diff options
Diffstat (limited to 'drivers/net/wireless/b43legacy/rfkill.c')
| -rw-r--r-- | drivers/net/wireless/b43legacy/rfkill.c | 28 | 
1 files changed, 25 insertions, 3 deletions
diff --git a/drivers/net/wireless/b43legacy/rfkill.c b/drivers/net/wireless/b43legacy/rfkill.c index d178dfbb1c9..476add97e97 100644 --- a/drivers/net/wireless/b43legacy/rfkill.c +++ b/drivers/net/wireless/b43legacy/rfkill.c @@ -44,6 +44,23 @@ static bool b43legacy_is_hw_radio_enabled(struct b43legacy_wldev *dev)  	return 0;  } +/* Update the rfkill state */ +static void b43legacy_rfkill_update_state(struct b43legacy_wldev *dev) +{ +	struct b43legacy_rfkill *rfk = &(dev->wl->rfkill); + +	if (!dev->radio_hw_enable) { +		rfk->rfkill->state = RFKILL_STATE_HARD_BLOCKED; +		return; +	} + +	if (!dev->phy.radio_on) +		rfk->rfkill->state = RFKILL_STATE_SOFT_BLOCKED; +	else +		rfk->rfkill->state = RFKILL_STATE_UNBLOCKED; + +} +  /* The poll callback for the hardware button. */  static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev)  { @@ -61,6 +78,7 @@ static void b43legacy_rfkill_poll(struct input_polled_dev *poll_dev)  	if (unlikely(enabled != dev->radio_hw_enable)) {  		dev->radio_hw_enable = enabled;  		report_change = 1; +		b43legacy_rfkill_update_state(dev);  		b43legacyinfo(wl, "Radio hardware status changed to %s\n",  			enabled ? "ENABLED" : "DISABLED");  	} @@ -90,7 +108,7 @@ static int b43legacy_rfkill_soft_toggle(void *data, enum rfkill_state state)  		goto out_unlock;  	err = 0;  	switch (state) { -	case RFKILL_STATE_ON: +	case RFKILL_STATE_UNBLOCKED:  		if (!dev->radio_hw_enable) {  			/* No luck. We can't toggle the hardware RF-kill  			 * button from software. */ @@ -100,10 +118,14 @@ static int b43legacy_rfkill_soft_toggle(void *data, enum rfkill_state state)  		if (!dev->phy.radio_on)  			b43legacy_radio_turn_on(dev);  		break; -	case RFKILL_STATE_OFF: +	case RFKILL_STATE_SOFT_BLOCKED:  		if (dev->phy.radio_on)  			b43legacy_radio_turn_off(dev, 0);  		break; +	default: +		b43legacywarn(wl, "Received unexpected rfkill state %d.\n", +			      state); +		break;  	}  out_unlock: @@ -135,7 +157,7 @@ void b43legacy_rfkill_init(struct b43legacy_wldev *dev)  	snprintf(rfk->name, sizeof(rfk->name),  		 "b43legacy-%s", wiphy_name(wl->hw->wiphy));  	rfk->rfkill->name = rfk->name; -	rfk->rfkill->state = RFKILL_STATE_ON; +	rfk->rfkill->state = RFKILL_STATE_UNBLOCKED;  	rfk->rfkill->data = dev;  	rfk->rfkill->toggle_radio = b43legacy_rfkill_soft_toggle;  	rfk->rfkill->user_claim_unsupported = 1;  |