aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net
diff options
context:
space:
mode:
authorRajkumar Manoharan <rmanohar@qca.qualcomm.com>2012-11-20 08:00:01 -0500
committerJohn W. Linville <linville@tuxdriver.com>2012-11-21 14:16:01 -0500
commit2884561a6472d6f9c960ccf2250a72ca058167a1 (patch)
treecd4b95eae71371652ae97e074166ec7befc6f107 /drivers/net
parentb88083bfb37297330240a478bef76316ee3f1b9b (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.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/btcoex.c1
-rw-r--r--drivers/net/wireless/ath/ath9k/btcoex.h1
-rw-r--r--drivers/net/wireless/ath/ath9k/gpio.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/mci.c18
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
54void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum) 55void 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
732static 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}
732void ath9k_mci_update_rssi(struct ath_softc *sc) 748void 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