1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-11-24 01:43:08 +02:00

[brcm-2.4] fix wlcompat so that the wl module can be unloaded

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>


git-svn-id: svn://svn.openwrt.org/openwrt/branches/backfire@25671 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
florian 2011-02-23 22:10:08 +00:00
parent 167c9d4a48
commit e6e6f69066
2 changed files with 12 additions and 4 deletions

View 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. # This is free software, licensed under the GNU General Public License v2.
# See /LICENSE for more information. # See /LICENSE for more information.
@ -10,7 +10,7 @@ include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=broadcom-wl PKG_NAME:=broadcom-wl
PKG_VERSION:=4.150.10.5.3 PKG_VERSION:=4.150.10.5.3
PKG_RELEASE:=7 PKG_RELEASE:=8
WLC_VERSION:=0.2 WLC_VERSION:=0.2
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2 PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2

View File

@ -38,7 +38,7 @@
#include <wlioctl.h> #include <wlioctl.h>
char buf[WLC_IOCTL_MAXLEN]; char buf[WLC_IOCTL_MAXLEN];
static struct net_device *dev; static struct net_device *dev = NULL;
#ifndef DEBUG #ifndef DEBUG
static int random = 1; static int random = 1;
#endif #endif
@ -981,10 +981,15 @@ static int __init wlcompat_init()
int found = 0, i; int found = 0, i;
char devname[4] = "wl0"; 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))) { while (!found && (dev = dev_get_by_name(devname))) {
if ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && (i == WLC_IOCTL_MAGIC)) if ((wl_ioctl(dev, WLC_GET_MAGIC, &i, sizeof(i)) == 0) && (i == WLC_IOCTL_MAGIC))
found = 1; found = 1;
devname[2]++; else {
dev_put(dev);
devname[2]++;
}
} }
@ -1026,6 +1031,9 @@ static void __exit wlcompat_exit()
dev->wireless_handlers = NULL; dev->wireless_handlers = NULL;
#endif #endif
dev->do_ioctl = old_ioctl; dev->do_ioctl = old_ioctl;
dev_put(dev);
return; return;
} }