b43: Rewrite and fix rfkill init
PATCH 1/1 b43: Rewrite and fix rfkill init
The rfkill subsystem doesn't like code like thatrfkill_allocate();rfkill_register();rfkill_unregister();rfkill_register(); /* <- This will crash */
This sequence happens with
modprobe b43
ifconfig wlanX up
ifconfig wlanX down
ifconfig wlanX up
Fix this by always re-allocating the rfkill stuff before register.
Signed-off-by Michael Buesch <[email protected]>
---
Note that this has to be ported to b43legacy.
Some volunteers? :)
drivers/net/wireless/b43/main.c +0 -2
@@ -3686,7 +3686,6 @@ static int b43_setup_modes(struct b43_wlstatic void b43_wireless_core_detach (struct b43_wldev *dev) { -b43_rfkill_free (dev);/* We release firmware that late to not be required to re-request * is all the time when we reinit the core. */ b43_release_firmware (dev);
@@ -3772,7 +3771,6 @@ static int b43_wireless_core_attach(struif (!wl->current_dev) wl->current_dev = dev;INIT_WORK (&dev->restart_work, b43_chip_reset); -b43_rfkill_alloc (dev);b43_radio_turn_off (dev,1 );b43_switch_analog (dev,0 );
drivers/net/wireless/b43/rfkill.c +51 -68
169 lines not on this page · raw message
drivers/net/wireless/b43/rfkill.h +4 -10
@@ -15,14 +15,14 @@ struct b43_rfkill {struct rfkill *rfkill;/* The poll device for the RFKILL input button */ struct input_polled_dev *poll_dev; +/* Did initialization succeed? Used for freeing. */ +bool registered;/* The unique name of this rfkill switch */ -char name[32 ]; +char name[sizeof ("b43-phy4294967295" )]; }; -/* All the init functions return void, because we are not interested +/* The init function returns void, because we are not interested * in failing the b43 init process when rfkill init failed. */ -void b43_rfkill_alloc (struct b43_wldev *dev); -void b43_rfkill_free (struct b43_wldev *dev);void b43_rfkill_init (struct b43_wldev *dev);void b43_rfkill_exit (struct b43_wldev *dev);
@@ -36,12 +36,6 @@ struct b43_rfkill {/* empty */ }; -static inline void b43_rfkill_alloc (struct b43_wldev *dev) -{ -} -static inline void b43_rfkill_free (struct b43_wldev *dev) -{ -}static inline void b43_rfkill_init (struct b43_wldev *dev) { }