Commit d92bb98f authored by Rajkumar Manoharan's avatar Rajkumar Manoharan Committed by John W. Linville

ath9k: flush bt profile whenever it is requested

Before processing BT profiles or status messages, check whether
it is requested to flush BT profile. Otherwise it might increase
number of BT profiles that affects the WLAN performance. Also
flush the profiles when MCI is recovering from broken rx. After
flushing BT profiles, query BT topology to refetch them.
Signed-off-by: default avatarRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent bfbee427
...@@ -1236,6 +1236,10 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type) ...@@ -1236,6 +1236,10 @@ u32 ar9003_mci_state(struct ath_hw *ah, u32 state_type)
case MCI_STATE_NEED_FTP_STOMP: case MCI_STATE_NEED_FTP_STOMP:
value = !(mci->config & ATH_MCI_CONFIG_DISABLE_FTP_STOMP); value = !(mci->config & ATH_MCI_CONFIG_DISABLE_FTP_STOMP);
break; break;
case MCI_STATE_NEED_FLUSH_BT_INFO:
value = (!mci->unhalt_bt_gpm && mci->need_flush_btinfo) ? 1 : 0;
mci->need_flush_btinfo = false;
break;
default: default:
break; break;
} }
......
...@@ -200,6 +200,7 @@ enum mci_state_type { ...@@ -200,6 +200,7 @@ enum mci_state_type {
MCI_STATE_RECOVER_RX, MCI_STATE_RECOVER_RX,
MCI_STATE_NEED_FTP_STOMP, MCI_STATE_NEED_FTP_STOMP,
MCI_STATE_DEBUG, MCI_STATE_DEBUG,
MCI_STATE_NEED_FLUSH_BT_INFO,
MCI_STATE_MAX MCI_STATE_MAX
}; };
...@@ -211,7 +212,8 @@ enum mci_gpm_coex_opcode { ...@@ -211,7 +212,8 @@ enum mci_gpm_coex_opcode {
MCI_GPM_COEX_WLAN_CHANNELS, MCI_GPM_COEX_WLAN_CHANNELS,
MCI_GPM_COEX_BT_PROFILE_INFO, MCI_GPM_COEX_BT_PROFILE_INFO,
MCI_GPM_COEX_BT_STATUS_UPDATE, MCI_GPM_COEX_BT_STATUS_UPDATE,
MCI_GPM_COEX_BT_UPDATE_FLAGS MCI_GPM_COEX_BT_UPDATE_FLAGS,
MCI_GPM_COEX_NOOP,
}; };
#define MCI_GPM_NOMORE 0 #define MCI_GPM_NOMORE 0
......
...@@ -80,6 +80,7 @@ void ath_mci_flush_profile(struct ath_mci_profile *mci) ...@@ -80,6 +80,7 @@ void ath_mci_flush_profile(struct ath_mci_profile *mci)
struct ath_mci_profile_info *info, *tinfo; struct ath_mci_profile_info *info, *tinfo;
mci->aggr_limit = 0; mci->aggr_limit = 0;
mci->num_mgmt = 0;
if (list_empty(&mci->info)) if (list_empty(&mci->info))
return; return;
...@@ -328,6 +329,13 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) ...@@ -328,6 +329,13 @@ static void ath_mci_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload)
u8 major, minor; u8 major, minor;
u32 seq_num; u32 seq_num;
if (ar9003_mci_state(ah, MCI_STATE_NEED_FLUSH_BT_INFO) &&
ar9003_mci_state(ah, MCI_STATE_ENABLE)) {
ath_dbg(common, MCI, "(MCI) Need to flush BT profiles\n");
ath_mci_flush_profile(&sc->btcoex.mci);
ar9003_mci_state(ah, MCI_STATE_SEND_STATUS_QUERY);
}
switch (opcode) { switch (opcode) {
case MCI_GPM_COEX_VERSION_QUERY: case MCI_GPM_COEX_VERSION_QUERY:
ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_COEX_VERSION); ar9003_mci_state(ah, MCI_STATE_SEND_WLAN_COEX_VERSION);
...@@ -568,9 +576,11 @@ void ath_mci_intr(struct ath_softc *sc) ...@@ -568,9 +576,11 @@ void ath_mci_intr(struct ath_softc *sc)
} }
if ((mci_int & AR_MCI_INTERRUPT_RX_INVALID_HDR) || if ((mci_int & AR_MCI_INTERRUPT_RX_INVALID_HDR) ||
(mci_int & AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)) (mci_int & AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT)) {
mci_int &= ~(AR_MCI_INTERRUPT_RX_INVALID_HDR | mci_int &= ~(AR_MCI_INTERRUPT_RX_INVALID_HDR |
AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT); AR_MCI_INTERRUPT_CONT_INFO_TIMEOUT);
ath_mci_msg(sc, MCI_GPM_COEX_NOOP, NULL);
}
} }
void ath_mci_enable(struct ath_softc *sc) void ath_mci_enable(struct ath_softc *sc)
......
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