diff options
author | Rajkumar Manoharan <rmanohar@qca.qualcomm.com> | 2012-11-20 08:00:01 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2012-11-21 14:16:01 -0500 |
commit | 2884561a6472d6f9c960ccf2250a72ca058167a1 (patch) | |
tree | cd4b95eae71371652ae97e074166ec7befc6f107 /drivers/net | |
parent | b88083bfb37297330240a478bef76316ee3f1b9b (diff) |
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@qca.qualcomm.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ath9k.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/btcoex.c | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/btcoex.h | 1 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/gpio.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mci.c | 18 |
5 files changed, 25 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index 9a93d2bb8f66..04fa5f350e8c 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -488,6 +488,7 @@ struct ath_btcoex { | |||
488 | int rssi_count; | 488 | int rssi_count; |
489 | struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */ | 489 | struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */ |
490 | struct ath_mci_profile mci; | 490 | struct ath_mci_profile mci; |
491 | u8 stomp_audio; | ||
491 | }; | 492 | }; |
492 | 493 | ||
493 | #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT | 494 | #ifdef CONFIG_ATH9K_BTCOEX_SUPPORT |
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.c b/drivers/net/wireless/ath/ath9k/btcoex.c index c90e9bc4b026..9963b0bf9f72 100644 --- 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_BTCOEX_STOMP_MAX] | |||
49 | { 0x01017d01, 0x3b3b3b01, 0x3b3b3b01, 0x3b3b3b3b }, /* STOMP_LOW */ | 49 | { 0x01017d01, 0x3b3b3b01, 0x3b3b3b01, 0x3b3b3b3b }, /* STOMP_LOW */ |
50 | { 0x01017d01, 0x01010101, 0x01010101, 0x01010101 }, /* STOMP_NONE */ | 50 | { 0x01017d01, 0x01010101, 0x01010101, 0x01010101 }, /* STOMP_NONE */ |
51 | { 0x01017d01, 0x013b0101, 0x3b3b0101, 0x3b3b013b }, /* STOMP_LOW_FTP */ | 51 | { 0x01017d01, 0x013b0101, 0x3b3b0101, 0x3b3b013b }, /* STOMP_LOW_FTP */ |
52 | { 0xffffff01, 0xffffffff, 0xffffff01, 0xffffffff }, /* STOMP_AUDIO */ | ||
52 | }; | 53 | }; |
53 | 54 | ||
54 | void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum) | 55 | void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum) |
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h index 2f84ab273d0c..6de26ea5d5fa 100644 --- a/drivers/net/wireless/ath/ath9k/btcoex.h +++ b/drivers/net/wireless/ath/ath9k/btcoex.h | |||
@@ -50,6 +50,7 @@ enum ath_stomp_type { | |||
50 | ATH_BTCOEX_STOMP_LOW, | 50 | ATH_BTCOEX_STOMP_LOW, |
51 | ATH_BTCOEX_STOMP_NONE, | 51 | ATH_BTCOEX_STOMP_NONE, |
52 | ATH_BTCOEX_STOMP_LOW_FTP, | 52 | ATH_BTCOEX_STOMP_LOW_FTP, |
53 | ATH_BTCOEX_STOMP_AUDIO, | ||
53 | ATH_BTCOEX_STOMP_MAX | 54 | ATH_BTCOEX_STOMP_MAX |
54 | }; | 55 | }; |
55 | 56 | ||
diff --git a/drivers/net/wireless/ath/ath9k/gpio.c b/drivers/net/wireless/ath/ath9k/gpio.c index 4236df8ffe67..7b39cc14662d 100644 --- 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(unsigned long data) | |||
247 | stomp_type = ATH_BTCOEX_STOMP_ALL; | 247 | stomp_type = ATH_BTCOEX_STOMP_ALL; |
248 | timer_period = btcoex->btscan_no_stomp; | 248 | timer_period = btcoex->btscan_no_stomp; |
249 | } | 249 | } |
250 | } else if (btcoex->stomp_audio >= 5) { | ||
251 | stomp_type = ATH_BTCOEX_STOMP_AUDIO; | ||
252 | btcoex->stomp_audio = 0; | ||
250 | } | 253 | } |
251 | 254 | ||
252 | ath9k_hw_btcoex_bt_stomp(ah, stomp_type); | 255 | ath9k_hw_btcoex_bt_stomp(ah, stomp_type); |
@@ -295,7 +298,7 @@ static void ath_btcoex_no_stomp_timer(void *arg) | |||
295 | (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && | 298 | (!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && |
296 | test_bit(BT_OP_SCAN, &btcoex->op_flags))) | 299 | test_bit(BT_OP_SCAN, &btcoex->op_flags))) |
297 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE); | 300 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_NONE); |
298 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) | 301 | else if (btcoex->bt_stomp_type == ATH_BTCOEX_STOMP_ALL) |
299 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW); | 302 | ath9k_hw_btcoex_bt_stomp(ah, ATH_BTCOEX_STOMP_LOW); |
300 | 303 | ||
301 | ath9k_hw_btcoex_enable(ah); | 304 | ath9k_hw_btcoex_enable(ah); |
diff --git a/drivers/net/wireless/ath/ath9k/mci.c b/drivers/net/wireless/ath/ath9k/mci.c index ece192d77355..706378ea3ba2 100644 --- 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_softc *sc, bool setchannel, | |||
729 | ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit, false); | 729 | ath9k_hw_set_txpowerlimit(ah, sc->config.txpowlimit, false); |
730 | } | 730 | } |
731 | 731 | ||
732 | static void ath9k_mci_stomp_audio(struct ath_softc *sc) | ||
733 | { | ||
734 | struct ath_hw *ah = sc->sc_ah; | ||
735 | struct ath_btcoex *btcoex = &sc->btcoex; | ||
736 | struct ath_mci_profile *mci = &btcoex->mci; | ||
737 | |||
738 | if (!mci->num_sco && !mci->num_a2dp) | ||
739 | return; | ||
740 | |||
741 | if (ah->stats.avgbrssi > 25) { | ||
742 | btcoex->stomp_audio = 0; | ||
743 | return; | ||
744 | } | ||
745 | |||
746 | btcoex->stomp_audio++; | ||
747 | } | ||
732 | void ath9k_mci_update_rssi(struct ath_softc *sc) | 748 | void ath9k_mci_update_rssi(struct ath_softc *sc) |
733 | { | 749 | { |
734 | struct ath_hw *ah = sc->sc_ah; | 750 | struct ath_hw *ah = sc->sc_ah; |
735 | struct ath_btcoex *btcoex = &sc->btcoex; | 751 | struct ath_btcoex *btcoex = &sc->btcoex; |
736 | struct ath9k_hw_mci *mci_hw = &sc->sc_ah->btcoex_hw.mci; | 752 | struct ath9k_hw_mci *mci_hw = &sc->sc_ah->btcoex_hw.mci; |
737 | 753 | ||
754 | ath9k_mci_stomp_audio(sc); | ||
755 | |||
738 | if (!(mci_hw->config & ATH_MCI_CONFIG_CONCUR_TX)) | 756 | if (!(mci_hw->config & ATH_MCI_CONFIG_CONCUR_TX)) |
739 | return; | 757 | return; |
740 | 758 | ||