83 lines
3.1 KiB
Diff
83 lines
3.1 KiB
Diff
Back-port of the following upstream commit...
|
|
|
|
commit d4d59e88cb746165c6fe33eacb6f582d525c6ef1
|
|
Author: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
|
Date: Fri Jan 22 14:22:45 2010 -0800
|
|
|
|
iwlwifi: Logic to control how frequent radio should be reset if needed
|
|
|
|
Add additional logic for internal scan routine to control how
|
|
frequent this function should be performed.
|
|
|
|
The intent of this function is to reset/re-tune the radio and bring the
|
|
RF/PHY back to normal state, it does not make sense calling it too
|
|
frequent,
|
|
if reset the radio can not bring it back to normal state, it indicate
|
|
there are other reason to cause the radio not operate correctly.
|
|
|
|
Signed-off-by: Wey-Yi Guy <wey-yi.w.guy@intel.com>
|
|
Signed-off-by: Reinette Chatre <reinette.chatre@intel.com>
|
|
Signed-off-by: John W. Linville <linville@tuxdriver.com>
|
|
|
|
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h
|
|
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h.orig 2010-03-22 11:26:18.000000000 -0400
|
|
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-dev.h 2010-03-22 14:12:32.000000000 -0400
|
|
@@ -1013,6 +1013,7 @@ struct iwl_priv {
|
|
unsigned long scan_start;
|
|
unsigned long scan_pass_start;
|
|
unsigned long scan_start_tsf;
|
|
+ unsigned long last_internal_scan_jiffies;
|
|
void *scan;
|
|
int scan_bands;
|
|
struct cfg80211_scan_request *scan_request;
|
|
diff -up linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c
|
|
--- linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c.orig 2010-03-22 11:26:18.000000000 -0400
|
|
+++ linux-2.6.32.noarch/drivers/net/wireless/iwlwifi/iwl-scan.c 2010-03-22 14:15:28.000000000 -0400
|
|
@@ -206,7 +206,8 @@ static void iwl_rx_scan_results_notif(st
|
|
#endif
|
|
|
|
priv->last_scan_jiffies = jiffies;
|
|
- priv->next_scan_jiffies = 0;
|
|
+ if (!priv->is_internal_short_scan)
|
|
+ priv->next_scan_jiffies = 0;
|
|
}
|
|
|
|
/* Service SCAN_COMPLETE_NOTIFICATION (0x84) */
|
|
@@ -252,8 +253,11 @@ static void iwl_rx_scan_complete_notif(s
|
|
goto reschedule;
|
|
}
|
|
|
|
- priv->last_scan_jiffies = jiffies;
|
|
- priv->next_scan_jiffies = 0;
|
|
+ if (!priv->is_internal_short_scan)
|
|
+ priv->next_scan_jiffies = 0;
|
|
+ else
|
|
+ priv->last_internal_scan_jiffies = jiffies;
|
|
+
|
|
IWL_DEBUG_INFO(priv, "Setting scan to off\n");
|
|
|
|
clear_bit(STATUS_SCANNING, &priv->status);
|
|
@@ -560,6 +564,8 @@ EXPORT_SYMBOL(iwl_mac_hw_scan);
|
|
* internal short scan, this function should only been called while associated.
|
|
* It will reset and tune the radio to prevent possible RF related problem
|
|
*/
|
|
+#define IWL_DELAY_NEXT_INTERNAL_SCAN (HZ*1)
|
|
+
|
|
int iwl_internal_short_hw_scan(struct iwl_priv *priv)
|
|
{
|
|
int ret = 0;
|
|
@@ -579,6 +585,13 @@ int iwl_internal_short_hw_scan(struct iw
|
|
ret = -EAGAIN;
|
|
goto out;
|
|
}
|
|
+ if (priv->last_internal_scan_jiffies &&
|
|
+ time_after(priv->last_internal_scan_jiffies +
|
|
+ IWL_DELAY_NEXT_INTERNAL_SCAN, jiffies)) {
|
|
+ IWL_DEBUG_SCAN(priv, "internal scan rejected\n");
|
|
+ goto out;
|
|
+ }
|
|
+
|
|
priv->scan_bands = 0;
|
|
if (priv->band == IEEE80211_BAND_5GHZ)
|
|
priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ);
|