ath9k_hw: Fix frequent BT rx recovery
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Mon, 15 Oct 2012 09:59:50 +0000 (15:29 +0530)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 29 Oct 2012 19:19:29 +0000 (15:19 -0400)
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>
drivers/net/wireless/ath/ath9k/ar9003_mci.c
drivers/net/wireless/ath/ath9k/ar9003_mci.h
drivers/net/wireless/ath/ath9k/btcoex.h

index 87d9c348e5980ed42e2879f945dad5fb30c93fb5..b04fa46228225f0ba0e38c9ef1b8e81ac4bb6d22 100644 (file)
@@ -1203,7 +1203,7 @@ EXPORT_SYMBOL(ar9003_mci_cleanup);
 u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
 {
        struct ath9k_hw_mci *mci = &ah->btcoex_hw.mci;
-       u32 value = 0;
+       u32 value = 0, tsf;
        u8 query_type;
 
        switch (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);
                break;
        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);
                mci->query_bt = true;
                mci->need_flush_btinfo = true;
index 0910310ae834ef974aa2938a495fd94f07fd6ca9..3e51f54b012261621ddf51d46fa02065763cf3fc 100644 (file)
@@ -18,6 +18,7 @@
 #define AR9003_MCI_H
 
 #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 */
 #define MCI_GPM_COEX_MAJOR_VERSION_DEFAULT  3
index 94e921147e4ce6d9da09394d778d0beeb125e8ed..2f84ab273d0c3950bc74696150aa1d1d3adc046a 100644 (file)
@@ -88,6 +88,7 @@ struct ath9k_hw_mci {
        u8 bt_state;
        u8 stomp_ftp;
        bool concur_tx;
+       u32 last_recovery;
 };
 
 struct ath_btcoex_hw {