iwlwifi: avoid firmware command sending if rfkill is enabled
authorMohamed Abbas <mabbas@linux.intel.com>
Thu, 29 Nov 2007 03:10:15 +0000 (11:10 +0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 28 Jan 2008 23:05:37 +0000 (15:05 -0800)
This patch fixed a ucode timeout issue and worked code with suspend
to disk.

Signed-off-by: Mohamed Abbas <mabbas@linux.intel.com>
Signed-off-by: Zhu Yi <yi.zhu@intel.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/iwlwifi/iwl3945-base.c
drivers/net/wireless/iwlwifi/iwl4965-base.c

index 3272608ced83d0321e29a05dca9c003d2029aba9..dbb6eff7b8e63719fd75e8aedb405d1cb85278aa 100644 (file)
@@ -2546,9 +2546,6 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv)
 
 static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode)
 {
-       if (!iwl3945_is_ready_rf(priv))
-               return -EAGAIN;
-
        if (mode == IEEE80211_IF_TYPE_IBSS) {
                const struct iwl3945_channel_info *ch_info;
 
@@ -2563,13 +2560,6 @@ static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode)
                }
        }
 
-       cancel_delayed_work(&priv->scan_check);
-       if (iwl3945_scan_cancel_timeout(priv, 100)) {
-               IWL_WARNING("Aborted scan still in progress after 100ms\n");
-               IWL_DEBUG_MAC80211("leaving - scan abort failed.\n");
-               return -EAGAIN;
-       }
-
        priv->iw_mode = mode;
 
        iwl3945_connection_init_rx_config(priv);
@@ -2577,6 +2567,17 @@ static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode)
 
        iwl3945_clear_stations_table(priv);
 
+       /* dont commit rxon if rf-kill is on*/
+       if (!iwl3945_is_ready_rf(priv))
+               return -EAGAIN;
+
+       cancel_delayed_work(&priv->scan_check);
+       if (iwl3945_scan_cancel_timeout(priv, 100)) {
+               IWL_WARNING("Aborted scan still in progress after 100ms\n");
+               IWL_DEBUG_MAC80211("leaving - scan abort failed.\n");
+               return -EAGAIN;
+       }
+
        iwl3945_commit_rxon(priv);
 
        return 0;
@@ -7020,6 +7021,12 @@ static void iwl3945_mac_stop(struct ieee80211_hw *hw)
         * RXON_FILTER_ASSOC_MSK BIT
         */
        priv->is_open = 0;
+       if (!iwl3945_is_ready_rf(priv)) {
+               IWL_DEBUG_MAC80211("leave - RF not ready\n");
+               mutex_unlock(&priv->mutex);
+               return;
+       }
+
        iwl3945_scan_cancel_timeout(priv, 100);
        cancel_delayed_work(&priv->post_associate);
        priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
@@ -7291,6 +7298,9 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, int if_id,
                priv->ibss_beacon = conf->beacon;
        }
 
+       if (iwl3945_is_rfkill(priv))
+               goto done;
+
        if (conf->bssid && !is_zero_ether_addr(conf->bssid) &&
            !is_multicast_ether_addr(conf->bssid)) {
                /* If there is currently a HW scan going on in the background
@@ -7325,6 +7335,7 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, int if_id,
                iwl3945_commit_rxon(priv);
        }
 
+ done:
        spin_lock_irqsave(&priv->lock, flags);
        if (!conf->ssid_len)
                memset(priv->essid, 0, IW_ESSID_MAX_SIZE);
@@ -7361,11 +7372,12 @@ static void iwl3945_mac_remove_interface(struct ieee80211_hw *hw,
 
        mutex_lock(&priv->mutex);
 
-       iwl3945_scan_cancel_timeout(priv, 100);
-       cancel_delayed_work(&priv->post_associate);
-       priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-       iwl3945_commit_rxon(priv);
-
+       if (iwl3945_is_ready_rf(priv)) {
+               iwl3945_scan_cancel_timeout(priv, 100);
+               cancel_delayed_work(&priv->post_associate);
+               priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+               iwl3945_commit_rxon(priv);
+       }
        if (priv->interface_id == conf->if_id) {
                priv->interface_id = 0;
                memset(priv->bssid, 0, ETH_ALEN);
@@ -7636,6 +7648,12 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw)
 
        spin_unlock_irqrestore(&priv->lock, flags);
 
+       if (!iwl3945_is_ready_rf(priv)) {
+               IWL_DEBUG_MAC80211("leave - not ready\n");
+               mutex_unlock(&priv->mutex);
+               return;
+       }
+
        /* we are restarting association process
         * clear RXON_FILTER_ASSOC_MSK bit
        */
@@ -7653,12 +7671,6 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw)
                return;
        }
 
-       if (!iwl3945_is_ready_rf(priv)) {
-               IWL_DEBUG_MAC80211("leave - not ready\n");
-               mutex_unlock(&priv->mutex);
-               return;
-       }
-
        priv->only_active_channel = 0;
 
        iwl3945_set_rate(priv);
index 6be38ce701f52d4cd0e8bb4dddf8b1d8a722d866..b6e9a09b7e7579807905babc4753e0cb063c5a6a 100644 (file)
@@ -2649,9 +2649,6 @@ static void iwl4965_connection_init_rx_config(struct iwl4965_priv *priv)
 
 static int iwl4965_set_mode(struct iwl4965_priv *priv, int mode)
 {
-       if (!iwl4965_is_ready_rf(priv))
-               return -EAGAIN;
-
        if (mode == IEEE80211_IF_TYPE_IBSS) {
                const struct iwl4965_channel_info *ch_info;
 
@@ -2666,13 +2663,6 @@ static int iwl4965_set_mode(struct iwl4965_priv *priv, int mode)
                }
        }
 
-       cancel_delayed_work(&priv->scan_check);
-       if (iwl4965_scan_cancel_timeout(priv, 100)) {
-               IWL_WARNING("Aborted scan still in progress after 100ms\n");
-               IWL_DEBUG_MAC80211("leaving - scan abort failed.\n");
-               return -EAGAIN;
-       }
-
        priv->iw_mode = mode;
 
        iwl4965_connection_init_rx_config(priv);
@@ -2680,6 +2670,17 @@ static int iwl4965_set_mode(struct iwl4965_priv *priv, int mode)
 
        iwl4965_clear_stations_table(priv);
 
+       /* dont commit rxon if rf-kill is on*/
+       if (!iwl4965_is_ready_rf(priv))
+               return -EAGAIN;
+
+       cancel_delayed_work(&priv->scan_check);
+       if (iwl4965_scan_cancel_timeout(priv, 100)) {
+               IWL_WARNING("Aborted scan still in progress after 100ms\n");
+               IWL_DEBUG_MAC80211("leaving - scan abort failed.\n");
+               return -EAGAIN;
+       }
+
        iwl4965_commit_rxon(priv);
 
        return 0;
@@ -7458,6 +7459,12 @@ static void iwl4965_mac_stop(struct ieee80211_hw *hw)
         * RXON_FILTER_ASSOC_MSK BIT
         */
        priv->is_open = 0;
+       if (!iwl4965_is_ready_rf(priv)) {
+               IWL_DEBUG_MAC80211("leave - RF not ready\n");
+               mutex_unlock(&priv->mutex);
+               return;
+       }
+
        iwl4965_scan_cancel_timeout(priv, 100);
        cancel_delayed_work(&priv->post_associate);
        priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
@@ -7743,6 +7750,9 @@ static int iwl4965_mac_config_interface(struct ieee80211_hw *hw, int if_id,
                priv->ibss_beacon = conf->beacon;
        }
 
+       if (iwl4965_is_rfkill(priv))
+               goto done;
+
        if (conf->bssid && !is_zero_ether_addr(conf->bssid) &&
            !is_multicast_ether_addr(conf->bssid)) {
                /* If there is currently a HW scan going on in the background
@@ -7777,6 +7787,7 @@ static int iwl4965_mac_config_interface(struct ieee80211_hw *hw, int if_id,
                iwl4965_commit_rxon(priv);
        }
 
+ done:
        spin_lock_irqsave(&priv->lock, flags);
        if (!conf->ssid_len)
                memset(priv->essid, 0, IW_ESSID_MAX_SIZE);
@@ -7813,11 +7824,12 @@ static void iwl4965_mac_remove_interface(struct ieee80211_hw *hw,
 
        mutex_lock(&priv->mutex);
 
-       iwl4965_scan_cancel_timeout(priv, 100);
-       cancel_delayed_work(&priv->post_associate);
-       priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
-       iwl4965_commit_rxon(priv);
-
+       if (iwl4965_is_ready_rf(priv)) {
+               iwl4965_scan_cancel_timeout(priv, 100);
+               cancel_delayed_work(&priv->post_associate);
+               priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
+               iwl4965_commit_rxon(priv);
+       }
        if (priv->interface_id == conf->if_id) {
                priv->interface_id = 0;
                memset(priv->bssid, 0, ETH_ALEN);
@@ -8130,6 +8142,12 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw)
 
        spin_unlock_irqrestore(&priv->lock, flags);
 
+       if (!iwl4965_is_ready_rf(priv)) {
+               IWL_DEBUG_MAC80211("leave - not ready\n");
+               mutex_unlock(&priv->mutex);
+               return;
+       }
+
        /* we are restarting association process
         * clear RXON_FILTER_ASSOC_MSK bit
         */
@@ -8147,12 +8165,6 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw)
                return;
        }
 
-       if (!iwl4965_is_ready_rf(priv)) {
-               IWL_DEBUG_MAC80211("leave - not ready\n");
-               mutex_unlock(&priv->mutex);
-               return;
-       }
-
        priv->only_active_channel = 0;
 
        iwl4965_set_rate(priv);