aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging/wlan-ng/p80211netdev.c
diff options
context:
space:
mode:
authorRichard Kennedy <richard@rsk.demon.co.uk>2009-02-20 12:09:12 +0000
committerGreg Kroah-Hartman <gregkh@suse.de>2009-04-03 14:53:24 -0700
commitcfde74517b32724a78896eda49198f147e12050d (patch)
treedcca75204f6d88fe846a2b8f7d02d3c2e97446a5 /drivers/staging/wlan-ng/p80211netdev.c
parent18c7f792be75c2430cbf16e22dca1ab6a9881a63 (diff)
downloadkernel_samsung_smdk4412-cfde74517b32724a78896eda49198f147e12050d.zip
kernel_samsung_smdk4412-cfde74517b32724a78896eda49198f147e12050d.tar.gz
kernel_samsung_smdk4412-cfde74517b32724a78896eda49198f147e12050d.tar.bz2
Staging: wlan-ng: block ioctls until card fully initialised
Add a mutex to block ioctls before the card is fully initialised and only allow one ioctl at a time. This stops udev trying to load the firmware before to card is fully up. patch ported from wlan-ng-devel Karl Relton <karllinuxtest.relton@ntlworld.com> spotted that this was missing from the staging version, http://lists.linux-wlan.com/pipermail/linux-wlan-devel/2009-February/003890.html Signed-off-by: Richard Kennedy <richard@rsk.demon.co.uk> Cc: Karl Relton <karllinuxtest.relton@ntlworld.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/wlan-ng/p80211netdev.c')
-rw-r--r--drivers/staging/wlan-ng/p80211netdev.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/drivers/staging/wlan-ng/p80211netdev.c b/drivers/staging/wlan-ng/p80211netdev.c
index 50fa8d6..b2a606a 100644
--- a/drivers/staging/wlan-ng/p80211netdev.c
+++ b/drivers/staging/wlan-ng/p80211netdev.c
@@ -567,6 +567,8 @@ static int p80211knetdev_do_ioctl(netdevice_t *dev, struct ifreq *ifr, int cmd)
pr_debug("rx'd ioctl, cmd=%d, len=%d\n", cmd, req->len);
+ mutex_lock(&wlandev->ioctl_lock);
+
#ifdef SIOCETHTOOL
if (cmd == SIOCETHTOOL) {
result =
@@ -607,6 +609,8 @@ static int p80211knetdev_do_ioctl(netdevice_t *dev, struct ifreq *ifr, int cmd)
result = -ENOMEM;
}
bail:
+ mutex_unlock(&wlandev->ioctl_lock);
+
return result; /* If allocate,copyfrom or copyto fails, return errno */
}
@@ -758,6 +762,11 @@ int wlan_setup(wlandevice_t *wlandev)
dev->open = p80211knetdev_open;
dev->stop = p80211knetdev_stop;
+ mutex_init(&wlandev->ioctl_lock);
+ /* block ioctls until fully initialised. Don't forget to call
+ allow_ioctls at some point!*/
+ mutex_lock(&wlandev->ioctl_lock);
+
#if (WIRELESS_EXT < 21)
dev->get_wireless_stats = p80211wext_get_wireless_stats;
#endif
@@ -1098,3 +1107,8 @@ static void p80211knetdev_tx_timeout(netdevice_t *netdev)
netif_wake_queue(wlandev->netdev);
}
}
+
+void p80211_allow_ioctls(wlandevice_t *wlandev)
+{
+ mutex_unlock(&wlandev->ioctl_lock);
+}