summaryrefslogtreecommitdiffstats
path: root/iwlwifi_-Logic-to-control-how-frequent-radio-should-be-reset-if-needed.patch
diff options
context:
space:
mode:
authorJesse Keating <jkeating@redhat.com>2010-07-29 17:18:45 -0700
committerJesse Keating <jkeating@redhat.com>2010-07-29 17:18:45 -0700
commit2f82dda4a9bf41e64e864889bf06564bdf826e25 (patch)
tree118a7b483ae5de4dbf83d20001302f1404866ef0 /iwlwifi_-Logic-to-control-how-frequent-radio-should-be-reset-if-needed.patch
parent64ba2e5ffde5f2418eb26c700cb0ab62b04e5013 (diff)
downloaddom0-kernel-2f82dda4a9bf41e64e864889bf06564bdf826e25.tar.gz
dom0-kernel-2f82dda4a9bf41e64e864889bf06564bdf826e25.tar.xz
dom0-kernel-2f82dda4a9bf41e64e864889bf06564bdf826e25.zip
initial srpm import
Diffstat (limited to 'iwlwifi_-Logic-to-control-how-frequent-radio-should-be-reset-if-needed.patch')
-rw-r--r--iwlwifi_-Logic-to-control-how-frequent-radio-should-be-reset-if-needed.patch82
1 files changed, 82 insertions, 0 deletions
diff --git a/iwlwifi_-Logic-to-control-how-frequent-radio-should-be-reset-if-needed.patch b/iwlwifi_-Logic-to-control-how-frequent-radio-should-be-reset-if-needed.patch
new file mode 100644
index 0000000..e9f1623
--- /dev/null
+++ b/iwlwifi_-Logic-to-control-how-frequent-radio-should-be-reset-if-needed.patch
@@ -0,0 +1,82 @@
+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);