提交 fde3571f 编写于 作者: M Mohamed Abbas 提交者: David S. Miller

iwlwifi: avoid firmware command sending if rfkill is enabled

This patch fixed a ucode timeout issue and worked code with suspend
to disk.
Signed-off-by: NMohamed Abbas <mabbas@linux.intel.com>
Signed-off-by: NZhu Yi <yi.zhu@intel.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 5c0eef96
...@@ -2546,9 +2546,6 @@ static void iwl3945_connection_init_rx_config(struct iwl3945_priv *priv) ...@@ -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) 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) { if (mode == IEEE80211_IF_TYPE_IBSS) {
const struct iwl3945_channel_info *ch_info; const struct iwl3945_channel_info *ch_info;
...@@ -2563,13 +2560,6 @@ static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode) ...@@ -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; priv->iw_mode = mode;
iwl3945_connection_init_rx_config(priv); iwl3945_connection_init_rx_config(priv);
...@@ -2577,6 +2567,17 @@ static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode) ...@@ -2577,6 +2567,17 @@ static int iwl3945_set_mode(struct iwl3945_priv *priv, int mode)
iwl3945_clear_stations_table(priv); 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); iwl3945_commit_rxon(priv);
return 0; return 0;
...@@ -7020,6 +7021,12 @@ static void iwl3945_mac_stop(struct ieee80211_hw *hw) ...@@ -7020,6 +7021,12 @@ static void iwl3945_mac_stop(struct ieee80211_hw *hw)
* RXON_FILTER_ASSOC_MSK BIT * RXON_FILTER_ASSOC_MSK BIT
*/ */
priv->is_open = 0; 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); iwl3945_scan_cancel_timeout(priv, 100);
cancel_delayed_work(&priv->post_associate); cancel_delayed_work(&priv->post_associate);
priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; 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, ...@@ -7291,6 +7298,9 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, int if_id,
priv->ibss_beacon = conf->beacon; priv->ibss_beacon = conf->beacon;
} }
if (iwl3945_is_rfkill(priv))
goto done;
if (conf->bssid && !is_zero_ether_addr(conf->bssid) && if (conf->bssid && !is_zero_ether_addr(conf->bssid) &&
!is_multicast_ether_addr(conf->bssid)) { !is_multicast_ether_addr(conf->bssid)) {
/* If there is currently a HW scan going on in the background /* 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, ...@@ -7325,6 +7335,7 @@ static int iwl3945_mac_config_interface(struct ieee80211_hw *hw, int if_id,
iwl3945_commit_rxon(priv); iwl3945_commit_rxon(priv);
} }
done:
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
if (!conf->ssid_len) if (!conf->ssid_len)
memset(priv->essid, 0, IW_ESSID_MAX_SIZE); memset(priv->essid, 0, IW_ESSID_MAX_SIZE);
...@@ -7361,11 +7372,12 @@ static void iwl3945_mac_remove_interface(struct ieee80211_hw *hw, ...@@ -7361,11 +7372,12 @@ static void iwl3945_mac_remove_interface(struct ieee80211_hw *hw,
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
iwl3945_scan_cancel_timeout(priv, 100); if (iwl3945_is_ready_rf(priv)) {
cancel_delayed_work(&priv->post_associate); iwl3945_scan_cancel_timeout(priv, 100);
priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; cancel_delayed_work(&priv->post_associate);
iwl3945_commit_rxon(priv); priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
iwl3945_commit_rxon(priv);
}
if (priv->interface_id == conf->if_id) { if (priv->interface_id == conf->if_id) {
priv->interface_id = 0; priv->interface_id = 0;
memset(priv->bssid, 0, ETH_ALEN); memset(priv->bssid, 0, ETH_ALEN);
...@@ -7636,6 +7648,12 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw) ...@@ -7636,6 +7648,12 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw)
spin_unlock_irqrestore(&priv->lock, flags); 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 /* we are restarting association process
* clear RXON_FILTER_ASSOC_MSK bit * clear RXON_FILTER_ASSOC_MSK bit
*/ */
...@@ -7653,12 +7671,6 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw) ...@@ -7653,12 +7671,6 @@ static void iwl3945_mac_reset_tsf(struct ieee80211_hw *hw)
return; return;
} }
if (!iwl3945_is_ready_rf(priv)) {
IWL_DEBUG_MAC80211("leave - not ready\n");
mutex_unlock(&priv->mutex);
return;
}
priv->only_active_channel = 0; priv->only_active_channel = 0;
iwl3945_set_rate(priv); iwl3945_set_rate(priv);
......
...@@ -2649,9 +2649,6 @@ static void iwl4965_connection_init_rx_config(struct iwl4965_priv *priv) ...@@ -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) 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) { if (mode == IEEE80211_IF_TYPE_IBSS) {
const struct iwl4965_channel_info *ch_info; const struct iwl4965_channel_info *ch_info;
...@@ -2666,13 +2663,6 @@ static int iwl4965_set_mode(struct iwl4965_priv *priv, int mode) ...@@ -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; priv->iw_mode = mode;
iwl4965_connection_init_rx_config(priv); iwl4965_connection_init_rx_config(priv);
...@@ -2680,6 +2670,17 @@ static int iwl4965_set_mode(struct iwl4965_priv *priv, int mode) ...@@ -2680,6 +2670,17 @@ static int iwl4965_set_mode(struct iwl4965_priv *priv, int mode)
iwl4965_clear_stations_table(priv); 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); iwl4965_commit_rxon(priv);
return 0; return 0;
...@@ -7458,6 +7459,12 @@ static void iwl4965_mac_stop(struct ieee80211_hw *hw) ...@@ -7458,6 +7459,12 @@ static void iwl4965_mac_stop(struct ieee80211_hw *hw)
* RXON_FILTER_ASSOC_MSK BIT * RXON_FILTER_ASSOC_MSK BIT
*/ */
priv->is_open = 0; 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); iwl4965_scan_cancel_timeout(priv, 100);
cancel_delayed_work(&priv->post_associate); cancel_delayed_work(&priv->post_associate);
priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; 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, ...@@ -7743,6 +7750,9 @@ static int iwl4965_mac_config_interface(struct ieee80211_hw *hw, int if_id,
priv->ibss_beacon = conf->beacon; priv->ibss_beacon = conf->beacon;
} }
if (iwl4965_is_rfkill(priv))
goto done;
if (conf->bssid && !is_zero_ether_addr(conf->bssid) && if (conf->bssid && !is_zero_ether_addr(conf->bssid) &&
!is_multicast_ether_addr(conf->bssid)) { !is_multicast_ether_addr(conf->bssid)) {
/* If there is currently a HW scan going on in the background /* 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, ...@@ -7777,6 +7787,7 @@ static int iwl4965_mac_config_interface(struct ieee80211_hw *hw, int if_id,
iwl4965_commit_rxon(priv); iwl4965_commit_rxon(priv);
} }
done:
spin_lock_irqsave(&priv->lock, flags); spin_lock_irqsave(&priv->lock, flags);
if (!conf->ssid_len) if (!conf->ssid_len)
memset(priv->essid, 0, IW_ESSID_MAX_SIZE); memset(priv->essid, 0, IW_ESSID_MAX_SIZE);
...@@ -7813,11 +7824,12 @@ static void iwl4965_mac_remove_interface(struct ieee80211_hw *hw, ...@@ -7813,11 +7824,12 @@ static void iwl4965_mac_remove_interface(struct ieee80211_hw *hw,
mutex_lock(&priv->mutex); mutex_lock(&priv->mutex);
iwl4965_scan_cancel_timeout(priv, 100); if (iwl4965_is_ready_rf(priv)) {
cancel_delayed_work(&priv->post_associate); iwl4965_scan_cancel_timeout(priv, 100);
priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK; cancel_delayed_work(&priv->post_associate);
iwl4965_commit_rxon(priv); priv->staging_rxon.filter_flags &= ~RXON_FILTER_ASSOC_MSK;
iwl4965_commit_rxon(priv);
}
if (priv->interface_id == conf->if_id) { if (priv->interface_id == conf->if_id) {
priv->interface_id = 0; priv->interface_id = 0;
memset(priv->bssid, 0, ETH_ALEN); memset(priv->bssid, 0, ETH_ALEN);
...@@ -8130,6 +8142,12 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw) ...@@ -8130,6 +8142,12 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw)
spin_unlock_irqrestore(&priv->lock, flags); 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 /* we are restarting association process
* clear RXON_FILTER_ASSOC_MSK bit * clear RXON_FILTER_ASSOC_MSK bit
*/ */
...@@ -8147,12 +8165,6 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw) ...@@ -8147,12 +8165,6 @@ static void iwl4965_mac_reset_tsf(struct ieee80211_hw *hw)
return; return;
} }
if (!iwl4965_is_ready_rf(priv)) {
IWL_DEBUG_MAC80211("leave - not ready\n");
mutex_unlock(&priv->mutex);
return;
}
priv->only_active_channel = 0; priv->only_active_channel = 0;
iwl4965_set_rate(priv); iwl4965_set_rate(priv);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册