Signed-off-by: Bala Shanmugam <bkamatch@xxxxxxxxxxxxxxxx> --- .../0002-ath9k-Fix-MCI-reset-in-BT-cal_req.patch | 95 ++++++++++++++++++ ...mp-audio-profiles-on-weak-signal-strength.patch | 105 ++++++++++++++++++++ 2 files changed, 200 insertions(+), 0 deletions(-) create mode 100644 linux-next-pending/0002-ath9k-Fix-MCI-reset-in-BT-cal_req.patch create mode 100644 linux-next-pending/0003-ath9k-stomp-audio-profiles-on-weak-signal-strength.patch diff --git a/linux-next-pending/0002-ath9k-Fix-MCI-reset-in-BT-cal_req.patch b/linux-next-pending/0002-ath9k-Fix-MCI-reset-in-BT-cal_req.patch new file mode 100644 index 0000000..130fce8 --- /dev/null +++ b/linux-next-pending/0002-ath9k-Fix-MCI-reset-in-BT-cal_req.patch @@ -0,0 +1,95 @@ +From 21aac28c0e8a762395364bf99b939cba120f58e8 Mon Sep 17 00:00:00 2001 +From: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx> +Date: Fri, 16 Nov 2012 19:18:01 +0530 +Subject: [PATCH 1/2] ath9k: Fix MCI reset in BT cal_req + +This patch reverts the commit "ath9k_hw: Wait BT calibration to complete" +and bail out from MCI interrupt routine for chip reset. The above commit +stalls the WLAN TCP traffic while bringing up and down the BT interface +iteratively. Fixing this properly by queueing up chip reset and bailing +out properly from tasklet routine. + +Signed-off-by: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx> +--- + drivers/net/wireless/ath/ath9k/ar9003_mci.c | 1 - + drivers/net/wireless/ath/ath9k/debug.c | 3 +++ + drivers/net/wireless/ath/ath9k/debug.h | 1 + + drivers/net/wireless/ath/ath9k/mci.c | 21 +++------------------ + 4 files changed, 7 insertions(+), 19 deletions(-) + +--- a/drivers/net/wireless/ath/ath9k/ar9003_mci.c ++++ b/drivers/net/wireless/ath/ath9k/ar9003_mci.c +@@ -714,7 +714,6 @@ bool ar9003_mci_start_reset(struct ath_h + + return true; + } +-EXPORT_SYMBOL(ar9003_mci_start_reset); + + int ar9003_mci_end_reset(struct ath_hw *ah, struct ath9k_channel *chan, + struct ath9k_hw_cal_data *caldata) +--- a/drivers/net/wireless/ath/ath9k/debug.c ++++ b/drivers/net/wireless/ath/ath9k/debug.c +@@ -837,6 +837,9 @@ static ssize_t read_file_reset(struct fi + len += snprintf(buf + len, sizeof(buf) - len, + "%17s: %2d\n", "PLL RX Hang", + sc->debug.stats.reset[RESET_TYPE_PLL_HANG]); ++ len += snprintf(buf + len, sizeof(buf) - len, ++ "%17s: %2d\n", "MCI Reset", ++ sc->debug.stats.reset[RESET_TYPE_MCI]); + + if (len > sizeof(buf)) + len = sizeof(buf); +--- a/drivers/net/wireless/ath/ath9k/debug.h ++++ b/drivers/net/wireless/ath/ath9k/debug.h +@@ -41,6 +41,7 @@ enum ath_reset_type { + RESET_TYPE_PLL_HANG, + RESET_TYPE_MAC_HANG, + RESET_TYPE_BEACON_STUCK, ++ RESET_TYPE_MCI, + __RESET_TYPE_MAX + }; + +--- a/drivers/net/wireless/ath/ath9k/mci.c ++++ b/drivers/net/wireless/ath/ath9k/mci.c +@@ -207,23 +207,6 @@ skip_tuning: + ath9k_btcoex_timer_resume(sc); + } + +-static void ath_mci_wait_btcal_done(struct ath_softc *sc) +-{ +- struct ath_hw *ah = sc->sc_ah; +- +- /* Stop tx & rx */ +- ieee80211_stop_queues(sc->hw); +- ath_stoprecv(sc); +- ath_drain_all_txq(sc, false); +- +- /* Wait for cal done */ +- ar9003_mci_start_reset(ah, ah->curchan); +- +- /* Resume tx & rx */ +- ath_startrecv(sc); +- ieee80211_wake_queues(sc->hw); +-} +- + static void ath_mci_cal_msg(struct ath_softc *sc, u8 opcode, u8 *rx_payload) + { + struct ath_hw *ah = sc->sc_ah; +@@ -235,7 +218,7 @@ static void ath_mci_cal_msg(struct ath_s + case MCI_GPM_BT_CAL_REQ: + if (mci_hw->bt_state == MCI_BT_AWAKE) { + mci_hw->bt_state = MCI_BT_CAL_START; +- ath_mci_wait_btcal_done(sc); ++ ath9k_queue_reset(sc, RESET_TYPE_MCI); + } + ath_dbg(common, MCI, "MCI State : %d\n", mci_hw->bt_state); + break; +@@ -578,6 +561,8 @@ void ath_mci_intr(struct ath_softc *sc) + mci_int_rxmsg &= ~AR_MCI_INTERRUPT_RX_MSG_GPM; + + while (more_data == MCI_GPM_MORE) { ++ if (test_bit(SC_OP_HW_RESET, &sc->sc_flags)) ++ return; + + pgpm = mci->gpm_buf.bf_addr; + offset = ar9003_mci_get_next_gpm_offset(ah, false, diff --git a/linux-next-pending/0003-ath9k-stomp-audio-profiles-on-weak-signal-strength.patch b/linux-next-pending/0003-ath9k-stomp-audio-profiles-on-weak-signal-strength.patch new file mode 100644 index 0000000..9efbcee --- /dev/null +++ b/linux-next-pending/0003-ath9k-stomp-audio-profiles-on-weak-signal-strength.patch @@ -0,0 +1,105 @@ +From 2b2a2ffa141e1b2d9d4f2699dffcf7e35081089a Mon Sep 17 00:00:00 2001 +From: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx> +Date: Mon, 19 Nov 2012 17:46:25 +0530 +Subject: [PATCH 2/2] ath9k: stomp audio profiles on weak signal strength + +On lower WLAN signal strength, WLAN downlink traffic might suffer +from retransmissions. At the mean time, playing SCO/A2DP profiles +is affecting WLAN stability. In such scenario, by stomping SCO/A2DP +BT traffic completely for a BTCOEX period, gives WLAN traffic an +oppertunity to recover PHY rate. It also improves WLAN stability at +lower RSSI without sacificing BT traffic. + +Signed-off-by: Rajkumar Manoharan <rmanohar@xxxxxxxxxxxxxxxx> +--- + drivers/net/wireless/ath/ath9k/ath9k.h | 1 + + drivers/net/wireless/ath/ath9k/btcoex.c | 1 + + drivers/net/wireless/ath/ath9k/btcoex.h | 1 + + drivers/net/wireless/ath/ath9k/gpio.c | 5 ++++- + drivers/net/wireless/ath/ath9k/mci.c | 18 ++++++++++++++++++ + 5 files changed, 25 insertions(+), 1 deletion(-) + +--- a/drivers/net/wireless/ath/ath9k/ath9k.h ++++ b/drivers/net/wireless/ath/ath9k/ath9k.h +@@ -482,6 +482,7 @@ struct ath_btcoex { + int rssi_count; + struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */ + struct ath_mci_profile mci; ++ u8 stomp_audio; + }; + + #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT +--- a/drivers/net/wireless/ath/ath9k/btcoex.c ++++ b/drivers/net/wireless/ath/ath9k/btcoex.c +@@ -49,6 +49,7 @@ static const u32 mci_wlan_weights[ATH_BT + { 0x01017d01, 0x3b3b3b01, 0x3b3b3b01, 0x3b3b3b3b }, /* STOMP_LOW */ + { 0x01017d01, 0x01010101, 0x01010101, 0x01010101 }, /* STOMP_NONE */ + { 0x01017d01, 0x013b0101, 0x3b3b0101, 0x3b3b013b }, /* STOMP_LOW_FTP */ ++ { 0xffffff01, 0xffffffff, 0xffffff01, 0xffffffff }, /* STOMP_AUDIO */ + }; + + void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum) +--- a/drivers/net/wireless/ath/ath9k/btcoex.h ++++ b/drivers/net/wireless/ath/ath9k/btcoex.h +@@ -50,6 +50,7 @@ enum ath_stomp_type { + ATH_BTCOEX_STOMP_LOW, + ATH_BTCOEX_STOMP_NONE, + ATH_BTCOEX_STOMP_LOW_FTP, ++ ATH_BTCOEX_STOMP_AUDIO, + ATH_BTCOEX_STOMP_MAX + }; + +--- a/drivers/net/wireless/ath/ath9k/gpio.c ++++ b/drivers/net/wireless/ath/ath9k/gpio.c +@@ -247,6 +247,9 @@ static void ath_btcoex_period_timer(unsi + stomp_type = ATH_BTCOEX_STOMP_ALL; + timer_period = btcoex->btscan_no_stomp; + } ++ } else if (btcoex->stomp_audio >= 5) { ++ stomp_type = ATH_BTCOEX_STOMP_AUDIO; ++ btcoex->stomp_audio = 0; + } + + ath9k_hw_btcoex_bt_stomp(ah, stomp_type); +@@ -295,7 +298,7 @@ static void ath_btcoex_no_stomp_timer(vo + (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && + test_bit(BT_OP_SCAN, &btcoex->op_flags))) + ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE); +- else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) ++ else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) + ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW); + + ath9k_hw_btcoex_enable(ah); +--- a/drivers/net/wireless/ath/ath9k/mci.c ++++ b/drivers/net/wireless/ath/ath9k/mci.c +@@ -729,12 +729,30 @@ void ath9k_mci_set_txpower(struct ath_so + ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit, false); + } + ++static void ath9k_mci_stomp_audio(struct ath_softc *sc) ++{ ++ struct ath_hw *ah = sc->sc_ah; ++ struct ath_btcoex *btcoex = &sc->btcoex; ++ struct ath_mci_profile *mci = &btcoex->mci; ++ ++ if (!mci->num_sco && !mci->num_a2dp) ++ return; ++ ++ if (ah->stats.avgbrssi > 25) { ++ btcoex->stomp_audio = 0; ++ return; ++ } ++ ++ btcoex->stomp_audio++; ++} + void ath9k_mci_update_rssi(struct ath_softc *sc) + { + struct ath_hw *ah = sc->sc_ah; + struct ath_btcoex *btcoex = &sc->btcoex; + struct ath9k_hw_mci *mci_hw = &sc->sc_ah->btcoex_hw.mci; + ++ ath9k_mci_stomp_audio(sc); ++ + if (!(mci_hw->config & ATH_MCI_CONFIG_CONCUR_TX)) + return; + -- 1.7.4.1 -- To unsubscribe from this list: send the line "unsubscribe linux-wireless" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html