iwl4965: reset firmware after rfkill off
authorStanislaw Gruszka <sgruszka@redhat.com>
Thu, 1 Aug 2013 10:07:55 +0000 (12:07 +0200)
committerBen Hutchings <ben@decadent.org.uk>
Tue, 10 Sep 2013 00:57:19 +0000 (01:57 +0100)
commit 788f7a56fce1bcb2067b62b851a086fca48a0056 upstream.

Using rfkill switch can make firmware unstable, what cause various
Microcode errors and kernel warnings. Reseting firmware just after
rfkill off (radio on) helped with that.

Resolve:
https://bugzilla.redhat.com/show_bug.cgi?id=977053

Reported-and-tested-by: Justin Pearce <whitefox@guardianfox.net>
Signed-off-by: Stanislaw Gruszka <sgruszka@redhat.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
[bwh: Backported to 3.2: adjust filenames, context, naming]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
drivers/net/wireless/iwlegacy/iwl-core.c
drivers/net/wireless/iwlegacy/iwl4965-base.c

index 1bb64c9..09891e5 100644 (file)
@@ -1757,6 +1757,7 @@ int iwl_legacy_force_reset(struct iwl_priv *priv, bool external)
 
        return 0;
 }
+EXPORT_SYMBOL(iwl_legacy_force_reset);
 
 int
 iwl_legacy_mac_change_interface(struct ieee80211_hw *hw,
index dd9846c..77ad3bf 100644 (file)
@@ -868,12 +868,12 @@ static void iwl4965_irq_tasklet(struct iwl_priv *priv)
                 * is killed. Hence update the killswitch state here. The
                 * rfkill handler will care about restarting if needed.
                 */
-               if (!test_bit(STATUS_ALIVE, &priv->status)) {
-                       if (hw_rf_kill)
-                               set_bit(STATUS_RF_KILL_HW, &priv->status);
-                       else
-                               clear_bit(STATUS_RF_KILL_HW, &priv->status);
+               if (hw_rf_kill) {
+                       set_bit(STATUS_RF_KILL_HW, &priv->status);
+               } else {
+                       clear_bit(STATUS_RF_KILL_HW, &priv->status);
                        wiphy_rfkill_set_hw_state(priv->hw->wiphy, hw_rf_kill);
+                       iwl_legacy_force_reset(priv, true);
                }
 
                handled |= CSR_INT_BIT_RF_KILL;