aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>2012-10-15 05:59:50 -0400
committerJohn W. Linville <linville@tuxdriver.com>2012-10-29 15:19:29 -0400
commit2097fdd7ebdb1674aaf7343b7a1d6cc2758c1dff (patch)
treec1d05e894ffbc45b4cb1aa69485228b2dc716701 /drivers
parente9f9fd8cdc5fcb718e2ce778cb5e0eea27e2fdc8 (diff)
ath9k_hw: Fix frequent BT rx recovery
While resuming from S3, BT host issues HCI reset command and it causes BT firmware to busy with security key calculation. At this movement, WLAN detects MCI hardware error of MCI_CONT_INFO_TIMEOUT and then it starts the recovery sequence repeatedly. Too many recovery sequences would exhaust the BT kernel message pool. This patch imposes a duration between consecutive BT recovery procedure. Thus it solves BT firmware panic issue reported in AR9565. Signed-off-by: Rajkumar Manoharan <rmanohar@qca.qualcomm.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mci.c10
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9003_mci.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/btcoex.h1
3 files changed, 11 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.c b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
index 87d9c348e598..b04fa4622822 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c
@@ -1203,7 +1203,7 @@ EXPORT_SYMBOL(ar9003_mci_cleanup);
1203u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type) 1203u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
1204{ 1204{
1205 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; 1205 struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
1206 u32 value = 0; 1206 u32 value = 0, tsf;
1207 u8 query_type; 1207 u8 query_type;
1208 1208
1209 switch (state_type) { 1209 switch (state_type) {
@@ -1261,6 +1261,14 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
1261 ar9003_mci_send_coex_bt_status_query(ah, true, query_type); 1261 ar9003_mci_send_coex_bt_status_query(ah, true, query_type);
1262 break; 1262 break;
1263 case MCI_STATE_RECOVER_RX: 1263 case MCI_STATE_RECOVER_RX:
1264 tsf = ath9k_hw_gettsf32(ah);
1265 if ((tsf - mci->last_recovery) <= MCI_RECOVERY_DUR_TSF) {
1266 ath_dbg(ath9k_hw_common(ah), MCI,
1267 "(MCI) ignore Rx recovery\n");
1268 break;
1269 }
1270 ath_dbg(ath9k_hw_common(ah), MCI, "(MCI) RECOVER RX\n");
1271 mci->last_recovery = tsf;
1264 ar9003_mci_prep_interface(ah); 1272 ar9003_mci_prep_interface(ah);
1265 mci->query_bt = true; 1273 mci->query_bt = true;
1266 mci->need_flush_btinfo = true; 1274 mci->need_flush_btinfo = true;
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mci.h b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
index 0910310ae834..3e51f54b0122 100644
--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.h
+++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.h
@@ -18,6 +18,7 @@
18#define AR9003_MCI_H 18#define AR9003_MCI_H
19 19
20#define MCI_FLAG_DISABLE_TIMESTAMP 0x00000001 /* Disable time stamp */ 20#define MCI_FLAG_DISABLE_TIMESTAMP 0x00000001 /* Disable time stamp */
21#define MCI_RECOVERY_DUR_TSF (100 * 1000) /* 100 ms */
21 22
22/* Default remote BT device MCI COEX version */ 23/* Default remote BT device MCI COEX version */
23#define MCI_GPM_COEX_MAJOR_VERSION_DEFAULT 3 24#define MCI_GPM_COEX_MAJOR_VERSION_DEFAULT 3
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h
index 94e921147e4c..2f84ab273d0c 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.h
+++ b/drivers/net/wireless/ath/ath9k/btcoex.h
@@ -88,6 +88,7 @@ struct ath9k_hw_mci {
88 u8 bt_state; 88 u8 bt_state;
89 u8 stomp_ftp; 89 u8 stomp_ftp;
90 bool concur_tx; 90 bool concur_tx;
91 u32 last_recovery;
91}; 92};
92 93
93struct ath_btcoex_hw { 94struct ath_btcoex_hw {