[PATCH 3/3] iwl3945: fix rfkill SW and HW mishmash

Stanislaw Gruszka sgruszka at redhat.com
Thu Jul 23 14:35:42 UTC 2009


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




More information about the Fedora-kernel-list mailing list