diff options
author | thompsa <thompsa@FreeBSD.org> | 2008-05-01 04:55:00 +0000 |
---|---|---|
committer | thompsa <thompsa@FreeBSD.org> | 2008-05-01 04:55:00 +0000 |
commit | a96561521e584f7ce37efdbc079f9f3d125f8f39 (patch) | |
tree | b983721c7e7ac121297fd8475a3fd70e7cdc0166 /sys/dev/ral | |
parent | baf49360e8bbe44e4ec849b9c8e2374de1cb3f12 (diff) | |
download | FreeBSD-src-a96561521e584f7ce37efdbc079f9f3d125f8f39.zip FreeBSD-src-a96561521e584f7ce37efdbc079f9f3d125f8f39.tar.gz |
Unify all the wifi *_ioctl routines
- Limit grabbing the lock to SIOCSIFFLAGS.
- Move ieee80211_start_all() to SIOCSIFFLAGS.
- Remove SIOCSIFMEDIA as it is not useful.
- Limit ether_ioctl to only SIOCGIFADDR. SIOCSIFADDR and SIOCSIFMTU have no
affect as there is no input/output path in the vap parent. The vap code
will handle the reinit of the mac address changes.
- Split off ndis_ioctl_80211 as it was getting too different to wired devices.
This fixes a copyout while locked and a lock recursion.
Reviewed by: sam
Diffstat (limited to 'sys/dev/ral')
-rw-r--r-- | sys/dev/ral/rt2560.c | 15 | ||||
-rw-r--r-- | sys/dev/ral/rt2661.c | 15 |
2 files changed, 16 insertions, 14 deletions
diff --git a/sys/dev/ral/rt2560.c b/sys/dev/ral/rt2560.c index 1536a35..17a7201 100644 --- a/sys/dev/ral/rt2560.c +++ b/sys/dev/ral/rt2560.c @@ -2005,9 +2005,9 @@ rt2560_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) struct ifreq *ifr = (struct ifreq *) data; int error = 0, startall = 0; - RAL_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: + RAL_LOCK(sc); if (ifp->if_flags & IFF_UP) { if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { rt2560_init_locked(sc); @@ -2018,19 +2018,20 @@ rt2560_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if (ifp->if_drv_flags & IFF_DRV_RUNNING) rt2560_stop_locked(sc); } + RAL_UNLOCK(sc); + if (startall) + ieee80211_start_all(ic); break; case SIOCGIFMEDIA: - case SIOCSIFMEDIA: error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); break; - default: + case SIOCGIFADDR: error = ether_ioctl(ifp, cmd, data); break; + default: + error = EINVAL; + break; } - RAL_UNLOCK(sc); - - if (startall) - ieee80211_start_all(ic); return error; } diff --git a/sys/dev/ral/rt2661.c b/sys/dev/ral/rt2661.c index c94dbe7..691ac38 100644 --- a/sys/dev/ral/rt2661.c +++ b/sys/dev/ral/rt2661.c @@ -1747,9 +1747,9 @@ rt2661_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) struct ifreq *ifr = (struct ifreq *) data; int error = 0, startall = 0; - RAL_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: + RAL_LOCK(sc); if (ifp->if_flags & IFF_UP) { if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { rt2661_init_locked(sc); @@ -1760,19 +1760,20 @@ rt2661_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data) if (ifp->if_drv_flags & IFF_DRV_RUNNING) rt2661_stop_locked(sc); } + RAL_UNLOCK(sc); + if (startall) + ieee80211_start_all(ic); break; case SIOCGIFMEDIA: - case SIOCSIFMEDIA: error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); break; - default: + case SIOCGIFADDR: error = ether_ioctl(ifp, cmd, data); break; + default: + error = EINVAL; + break; } - RAL_UNLOCK(sc); - - if (startall) - ieee80211_start_all(ic); return error; } |