b43: Fix rfkill radio LED
This fixes Bug #9414 Since addition of the rfkill callback, the LED associated with the off switch on the radio has not worked for several reasons: (1) Essential data in the rfkill structure were missing. (2) The rfkill structure was initialized after the LED initialization. (3) There was a minor memory leak if the radio LED structure was inited. Once the above problems were fixed, additional difficulties were noted: (4) The radio LED was in the wrong state at startup. (5) The radio switch had to be manipulated twice for each state change. (6) A circular mutex locking situation existed. (7) If rfkill-input is built as a module, it is not automatically loaded. This patch fixes all of the above. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: Michael Buesch <mb@bu3sch.de> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
cb935cb4bd
commit
1a8d122782
@@ -2163,7 +2163,6 @@ static void b43_mgmtframe_txantenna(struct b43_wldev *dev, int antenna)
|
||||
static void b43_chip_exit(struct b43_wldev *dev)
|
||||
{
|
||||
b43_radio_turn_off(dev, 1);
|
||||
b43_leds_exit(dev);
|
||||
b43_gpio_cleanup(dev);
|
||||
/* firmware is released later */
|
||||
}
|
||||
@@ -2191,11 +2190,10 @@ static int b43_chip_init(struct b43_wldev *dev)
|
||||
err = b43_gpio_init(dev);
|
||||
if (err)
|
||||
goto out; /* firmware is released later */
|
||||
b43_leds_init(dev);
|
||||
|
||||
err = b43_upload_initvals(dev);
|
||||
if (err)
|
||||
goto err_leds_exit;
|
||||
goto err_gpio_clean;
|
||||
b43_radio_turn_on(dev);
|
||||
|
||||
b43_write16(dev, 0x03E6, 0x0000);
|
||||
@@ -2271,8 +2269,7 @@ out:
|
||||
|
||||
err_radio_off:
|
||||
b43_radio_turn_off(dev, 1);
|
||||
err_leds_exit:
|
||||
b43_leds_exit(dev);
|
||||
err_gpio_clean:
|
||||
b43_gpio_cleanup(dev);
|
||||
return err;
|
||||
}
|
||||
@@ -3273,10 +3270,7 @@ static void b43_wireless_core_exit(struct b43_wldev *dev)
|
||||
return;
|
||||
b43_set_status(dev, B43_STAT_UNINIT);
|
||||
|
||||
mutex_unlock(&dev->wl->mutex);
|
||||
b43_rfkill_exit(dev);
|
||||
mutex_lock(&dev->wl->mutex);
|
||||
|
||||
b43_leds_exit(dev);
|
||||
b43_rng_exit(dev->wl);
|
||||
b43_pio_free(dev);
|
||||
b43_dma_free(dev);
|
||||
@@ -3405,12 +3399,12 @@ static int b43_wireless_core_init(struct b43_wldev *dev)
|
||||
memset(wl->mac_addr, 0, ETH_ALEN);
|
||||
b43_upload_card_macaddress(dev);
|
||||
b43_security_init(dev);
|
||||
b43_rfkill_init(dev);
|
||||
b43_rng_init(wl);
|
||||
|
||||
b43_set_status(dev, B43_STAT_INITIALIZED);
|
||||
|
||||
out:
|
||||
b43_leds_init(dev);
|
||||
out:
|
||||
return err;
|
||||
|
||||
err_chip_exit:
|
||||
@@ -3499,6 +3493,10 @@ static int b43_start(struct ieee80211_hw *hw)
|
||||
int did_init = 0;
|
||||
int err = 0;
|
||||
|
||||
/* First register RFkill.
|
||||
* LEDs that are registered later depend on it. */
|
||||
b43_rfkill_init(dev);
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
|
||||
if (b43_status(dev) < B43_STAT_INITIALIZED) {
|
||||
@@ -3528,6 +3526,8 @@ static void b43_stop(struct ieee80211_hw *hw)
|
||||
struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
struct b43_wldev *dev = wl->current_dev;
|
||||
|
||||
b43_rfkill_exit(dev);
|
||||
|
||||
mutex_lock(&wl->mutex);
|
||||
if (b43_status(dev) >= B43_STAT_STARTED)
|
||||
b43_wireless_core_stop(dev);
|
||||
|
Reference in New Issue
Block a user