Disable SW switch regardless of HW switch state (we can only enable radio when both SW and HW rfkill switches are off). Report to rfkill subsystem SW switch state before HW switch state to move rfkill subsystem to SOFT_BLOCK rather than HARD_BLOCK, otherwise in some conditions we would not be able to turn radio back on. --- drivers/net/wireless/iwlwifi/iwl3945-base.c | 17 +++++++---------- 1 files changed, 7 insertions(+), 10 deletions(-) diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 5011a79..6065921 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c @@ -8216,7 +8216,8 @@ static int iwl3945_rfkill_soft_rf_kill(void *data, enum rfkill_state state) case RFKILL_STATE_UNBLOCKED: if (iwl3945_is_rfkill_hw(priv)) { err = -EBUSY; - goto out_unlock; + /* pass error to rfkill core to make it state HARD + * BLOCKED and disable software kill switch */ } iwl3945_radio_kill_sw(priv, 0); break; @@ -8227,9 +8228,8 @@ static int iwl3945_rfkill_soft_rf_kill(void *data, enum rfkill_state state) IWL_WARNING("we received unexpected RFKILL state %d\n", state); break; } -out_unlock: - mutex_unlock(&priv->mutex); + mutex_unlock(&priv->mutex); return err; } @@ -8291,15 +8291,12 @@ void iwl3945_rfkill_set_hw_state(struct iwl3945_priv *priv) if (!priv->rfkill) return; - if (iwl3945_is_rfkill_hw(priv)) { + if (iwl3945_is_rfkill_sw(priv)) + rfkill_force_state(priv->rfkill, RFKILL_STATE_SOFT_BLOCKED); + else if (iwl3945_is_rfkill_hw(priv)) rfkill_force_state(priv->rfkill, RFKILL_STATE_HARD_BLOCKED); - return; - } - - if (!iwl3945_is_rfkill_sw(priv)) - rfkill_force_state(priv->rfkill, RFKILL_STATE_UNBLOCKED); else - rfkill_force_state(priv->rfkill, RFKILL_STATE_SOFT_BLOCKED); + rfkill_force_state(priv->rfkill, RFKILL_STATE_UNBLOCKED); } #endif -- 1.6.2.5 _______________________________________________ Fedora-kernel-list mailing list Fedora-kernel-list@redhat.com https://www.redhat.com/mailman/listinfo/fedora-kernel-list