Commit 2097fdd7 authored by Rajkumar Manoharan's avatar Rajkumar Manoharan Committed by John W. Linville
Browse files

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: default avatarRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent e9f9fd8c
...@@ -1203,7 +1203,7 @@ EXPORT_SYMBOL(ar9003_mci_cleanup); ...@@ -1203,7 +1203,7 @@ EXPORT_SYMBOL(ar9003_mci_cleanup);
u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type) u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
{ {
struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci; struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
u32 value = 0; u32 value = 0, tsf;
u8 query_type; u8 query_type;
switch (state_type) { switch (state_type) {
...@@ -1261,6 +1261,14 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type) ...@@ -1261,6 +1261,14 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
ar9003_mci_send_coex_bt_status_query(ah, true, query_type); ar9003_mci_send_coex_bt_status_query(ah, true, query_type);
break; break;
case MCI_STATE_RECOVER_RX: case MCI_STATE_RECOVER_RX:
tsf = ath9k_hw_gettsf32(ah);
if ((tsf - mci->last_recovery) <= MCI_RECOVERY_DUR_TSF) {
ath_dbg(ath9k_hw_common(ah), MCI,
"(MCI) ignore Rx recovery\n");
break;
}
ath_dbg(ath9k_hw_common(ah), MCI, "(MCI) RECOVER RX\n");
mci->last_recovery = tsf;
ar9003_mci_prep_interface(ah); ar9003_mci_prep_interface(ah);
mci->query_bt = true; mci->query_bt = true;
mci->need_flush_btinfo = true; mci->need_flush_btinfo = true;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#define AR9003_MCI_H #define AR9003_MCI_H
#define MCI_FLAG_DISABLE_TIMESTAMP 0x00000001 /* Disable time stamp */ #define MCI_FLAG_DISABLE_TIMESTAMP 0x00000001 /* Disable time stamp */
#define MCI_RECOVERY_DUR_TSF (100 * 1000) /* 100 ms */
/* Default remote BT device MCI COEX version */ /* Default remote BT device MCI COEX version */
#define MCI_GPM_COEX_MAJOR_VERSION_DEFAULT 3 #define MCI_GPM_COEX_MAJOR_VERSION_DEFAULT 3
......
...@@ -88,6 +88,7 @@ struct ath9k_hw_mci { ...@@ -88,6 +88,7 @@ struct ath9k_hw_mci {
u8 bt_state; u8 bt_state;
u8 stomp_ftp; u8 stomp_ftp;
bool concur_tx; bool concur_tx;
u32 last_recovery;
}; };
struct ath_btcoex_hw { struct ath_btcoex_hw {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment