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) {
                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;
 
 #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