[brcm-2.4] fix wlcompat so that the wl module can be unloaded
authorFlorian Fainelli <florian@openwrt.org>
Wed, 23 Feb 2011 22:10:08 +0000 (22:10 +0000)
committerFlorian Fainelli <florian@openwrt.org>
Wed, 23 Feb 2011 22:10:08 +0000 (22:10 +0000)
This patch was created on 8.09.2 but it also applies to Backfire
I found that I couldn't unload the broadcom wl driver, wlcompat didn't correctly release/decrement  the device pointer,
This patch cleans that up

I wanted to be able to remove/install the wl driver so that I could get out of monitor mode without rebooting

Signed-off-by: Chris Martin <chris@martin.cc>
SVN-Revision: 25671

package/broadcom-wl/Makefile
package/broadcom-wl/src/wlcompat/wlcompat.c

index aaf6083..6b68b84 100644 (file)
@@ -1,5 +1,5 @@
 #
-# Copyright (C) 2006-2010 OpenWrt.org
+# Copyright (C) 2006-2011 OpenWrt.org
 #
 # This is free software, licensed under the GNU General Public License v2.
 # See /LICENSE for more information.
@@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
 
 PKG_NAME:=broadcom-wl
 PKG_VERSION:=4.150.10.5.3
-PKG_RELEASE:=7
+PKG_RELEASE:=8
 WLC_VERSION:=0.2
 
 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2
index 1b5dd78..95e700d 100644 (file)
@@ -38,7 +38,7 @@
 #include <wlioctl.h>
 
 char buf[WLC_IOCTL_MAXLEN];
-static struct net_device *dev;
+static struct net_device *dev = NULL;
 #ifndef DEBUG
 static int random = 1;
 #endif
@@ -981,10 +981,15 @@ static int __init wlcompat_init()
        int found = 0, i;
        char devname[4] = "wl0";
 
+       /* calling dev_get_by_name() will inc the open_counter in dev
+        * we must put it back with dev_put() when we are finished to dec the counter */
        while (!found && (dev = dev_get_by_name(devname))) {
                if ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && (i == WLC_IOCTL_MAGIC))
                        found = 1;
-               devname[2]++;
+               else {
+                       dev_put(dev);
+                       devname[2]++;
+               }
        }
 
 
@@ -1026,6 +1031,9 @@ static void __exit wlcompat_exit()
        dev->wireless_handlers = NULL;
 #endif
        dev->do_ioctl = old_ioctl;
+
+       dev_put(dev);
+
        return;
 }