aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/net/wireless/ath/ath9k/btcoex.c64
-rw-r--r--drivers/net/wireless/ath/ath9k/btcoex.h8
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.h5
-rw-r--r--drivers/net/wireless/ath/ath9k/reg.h15
4 files changed, 34 insertions, 58 deletions
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.c b/drivers/net/wireless/ath/ath9k/btcoex.c
index 137a045f0094..064c9001d29a 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.c
+++ b/drivers/net/wireless/ath/ath9k/btcoex.c
@@ -35,6 +35,12 @@ struct ath_btcoex_config {
35 bool bt_hold_rx_clear; 35 bool bt_hold_rx_clear;
36}; 36};
37 37
38static const u32 ar9003_wlan_weights[ATH_BTCOEX_STOMP_MAX]
39 [AR9300_NUM_WLAN_WEIGHTS] = {
40 { 0xfffffff0, 0xfffffff0, 0xfffffff0, 0xfffffff0 }, /* STOMP_ALL */
41 { 0x88888880, 0x88888880, 0x88888880, 0x88888880 }, /* STOMP_LOW */
42 { 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, /* STOMP_NONE */
43};
38 44
39void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum) 45void ath9k_hw_init_btcoex_hw(struct ath_hw *ah, int qnum)
40{ 46{
@@ -151,27 +157,26 @@ EXPORT_SYMBOL(ath9k_hw_btcoex_set_weight);
151 157
152static void ath9k_hw_btcoex_enable_3wire(struct ath_hw *ah) 158static void ath9k_hw_btcoex_enable_3wire(struct ath_hw *ah)
153{ 159{
154 struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw; 160 struct ath_btcoex_hw *btcoex = &ah->btcoex_hw;
155 u32 val; 161 u32 val;
162 int i;
156 163
157 /* 164 /*
158 * Program coex mode and weight registers to 165 * Program coex mode and weight registers to
159 * enable coex 3-wire 166 * enable coex 3-wire
160 */ 167 */
161 REG_WRITE(ah, AR_BT_COEX_MODE, btcoex_hw->bt_coex_mode); 168 REG_WRITE(ah, AR_BT_COEX_MODE, btcoex->bt_coex_mode);
162 REG_WRITE(ah, AR_BT_COEX_MODE2, btcoex_hw->bt_coex_mode2); 169 REG_WRITE(ah, AR_BT_COEX_MODE2, btcoex->bt_coex_mode2);
163 170
164 171
165 if (AR_SREV_9300_20_OR_LATER(ah)) { 172 if (AR_SREV_9300_20_OR_LATER(ah)) {
166 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS0, ah->bt_coex_wlan_weight[0]); 173 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS0, btcoex->wlan_weight[0]);
167 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS1, ah->bt_coex_wlan_weight[1]); 174 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS1, btcoex->wlan_weight[1]);
168 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS0, ah->bt_coex_bt_weight[0]); 175 for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++)
169 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS1, ah->bt_coex_bt_weight[1]); 176 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS(i),
170 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS2, ah->bt_coex_bt_weight[2]); 177 btcoex->bt_weight[i]);
171 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS3, ah->bt_coex_bt_weight[3]);
172
173 } else 178 } else
174 REG_WRITE(ah, AR_BT_COEX_WEIGHT, btcoex_hw->bt_coex_weights); 179 REG_WRITE(ah, AR_BT_COEX_WEIGHT, btcoex->bt_coex_weights);
175 180
176 181
177 182
@@ -184,7 +189,7 @@ static void ath9k_hw_btcoex_enable_3wire(struct ath_hw *ah)
184 REG_RMW_FIELD(ah, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1); 189 REG_RMW_FIELD(ah, AR_QUIET1, AR_QUIET1_QUIET_ACK_CTS_ENABLE, 1);
185 REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0); 190 REG_RMW_FIELD(ah, AR_PCU_MISC, AR_PCU_BT_ANT_PREVENT_RX, 0);
186 191
187 ath9k_hw_cfg_output(ah, btcoex_hw->wlanactive_gpio, 192 ath9k_hw_cfg_output(ah, btcoex->wlanactive_gpio,
188 AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL); 193 AR_GPIO_OUTPUT_MUX_AS_RX_CLEAR_EXTERNAL);
189} 194}
190 195
@@ -214,6 +219,7 @@ EXPORT_SYMBOL(ath9k_hw_btcoex_enable);
214void ath9k_hw_btcoex_disable(struct ath_hw *ah) 219void ath9k_hw_btcoex_disable(struct ath_hw *ah)
215{ 220{
216 struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw; 221 struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
222 int i;
217 223
218 ath9k_hw_set_gpio(ah, btcoex_hw->wlanactive_gpio, 0); 224 ath9k_hw_set_gpio(ah, btcoex_hw->wlanactive_gpio, 0);
219 225
@@ -227,10 +233,8 @@ void ath9k_hw_btcoex_disable(struct ath_hw *ah)
227 if (AR_SREV_9300_20_OR_LATER(ah)) { 233 if (AR_SREV_9300_20_OR_LATER(ah)) {
228 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS0, 0); 234 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS0, 0);
229 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS1, 0); 235 REG_WRITE(ah, AR_BT_COEX_WL_WEIGHTS1, 0);
230 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS0, 0); 236 for (i = 0; i < AR9300_NUM_BT_WEIGHTS; i++)
231 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS1, 0); 237 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS(i), 0);
232 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS2, 0);
233 REG_WRITE(ah, AR_BT_COEX_BT_WEIGHTS3, 0);
234 } else 238 } else
235 REG_WRITE(ah, AR_BT_COEX_WEIGHT, 0); 239 REG_WRITE(ah, AR_BT_COEX_WEIGHT, 0);
236 240
@@ -243,30 +247,12 @@ EXPORT_SYMBOL(ath9k_hw_btcoex_disable);
243static void ar9003_btcoex_bt_stomp(struct ath_hw *ah, 247static void ar9003_btcoex_bt_stomp(struct ath_hw *ah,
244 enum ath_stomp_type stomp_type) 248 enum ath_stomp_type stomp_type)
245{ 249{
246 ah->bt_coex_bt_weight[0] = AR9300_BT_WGHT; 250 struct ath_btcoex_hw *btcoex = &ah->btcoex_hw;
247 ah->bt_coex_bt_weight[1] = AR9300_BT_WGHT; 251 int i;
248 ah->bt_coex_bt_weight[2] = AR9300_BT_WGHT;
249 ah->bt_coex_bt_weight[3] = AR9300_BT_WGHT;
250
251 252
252 switch (stomp_type) { 253 for (i = 0; i < AR9300_NUM_WLAN_WEIGHTS; i++) {
253 case ATH_BTCOEX_STOMP_ALL: 254 btcoex->bt_weight[i] = AR9300_BT_WGHT;
254 ah->bt_coex_wlan_weight[0] = AR9300_STOMP_ALL_WLAN_WGHT0; 255 btcoex->wlan_weight[i] = ar9003_wlan_weights[stomp_type][i];
255 ah->bt_coex_wlan_weight[1] = AR9300_STOMP_ALL_WLAN_WGHT1;
256 break;
257 case ATH_BTCOEX_STOMP_LOW:
258 ah->bt_coex_wlan_weight[0] = AR9300_STOMP_LOW_WLAN_WGHT0;
259 ah->bt_coex_wlan_weight[1] = AR9300_STOMP_LOW_WLAN_WGHT1;
260 break;
261 case ATH_BTCOEX_STOMP_NONE:
262 ah->bt_coex_wlan_weight[0] = AR9300_STOMP_NONE_WLAN_WGHT0;
263 ah->bt_coex_wlan_weight[1] = AR9300_STOMP_NONE_WLAN_WGHT1;
264 break;
265
266 default:
267 ath_dbg(ath9k_hw_common(ah), ATH_DBG_BTCOEX,
268 "Invalid Stomptype\n");
269 break;
270 } 256 }
271} 257}
272 258
diff --git a/drivers/net/wireless/ath/ath9k/btcoex.h b/drivers/net/wireless/ath/ath9k/btcoex.h
index 234f77689b14..34acb5121a2e 100644
--- a/drivers/net/wireless/ath/ath9k/btcoex.h
+++ b/drivers/net/wireless/ath/ath9k/btcoex.h
@@ -36,12 +36,14 @@
36#define ATH_BT_CNT_THRESHOLD 3 36#define ATH_BT_CNT_THRESHOLD 3
37#define ATH_BT_CNT_SCAN_THRESHOLD 15 37#define ATH_BT_CNT_SCAN_THRESHOLD 15
38 38
39#define AR9300_NUM_BT_WEIGHTS 4
40#define AR9300_NUM_WLAN_WEIGHTS 4
39/* Defines the BT AR_BT_COEX_WGHT used */ 41/* Defines the BT AR_BT_COEX_WGHT used */
40enum ath_stomp_type { 42enum ath_stomp_type {
41 ATH_BTCOEX_NO_STOMP,
42 ATH_BTCOEX_STOMP_ALL, 43 ATH_BTCOEX_STOMP_ALL,
43 ATH_BTCOEX_STOMP_LOW, 44 ATH_BTCOEX_STOMP_LOW,
44 ATH_BTCOEX_STOMP_NONE 45 ATH_BTCOEX_STOMP_NONE,
46 ATH_BTCOEX_STOMP_MAX
45}; 47};
46 48
47enum ath_btcoex_scheme { 49enum ath_btcoex_scheme {
@@ -59,6 +61,8 @@ struct ath_btcoex_hw {
59 u32 bt_coex_mode; /* Register setting for AR_BT_COEX_MODE */ 61 u32 bt_coex_mode; /* Register setting for AR_BT_COEX_MODE */
60 u32 bt_coex_weights; /* Register setting for AR_BT_COEX_WEIGHT */ 62 u32 bt_coex_weights; /* Register setting for AR_BT_COEX_WEIGHT */
61 u32 bt_coex_mode2; /* Register setting for AR_BT_COEX_MODE2 */ 63 u32 bt_coex_mode2; /* Register setting for AR_BT_COEX_MODE2 */
64 u32 bt_weight[AR9300_NUM_BT_WEIGHTS];
65 u32 wlan_weight[AR9300_NUM_WLAN_WEIGHTS];
62}; 66};
63 67
64void ath9k_hw_btcoex_init_2wire(struct ath_hw *ah); 68void ath9k_hw_btcoex_init_2wire(struct ath_hw *ah);
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h
index 33e8f2f9d425..3cb878c28ccf 100644
--- a/drivers/net/wireless/ath/ath9k/hw.h
+++ b/drivers/net/wireless/ath/ath9k/hw.h
@@ -59,9 +59,6 @@
59#define AT9285_COEX3WIRE_SA_SUBSYSID 0x30aa 59#define AT9285_COEX3WIRE_SA_SUBSYSID 0x30aa
60#define AT9285_COEX3WIRE_DA_SUBSYSID 0x30ab 60#define AT9285_COEX3WIRE_DA_SUBSYSID 0x30ab
61 61
62#define AR9300_NUM_BT_WEIGHTS 4
63#define AR9300_NUM_WLAN_WEIGHTS 4
64
65#define ATH_AMPDU_LIMIT_MAX (64 * 1024 - 1) 62#define ATH_AMPDU_LIMIT_MAX (64 * 1024 - 1)
66 63
67#define ATH_DEFAULT_NOISE_FLOOR -95 64#define ATH_DEFAULT_NOISE_FLOOR -95
@@ -802,8 +799,6 @@ struct ath_hw {
802 799
803 /* Bluetooth coexistance */ 800 /* Bluetooth coexistance */
804 struct ath_btcoex_hw btcoex_hw; 801 struct ath_btcoex_hw btcoex_hw;
805 u32 bt_coex_bt_weight[AR9300_NUM_BT_WEIGHTS];
806 u32 bt_coex_wlan_weight[AR9300_NUM_WLAN_WEIGHTS];
807 802
808 u32 intr_txqs; 803 u32 intr_txqs;
809 u8 txchainmask; 804 u8 txchainmask;
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h
index 8fcb7e9e8399..e17236dbb6c9 100644
--- a/drivers/net/wireless/ath/ath9k/reg.h
+++ b/drivers/net/wireless/ath/ath9k/reg.h
@@ -1753,18 +1753,9 @@ enum {
1753#define AR_BT_COEX_WL_WEIGHTS0 0x8174 1753#define AR_BT_COEX_WL_WEIGHTS0 0x8174
1754#define AR_BT_COEX_WL_WEIGHTS1 0x81c4 1754#define AR_BT_COEX_WL_WEIGHTS1 0x81c4
1755 1755
1756#define AR_BT_COEX_BT_WEIGHTS0 0x83ac 1756#define AR_BT_COEX_BT_WEIGHTS(_i) (0x83ac + (_i << 2))
1757#define AR_BT_COEX_BT_WEIGHTS1 0x83b0 1757
1758#define AR_BT_COEX_BT_WEIGHTS2 0x83b4 1758#define AR9300_BT_WGHT 0xcccc4444
1759#define AR_BT_COEX_BT_WEIGHTS3 0x83b8
1760
1761#define AR9300_BT_WGHT 0xcccc4444
1762#define AR9300_STOMP_ALL_WLAN_WGHT0 0xfffffff0
1763#define AR9300_STOMP_ALL_WLAN_WGHT1 0xfffffff0
1764#define AR9300_STOMP_LOW_WLAN_WGHT0 0x88888880
1765#define AR9300_STOMP_LOW_WLAN_WGHT1 0x88888880
1766#define AR9300_STOMP_NONE_WLAN_WGHT0 0x00000000
1767#define AR9300_STOMP_NONE_WLAN_WGHT1 0x00000000
1768 1759
1769#define AR_BT_COEX_MODE2 0x817c 1760#define AR_BT_COEX_MODE2 0x817c
1770#define AR_BT_BCN_MISS_THRESH 0x000000ff 1761#define AR_BT_BCN_MISS_THRESH 0x000000ff