bcaeee90639d58ba42627a7f972c9751b0330f00
[openwrt/staging/mkresin.git] / package / kernel / mac80211 / patches / 300-pending_work.patch
1 --- a/drivers/net/wireless/ath/ath10k/mac.c
2 +++ b/drivers/net/wireless/ath/ath10k/mac.c
3 @@ -1351,12 +1351,12 @@ static int ath10k_update_channel_list(st
4 ch->allow_vht = true;
5
6 ch->allow_ibss =
7 - !(channel->flags & IEEE80211_CHAN_NO_IBSS);
8 + !(channel->flags & IEEE80211_CHAN_NO_IR);
9
10 ch->ht40plus =
11 !(channel->flags & IEEE80211_CHAN_NO_HT40PLUS);
12
13 - passive = channel->flags & IEEE80211_CHAN_PASSIVE_SCAN;
14 + passive = channel->flags & IEEE80211_CHAN_NO_IR;
15 ch->passive = passive;
16
17 ch->freq = channel->center_freq;
18 --- a/drivers/net/wireless/ath/ath9k/Kconfig
19 +++ b/drivers/net/wireless/ath/ath9k/Kconfig
20 @@ -90,7 +90,7 @@ config ATH9K_DFS_CERTIFIED
21
22 config ATH9K_TX99
23 bool "Atheros ath9k TX99 testing support"
24 - depends on CFG80211_CERTIFICATION_ONUS
25 + depends on ATH9K_DEBUGFS && CFG80211_CERTIFICATION_ONUS
26 default n
27 ---help---
28 Say N. This should only be enabled on systems undergoing
29 @@ -108,6 +108,14 @@ config ATH9K_TX99
30 be evaluated to meet the RF exposure limits set forth in the
31 governmental SAR regulations.
32
33 +config ATH9K_WOW
34 + bool "Wake on Wireless LAN support (EXPERIMENTAL)"
35 + depends on ATH9K && PM
36 + default n
37 + ---help---
38 + This option enables Wake on Wireless LAN support for certain cards.
39 + Currently, AR9462 is supported.
40 +
41 config ATH9K_LEGACY_RATE_CONTROL
42 bool "Atheros ath9k rate control"
43 depends on ATH9K
44 --- a/drivers/net/wireless/ath/ath9k/Makefile
45 +++ b/drivers/net/wireless/ath/ath9k/Makefile
46 @@ -11,11 +11,13 @@ ath9k-$(CPTCFG_ATH9K_BTCOEX_SUPPORT) +=
47 ath9k-$(CPTCFG_ATH9K_LEGACY_RATE_CONTROL) += rc.o
48 ath9k-$(CPTCFG_ATH9K_PCI) += pci.o
49 ath9k-$(CPTCFG_ATH9K_AHB) += ahb.o
50 -ath9k-$(CPTCFG_ATH9K_DEBUGFS) += debug.o
51 ath9k-$(CPTCFG_ATH9K_DFS_DEBUGFS) += dfs_debug.o
52 -ath9k-$(CPTCFG_ATH9K_DFS_CERTIFIED) += \
53 - dfs.o
54 -ath9k-$(CONFIG_PM_SLEEP) += wow.o
55 +ath9k-$(CPTCFG_ATH9K_DFS_CERTIFIED) += dfs.o
56 +ath9k-$(CPTCFG_ATH9K_TX99) += tx99.o
57 +ath9k-$(CPTCFG_ATH9K_WOW) += wow.o
58 +
59 +ath9k-$(CPTCFG_ATH9K_DEBUGFS) += debug.o \
60 + spectral.o
61
62 obj-$(CPTCFG_ATH9K) += ath9k.o
63
64 @@ -41,6 +43,8 @@ ath9k_hw-y:= \
65 ar9003_eeprom.o \
66 ar9003_paprd.o
67
68 +ath9k_hw-$(CPTCFG_ATH9K_WOW) += ar9003_wow.o
69 +
70 ath9k_hw-$(CPTCFG_ATH9K_BTCOEX_SUPPORT) += btcoex.o \
71 ar9003_mci.o
72 obj-$(CPTCFG_ATH9K_HW) += ath9k_hw.o
73 --- a/drivers/net/wireless/ath/ath9k/ar9003_hw.c
74 +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c
75 @@ -17,6 +17,7 @@
76 #include "hw.h"
77 #include "ar9003_mac.h"
78 #include "ar9003_2p2_initvals.h"
79 +#include "ar9003_buffalo_initvals.h"
80 #include "ar9485_initvals.h"
81 #include "ar9340_initvals.h"
82 #include "ar9330_1p1_initvals.h"
83 @@ -26,6 +27,7 @@
84 #include "ar9462_2p0_initvals.h"
85 #include "ar9462_2p1_initvals.h"
86 #include "ar9565_1p0_initvals.h"
87 +#include "ar9565_1p1_initvals.h"
88
89 /* General hardware code for the AR9003 hadware family */
90
91 @@ -148,7 +150,11 @@ static void ar9003_hw_init_mode_regs(str
92 ar9340Modes_high_ob_db_tx_gain_table_1p0);
93
94 INIT_INI_ARRAY(&ah->iniModesFastClock,
95 - ar9340Modes_fast_clock_1p0);
96 + ar9340Modes_fast_clock_1p0);
97 + INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
98 + ar9340_1p0_baseband_core_txfir_coeff_japan_2484);
99 + INIT_INI_ARRAY(&ah->ini_dfs,
100 + ar9340_1p0_baseband_postamble_dfs_channel);
101
102 if (!ah->is_clk_25mhz)
103 INIT_INI_ARRAY(&ah->iniAdditional,
104 @@ -187,17 +193,17 @@ static void ar9003_hw_init_mode_regs(str
105 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
106 ar9485_1_1_baseband_core_txfir_coeff_japan_2484);
107
108 - /* Load PCIE SERDES settings from INI */
109 -
110 - /* Awake Setting */
111 -
112 - INIT_INI_ARRAY(&ah->iniPcieSerdes,
113 - ar9485_1_1_pcie_phy_clkreq_disable_L1);
114 -
115 - /* Sleep Setting */
116 -
117 - INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
118 - ar9485_1_1_pcie_phy_clkreq_disable_L1);
119 + if (ah->config.no_pll_pwrsave) {
120 + INIT_INI_ARRAY(&ah->iniPcieSerdes,
121 + ar9485_1_1_pcie_phy_clkreq_disable_L1);
122 + INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
123 + ar9485_1_1_pcie_phy_clkreq_disable_L1);
124 + } else {
125 + INIT_INI_ARRAY(&ah->iniPcieSerdes,
126 + ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
127 + INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
128 + ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
129 + }
130 } else if (AR_SREV_9462_21(ah)) {
131 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
132 ar9462_2p1_mac_core);
133 @@ -223,6 +229,10 @@ static void ar9003_hw_init_mode_regs(str
134 ar9462_2p1_modes_fast_clock);
135 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
136 ar9462_2p1_baseband_core_txfir_coeff_japan_2484);
137 + INIT_INI_ARRAY(&ah->iniPcieSerdes,
138 + ar9462_2p1_pciephy_clkreq_disable_L1);
139 + INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
140 + ar9462_2p1_pciephy_clkreq_disable_L1);
141 } else if (AR_SREV_9462_20(ah)) {
142
143 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core);
144 @@ -247,18 +257,18 @@ static void ar9003_hw_init_mode_regs(str
145 ar9462_2p0_soc_postamble);
146
147 INIT_INI_ARRAY(&ah->iniModesRxGain,
148 - ar9462_common_rx_gain_table_2p0);
149 + ar9462_2p0_common_rx_gain);
150
151 /* Awake -> Sleep Setting */
152 INIT_INI_ARRAY(&ah->iniPcieSerdes,
153 - ar9462_pciephy_clkreq_disable_L1_2p0);
154 + ar9462_2p0_pciephy_clkreq_disable_L1);
155 /* Sleep -> Awake Setting */
156 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
157 - ar9462_pciephy_clkreq_disable_L1_2p0);
158 + ar9462_2p0_pciephy_clkreq_disable_L1);
159
160 /* Fast clock modal settings */
161 INIT_INI_ARRAY(&ah->iniModesFastClock,
162 - ar9462_modes_fast_clock_2p0);
163 + ar9462_2p0_modes_fast_clock);
164
165 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
166 ar9462_2p0_baseband_core_txfir_coeff_japan_2484);
167 @@ -330,7 +340,46 @@ static void ar9003_hw_init_mode_regs(str
168 ar9580_1p0_low_ob_db_tx_gain_table);
169
170 INIT_INI_ARRAY(&ah->iniModesFastClock,
171 - ar9580_1p0_modes_fast_clock);
172 + ar9580_1p0_modes_fast_clock);
173 + INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
174 + ar9580_1p0_baseband_core_txfir_coeff_japan_2484);
175 + INIT_INI_ARRAY(&ah->ini_dfs,
176 + ar9580_1p0_baseband_postamble_dfs_channel);
177 + } else if (AR_SREV_9565_11_OR_LATER(ah)) {
178 + INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
179 + ar9565_1p1_mac_core);
180 + INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
181 + ar9565_1p1_mac_postamble);
182 +
183 + INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
184 + ar9565_1p1_baseband_core);
185 + INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
186 + ar9565_1p1_baseband_postamble);
187 +
188 + INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
189 + ar9565_1p1_radio_core);
190 + INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
191 + ar9565_1p1_radio_postamble);
192 +
193 + INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
194 + ar9565_1p1_soc_preamble);
195 + INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
196 + ar9565_1p1_soc_postamble);
197 +
198 + INIT_INI_ARRAY(&ah->iniModesRxGain,
199 + ar9565_1p1_Common_rx_gain_table);
200 + INIT_INI_ARRAY(&ah->iniModesTxGain,
201 + ar9565_1p1_Modes_lowest_ob_db_tx_gain_table);
202 +
203 + INIT_INI_ARRAY(&ah->iniPcieSerdes,
204 + ar9565_1p1_pciephy_clkreq_disable_L1);
205 + INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
206 + ar9565_1p1_pciephy_clkreq_disable_L1);
207 +
208 + INIT_INI_ARRAY(&ah->iniModesFastClock,
209 + ar9565_1p1_modes_fast_clock);
210 + INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
211 + ar9565_1p1_baseband_core_txfir_coeff_japan_2484);
212 } else if (AR_SREV_9565(ah)) {
213 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
214 ar9565_1p0_mac_core);
215 @@ -411,7 +460,11 @@ static void ar9003_hw_init_mode_regs(str
216
217 /* Fast clock modal settings */
218 INIT_INI_ARRAY(&ah->iniModesFastClock,
219 - ar9300Modes_fast_clock_2p2);
220 + ar9300Modes_fast_clock_2p2);
221 + INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
222 + ar9300_2p2_baseband_core_txfir_coeff_japan_2484);
223 + INIT_INI_ARRAY(&ah->ini_dfs,
224 + ar9300_2p2_baseband_postamble_dfs_channel);
225 }
226 }
227
228 @@ -440,7 +493,10 @@ static void ar9003_tx_gain_table_mode0(s
229 ar9462_2p1_modes_low_ob_db_tx_gain);
230 else if (AR_SREV_9462_20(ah))
231 INIT_INI_ARRAY(&ah->iniModesTxGain,
232 - ar9462_modes_low_ob_db_tx_gain_table_2p0);
233 + ar9462_2p0_modes_low_ob_db_tx_gain);
234 + else if (AR_SREV_9565_11(ah))
235 + INIT_INI_ARRAY(&ah->iniModesTxGain,
236 + ar9565_1p1_modes_low_ob_db_tx_gain_table);
237 else if (AR_SREV_9565(ah))
238 INIT_INI_ARRAY(&ah->iniModesTxGain,
239 ar9565_1p0_modes_low_ob_db_tx_gain_table);
240 @@ -474,7 +530,10 @@ static void ar9003_tx_gain_table_mode1(s
241 ar9462_2p1_modes_high_ob_db_tx_gain);
242 else if (AR_SREV_9462_20(ah))
243 INIT_INI_ARRAY(&ah->iniModesTxGain,
244 - ar9462_modes_high_ob_db_tx_gain_table_2p0);
245 + ar9462_2p0_modes_high_ob_db_tx_gain);
246 + else if (AR_SREV_9565_11(ah))
247 + INIT_INI_ARRAY(&ah->iniModesTxGain,
248 + ar9565_1p1_modes_high_ob_db_tx_gain_table);
249 else if (AR_SREV_9565(ah))
250 INIT_INI_ARRAY(&ah->iniModesTxGain,
251 ar9565_1p0_modes_high_ob_db_tx_gain_table);
252 @@ -500,6 +559,9 @@ static void ar9003_tx_gain_table_mode2(s
253 else if (AR_SREV_9580(ah))
254 INIT_INI_ARRAY(&ah->iniModesTxGain,
255 ar9580_1p0_low_ob_db_tx_gain_table);
256 + else if (AR_SREV_9565_11(ah))
257 + INIT_INI_ARRAY(&ah->iniModesTxGain,
258 + ar9565_1p1_modes_low_ob_db_tx_gain_table);
259 else if (AR_SREV_9565(ah))
260 INIT_INI_ARRAY(&ah->iniModesTxGain,
261 ar9565_1p0_modes_low_ob_db_tx_gain_table);
262 @@ -525,12 +587,20 @@ static void ar9003_tx_gain_table_mode3(s
263 else if (AR_SREV_9580(ah))
264 INIT_INI_ARRAY(&ah->iniModesTxGain,
265 ar9580_1p0_high_power_tx_gain_table);
266 + else if (AR_SREV_9565_11(ah))
267 + INIT_INI_ARRAY(&ah->iniModesTxGain,
268 + ar9565_1p1_modes_high_power_tx_gain_table);
269 else if (AR_SREV_9565(ah))
270 INIT_INI_ARRAY(&ah->iniModesTxGain,
271 ar9565_1p0_modes_high_power_tx_gain_table);
272 - else
273 - INIT_INI_ARRAY(&ah->iniModesTxGain,
274 - ar9300Modes_high_power_tx_gain_table_2p2);
275 + else {
276 + if (ah->config.tx_gain_buffalo)
277 + INIT_INI_ARRAY(&ah->iniModesTxGain,
278 + ar9300Modes_high_power_tx_gain_table_buffalo);
279 + else
280 + INIT_INI_ARRAY(&ah->iniModesTxGain,
281 + ar9300Modes_high_power_tx_gain_table_2p2);
282 + }
283 }
284
285 static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
286 @@ -546,7 +616,7 @@ static void ar9003_tx_gain_table_mode4(s
287 ar9462_2p1_modes_mix_ob_db_tx_gain);
288 else if (AR_SREV_9462_20(ah))
289 INIT_INI_ARRAY(&ah->iniModesTxGain,
290 - ar9462_modes_mix_ob_db_tx_gain_table_2p0);
291 + ar9462_2p0_modes_mix_ob_db_tx_gain);
292 else
293 INIT_INI_ARRAY(&ah->iniModesTxGain,
294 ar9300Modes_mixed_ob_db_tx_gain_table_2p2);
295 @@ -581,6 +651,13 @@ static void ar9003_tx_gain_table_mode6(s
296 ar9580_1p0_type6_tx_gain_table);
297 }
298
299 +static void ar9003_tx_gain_table_mode7(struct ath_hw *ah)
300 +{
301 + if (AR_SREV_9340(ah))
302 + INIT_INI_ARRAY(&ah->iniModesTxGain,
303 + ar9340_cus227_tx_gain_table_1p0);
304 +}
305 +
306 typedef void (*ath_txgain_tab)(struct ath_hw *ah);
307
308 static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
309 @@ -593,6 +670,7 @@ static void ar9003_tx_gain_table_apply(s
310 ar9003_tx_gain_table_mode4,
311 ar9003_tx_gain_table_mode5,
312 ar9003_tx_gain_table_mode6,
313 + ar9003_tx_gain_table_mode7,
314 };
315 int idx = ar9003_hw_get_tx_gain_idx(ah);
316
317 @@ -629,7 +707,10 @@ static void ar9003_rx_gain_table_mode0(s
318 ar9462_2p1_common_rx_gain);
319 else if (AR_SREV_9462_20(ah))
320 INIT_INI_ARRAY(&ah->iniModesRxGain,
321 - ar9462_common_rx_gain_table_2p0);
322 + ar9462_2p0_common_rx_gain);
323 + else if (AR_SREV_9565_11(ah))
324 + INIT_INI_ARRAY(&ah->iniModesRxGain,
325 + ar9565_1p1_Common_rx_gain_table);
326 else if (AR_SREV_9565(ah))
327 INIT_INI_ARRAY(&ah->iniModesRxGain,
328 ar9565_1p0_Common_rx_gain_table);
329 @@ -657,7 +738,7 @@ static void ar9003_rx_gain_table_mode1(s
330 ar9462_2p1_common_wo_xlna_rx_gain);
331 else if (AR_SREV_9462_20(ah))
332 INIT_INI_ARRAY(&ah->iniModesRxGain,
333 - ar9462_common_wo_xlna_rx_gain_table_2p0);
334 + ar9462_2p0_common_wo_xlna_rx_gain);
335 else if (AR_SREV_9550(ah)) {
336 INIT_INI_ARRAY(&ah->iniModesRxGain,
337 ar955x_1p0_common_wo_xlna_rx_gain_table);
338 @@ -666,6 +747,9 @@ static void ar9003_rx_gain_table_mode1(s
339 } else if (AR_SREV_9580(ah))
340 INIT_INI_ARRAY(&ah->iniModesRxGain,
341 ar9580_1p0_wo_xlna_rx_gain_table);
342 + else if (AR_SREV_9565_11(ah))
343 + INIT_INI_ARRAY(&ah->iniModesRxGain,
344 + ar9565_1p1_common_wo_xlna_rx_gain_table);
345 else if (AR_SREV_9565(ah))
346 INIT_INI_ARRAY(&ah->iniModesRxGain,
347 ar9565_1p0_common_wo_xlna_rx_gain_table);
348 @@ -687,7 +771,7 @@ static void ar9003_rx_gain_table_mode2(s
349 ar9462_2p1_baseband_postamble_5g_xlna);
350 } else if (AR_SREV_9462_20(ah)) {
351 INIT_INI_ARRAY(&ah->iniModesRxGain,
352 - ar9462_common_mixed_rx_gain_table_2p0);
353 + ar9462_2p0_common_mixed_rx_gain);
354 INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_core,
355 ar9462_2p0_baseband_core_mix_rxgain);
356 INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_postamble,
357 @@ -701,12 +785,12 @@ static void ar9003_rx_gain_table_mode3(s
358 {
359 if (AR_SREV_9462_21(ah)) {
360 INIT_INI_ARRAY(&ah->iniModesRxGain,
361 - ar9462_2p1_common_5g_xlna_only_rx_gain);
362 + ar9462_2p1_common_5g_xlna_only_rxgain);
363 INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
364 ar9462_2p1_baseband_postamble_5g_xlna);
365 } else if (AR_SREV_9462_20(ah)) {
366 INIT_INI_ARRAY(&ah->iniModesRxGain,
367 - ar9462_2p0_5g_xlna_only_rxgain);
368 + ar9462_2p0_common_5g_xlna_only_rxgain);
369 INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
370 ar9462_2p0_baseband_postamble_5g_xlna);
371 }
372 @@ -750,6 +834,9 @@ static void ar9003_hw_init_mode_gain_reg
373 static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
374 bool power_off)
375 {
376 + unsigned int i;
377 + struct ar5416IniArray *array;
378 +
379 /*
380 * Increase L1 Entry Latency. Some WB222 boards don't have
381 * this change in eeprom/OTP.
382 @@ -775,18 +862,13 @@ static void ar9003_hw_configpcipowersave
383 * Configire PCIE after Ini init. SERDES values now come from ini file
384 * This enables PCIe low power mode.
385 */
386 - if (ah->config.pcieSerDesWrite) {
387 - unsigned int i;
388 - struct ar5416IniArray *array;
389 -
390 - array = power_off ? &ah->iniPcieSerdes :
391 - &ah->iniPcieSerdesLowPower;
392 -
393 - for (i = 0; i < array->ia_rows; i++) {
394 - REG_WRITE(ah,
395 - INI_RA(array, i, 0),
396 - INI_RA(array, i, 1));
397 - }
398 + array = power_off ? &ah->iniPcieSerdes :
399 + &ah->iniPcieSerdesLowPower;
400 +
401 + for (i = 0; i < array->ia_rows; i++) {
402 + REG_WRITE(ah,
403 + INI_RA(array, i, 0),
404 + INI_RA(array, i, 1));
405 }
406 }
407
408 --- a/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
409 +++ b/drivers/net/wireless/ath/ath9k/ar9340_initvals.h
410 @@ -18,6 +18,20 @@
411 #ifndef INITVALS_9340_H
412 #define INITVALS_9340_H
413
414 +#define ar9340_1p0_mac_postamble ar9300_2p2_mac_postamble
415 +
416 +#define ar9340_1p0_soc_postamble ar9300_2p2_soc_postamble
417 +
418 +#define ar9340Modes_fast_clock_1p0 ar9300Modes_fast_clock_2p2
419 +
420 +#define ar9340Common_rx_gain_table_1p0 ar9300Common_rx_gain_table_2p2
421 +
422 +#define ar9340Common_wo_xlna_rx_gain_table_1p0 ar9300Common_wo_xlna_rx_gain_table_2p2
423 +
424 +#define ar9340_1p0_baseband_core_txfir_coeff_japan_2484 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
425 +
426 +#define ar9340_1p0_baseband_postamble_dfs_channel ar9300_2p2_baseband_postamble_dfs_channel
427 +
428 static const u32 ar9340_1p0_radio_postamble[][5] = {
429 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
430 {0x000160ac, 0xa4646800, 0xa4646800, 0xa4646800, 0xa4646800},
431 @@ -100,8 +114,6 @@ static const u32 ar9340Modes_lowest_ob_d
432 {0x00016448, 0x24925266, 0x24925266, 0x24925266, 0x24925266},
433 };
434
435 -#define ar9340Modes_fast_clock_1p0 ar9300Modes_fast_clock_2p2
436 -
437 static const u32 ar9340_1p0_radio_core[][2] = {
438 /* Addr allmodes */
439 {0x00016000, 0x36db6db6},
440 @@ -215,16 +227,12 @@ static const u32 ar9340_1p0_radio_core_4
441 {0x0000824c, 0x0001e800},
442 };
443
444 -#define ar9340_1p0_mac_postamble ar9300_2p2_mac_postamble
445 -
446 -#define ar9340_1p0_soc_postamble ar9300_2p2_soc_postamble
447 -
448 static const u32 ar9340_1p0_baseband_postamble[][5] = {
449 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
450 {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011},
451 {0x00009820, 0x206a022e, 0x206a022e, 0x206a022e, 0x206a022e},
452 {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
453 - {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
454 + {0x00009828, 0x06903081, 0x06903081, 0x09103881, 0x09103881},
455 {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
456 {0x00009830, 0x0000059c, 0x0000059c, 0x0000119c, 0x0000119c},
457 {0x00009c00, 0x000000c4, 0x000000c4, 0x000000c4, 0x000000c4},
458 @@ -340,9 +348,9 @@ static const u32 ar9340_1p0_baseband_cor
459 {0x0000a370, 0x00000000},
460 {0x0000a390, 0x00000001},
461 {0x0000a394, 0x00000444},
462 - {0x0000a398, 0x001f0e0f},
463 - {0x0000a39c, 0x0075393f},
464 - {0x0000a3a0, 0xb79f6427},
465 + {0x0000a398, 0x00000000},
466 + {0x0000a39c, 0x210d0401},
467 + {0x0000a3a0, 0xab9a7144},
468 {0x0000a3a4, 0x00000000},
469 {0x0000a3a8, 0xaaaaaaaa},
470 {0x0000a3ac, 0x3c466478},
471 @@ -714,266 +722,6 @@ static const u32 ar9340Modes_ub124_tx_ga
472 {0x0000b2e8, 0xfffe0000, 0xfffe0000, 0xfffc0000, 0xfffc0000},
473 };
474
475 -static const u32 ar9340Common_rx_gain_table_1p0[][2] = {
476 - /* Addr allmodes */
477 - {0x0000a000, 0x00010000},
478 - {0x0000a004, 0x00030002},
479 - {0x0000a008, 0x00050004},
480 - {0x0000a00c, 0x00810080},
481 - {0x0000a010, 0x00830082},
482 - {0x0000a014, 0x01810180},
483 - {0x0000a018, 0x01830182},
484 - {0x0000a01c, 0x01850184},
485 - {0x0000a020, 0x01890188},
486 - {0x0000a024, 0x018b018a},
487 - {0x0000a028, 0x018d018c},
488 - {0x0000a02c, 0x01910190},
489 - {0x0000a030, 0x01930192},
490 - {0x0000a034, 0x01950194},
491 - {0x0000a038, 0x038a0196},
492 - {0x0000a03c, 0x038c038b},
493 - {0x0000a040, 0x0390038d},
494 - {0x0000a044, 0x03920391},
495 - {0x0000a048, 0x03940393},
496 - {0x0000a04c, 0x03960395},
497 - {0x0000a050, 0x00000000},
498 - {0x0000a054, 0x00000000},
499 - {0x0000a058, 0x00000000},
500 - {0x0000a05c, 0x00000000},
501 - {0x0000a060, 0x00000000},
502 - {0x0000a064, 0x00000000},
503 - {0x0000a068, 0x00000000},
504 - {0x0000a06c, 0x00000000},
505 - {0x0000a070, 0x00000000},
506 - {0x0000a074, 0x00000000},
507 - {0x0000a078, 0x00000000},
508 - {0x0000a07c, 0x00000000},
509 - {0x0000a080, 0x22222229},
510 - {0x0000a084, 0x1d1d1d1d},
511 - {0x0000a088, 0x1d1d1d1d},
512 - {0x0000a08c, 0x1d1d1d1d},
513 - {0x0000a090, 0x171d1d1d},
514 - {0x0000a094, 0x11111717},
515 - {0x0000a098, 0x00030311},
516 - {0x0000a09c, 0x00000000},
517 - {0x0000a0a0, 0x00000000},
518 - {0x0000a0a4, 0x00000000},
519 - {0x0000a0a8, 0x00000000},
520 - {0x0000a0ac, 0x00000000},
521 - {0x0000a0b0, 0x00000000},
522 - {0x0000a0b4, 0x00000000},
523 - {0x0000a0b8, 0x00000000},
524 - {0x0000a0bc, 0x00000000},
525 - {0x0000a0c0, 0x001f0000},
526 - {0x0000a0c4, 0x01000101},
527 - {0x0000a0c8, 0x011e011f},
528 - {0x0000a0cc, 0x011c011d},
529 - {0x0000a0d0, 0x02030204},
530 - {0x0000a0d4, 0x02010202},
531 - {0x0000a0d8, 0x021f0200},
532 - {0x0000a0dc, 0x0302021e},
533 - {0x0000a0e0, 0x03000301},
534 - {0x0000a0e4, 0x031e031f},
535 - {0x0000a0e8, 0x0402031d},
536 - {0x0000a0ec, 0x04000401},
537 - {0x0000a0f0, 0x041e041f},
538 - {0x0000a0f4, 0x0502041d},
539 - {0x0000a0f8, 0x05000501},
540 - {0x0000a0fc, 0x051e051f},
541 - {0x0000a100, 0x06010602},
542 - {0x0000a104, 0x061f0600},
543 - {0x0000a108, 0x061d061e},
544 - {0x0000a10c, 0x07020703},
545 - {0x0000a110, 0x07000701},
546 - {0x0000a114, 0x00000000},
547 - {0x0000a118, 0x00000000},
548 - {0x0000a11c, 0x00000000},
549 - {0x0000a120, 0x00000000},
550 - {0x0000a124, 0x00000000},
551 - {0x0000a128, 0x00000000},
552 - {0x0000a12c, 0x00000000},
553 - {0x0000a130, 0x00000000},
554 - {0x0000a134, 0x00000000},
555 - {0x0000a138, 0x00000000},
556 - {0x0000a13c, 0x00000000},
557 - {0x0000a140, 0x001f0000},
558 - {0x0000a144, 0x01000101},
559 - {0x0000a148, 0x011e011f},
560 - {0x0000a14c, 0x011c011d},
561 - {0x0000a150, 0x02030204},
562 - {0x0000a154, 0x02010202},
563 - {0x0000a158, 0x021f0200},
564 - {0x0000a15c, 0x0302021e},
565 - {0x0000a160, 0x03000301},
566 - {0x0000a164, 0x031e031f},
567 - {0x0000a168, 0x0402031d},
568 - {0x0000a16c, 0x04000401},
569 - {0x0000a170, 0x041e041f},
570 - {0x0000a174, 0x0502041d},
571 - {0x0000a178, 0x05000501},
572 - {0x0000a17c, 0x051e051f},
573 - {0x0000a180, 0x06010602},
574 - {0x0000a184, 0x061f0600},
575 - {0x0000a188, 0x061d061e},
576 - {0x0000a18c, 0x07020703},
577 - {0x0000a190, 0x07000701},
578 - {0x0000a194, 0x00000000},
579 - {0x0000a198, 0x00000000},
580 - {0x0000a19c, 0x00000000},
581 - {0x0000a1a0, 0x00000000},
582 - {0x0000a1a4, 0x00000000},
583 - {0x0000a1a8, 0x00000000},
584 - {0x0000a1ac, 0x00000000},
585 - {0x0000a1b0, 0x00000000},
586 - {0x0000a1b4, 0x00000000},
587 - {0x0000a1b8, 0x00000000},
588 - {0x0000a1bc, 0x00000000},
589 - {0x0000a1c0, 0x00000000},
590 - {0x0000a1c4, 0x00000000},
591 - {0x0000a1c8, 0x00000000},
592 - {0x0000a1cc, 0x00000000},
593 - {0x0000a1d0, 0x00000000},
594 - {0x0000a1d4, 0x00000000},
595 - {0x0000a1d8, 0x00000000},
596 - {0x0000a1dc, 0x00000000},
597 - {0x0000a1e0, 0x00000000},
598 - {0x0000a1e4, 0x00000000},
599 - {0x0000a1e8, 0x00000000},
600 - {0x0000a1ec, 0x00000000},
601 - {0x0000a1f0, 0x00000396},
602 - {0x0000a1f4, 0x00000396},
603 - {0x0000a1f8, 0x00000396},
604 - {0x0000a1fc, 0x00000196},
605 - {0x0000b000, 0x00010000},
606 - {0x0000b004, 0x00030002},
607 - {0x0000b008, 0x00050004},
608 - {0x0000b00c, 0x00810080},
609 - {0x0000b010, 0x00830082},
610 - {0x0000b014, 0x01810180},
611 - {0x0000b018, 0x01830182},
612 - {0x0000b01c, 0x01850184},
613 - {0x0000b020, 0x02810280},
614 - {0x0000b024, 0x02830282},
615 - {0x0000b028, 0x02850284},
616 - {0x0000b02c, 0x02890288},
617 - {0x0000b030, 0x028b028a},
618 - {0x0000b034, 0x0388028c},
619 - {0x0000b038, 0x038a0389},
620 - {0x0000b03c, 0x038c038b},
621 - {0x0000b040, 0x0390038d},
622 - {0x0000b044, 0x03920391},
623 - {0x0000b048, 0x03940393},
624 - {0x0000b04c, 0x03960395},
625 - {0x0000b050, 0x00000000},
626 - {0x0000b054, 0x00000000},
627 - {0x0000b058, 0x00000000},
628 - {0x0000b05c, 0x00000000},
629 - {0x0000b060, 0x00000000},
630 - {0x0000b064, 0x00000000},
631 - {0x0000b068, 0x00000000},
632 - {0x0000b06c, 0x00000000},
633 - {0x0000b070, 0x00000000},
634 - {0x0000b074, 0x00000000},
635 - {0x0000b078, 0x00000000},
636 - {0x0000b07c, 0x00000000},
637 - {0x0000b080, 0x23232323},
638 - {0x0000b084, 0x21232323},
639 - {0x0000b088, 0x19191c1e},
640 - {0x0000b08c, 0x12141417},
641 - {0x0000b090, 0x07070e0e},
642 - {0x0000b094, 0x03030305},
643 - {0x0000b098, 0x00000003},
644 - {0x0000b09c, 0x00000000},
645 - {0x0000b0a0, 0x00000000},
646 - {0x0000b0a4, 0x00000000},
647 - {0x0000b0a8, 0x00000000},
648 - {0x0000b0ac, 0x00000000},
649 - {0x0000b0b0, 0x00000000},
650 - {0x0000b0b4, 0x00000000},
651 - {0x0000b0b8, 0x00000000},
652 - {0x0000b0bc, 0x00000000},
653 - {0x0000b0c0, 0x003f0020},
654 - {0x0000b0c4, 0x00400041},
655 - {0x0000b0c8, 0x0140005f},
656 - {0x0000b0cc, 0x0160015f},
657 - {0x0000b0d0, 0x017e017f},
658 - {0x0000b0d4, 0x02410242},
659 - {0x0000b0d8, 0x025f0240},
660 - {0x0000b0dc, 0x027f0260},
661 - {0x0000b0e0, 0x0341027e},
662 - {0x0000b0e4, 0x035f0340},
663 - {0x0000b0e8, 0x037f0360},
664 - {0x0000b0ec, 0x04400441},
665 - {0x0000b0f0, 0x0460045f},
666 - {0x0000b0f4, 0x0541047f},
667 - {0x0000b0f8, 0x055f0540},
668 - {0x0000b0fc, 0x057f0560},
669 - {0x0000b100, 0x06400641},
670 - {0x0000b104, 0x0660065f},
671 - {0x0000b108, 0x067e067f},
672 - {0x0000b10c, 0x07410742},
673 - {0x0000b110, 0x075f0740},
674 - {0x0000b114, 0x077f0760},
675 - {0x0000b118, 0x07800781},
676 - {0x0000b11c, 0x07a0079f},
677 - {0x0000b120, 0x07c107bf},
678 - {0x0000b124, 0x000007c0},
679 - {0x0000b128, 0x00000000},
680 - {0x0000b12c, 0x00000000},
681 - {0x0000b130, 0x00000000},
682 - {0x0000b134, 0x00000000},
683 - {0x0000b138, 0x00000000},
684 - {0x0000b13c, 0x00000000},
685 - {0x0000b140, 0x003f0020},
686 - {0x0000b144, 0x00400041},
687 - {0x0000b148, 0x0140005f},
688 - {0x0000b14c, 0x0160015f},
689 - {0x0000b150, 0x017e017f},
690 - {0x0000b154, 0x02410242},
691 - {0x0000b158, 0x025f0240},
692 - {0x0000b15c, 0x027f0260},
693 - {0x0000b160, 0x0341027e},
694 - {0x0000b164, 0x035f0340},
695 - {0x0000b168, 0x037f0360},
696 - {0x0000b16c, 0x04400441},
697 - {0x0000b170, 0x0460045f},
698 - {0x0000b174, 0x0541047f},
699 - {0x0000b178, 0x055f0540},
700 - {0x0000b17c, 0x057f0560},
701 - {0x0000b180, 0x06400641},
702 - {0x0000b184, 0x0660065f},
703 - {0x0000b188, 0x067e067f},
704 - {0x0000b18c, 0x07410742},
705 - {0x0000b190, 0x075f0740},
706 - {0x0000b194, 0x077f0760},
707 - {0x0000b198, 0x07800781},
708 - {0x0000b19c, 0x07a0079f},
709 - {0x0000b1a0, 0x07c107bf},
710 - {0x0000b1a4, 0x000007c0},
711 - {0x0000b1a8, 0x00000000},
712 - {0x0000b1ac, 0x00000000},
713 - {0x0000b1b0, 0x00000000},
714 - {0x0000b1b4, 0x00000000},
715 - {0x0000b1b8, 0x00000000},
716 - {0x0000b1bc, 0x00000000},
717 - {0x0000b1c0, 0x00000000},
718 - {0x0000b1c4, 0x00000000},
719 - {0x0000b1c8, 0x00000000},
720 - {0x0000b1cc, 0x00000000},
721 - {0x0000b1d0, 0x00000000},
722 - {0x0000b1d4, 0x00000000},
723 - {0x0000b1d8, 0x00000000},
724 - {0x0000b1dc, 0x00000000},
725 - {0x0000b1e0, 0x00000000},
726 - {0x0000b1e4, 0x00000000},
727 - {0x0000b1e8, 0x00000000},
728 - {0x0000b1ec, 0x00000000},
729 - {0x0000b1f0, 0x00000396},
730 - {0x0000b1f4, 0x00000396},
731 - {0x0000b1f8, 0x00000396},
732 - {0x0000b1fc, 0x00000196},
733 -};
734 -
735 static const u32 ar9340Modes_low_ob_db_tx_gain_table_1p0[][5] = {
736 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
737 {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
738 @@ -1437,8 +1185,6 @@ static const u32 ar9340_1p0_mac_core[][2
739 {0x000083d0, 0x000101ff},
740 };
741
742 -#define ar9340Common_wo_xlna_rx_gain_table_1p0 ar9300Common_wo_xlna_rx_gain_table_2p2
743 -
744 static const u32 ar9340_1p0_soc_preamble[][2] = {
745 /* Addr allmodes */
746 {0x00007008, 0x00000000},
747 @@ -1447,4 +1193,106 @@ static const u32 ar9340_1p0_soc_preamble
748 {0x00007038, 0x000004c2},
749 };
750
751 +static const u32 ar9340_cus227_tx_gain_table_1p0[][5] = {
752 + /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
753 + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
754 + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
755 + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
756 + {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
757 + {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
758 + {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
759 + {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
760 + {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
761 + {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
762 + {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
763 + {0x0000a514, 0x1c000223, 0x1c000223, 0x11000400, 0x11000400},
764 + {0x0000a518, 0x21002220, 0x21002220, 0x15000402, 0x15000402},
765 + {0x0000a51c, 0x27002223, 0x27002223, 0x19000404, 0x19000404},
766 + {0x0000a520, 0x2c022220, 0x2c022220, 0x1b000603, 0x1b000603},
767 + {0x0000a524, 0x30022222, 0x30022222, 0x1f000a02, 0x1f000a02},
768 + {0x0000a528, 0x35022225, 0x35022225, 0x23000a04, 0x23000a04},
769 + {0x0000a52c, 0x3b02222a, 0x3b02222a, 0x26000a20, 0x26000a20},
770 + {0x0000a530, 0x3f02222c, 0x3f02222c, 0x2a000e20, 0x2a000e20},
771 + {0x0000a534, 0x4202242a, 0x4202242a, 0x2e000e22, 0x2e000e22},
772 + {0x0000a538, 0x4702244a, 0x4702244a, 0x31000e24, 0x31000e24},
773 + {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x34001640, 0x34001640},
774 + {0x0000a540, 0x4e02246c, 0x4e02246c, 0x38001660, 0x38001660},
775 + {0x0000a544, 0x5302266c, 0x5302266c, 0x3b001861, 0x3b001861},
776 + {0x0000a548, 0x5702286c, 0x5702286c, 0x3e001a81, 0x3e001a81},
777 + {0x0000a54c, 0x5c02486b, 0x5c02486b, 0x42001a83, 0x42001a83},
778 + {0x0000a550, 0x61024a6c, 0x61024a6c, 0x44001c84, 0x44001c84},
779 + {0x0000a554, 0x66026a6c, 0x66026a6c, 0x48001ce3, 0x48001ce3},
780 + {0x0000a558, 0x6b026e6c, 0x6b026e6c, 0x4c001ce5, 0x4c001ce5},
781 + {0x0000a55c, 0x7002708c, 0x7002708c, 0x50001ce9, 0x50001ce9},
782 + {0x0000a560, 0x7302b08a, 0x7302b08a, 0x54001ceb, 0x54001ceb},
783 + {0x0000a564, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
784 + {0x0000a568, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
785 + {0x0000a56c, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
786 + {0x0000a570, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
787 + {0x0000a574, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
788 + {0x0000a578, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
789 + {0x0000a57c, 0x7702b08c, 0x7702b08c, 0x56001eec, 0x56001eec},
790 + {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
791 + {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},
792 + {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},
793 + {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200},
794 + {0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202},
795 + {0x0000a594, 0x1c800223, 0x1c800223, 0x11800400, 0x11800400},
796 + {0x0000a598, 0x21820220, 0x21820220, 0x15800402, 0x15800402},
797 + {0x0000a59c, 0x27820223, 0x27820223, 0x19800404, 0x19800404},
798 + {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1b800603, 0x1b800603},
799 + {0x0000a5a4, 0x2f822222, 0x2f822222, 0x1f800a02, 0x1f800a02},
800 + {0x0000a5a8, 0x34822225, 0x34822225, 0x23800a04, 0x23800a04},
801 + {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x26800a20, 0x26800a20},
802 + {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2a800e20, 0x2a800e20},
803 + {0x0000a5b4, 0x4282242a, 0x4282242a, 0x2e800e22, 0x2e800e22},
804 + {0x0000a5b8, 0x4782244a, 0x4782244a, 0x31800e24, 0x31800e24},
805 + {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x34801640, 0x34801640},
806 + {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x38801660, 0x38801660},
807 + {0x0000a5c4, 0x5382266c, 0x5382266c, 0x3b801861, 0x3b801861},
808 + {0x0000a5c8, 0x5782286c, 0x5782286c, 0x3e801a81, 0x3e801a81},
809 + {0x0000a5cc, 0x5c84286b, 0x5c84286b, 0x42801a83, 0x42801a83},
810 + {0x0000a5d0, 0x61842a6c, 0x61842a6c, 0x44801c84, 0x44801c84},
811 + {0x0000a5d4, 0x66862a6c, 0x66862a6c, 0x48801ce3, 0x48801ce3},
812 + {0x0000a5d8, 0x6b862e6c, 0x6b862e6c, 0x4c801ce5, 0x4c801ce5},
813 + {0x0000a5dc, 0x7086308c, 0x7086308c, 0x50801ce9, 0x50801ce9},
814 + {0x0000a5e0, 0x738a308a, 0x738a308a, 0x54801ceb, 0x54801ceb},
815 + {0x0000a5e4, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
816 + {0x0000a5e8, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
817 + {0x0000a5ec, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
818 + {0x0000a5f0, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
819 + {0x0000a5f4, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
820 + {0x0000a5f8, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
821 + {0x0000a5fc, 0x778a308c, 0x778a308c, 0x56801eec, 0x56801eec},
822 + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
823 + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
824 + {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
825 + {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
826 + {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
827 + {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
828 + {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
829 + {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
830 + {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
831 + {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
832 + {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
833 + {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
834 + {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
835 + {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
836 + {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
837 + {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
838 + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
839 + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
840 + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
841 + {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
842 + {0x00016044, 0x056db2db, 0x056db2db, 0x03b6d2e4, 0x03b6d2e4},
843 + {0x00016048, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266},
844 + {0x00016280, 0x01000015, 0x01000015, 0x01001015, 0x01001015},
845 + {0x00016288, 0x30318000, 0x30318000, 0x00318000, 0x00318000},
846 + {0x00016444, 0x056db2db, 0x056db2db, 0x03b6d2e4, 0x03b6d2e4},
847 + {0x00016448, 0x24925666, 0x24925666, 0x8e481266, 0x8e481266},
848 + {0x0000a3a4, 0x00000011, 0x00000011, 0x00000011, 0x00000011},
849 + {0x0000a3a8, 0x3c3c3c3c, 0x3c3c3c3c, 0x3c3c3c3c, 0x3c3c3c3c},
850 + {0x0000a3ac, 0x30303030, 0x30303030, 0x30303030, 0x30303030},
851 +};
852 +
853 #endif /* INITVALS_9340_H */
854 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
855 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
856 @@ -27,40 +27,15 @@
857 #include "common.h"
858 #include "mci.h"
859 #include "dfs.h"
860 -
861 -/*
862 - * Header for the ath9k.ko driver core *only* -- hw code nor any other driver
863 - * should rely on this file or its contents.
864 - */
865 +#include "spectral.h"
866
867 struct ath_node;
868 +struct ath_rate_table;
869
870 -/* Macro to expand scalars to 64-bit objects */
871 -
872 -#define ito64(x) (sizeof(x) == 1) ? \
873 - (((unsigned long long int)(x)) & (0xff)) : \
874 - (sizeof(x) == 2) ? \
875 - (((unsigned long long int)(x)) & 0xffff) : \
876 - ((sizeof(x) == 4) ? \
877 - (((unsigned long long int)(x)) & 0xffffffff) : \
878 - (unsigned long long int)(x))
879 -
880 -/* increment with wrap-around */
881 -#define INCR(_l, _sz) do { \
882 - (_l)++; \
883 - (_l) &= ((_sz) - 1); \
884 - } while (0)
885 -
886 -/* decrement with wrap-around */
887 -#define DECR(_l, _sz) do { \
888 - (_l)--; \
889 - (_l) &= ((_sz) - 1); \
890 - } while (0)
891 -
892 -#define TSF_TO_TU(_h,_l) \
893 - ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
894 -
895 -#define ATH_TXQ_SETUP(sc, i) ((sc)->tx.txqsetup & (1<<i))
896 +extern struct ieee80211_ops ath9k_ops;
897 +extern int ath9k_modparam_nohwcrypt;
898 +extern int led_blink;
899 +extern bool is_ath9k_unloaded;
900
901 struct ath_config {
902 u16 txpowlimit;
903 @@ -70,6 +45,17 @@ struct ath_config {
904 /* Descriptor Management */
905 /*************************/
906
907 +#define ATH_TXSTATUS_RING_SIZE 512
908 +
909 +/* Macro to expand scalars to 64-bit objects */
910 +#define ito64(x) (sizeof(x) == 1) ? \
911 + (((unsigned long long int)(x)) & (0xff)) : \
912 + (sizeof(x) == 2) ? \
913 + (((unsigned long long int)(x)) & 0xffff) : \
914 + ((sizeof(x) == 4) ? \
915 + (((unsigned long long int)(x)) & 0xffffffff) : \
916 + (unsigned long long int)(x))
917 +
918 #define ATH_TXBUF_RESET(_bf) do { \
919 (_bf)->bf_lastbf = NULL; \
920 (_bf)->bf_next = NULL; \
921 @@ -77,23 +63,6 @@ struct ath_config {
922 sizeof(struct ath_buf_state)); \
923 } while (0)
924
925 -/**
926 - * enum buffer_type - Buffer type flags
927 - *
928 - * @BUF_AMPDU: This buffer is an ampdu, as part of an aggregate (during TX)
929 - * @BUF_AGGR: Indicates whether the buffer can be aggregated
930 - * (used in aggregation scheduling)
931 - */
932 -enum buffer_type {
933 - BUF_AMPDU = BIT(0),
934 - BUF_AGGR = BIT(1),
935 -};
936 -
937 -#define bf_isampdu(bf) (bf->bf_state.bf_type & BUF_AMPDU)
938 -#define bf_isaggr(bf) (bf->bf_state.bf_type & BUF_AGGR)
939 -
940 -#define ATH_TXSTATUS_RING_SIZE 512
941 -
942 #define DS2PHYS(_dd, _ds) \
943 ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc))
944 #define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0)
945 @@ -113,11 +82,20 @@ int ath_descdma_setup(struct ath_softc *
946 /* RX / TX */
947 /***********/
948
949 +#define ATH_TXQ_SETUP(sc, i) ((sc)->tx.txqsetup & (1<<i))
950 +
951 +/* increment with wrap-around */
952 +#define INCR(_l, _sz) do { \
953 + (_l)++; \
954 + (_l) &= ((_sz) - 1); \
955 + } while (0)
956 +
957 #define ATH_RXBUF 512
958 #define ATH_TXBUF 512
959 #define ATH_TXBUF_RESERVE 5
960 #define ATH_MAX_QDEPTH (ATH_TXBUF / 4 - ATH_TXBUF_RESERVE)
961 #define ATH_TXMAXTRY 13
962 +#define ATH_MAX_SW_RETRIES 30
963
964 #define TID_TO_WME_AC(_tid) \
965 ((((_tid) == 0) || ((_tid) == 3)) ? IEEE80211_AC_BE : \
966 @@ -133,6 +111,9 @@ int ath_descdma_setup(struct ath_softc *
967 #define ATH_AGGR_MIN_QDEPTH 2
968 /* minimum h/w qdepth for non-aggregated traffic */
969 #define ATH_NON_AGGR_MIN_QDEPTH 8
970 +#define ATH_TX_COMPLETE_POLL_INT 1000
971 +#define ATH_TXFIFO_DEPTH 8
972 +#define ATH_TX_ERROR 0x01
973
974 #define IEEE80211_SEQ_SEQ_SHIFT 4
975 #define IEEE80211_SEQ_MAX 4096
976 @@ -167,9 +148,6 @@ int ath_descdma_setup(struct ath_softc *
977
978 #define IS_CCK_RATE(rate) ((rate >= 0x18) && (rate <= 0x1e))
979
980 -#define ATH_TX_COMPLETE_POLL_INT 1000
981 -
982 -#define ATH_TXFIFO_DEPTH 8
983 struct ath_txq {
984 int mac80211_qnum; /* mac80211 queue number, -1 means not mac80211 Q */
985 u32 axq_qnum; /* ath9k hardware queue number */
986 @@ -214,6 +192,21 @@ struct ath_rxbuf {
987 dma_addr_t bf_buf_addr;
988 };
989
990 +/**
991 + * enum buffer_type - Buffer type flags
992 + *
993 + * @BUF_AMPDU: This buffer is an ampdu, as part of an aggregate (during TX)
994 + * @BUF_AGGR: Indicates whether the buffer can be aggregated
995 + * (used in aggregation scheduling)
996 + */
997 +enum buffer_type {
998 + BUF_AMPDU = BIT(0),
999 + BUF_AGGR = BIT(1),
1000 +};
1001 +
1002 +#define bf_isampdu(bf) (bf->bf_state.bf_type & BUF_AMPDU)
1003 +#define bf_isaggr(bf) (bf->bf_state.bf_type & BUF_AGGR)
1004 +
1005 struct ath_buf_state {
1006 u8 bf_type;
1007 u8 bfs_paprd;
1008 @@ -278,7 +271,6 @@ struct ath_tx_control {
1009 struct ieee80211_sta *sta;
1010 };
1011
1012 -#define ATH_TX_ERROR 0x01
1013
1014 /**
1015 * @txq_map: Index is mac80211 queue number. This is
1016 @@ -372,6 +364,22 @@ struct ath_vif {
1017 struct ath_buf *av_bcbuf;
1018 };
1019
1020 +struct ath9k_vif_iter_data {
1021 + u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */
1022 + u8 mask[ETH_ALEN]; /* bssid mask */
1023 + bool has_hw_macaddr;
1024 +
1025 + int naps; /* number of AP vifs */
1026 + int nmeshes; /* number of mesh vifs */
1027 + int nstations; /* number of station vifs */
1028 + int nwds; /* number of WDS vifs */
1029 + int nadhocs; /* number of adhoc vifs */
1030 +};
1031 +
1032 +void ath9k_calculate_iter_data(struct ieee80211_hw *hw,
1033 + struct ieee80211_vif *vif,
1034 + struct ath9k_vif_iter_data *iter_data);
1035 +
1036 /*******************/
1037 /* Beacon Handling */
1038 /*******************/
1039 @@ -387,6 +395,9 @@ struct ath_vif {
1040 #define ATH_DEFAULT_BMISS_LIMIT 10
1041 #define IEEE80211_MS_TO_TU(x) (((x) * 1000) / 1024)
1042
1043 +#define TSF_TO_TU(_h,_l) \
1044 + ((((u32)(_h)) << 22) | (((u32)(_l)) >> 10))
1045 +
1046 struct ath_beacon_config {
1047 int beacon_interval;
1048 u16 listen_interval;
1049 @@ -420,12 +431,10 @@ struct ath_beacon {
1050 };
1051
1052 void ath9k_beacon_tasklet(unsigned long data);
1053 -bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif);
1054 void ath9k_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif,
1055 u32 changed);
1056 void ath9k_beacon_assign_slot(struct ath_softc *sc, struct ieee80211_vif *vif);
1057 void ath9k_beacon_remove_slot(struct ath_softc *sc, struct ieee80211_vif *vif);
1058 -void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif);
1059 void ath9k_set_beacon(struct ath_softc *sc);
1060 bool ath9k_csa_is_finished(struct ath_softc *sc);
1061
1062 @@ -440,10 +449,9 @@ bool ath9k_csa_is_finished(struct ath_so
1063 #define ATH_LONG_CALINTERVAL_INT 1000 /* 1000 ms */
1064 #define ATH_LONG_CALINTERVAL 30000 /* 30 seconds */
1065 #define ATH_RESTART_CALINTERVAL 1200000 /* 20 minutes */
1066 -#define ATH_ANI_MAX_SKIP_COUNT 10
1067 -
1068 -#define ATH_PAPRD_TIMEOUT 100 /* msecs */
1069 -#define ATH_PLL_WORK_INTERVAL 100
1070 +#define ATH_ANI_MAX_SKIP_COUNT 10
1071 +#define ATH_PAPRD_TIMEOUT 100 /* msecs */
1072 +#define ATH_PLL_WORK_INTERVAL 100
1073
1074 void ath_tx_complete_poll_work(struct work_struct *work);
1075 void ath_reset_work(struct work_struct *work);
1076 @@ -459,6 +467,7 @@ void ath_check_ani(struct ath_softc *sc)
1077 int ath_update_survey_stats(struct ath_softc *sc);
1078 void ath_update_survey_nf(struct ath_softc *sc, int channel);
1079 void ath9k_queue_reset(struct ath_softc *sc, enum ath_reset_type type);
1080 +void ath_ps_full_sleep(unsigned long data);
1081
1082 /**********/
1083 /* BTCOEX */
1084 @@ -476,20 +485,19 @@ enum bt_op_flags {
1085 };
1086
1087 struct ath_btcoex {
1088 - bool hw_timer_enabled;
1089 spinlock_t btcoex_lock;
1090 struct timer_list period_timer; /* Timer for BT period */
1091 + struct timer_list no_stomp_timer;
1092 u32 bt_priority_cnt;
1093 unsigned long bt_priority_time;
1094 unsigned long op_flags;
1095 int bt_stomp_type; /* Types of BT stomping */
1096 - u32 btcoex_no_stomp; /* in usec */
1097 + u32 btcoex_no_stomp; /* in msec */
1098 u32 btcoex_period; /* in msec */
1099 - u32 btscan_no_stomp; /* in usec */
1100 + u32 btscan_no_stomp; /* in msec */
1101 u32 duty_cycle;
1102 u32 bt_wait_time;
1103 int rssi_count;
1104 - struct ath_gen_timer *no_stomp_timer; /* Timer for no BT stomping */
1105 struct ath_mci_profile mci;
1106 u8 stomp_audio;
1107 };
1108 @@ -537,12 +545,6 @@ static inline int ath9k_dump_btcoex(stru
1109 }
1110 #endif /* CPTCFG_ATH9K_BTCOEX_SUPPORT */
1111
1112 -struct ath9k_wow_pattern {
1113 - u8 pattern_bytes[MAX_PATTERN_SIZE];
1114 - u8 mask_bytes[MAX_PATTERN_SIZE];
1115 - u32 pattern_len;
1116 -};
1117 -
1118 /********************/
1119 /* LED Control */
1120 /********************/
1121 @@ -570,6 +572,40 @@ static inline void ath_fill_led_pin(stru
1122 }
1123 #endif
1124
1125 +/************************/
1126 +/* Wake on Wireless LAN */
1127 +/************************/
1128 +
1129 +struct ath9k_wow_pattern {
1130 + u8 pattern_bytes[MAX_PATTERN_SIZE];
1131 + u8 mask_bytes[MAX_PATTERN_SIZE];
1132 + u32 pattern_len;
1133 +};
1134 +
1135 +#ifdef CPTCFG_ATH9K_WOW
1136 +void ath9k_init_wow(struct ieee80211_hw *hw);
1137 +int ath9k_suspend(struct ieee80211_hw *hw,
1138 + struct cfg80211_wowlan *wowlan);
1139 +int ath9k_resume(struct ieee80211_hw *hw);
1140 +void ath9k_set_wakeup(struct ieee80211_hw *hw, bool enabled);
1141 +#else
1142 +static inline void ath9k_init_wow(struct ieee80211_hw *hw)
1143 +{
1144 +}
1145 +static inline int ath9k_suspend(struct ieee80211_hw *hw,
1146 + struct cfg80211_wowlan *wowlan)
1147 +{
1148 + return 0;
1149 +}
1150 +static inline int ath9k_resume(struct ieee80211_hw *hw)
1151 +{
1152 + return 0;
1153 +}
1154 +static inline void ath9k_set_wakeup(struct ieee80211_hw *hw, bool enabled)
1155 +{
1156 +}
1157 +#endif /* CONFIG_ATH9K_WOW */
1158 +
1159 /*******************************/
1160 /* Antenna diversity/combining */
1161 /*******************************/
1162 @@ -632,28 +668,24 @@ void ath_ant_comb_scan(struct ath_softc
1163 /* Main driver core */
1164 /********************/
1165
1166 -#define ATH9K_PCI_CUS198 0x0001
1167 -#define ATH9K_PCI_CUS230 0x0002
1168 -#define ATH9K_PCI_CUS217 0x0004
1169 -#define ATH9K_PCI_CUS252 0x0008
1170 -#define ATH9K_PCI_WOW 0x0010
1171 -#define ATH9K_PCI_BT_ANT_DIV 0x0020
1172 -#define ATH9K_PCI_D3_L1_WAR 0x0040
1173 -#define ATH9K_PCI_AR9565_1ANT 0x0080
1174 -#define ATH9K_PCI_AR9565_2ANT 0x0100
1175 +#define ATH9K_PCI_CUS198 0x0001
1176 +#define ATH9K_PCI_CUS230 0x0002
1177 +#define ATH9K_PCI_CUS217 0x0004
1178 +#define ATH9K_PCI_CUS252 0x0008
1179 +#define ATH9K_PCI_WOW 0x0010
1180 +#define ATH9K_PCI_BT_ANT_DIV 0x0020
1181 +#define ATH9K_PCI_D3_L1_WAR 0x0040
1182 +#define ATH9K_PCI_AR9565_1ANT 0x0080
1183 +#define ATH9K_PCI_AR9565_2ANT 0x0100
1184 +#define ATH9K_PCI_NO_PLL_PWRSAVE 0x0200
1185
1186 /*
1187 * Default cache line size, in bytes.
1188 * Used when PCI device not fully initialized by bootrom/BIOS
1189 */
1190 #define DEFAULT_CACHELINE 32
1191 -#define ATH_REGCLASSIDS_MAX 10
1192 #define ATH_CABQ_READY_TIME 80 /* % of beacon interval */
1193 -#define ATH_MAX_SW_RETRIES 30
1194 -#define ATH_CHAN_MAX 255
1195 -
1196 #define ATH_TXPOWER_MAX 100 /* .5 dBm units */
1197 -#define ATH_RATE_DUMMY_MARKER 0
1198
1199 enum sc_op_flags {
1200 SC_OP_INVALID,
1201 @@ -672,37 +704,6 @@ enum sc_op_flags {
1202 #define PS_BEACON_SYNC BIT(4)
1203 #define PS_WAIT_FOR_ANI BIT(5)
1204
1205 -struct ath_rate_table;
1206 -
1207 -struct ath9k_vif_iter_data {
1208 - u8 hw_macaddr[ETH_ALEN]; /* address of the first vif */
1209 - u8 mask[ETH_ALEN]; /* bssid mask */
1210 - bool has_hw_macaddr;
1211 -
1212 - int naps; /* number of AP vifs */
1213 - int nmeshes; /* number of mesh vifs */
1214 - int nstations; /* number of station vifs */
1215 - int nwds; /* number of WDS vifs */
1216 - int nadhocs; /* number of adhoc vifs */
1217 -};
1218 -
1219 -/* enum spectral_mode:
1220 - *
1221 - * @SPECTRAL_DISABLED: spectral mode is disabled
1222 - * @SPECTRAL_BACKGROUND: hardware sends samples when it is not busy with
1223 - * something else.
1224 - * @SPECTRAL_MANUAL: spectral scan is enabled, triggering for samples
1225 - * is performed manually.
1226 - * @SPECTRAL_CHANSCAN: Like manual, but also triggered when changing channels
1227 - * during a channel scan.
1228 - */
1229 -enum spectral_mode {
1230 - SPECTRAL_DISABLED = 0,
1231 - SPECTRAL_BACKGROUND,
1232 - SPECTRAL_MANUAL,
1233 - SPECTRAL_CHANSCAN,
1234 -};
1235 -
1236 struct ath_softc {
1237 struct ieee80211_hw *hw;
1238 struct device *dev;
1239 @@ -723,6 +724,7 @@ struct ath_softc {
1240 struct work_struct hw_check_work;
1241 struct work_struct hw_reset_work;
1242 struct completion paprd_complete;
1243 + wait_queue_head_t tx_wait;
1244
1245 unsigned int hw_busy_count;
1246 unsigned long sc_flags;
1247 @@ -759,6 +761,7 @@ struct ath_softc {
1248 struct delayed_work tx_complete_work;
1249 struct delayed_work hw_pll_work;
1250 struct timer_list rx_poll_timer;
1251 + struct timer_list sleep_timer;
1252
1253 #ifdef CPTCFG_ATH9K_BTCOEX_SUPPORT
1254 struct ath_btcoex btcoex;
1255 @@ -783,199 +786,54 @@ struct ath_softc {
1256 bool tx99_state;
1257 s16 tx99_power;
1258
1259 -#ifdef CONFIG_PM_SLEEP
1260 +#ifdef CONFIG_ATH9K_WOW
1261 atomic_t wow_got_bmiss_intr;
1262 atomic_t wow_sleep_proc_intr; /* in the middle of WoW sleep ? */
1263 u32 wow_intr_before_sleep;
1264 #endif
1265 };
1266
1267 -#define SPECTRAL_SCAN_BITMASK 0x10
1268 -/* Radar info packet format, used for DFS and spectral formats. */
1269 -struct ath_radar_info {
1270 - u8 pulse_length_pri;
1271 - u8 pulse_length_ext;
1272 - u8 pulse_bw_info;
1273 -} __packed;
1274 -
1275 -/* The HT20 spectral data has 4 bytes of additional information at it's end.
1276 - *
1277 - * [7:0]: all bins {max_magnitude[1:0], bitmap_weight[5:0]}
1278 - * [7:0]: all bins max_magnitude[9:2]
1279 - * [7:0]: all bins {max_index[5:0], max_magnitude[11:10]}
1280 - * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
1281 - */
1282 -struct ath_ht20_mag_info {
1283 - u8 all_bins[3];
1284 - u8 max_exp;
1285 -} __packed;
1286 -
1287 -#define SPECTRAL_HT20_NUM_BINS 56
1288 -
1289 -/* WARNING: don't actually use this struct! MAC may vary the amount of
1290 - * data by -1/+2. This struct is for reference only.
1291 - */
1292 -struct ath_ht20_fft_packet {
1293 - u8 data[SPECTRAL_HT20_NUM_BINS];
1294 - struct ath_ht20_mag_info mag_info;
1295 - struct ath_radar_info radar_info;
1296 -} __packed;
1297 -
1298 -#define SPECTRAL_HT20_TOTAL_DATA_LEN (sizeof(struct ath_ht20_fft_packet))
1299 -
1300 -/* Dynamic 20/40 mode:
1301 - *
1302 - * [7:0]: lower bins {max_magnitude[1:0], bitmap_weight[5:0]}
1303 - * [7:0]: lower bins max_magnitude[9:2]
1304 - * [7:0]: lower bins {max_index[5:0], max_magnitude[11:10]}
1305 - * [7:0]: upper bins {max_magnitude[1:0], bitmap_weight[5:0]}
1306 - * [7:0]: upper bins max_magnitude[9:2]
1307 - * [7:0]: upper bins {max_index[5:0], max_magnitude[11:10]}
1308 - * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
1309 - */
1310 -struct ath_ht20_40_mag_info {
1311 - u8 lower_bins[3];
1312 - u8 upper_bins[3];
1313 - u8 max_exp;
1314 -} __packed;
1315 -
1316 -#define SPECTRAL_HT20_40_NUM_BINS 128
1317 -
1318 -/* WARNING: don't actually use this struct! MAC may vary the amount of
1319 - * data. This struct is for reference only.
1320 - */
1321 -struct ath_ht20_40_fft_packet {
1322 - u8 data[SPECTRAL_HT20_40_NUM_BINS];
1323 - struct ath_ht20_40_mag_info mag_info;
1324 - struct ath_radar_info radar_info;
1325 -} __packed;
1326 -
1327 -
1328 -#define SPECTRAL_HT20_40_TOTAL_DATA_LEN (sizeof(struct ath_ht20_40_fft_packet))
1329 -
1330 -/* grabs the max magnitude from the all/upper/lower bins */
1331 -static inline u16 spectral_max_magnitude(u8 *bins)
1332 -{
1333 - return (bins[0] & 0xc0) >> 6 |
1334 - (bins[1] & 0xff) << 2 |
1335 - (bins[2] & 0x03) << 10;
1336 -}
1337 +/********/
1338 +/* TX99 */
1339 +/********/
1340
1341 -/* return the max magnitude from the all/upper/lower bins */
1342 -static inline u8 spectral_max_index(u8 *bins)
1343 +#ifdef CONFIG_ATH9K_TX99
1344 +void ath9k_tx99_init_debug(struct ath_softc *sc);
1345 +int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb,
1346 + struct ath_tx_control *txctl);
1347 +#else
1348 +static inline void ath9k_tx99_init_debug(struct ath_softc *sc)
1349 {
1350 - s8 m = (bins[2] & 0xfc) >> 2;
1351 -
1352 - /* TODO: this still doesn't always report the right values ... */
1353 - if (m > 32)
1354 - m |= 0xe0;
1355 - else
1356 - m &= ~0xe0;
1357 -
1358 - return m + 29;
1359 }
1360 -
1361 -/* return the bitmap weight from the all/upper/lower bins */
1362 -static inline u8 spectral_bitmap_weight(u8 *bins)
1363 +static inline int ath9k_tx99_send(struct ath_softc *sc,
1364 + struct sk_buff *skb,
1365 + struct ath_tx_control *txctl)
1366 {
1367 - return bins[0] & 0x3f;
1368 + return 0;
1369 }
1370 -
1371 -/* FFT sample format given to userspace via debugfs.
1372 - *
1373 - * Please keep the type/length at the front position and change
1374 - * other fields after adding another sample type
1375 - *
1376 - * TODO: this might need rework when switching to nl80211-based
1377 - * interface.
1378 - */
1379 -enum ath_fft_sample_type {
1380 - ATH_FFT_SAMPLE_HT20 = 1,
1381 - ATH_FFT_SAMPLE_HT20_40,
1382 -};
1383 -
1384 -struct fft_sample_tlv {
1385 - u8 type; /* see ath_fft_sample */
1386 - __be16 length;
1387 - /* type dependent data follows */
1388 -} __packed;
1389 -
1390 -struct fft_sample_ht20 {
1391 - struct fft_sample_tlv tlv;
1392 -
1393 - u8 max_exp;
1394 -
1395 - __be16 freq;
1396 - s8 rssi;
1397 - s8 noise;
1398 -
1399 - __be16 max_magnitude;
1400 - u8 max_index;
1401 - u8 bitmap_weight;
1402 -
1403 - __be64 tsf;
1404 -
1405 - u8 data[SPECTRAL_HT20_NUM_BINS];
1406 -} __packed;
1407 -
1408 -struct fft_sample_ht20_40 {
1409 - struct fft_sample_tlv tlv;
1410 -
1411 - u8 channel_type;
1412 - __be16 freq;
1413 -
1414 - s8 lower_rssi;
1415 - s8 upper_rssi;
1416 -
1417 - __be64 tsf;
1418 -
1419 - s8 lower_noise;
1420 - s8 upper_noise;
1421 -
1422 - __be16 lower_max_magnitude;
1423 - __be16 upper_max_magnitude;
1424 -
1425 - u8 lower_max_index;
1426 - u8 upper_max_index;
1427 -
1428 - u8 lower_bitmap_weight;
1429 - u8 upper_bitmap_weight;
1430 -
1431 - u8 max_exp;
1432 -
1433 - u8 data[SPECTRAL_HT20_40_NUM_BINS];
1434 -} __packed;
1435 -
1436 -int ath9k_tx99_init(struct ath_softc *sc);
1437 -void ath9k_tx99_deinit(struct ath_softc *sc);
1438 -int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb,
1439 - struct ath_tx_control *txctl);
1440 -
1441 -void ath9k_tasklet(unsigned long data);
1442 -int ath_cabq_update(struct ath_softc *);
1443 +#endif /* CONFIG_ATH9K_TX99 */
1444
1445 static inline void ath_read_cachesize(struct ath_common *common, int *csz)
1446 {
1447 common->bus_ops->read_cachesize(common, csz);
1448 }
1449
1450 -extern struct ieee80211_ops ath9k_ops;
1451 -extern int ath9k_modparam_nohwcrypt;
1452 -extern int led_blink;
1453 -extern bool is_ath9k_unloaded;
1454 -
1455 +void ath9k_tasklet(unsigned long data);
1456 +int ath_cabq_update(struct ath_softc *);
1457 u8 ath9k_parse_mpdudensity(u8 mpdudensity);
1458 irqreturn_t ath_isr(int irq, void *dev);
1459 +int ath_reset(struct ath_softc *sc);
1460 +void ath_cancel_work(struct ath_softc *sc);
1461 +void ath_restart_work(struct ath_softc *sc);
1462 int ath9k_init_device(u16 devid, struct ath_softc *sc,
1463 const struct ath_bus_ops *bus_ops);
1464 void ath9k_deinit_device(struct ath_softc *sc);
1465 -void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw);
1466 void ath9k_reload_chainmask_settings(struct ath_softc *sc);
1467 -
1468 -void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw);
1469 -int ath9k_spectral_scan_config(struct ieee80211_hw *hw,
1470 - enum spectral_mode spectral_mode);
1471 -
1472 +u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate);
1473 +void ath_start_rfkill_poll(struct ath_softc *sc);
1474 +void ath9k_rfkill_poll_state(struct ieee80211_hw *hw);
1475 +void ath9k_ps_wakeup(struct ath_softc *sc);
1476 +void ath9k_ps_restore(struct ath_softc *sc);
1477
1478 #ifdef CPTCFG_ATH9K_PCI
1479 int ath_pci_init(void);
1480 @@ -993,15 +851,4 @@ static inline int ath_ahb_init(void) { r
1481 static inline void ath_ahb_exit(void) {};
1482 #endif
1483
1484 -void ath9k_ps_wakeup(struct ath_softc *sc);
1485 -void ath9k_ps_restore(struct ath_softc *sc);
1486 -
1487 -u8 ath_txchainmask_reduction(struct ath_softc *sc, u8 chainmask, u32 rate);
1488 -
1489 -void ath_start_rfkill_poll(struct ath_softc *sc);
1490 -extern void ath9k_rfkill_poll_state(struct ieee80211_hw *hw);
1491 -void ath9k_calculate_iter_data(struct ieee80211_hw *hw,
1492 - struct ieee80211_vif *vif,
1493 - struct ath9k_vif_iter_data *iter_data);
1494 -
1495 #endif /* ATH9K_H */
1496 --- a/drivers/net/wireless/ath/ath9k/debug.c
1497 +++ b/drivers/net/wireless/ath/ath9k/debug.c
1498 @@ -17,7 +17,6 @@
1499 #include <linux/slab.h>
1500 #include <linux/vmalloc.h>
1501 #include <linux/export.h>
1502 -#include <linux/relay.h>
1503 #include <asm/unaligned.h>
1504
1505 #include "ath9k.h"
1506 @@ -27,6 +26,47 @@
1507 #define REG_READ_D(_ah, _reg) \
1508 ath9k_hw_common(_ah)->ops->read((_ah), (_reg))
1509
1510 +void ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause)
1511 +{
1512 + if (sync_cause)
1513 + sc->debug.stats.istats.sync_cause_all++;
1514 + if (sync_cause & AR_INTR_SYNC_RTC_IRQ)
1515 + sc->debug.stats.istats.sync_rtc_irq++;
1516 + if (sync_cause & AR_INTR_SYNC_MAC_IRQ)
1517 + sc->debug.stats.istats.sync_mac_irq++;
1518 + if (sync_cause & AR_INTR_SYNC_EEPROM_ILLEGAL_ACCESS)
1519 + sc->debug.stats.istats.eeprom_illegal_access++;
1520 + if (sync_cause & AR_INTR_SYNC_APB_TIMEOUT)
1521 + sc->debug.stats.istats.apb_timeout++;
1522 + if (sync_cause & AR_INTR_SYNC_PCI_MODE_CONFLICT)
1523 + sc->debug.stats.istats.pci_mode_conflict++;
1524 + if (sync_cause & AR_INTR_SYNC_HOST1_FATAL)
1525 + sc->debug.stats.istats.host1_fatal++;
1526 + if (sync_cause & AR_INTR_SYNC_HOST1_PERR)
1527 + sc->debug.stats.istats.host1_perr++;
1528 + if (sync_cause & AR_INTR_SYNC_TRCV_FIFO_PERR)
1529 + sc->debug.stats.istats.trcv_fifo_perr++;
1530 + if (sync_cause & AR_INTR_SYNC_RADM_CPL_EP)
1531 + sc->debug.stats.istats.radm_cpl_ep++;
1532 + if (sync_cause & AR_INTR_SYNC_RADM_CPL_DLLP_ABORT)
1533 + sc->debug.stats.istats.radm_cpl_dllp_abort++;
1534 + if (sync_cause & AR_INTR_SYNC_RADM_CPL_TLP_ABORT)
1535 + sc->debug.stats.istats.radm_cpl_tlp_abort++;
1536 + if (sync_cause & AR_INTR_SYNC_RADM_CPL_ECRC_ERR)
1537 + sc->debug.stats.istats.radm_cpl_ecrc_err++;
1538 + if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT)
1539 + sc->debug.stats.istats.radm_cpl_timeout++;
1540 + if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT)
1541 + sc->debug.stats.istats.local_timeout++;
1542 + if (sync_cause & AR_INTR_SYNC_PM_ACCESS)
1543 + sc->debug.stats.istats.pm_access++;
1544 + if (sync_cause & AR_INTR_SYNC_MAC_AWAKE)
1545 + sc->debug.stats.istats.mac_awake++;
1546 + if (sync_cause & AR_INTR_SYNC_MAC_ASLEEP)
1547 + sc->debug.stats.istats.mac_asleep++;
1548 + if (sync_cause & AR_INTR_SYNC_MAC_SLEEP_ACCESS)
1549 + sc->debug.stats.istats.mac_sleep_access++;
1550 +}
1551
1552 static ssize_t ath9k_debugfs_read_buf(struct file *file, char __user *user_buf,
1553 size_t count, loff_t *ppos)
1554 @@ -1016,297 +1056,6 @@ static const struct file_operations fops
1555 .llseek = default_llseek,
1556 };
1557
1558 -static ssize_t read_file_spec_scan_ctl(struct file *file, char __user *user_buf,
1559 - size_t count, loff_t *ppos)
1560 -{
1561 - struct ath_softc *sc = file->private_data;
1562 - char *mode = "";
1563 - unsigned int len;
1564 -
1565 - switch (sc->spectral_mode) {
1566 - case SPECTRAL_DISABLED:
1567 - mode = "disable";
1568 - break;
1569 - case SPECTRAL_BACKGROUND:
1570 - mode = "background";
1571 - break;
1572 - case SPECTRAL_CHANSCAN:
1573 - mode = "chanscan";
1574 - break;
1575 - case SPECTRAL_MANUAL:
1576 - mode = "manual";
1577 - break;
1578 - }
1579 - len = strlen(mode);
1580 - return simple_read_from_buffer(user_buf, count, ppos, mode, len);
1581 -}
1582 -
1583 -static ssize_t write_file_spec_scan_ctl(struct file *file,
1584 - const char __user *user_buf,
1585 - size_t count, loff_t *ppos)
1586 -{
1587 - struct ath_softc *sc = file->private_data;
1588 - struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1589 - char buf[32];
1590 - ssize_t len;
1591 -
1592 - if (config_enabled(CPTCFG_ATH9K_TX99))
1593 - return -EOPNOTSUPP;
1594 -
1595 - len = min(count, sizeof(buf) - 1);
1596 - if (copy_from_user(buf, user_buf, len))
1597 - return -EFAULT;
1598 -
1599 - buf[len] = '\0';
1600 -
1601 - if (strncmp("trigger", buf, 7) == 0) {
1602 - ath9k_spectral_scan_trigger(sc->hw);
1603 - } else if (strncmp("background", buf, 9) == 0) {
1604 - ath9k_spectral_scan_config(sc->hw, SPECTRAL_BACKGROUND);
1605 - ath_dbg(common, CONFIG, "spectral scan: background mode enabled\n");
1606 - } else if (strncmp("chanscan", buf, 8) == 0) {
1607 - ath9k_spectral_scan_config(sc->hw, SPECTRAL_CHANSCAN);
1608 - ath_dbg(common, CONFIG, "spectral scan: channel scan mode enabled\n");
1609 - } else if (strncmp("manual", buf, 6) == 0) {
1610 - ath9k_spectral_scan_config(sc->hw, SPECTRAL_MANUAL);
1611 - ath_dbg(common, CONFIG, "spectral scan: manual mode enabled\n");
1612 - } else if (strncmp("disable", buf, 7) == 0) {
1613 - ath9k_spectral_scan_config(sc->hw, SPECTRAL_DISABLED);
1614 - ath_dbg(common, CONFIG, "spectral scan: disabled\n");
1615 - } else {
1616 - return -EINVAL;
1617 - }
1618 -
1619 - return count;
1620 -}
1621 -
1622 -static const struct file_operations fops_spec_scan_ctl = {
1623 - .read = read_file_spec_scan_ctl,
1624 - .write = write_file_spec_scan_ctl,
1625 - .open = simple_open,
1626 - .owner = THIS_MODULE,
1627 - .llseek = default_llseek,
1628 -};
1629 -
1630 -static ssize_t read_file_spectral_short_repeat(struct file *file,
1631 - char __user *user_buf,
1632 - size_t count, loff_t *ppos)
1633 -{
1634 - struct ath_softc *sc = file->private_data;
1635 - char buf[32];
1636 - unsigned int len;
1637 -
1638 - len = sprintf(buf, "%d\n", sc->spec_config.short_repeat);
1639 - return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1640 -}
1641 -
1642 -static ssize_t write_file_spectral_short_repeat(struct file *file,
1643 - const char __user *user_buf,
1644 - size_t count, loff_t *ppos)
1645 -{
1646 - struct ath_softc *sc = file->private_data;
1647 - unsigned long val;
1648 - char buf[32];
1649 - ssize_t len;
1650 -
1651 - len = min(count, sizeof(buf) - 1);
1652 - if (copy_from_user(buf, user_buf, len))
1653 - return -EFAULT;
1654 -
1655 - buf[len] = '\0';
1656 - if (kstrtoul(buf, 0, &val))
1657 - return -EINVAL;
1658 -
1659 - if (val < 0 || val > 1)
1660 - return -EINVAL;
1661 -
1662 - sc->spec_config.short_repeat = val;
1663 - return count;
1664 -}
1665 -
1666 -static const struct file_operations fops_spectral_short_repeat = {
1667 - .read = read_file_spectral_short_repeat,
1668 - .write = write_file_spectral_short_repeat,
1669 - .open = simple_open,
1670 - .owner = THIS_MODULE,
1671 - .llseek = default_llseek,
1672 -};
1673 -
1674 -static ssize_t read_file_spectral_count(struct file *file,
1675 - char __user *user_buf,
1676 - size_t count, loff_t *ppos)
1677 -{
1678 - struct ath_softc *sc = file->private_data;
1679 - char buf[32];
1680 - unsigned int len;
1681 -
1682 - len = sprintf(buf, "%d\n", sc->spec_config.count);
1683 - return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1684 -}
1685 -
1686 -static ssize_t write_file_spectral_count(struct file *file,
1687 - const char __user *user_buf,
1688 - size_t count, loff_t *ppos)
1689 -{
1690 - struct ath_softc *sc = file->private_data;
1691 - unsigned long val;
1692 - char buf[32];
1693 - ssize_t len;
1694 -
1695 - len = min(count, sizeof(buf) - 1);
1696 - if (copy_from_user(buf, user_buf, len))
1697 - return -EFAULT;
1698 -
1699 - buf[len] = '\0';
1700 - if (kstrtoul(buf, 0, &val))
1701 - return -EINVAL;
1702 -
1703 - if (val < 0 || val > 255)
1704 - return -EINVAL;
1705 -
1706 - sc->spec_config.count = val;
1707 - return count;
1708 -}
1709 -
1710 -static const struct file_operations fops_spectral_count = {
1711 - .read = read_file_spectral_count,
1712 - .write = write_file_spectral_count,
1713 - .open = simple_open,
1714 - .owner = THIS_MODULE,
1715 - .llseek = default_llseek,
1716 -};
1717 -
1718 -static ssize_t read_file_spectral_period(struct file *file,
1719 - char __user *user_buf,
1720 - size_t count, loff_t *ppos)
1721 -{
1722 - struct ath_softc *sc = file->private_data;
1723 - char buf[32];
1724 - unsigned int len;
1725 -
1726 - len = sprintf(buf, "%d\n", sc->spec_config.period);
1727 - return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1728 -}
1729 -
1730 -static ssize_t write_file_spectral_period(struct file *file,
1731 - const char __user *user_buf,
1732 - size_t count, loff_t *ppos)
1733 -{
1734 - struct ath_softc *sc = file->private_data;
1735 - unsigned long val;
1736 - char buf[32];
1737 - ssize_t len;
1738 -
1739 - len = min(count, sizeof(buf) - 1);
1740 - if (copy_from_user(buf, user_buf, len))
1741 - return -EFAULT;
1742 -
1743 - buf[len] = '\0';
1744 - if (kstrtoul(buf, 0, &val))
1745 - return -EINVAL;
1746 -
1747 - if (val < 0 || val > 255)
1748 - return -EINVAL;
1749 -
1750 - sc->spec_config.period = val;
1751 - return count;
1752 -}
1753 -
1754 -static const struct file_operations fops_spectral_period = {
1755 - .read = read_file_spectral_period,
1756 - .write = write_file_spectral_period,
1757 - .open = simple_open,
1758 - .owner = THIS_MODULE,
1759 - .llseek = default_llseek,
1760 -};
1761 -
1762 -static ssize_t read_file_spectral_fft_period(struct file *file,
1763 - char __user *user_buf,
1764 - size_t count, loff_t *ppos)
1765 -{
1766 - struct ath_softc *sc = file->private_data;
1767 - char buf[32];
1768 - unsigned int len;
1769 -
1770 - len = sprintf(buf, "%d\n", sc->spec_config.fft_period);
1771 - return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1772 -}
1773 -
1774 -static ssize_t write_file_spectral_fft_period(struct file *file,
1775 - const char __user *user_buf,
1776 - size_t count, loff_t *ppos)
1777 -{
1778 - struct ath_softc *sc = file->private_data;
1779 - unsigned long val;
1780 - char buf[32];
1781 - ssize_t len;
1782 -
1783 - len = min(count, sizeof(buf) - 1);
1784 - if (copy_from_user(buf, user_buf, len))
1785 - return -EFAULT;
1786 -
1787 - buf[len] = '\0';
1788 - if (kstrtoul(buf, 0, &val))
1789 - return -EINVAL;
1790 -
1791 - if (val < 0 || val > 15)
1792 - return -EINVAL;
1793 -
1794 - sc->spec_config.fft_period = val;
1795 - return count;
1796 -}
1797 -
1798 -static const struct file_operations fops_spectral_fft_period = {
1799 - .read = read_file_spectral_fft_period,
1800 - .write = write_file_spectral_fft_period,
1801 - .open = simple_open,
1802 - .owner = THIS_MODULE,
1803 - .llseek = default_llseek,
1804 -};
1805 -
1806 -static struct dentry *create_buf_file_handler(const char *filename,
1807 - struct dentry *parent,
1808 -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,3,0))
1809 - umode_t mode,
1810 -#else
1811 - int mode,
1812 -#endif
1813 - struct rchan_buf *buf,
1814 - int *is_global)
1815 -{
1816 - struct dentry *buf_file;
1817 -
1818 - buf_file = debugfs_create_file(filename, mode, parent, buf,
1819 - &relay_file_operations);
1820 - *is_global = 1;
1821 - return buf_file;
1822 -}
1823 -
1824 -static int remove_buf_file_handler(struct dentry *dentry)
1825 -{
1826 - debugfs_remove(dentry);
1827 -
1828 - return 0;
1829 -}
1830 -
1831 -void ath_debug_send_fft_sample(struct ath_softc *sc,
1832 - struct fft_sample_tlv *fft_sample_tlv)
1833 -{
1834 - int length;
1835 - if (!sc->rfs_chan_spec_scan)
1836 - return;
1837 -
1838 - length = __be16_to_cpu(fft_sample_tlv->length) +
1839 - sizeof(*fft_sample_tlv);
1840 - relay_write(sc->rfs_chan_spec_scan, fft_sample_tlv, length);
1841 -}
1842 -
1843 -static struct rchan_callbacks rfs_spec_scan_cb = {
1844 - .create_buf_file = create_buf_file_handler,
1845 - .remove_buf_file = remove_buf_file_handler,
1846 -};
1847 -
1848 -
1849 static ssize_t read_file_regidx(struct file *file, char __user *user_buf,
1850 size_t count, loff_t *ppos)
1851 {
1852 @@ -1776,117 +1525,9 @@ void ath9k_get_et_stats(struct ieee80211
1853
1854 void ath9k_deinit_debug(struct ath_softc *sc)
1855 {
1856 - if (config_enabled(CPTCFG_ATH9K_DEBUGFS) && sc->rfs_chan_spec_scan) {
1857 - relay_close(sc->rfs_chan_spec_scan);
1858 - sc->rfs_chan_spec_scan = NULL;
1859 - }
1860 + ath9k_spectral_deinit_debug(sc);
1861 }
1862
1863 -static ssize_t read_file_tx99(struct file *file, char __user *user_buf,
1864 - size_t count, loff_t *ppos)
1865 -{
1866 - struct ath_softc *sc = file->private_data;
1867 - char buf[3];
1868 - unsigned int len;
1869 -
1870 - len = sprintf(buf, "%d\n", sc->tx99_state);
1871 - return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1872 -}
1873 -
1874 -static ssize_t write_file_tx99(struct file *file, const char __user *user_buf,
1875 - size_t count, loff_t *ppos)
1876 -{
1877 - struct ath_softc *sc = file->private_data;
1878 - struct ath_common *common = ath9k_hw_common(sc->sc_ah);
1879 - char buf[32];
1880 - bool start;
1881 - ssize_t len;
1882 - int r;
1883 -
1884 - if (sc->nvifs > 1)
1885 - return -EOPNOTSUPP;
1886 -
1887 - len = min(count, sizeof(buf) - 1);
1888 - if (copy_from_user(buf, user_buf, len))
1889 - return -EFAULT;
1890 -
1891 - if (strtobool(buf, &start))
1892 - return -EINVAL;
1893 -
1894 - if (start == sc->tx99_state) {
1895 - if (!start)
1896 - return count;
1897 - ath_dbg(common, XMIT, "Resetting TX99\n");
1898 - ath9k_tx99_deinit(sc);
1899 - }
1900 -
1901 - if (!start) {
1902 - ath9k_tx99_deinit(sc);
1903 - return count;
1904 - }
1905 -
1906 - r = ath9k_tx99_init(sc);
1907 - if (r)
1908 - return r;
1909 -
1910 - return count;
1911 -}
1912 -
1913 -static const struct file_operations fops_tx99 = {
1914 - .read = read_file_tx99,
1915 - .write = write_file_tx99,
1916 - .open = simple_open,
1917 - .owner = THIS_MODULE,
1918 - .llseek = default_llseek,
1919 -};
1920 -
1921 -static ssize_t read_file_tx99_power(struct file *file,
1922 - char __user *user_buf,
1923 - size_t count, loff_t *ppos)
1924 -{
1925 - struct ath_softc *sc = file->private_data;
1926 - char buf[32];
1927 - unsigned int len;
1928 -
1929 - len = sprintf(buf, "%d (%d dBm)\n",
1930 - sc->tx99_power,
1931 - sc->tx99_power / 2);
1932 -
1933 - return simple_read_from_buffer(user_buf, count, ppos, buf, len);
1934 -}
1935 -
1936 -static ssize_t write_file_tx99_power(struct file *file,
1937 - const char __user *user_buf,
1938 - size_t count, loff_t *ppos)
1939 -{
1940 - struct ath_softc *sc = file->private_data;
1941 - int r;
1942 - u8 tx_power;
1943 -
1944 - r = kstrtou8_from_user(user_buf, count, 0, &tx_power);
1945 - if (r)
1946 - return r;
1947 -
1948 - if (tx_power > MAX_RATE_POWER)
1949 - return -EINVAL;
1950 -
1951 - sc->tx99_power = tx_power;
1952 -
1953 - ath9k_ps_wakeup(sc);
1954 - ath9k_hw_tx99_set_txpower(sc->sc_ah, sc->tx99_power);
1955 - ath9k_ps_restore(sc);
1956 -
1957 - return count;
1958 -}
1959 -
1960 -static const struct file_operations fops_tx99_power = {
1961 - .read = read_file_tx99_power,
1962 - .write = write_file_tx99_power,
1963 - .open = simple_open,
1964 - .owner = THIS_MODULE,
1965 - .llseek = default_llseek,
1966 -};
1967 -
1968 int ath9k_init_debug(struct ath_hw *ah)
1969 {
1970 struct ath_common *common = ath9k_hw_common(ah);
1971 @@ -1903,6 +1544,8 @@ int ath9k_init_debug(struct ath_hw *ah)
1972 #endif
1973
1974 ath9k_dfs_init_debug(sc);
1975 + ath9k_tx99_init_debug(sc);
1976 + ath9k_spectral_init_debug(sc);
1977
1978 debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
1979 &fops_dma);
1980 @@ -1949,23 +1592,6 @@ int ath9k_init_debug(struct ath_hw *ah)
1981 &fops_base_eeprom);
1982 debugfs_create_file("modal_eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
1983 &fops_modal_eeprom);
1984 - sc->rfs_chan_spec_scan = relay_open("spectral_scan",
1985 - sc->debug.debugfs_phy,
1986 - 1024, 256, &rfs_spec_scan_cb,
1987 - NULL);
1988 - debugfs_create_file("spectral_scan_ctl", S_IRUSR | S_IWUSR,
1989 - sc->debug.debugfs_phy, sc,
1990 - &fops_spec_scan_ctl);
1991 - debugfs_create_file("spectral_short_repeat", S_IRUSR | S_IWUSR,
1992 - sc->debug.debugfs_phy, sc,
1993 - &fops_spectral_short_repeat);
1994 - debugfs_create_file("spectral_count", S_IRUSR | S_IWUSR,
1995 - sc->debug.debugfs_phy, sc, &fops_spectral_count);
1996 - debugfs_create_file("spectral_period", S_IRUSR | S_IWUSR,
1997 - sc->debug.debugfs_phy, sc, &fops_spectral_period);
1998 - debugfs_create_file("spectral_fft_period", S_IRUSR | S_IWUSR,
1999 - sc->debug.debugfs_phy, sc,
2000 - &fops_spectral_fft_period);
2001 debugfs_create_u32("gpio_mask", S_IRUSR | S_IWUSR,
2002 sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask);
2003 debugfs_create_u32("gpio_val", S_IRUSR | S_IWUSR,
2004 @@ -1978,15 +1604,6 @@ int ath9k_init_debug(struct ath_hw *ah)
2005 debugfs_create_file("btcoex", S_IRUSR, sc->debug.debugfs_phy, sc,
2006 &fops_btcoex);
2007 #endif
2008 - if (config_enabled(CPTCFG_ATH9K_TX99) &&
2009 - AR_SREV_9300_20_OR_LATER(ah)) {
2010 - debugfs_create_file("tx99", S_IRUSR | S_IWUSR,
2011 - sc->debug.debugfs_phy, sc,
2012 - &fops_tx99);
2013 - debugfs_create_file("tx99_power", S_IRUSR | S_IWUSR,
2014 - sc->debug.debugfs_phy, sc,
2015 - &fops_tx99_power);
2016 - }
2017
2018 return 0;
2019 }
2020 --- a/drivers/net/wireless/ath/ath9k/hw.c
2021 +++ b/drivers/net/wireless/ath/ath9k/hw.c
2022 @@ -17,6 +17,8 @@
2023 #include <linux/io.h>
2024 #include <linux/slab.h>
2025 #include <linux/module.h>
2026 +#include <linux/time.h>
2027 +#include <linux/bitops.h>
2028 #include <asm/unaligned.h>
2029
2030 #include "hw.h"
2031 @@ -83,48 +85,6 @@ static void ath9k_hw_ani_cache_ini_regs(
2032
2033 #ifdef CPTCFG_ATH9K_DEBUGFS
2034
2035 -void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause)
2036 -{
2037 - struct ath_softc *sc = common->priv;
2038 - if (sync_cause)
2039 - sc->debug.stats.istats.sync_cause_all++;
2040 - if (sync_cause & AR_INTR_SYNC_RTC_IRQ)
2041 - sc->debug.stats.istats.sync_rtc_irq++;
2042 - if (sync_cause & AR_INTR_SYNC_MAC_IRQ)
2043 - sc->debug.stats.istats.sync_mac_irq++;
2044 - if (sync_cause & AR_INTR_SYNC_EEPROM_ILLEGAL_ACCESS)
2045 - sc->debug.stats.istats.eeprom_illegal_access++;
2046 - if (sync_cause & AR_INTR_SYNC_APB_TIMEOUT)
2047 - sc->debug.stats.istats.apb_timeout++;
2048 - if (sync_cause & AR_INTR_SYNC_PCI_MODE_CONFLICT)
2049 - sc->debug.stats.istats.pci_mode_conflict++;
2050 - if (sync_cause & AR_INTR_SYNC_HOST1_FATAL)
2051 - sc->debug.stats.istats.host1_fatal++;
2052 - if (sync_cause & AR_INTR_SYNC_HOST1_PERR)
2053 - sc->debug.stats.istats.host1_perr++;
2054 - if (sync_cause & AR_INTR_SYNC_TRCV_FIFO_PERR)
2055 - sc->debug.stats.istats.trcv_fifo_perr++;
2056 - if (sync_cause & AR_INTR_SYNC_RADM_CPL_EP)
2057 - sc->debug.stats.istats.radm_cpl_ep++;
2058 - if (sync_cause & AR_INTR_SYNC_RADM_CPL_DLLP_ABORT)
2059 - sc->debug.stats.istats.radm_cpl_dllp_abort++;
2060 - if (sync_cause & AR_INTR_SYNC_RADM_CPL_TLP_ABORT)
2061 - sc->debug.stats.istats.radm_cpl_tlp_abort++;
2062 - if (sync_cause & AR_INTR_SYNC_RADM_CPL_ECRC_ERR)
2063 - sc->debug.stats.istats.radm_cpl_ecrc_err++;
2064 - if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT)
2065 - sc->debug.stats.istats.radm_cpl_timeout++;
2066 - if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT)
2067 - sc->debug.stats.istats.local_timeout++;
2068 - if (sync_cause & AR_INTR_SYNC_PM_ACCESS)
2069 - sc->debug.stats.istats.pm_access++;
2070 - if (sync_cause & AR_INTR_SYNC_MAC_AWAKE)
2071 - sc->debug.stats.istats.mac_awake++;
2072 - if (sync_cause & AR_INTR_SYNC_MAC_ASLEEP)
2073 - sc->debug.stats.istats.mac_asleep++;
2074 - if (sync_cause & AR_INTR_SYNC_MAC_SLEEP_ACCESS)
2075 - sc->debug.stats.istats.mac_sleep_access++;
2076 -}
2077 #endif
2078
2079
2080 @@ -438,23 +398,13 @@ static bool ath9k_hw_chip_test(struct at
2081
2082 static void ath9k_hw_init_config(struct ath_hw *ah)
2083 {
2084 - int i;
2085 -
2086 ah->config.dma_beacon_response_time = 1;
2087 ah->config.sw_beacon_response_time = 6;
2088 - ah->config.additional_swba_backoff = 0;
2089 ah->config.ack_6mb = 0x0;
2090 ah->config.cwm_ignore_extcca = 0;
2091 - ah->config.pcie_clock_req = 0;
2092 ah->config.analog_shiftreg = 1;
2093
2094 - for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
2095 - ah->config.spurchans[i][0] = AR_NO_SPUR;
2096 - ah->config.spurchans[i][1] = AR_NO_SPUR;
2097 - }
2098 -
2099 ah->config.rx_intr_mitigation = true;
2100 - ah->config.pcieSerDesWrite = true;
2101
2102 /*
2103 * We need this for PCI devices only (Cardbus, PCI, miniPCI)
2104 @@ -486,7 +436,6 @@ static void ath9k_hw_init_defaults(struc
2105 ah->hw_version.magic = AR5416_MAGIC;
2106 ah->hw_version.subvendorid = 0;
2107
2108 - ah->atim_window = 0;
2109 ah->sta_id1_defaults =
2110 AR_STA_ID1_CRPT_MIC_ENABLE |
2111 AR_STA_ID1_MCAST_KSRCH;
2112 @@ -549,11 +498,11 @@ static int ath9k_hw_post_init(struct ath
2113 * EEPROM needs to be initialized before we do this.
2114 * This is required for regulatory compliance.
2115 */
2116 - if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
2117 + if (AR_SREV_9300_20_OR_LATER(ah)) {
2118 u16 regdmn = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
2119 if ((regdmn & 0xF0) == CTL_FCC) {
2120 - ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9462_FCC_2GHZ;
2121 - ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_9462_FCC_5GHZ;
2122 + ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_2GHZ;
2123 + ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_5GHZ;
2124 }
2125 }
2126
2127 @@ -1282,6 +1231,42 @@ void ath9k_hw_get_delta_slope_vals(struc
2128 *coef_exponent = coef_exp - 16;
2129 }
2130
2131 +/* AR9330 WAR:
2132 + * call external reset function to reset WMAC if:
2133 + * - doing a cold reset
2134 + * - we have pending frames in the TX queues.
2135 + */
2136 +static bool ath9k_hw_ar9330_reset_war(struct ath_hw *ah, int type)
2137 +{
2138 + int i, npend = 0;
2139 +
2140 + for (i = 0; i < AR_NUM_QCU; i++) {
2141 + npend = ath9k_hw_numtxpending(ah, i);
2142 + if (npend)
2143 + break;
2144 + }
2145 +
2146 + if (ah->external_reset &&
2147 + (npend || type == ATH9K_RESET_COLD)) {
2148 + int reset_err = 0;
2149 +
2150 + ath_dbg(ath9k_hw_common(ah), RESET,
2151 + "reset MAC via external reset\n");
2152 +
2153 + reset_err = ah->external_reset();
2154 + if (reset_err) {
2155 + ath_err(ath9k_hw_common(ah),
2156 + "External reset failed, err=%d\n",
2157 + reset_err);
2158 + return false;
2159 + }
2160 +
2161 + REG_WRITE(ah, AR_RTC_RESET, 1);
2162 + }
2163 +
2164 + return true;
2165 +}
2166 +
2167 static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
2168 {
2169 u32 rst_flags;
2170 @@ -1332,38 +1317,8 @@ static bool ath9k_hw_set_reset(struct at
2171 }
2172
2173 if (AR_SREV_9330(ah)) {
2174 - int npend = 0;
2175 - int i;
2176 -
2177 - /* AR9330 WAR:
2178 - * call external reset function to reset WMAC if:
2179 - * - doing a cold reset
2180 - * - we have pending frames in the TX queues
2181 - */
2182 -
2183 - for (i = 0; i < AR_NUM_QCU; i++) {
2184 - npend = ath9k_hw_numtxpending(ah, i);
2185 - if (npend)
2186 - break;
2187 - }
2188 -
2189 - if (ah->external_reset &&
2190 - (npend || type == ATH9K_RESET_COLD)) {
2191 - int reset_err = 0;
2192 -
2193 - ath_dbg(ath9k_hw_common(ah), RESET,
2194 - "reset MAC via external reset\n");
2195 -
2196 - reset_err = ah->external_reset();
2197 - if (reset_err) {
2198 - ath_err(ath9k_hw_common(ah),
2199 - "External reset failed, err=%d\n",
2200 - reset_err);
2201 - return false;
2202 - }
2203 -
2204 - REG_WRITE(ah, AR_RTC_RESET, 1);
2205 - }
2206 + if (!ath9k_hw_ar9330_reset_war(ah, type))
2207 + return false;
2208 }
2209
2210 if (ath9k_hw_mci_is_enabled(ah))
2211 @@ -1373,7 +1328,12 @@ static bool ath9k_hw_set_reset(struct at
2212
2213 REGWRITE_BUFFER_FLUSH(ah);
2214
2215 - udelay(50);
2216 + if (AR_SREV_9300_20_OR_LATER(ah))
2217 + udelay(50);
2218 + else if (AR_SREV_9100(ah))
2219 + udelay(10000);
2220 + else
2221 + udelay(100);
2222
2223 REG_WRITE(ah, AR_RTC_RC, 0);
2224 if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
2225 @@ -1409,8 +1369,7 @@ static bool ath9k_hw_set_reset_power_on(
2226
2227 REGWRITE_BUFFER_FLUSH(ah);
2228
2229 - if (!AR_SREV_9300_20_OR_LATER(ah))
2230 - udelay(2);
2231 + udelay(2);
2232
2233 if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
2234 REG_WRITE(ah, AR_RC, 0);
2235 @@ -1502,8 +1461,9 @@ static bool ath9k_hw_channel_change(stru
2236 int r;
2237
2238 if (pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) {
2239 - band_switch = IS_CHAN_5GHZ(ah->curchan) != IS_CHAN_5GHZ(chan);
2240 - mode_diff = (chan->channelFlags != ah->curchan->channelFlags);
2241 + u32 flags_diff = chan->channelFlags ^ ah->curchan->channelFlags;
2242 + band_switch = !!(flags_diff & CHANNEL_5GHZ);
2243 + mode_diff = !!(flags_diff & ~CHANNEL_HT);
2244 }
2245
2246 for (qnum = 0; qnum < AR_NUM_QCU; qnum++) {
2247 @@ -1815,7 +1775,7 @@ static int ath9k_hw_do_fastcc(struct ath
2248 * If cross-band fcc is not supoprted, bail out if channelFlags differ.
2249 */
2250 if (!(pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) &&
2251 - chan->channelFlags != ah->curchan->channelFlags)
2252 + ((chan->channelFlags ^ ah->curchan->channelFlags) & ~CHANNEL_HT))
2253 goto fail;
2254
2255 if (!ath9k_hw_check_alive(ah))
2256 @@ -1856,10 +1816,12 @@ int ath9k_hw_reset(struct ath_hw *ah, st
2257 struct ath9k_hw_cal_data *caldata, bool fastcc)
2258 {
2259 struct ath_common *common = ath9k_hw_common(ah);
2260 + struct timespec ts;
2261 u32 saveLedState;
2262 u32 saveDefAntenna;
2263 u32 macStaId1;
2264 u64 tsf = 0;
2265 + s64 usec = 0;
2266 int r;
2267 bool start_mci_reset = false;
2268 bool save_fullsleep = ah->chip_fullsleep;
2269 @@ -1902,10 +1864,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
2270
2271 macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;
2272
2273 - /* For chips on which RTC reset is done, save TSF before it gets cleared */
2274 - if (AR_SREV_9100(ah) ||
2275 - (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)))
2276 - tsf = ath9k_hw_gettsf64(ah);
2277 + /* Save TSF before chip reset, a cold reset clears it */
2278 + tsf = ath9k_hw_gettsf64(ah);
2279 + getrawmonotonic(&ts);
2280 + usec = ts.tv_sec * 1000000ULL + ts.tv_nsec / 1000;
2281
2282 saveLedState = REG_READ(ah, AR_CFG_LED) &
2283 (AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL |
2284 @@ -1938,8 +1900,9 @@ int ath9k_hw_reset(struct ath_hw *ah, st
2285 }
2286
2287 /* Restore TSF */
2288 - if (tsf)
2289 - ath9k_hw_settsf64(ah, tsf);
2290 + getrawmonotonic(&ts);
2291 + usec = ts.tv_sec * 1000000ULL + ts.tv_nsec / 1000 - usec;
2292 + ath9k_hw_settsf64(ah, tsf + usec);
2293
2294 if (AR_SREV_9280_20_OR_LATER(ah))
2295 REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
2296 @@ -2261,9 +2224,6 @@ void ath9k_hw_beaconinit(struct ath_hw *
2297 case NL80211_IFTYPE_ADHOC:
2298 REG_SET_BIT(ah, AR_TXCFG,
2299 AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
2300 - REG_WRITE(ah, AR_NEXT_NDP_TIMER, next_beacon +
2301 - TU_TO_USEC(ah->atim_window ? ah->atim_window : 1));
2302 - flags |= AR_NDP_TIMER_EN;
2303 case NL80211_IFTYPE_MESH_POINT:
2304 case NL80211_IFTYPE_AP:
2305 REG_WRITE(ah, AR_NEXT_TBTT_TIMER, next_beacon);
2306 @@ -2284,7 +2244,6 @@ void ath9k_hw_beaconinit(struct ath_hw *
2307 REG_WRITE(ah, AR_BEACON_PERIOD, beacon_period);
2308 REG_WRITE(ah, AR_DMA_BEACON_PERIOD, beacon_period);
2309 REG_WRITE(ah, AR_SWBA_PERIOD, beacon_period);
2310 - REG_WRITE(ah, AR_NDP_PERIOD, beacon_period);
2311
2312 REGWRITE_BUFFER_FLUSH(ah);
2313
2314 @@ -2301,12 +2260,9 @@ void ath9k_hw_set_sta_beacon_timers(stru
2315
2316 ENABLE_REGWRITE_BUFFER(ah);
2317
2318 - REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt));
2319 -
2320 - REG_WRITE(ah, AR_BEACON_PERIOD,
2321 - TU_TO_USEC(bs->bs_intval));
2322 - REG_WRITE(ah, AR_DMA_BEACON_PERIOD,
2323 - TU_TO_USEC(bs->bs_intval));
2324 + REG_WRITE(ah, AR_NEXT_TBTT_TIMER, bs->bs_nexttbtt);
2325 + REG_WRITE(ah, AR_BEACON_PERIOD, bs->bs_intval);
2326 + REG_WRITE(ah, AR_DMA_BEACON_PERIOD, bs->bs_intval);
2327
2328 REGWRITE_BUFFER_FLUSH(ah);
2329
2330 @@ -2334,9 +2290,8 @@ void ath9k_hw_set_sta_beacon_timers(stru
2331
2332 ENABLE_REGWRITE_BUFFER(ah);
2333
2334 - REG_WRITE(ah, AR_NEXT_DTIM,
2335 - TU_TO_USEC(bs->bs_nextdtim - SLEEP_SLOP));
2336 - REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP));
2337 + REG_WRITE(ah, AR_NEXT_DTIM, bs->bs_nextdtim - SLEEP_SLOP);
2338 + REG_WRITE(ah, AR_NEXT_TIM, nextTbtt - SLEEP_SLOP);
2339
2340 REG_WRITE(ah, AR_SLEEP1,
2341 SM((CAB_TIMEOUT_VAL << 3), AR_SLEEP1_CAB_TIMEOUT)
2342 @@ -2350,8 +2305,8 @@ void ath9k_hw_set_sta_beacon_timers(stru
2343 REG_WRITE(ah, AR_SLEEP2,
2344 SM(beacontimeout, AR_SLEEP2_BEACON_TIMEOUT));
2345
2346 - REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval));
2347 - REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod));
2348 + REG_WRITE(ah, AR_TIM_PERIOD, beaconintval);
2349 + REG_WRITE(ah, AR_DTIM_PERIOD, dtimperiod);
2350
2351 REGWRITE_BUFFER_FLUSH(ah);
2352
2353 @@ -2987,20 +2942,6 @@ static const struct ath_gen_timer_config
2354
2355 /* HW generic timer primitives */
2356
2357 -/* compute and clear index of rightmost 1 */
2358 -static u32 rightmost_index(struct ath_gen_timer_table *timer_table, u32 *mask)
2359 -{
2360 - u32 b;
2361 -
2362 - b = *mask;
2363 - b &= (0-b);
2364 - *mask &= ~b;
2365 - b *= debruijn32;
2366 - b >>= 27;
2367 -
2368 - return timer_table->gen_timer_index[b];
2369 -}
2370 -
2371 u32 ath9k_hw_gettsf32(struct ath_hw *ah)
2372 {
2373 return REG_READ(ah, AR_TSF_L32);
2374 @@ -3016,6 +2957,10 @@ struct ath_gen_timer *ath_gen_timer_allo
2375 struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2376 struct ath_gen_timer *timer;
2377
2378 + if ((timer_index < AR_FIRST_NDP_TIMER) ||
2379 + (timer_index >= ATH_MAX_GEN_TIMER))
2380 + return NULL;
2381 +
2382 timer = kzalloc(sizeof(struct ath_gen_timer), GFP_KERNEL);
2383 if (timer == NULL)
2384 return NULL;
2385 @@ -3033,23 +2978,13 @@ EXPORT_SYMBOL(ath_gen_timer_alloc);
2386
2387 void ath9k_hw_gen_timer_start(struct ath_hw *ah,
2388 struct ath_gen_timer *timer,
2389 - u32 trig_timeout,
2390 + u32 timer_next,
2391 u32 timer_period)
2392 {
2393 struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2394 - u32 tsf, timer_next;
2395 -
2396 - BUG_ON(!timer_period);
2397 -
2398 - set_bit(timer->index, &timer_table->timer_mask.timer_bits);
2399 -
2400 - tsf = ath9k_hw_gettsf32(ah);
2401 + u32 mask = 0;
2402
2403 - timer_next = tsf + trig_timeout;
2404 -
2405 - ath_dbg(ath9k_hw_common(ah), BTCOEX,
2406 - "current tsf %x period %x timer_next %x\n",
2407 - tsf, timer_period, timer_next);
2408 + timer_table->timer_mask |= BIT(timer->index);
2409
2410 /*
2411 * Program generic timer registers
2412 @@ -3075,10 +3010,19 @@ void ath9k_hw_gen_timer_start(struct ath
2413 (1 << timer->index));
2414 }
2415
2416 - /* Enable both trigger and thresh interrupt masks */
2417 - REG_SET_BIT(ah, AR_IMR_S5,
2418 - (SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) |
2419 - SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG)));
2420 + if (timer->trigger)
2421 + mask |= SM(AR_GENTMR_BIT(timer->index),
2422 + AR_IMR_S5_GENTIMER_TRIG);
2423 + if (timer->overflow)
2424 + mask |= SM(AR_GENTMR_BIT(timer->index),
2425 + AR_IMR_S5_GENTIMER_THRESH);
2426 +
2427 + REG_SET_BIT(ah, AR_IMR_S5, mask);
2428 +
2429 + if ((ah->imask & ATH9K_INT_GENTIMER) == 0) {
2430 + ah->imask |= ATH9K_INT_GENTIMER;
2431 + ath9k_hw_set_interrupts(ah);
2432 + }
2433 }
2434 EXPORT_SYMBOL(ath9k_hw_gen_timer_start);
2435
2436 @@ -3086,11 +3030,6 @@ void ath9k_hw_gen_timer_stop(struct ath_
2437 {
2438 struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2439
2440 - if ((timer->index < AR_FIRST_NDP_TIMER) ||
2441 - (timer->index >= ATH_MAX_GEN_TIMER)) {
2442 - return;
2443 - }
2444 -
2445 /* Clear generic timer enable bits. */
2446 REG_CLR_BIT(ah, gen_tmr_configuration[timer->index].mode_addr,
2447 gen_tmr_configuration[timer->index].mode_mask);
2448 @@ -3110,7 +3049,12 @@ void ath9k_hw_gen_timer_stop(struct ath_
2449 (SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) |
2450 SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG)));
2451
2452 - clear_bit(timer->index, &timer_table->timer_mask.timer_bits);
2453 + timer_table->timer_mask &= ~BIT(timer->index);
2454 +
2455 + if (timer_table->timer_mask == 0) {
2456 + ah->imask &= ~ATH9K_INT_GENTIMER;
2457 + ath9k_hw_set_interrupts(ah);
2458 + }
2459 }
2460 EXPORT_SYMBOL(ath9k_hw_gen_timer_stop);
2461
2462 @@ -3131,32 +3075,32 @@ void ath_gen_timer_isr(struct ath_hw *ah
2463 {
2464 struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2465 struct ath_gen_timer *timer;
2466 - struct ath_common *common = ath9k_hw_common(ah);
2467 - u32 trigger_mask, thresh_mask, index;
2468 + unsigned long trigger_mask, thresh_mask;
2469 + unsigned int index;
2470
2471 /* get hardware generic timer interrupt status */
2472 trigger_mask = ah->intr_gen_timer_trigger;
2473 thresh_mask = ah->intr_gen_timer_thresh;
2474 - trigger_mask &= timer_table->timer_mask.val;
2475 - thresh_mask &= timer_table->timer_mask.val;
2476 + trigger_mask &= timer_table->timer_mask;
2477 + thresh_mask &= timer_table->timer_mask;
2478
2479 - trigger_mask &= ~thresh_mask;
2480 -
2481 - while (thresh_mask) {
2482 - index = rightmost_index(timer_table, &thresh_mask);
2483 + for_each_set_bit(index, &thresh_mask, ARRAY_SIZE(timer_table->timers)) {
2484 timer = timer_table->timers[index];
2485 - BUG_ON(!timer);
2486 - ath_dbg(common, BTCOEX, "TSF overflow for Gen timer %d\n",
2487 - index);
2488 + if (!timer)
2489 + continue;
2490 + if (!timer->overflow)
2491 + continue;
2492 +
2493 + trigger_mask &= ~BIT(index);
2494 timer->overflow(timer->arg);
2495 }
2496
2497 - while (trigger_mask) {
2498 - index = rightmost_index(timer_table, &trigger_mask);
2499 + for_each_set_bit(index, &trigger_mask, ARRAY_SIZE(timer_table->timers)) {
2500 timer = timer_table->timers[index];
2501 - BUG_ON(!timer);
2502 - ath_dbg(common, BTCOEX,
2503 - "Gen timer[%d] trigger\n", index);
2504 + if (!timer)
2505 + continue;
2506 + if (!timer->trigger)
2507 + continue;
2508 timer->trigger(timer->arg);
2509 }
2510 }
2511 --- a/drivers/net/wireless/ath/ath9k/hw.h
2512 +++ b/drivers/net/wireless/ath/ath9k/hw.h
2513 @@ -168,7 +168,7 @@
2514 #define CAB_TIMEOUT_VAL 10
2515 #define BEACON_TIMEOUT_VAL 10
2516 #define MIN_BEACON_TIMEOUT_VAL 1
2517 -#define SLEEP_SLOP 3
2518 +#define SLEEP_SLOP TU_TO_USEC(3)
2519
2520 #define INIT_CONFIG_STATUS 0x00000000
2521 #define INIT_RSSI_THR 0x00000700
2522 @@ -280,11 +280,8 @@ struct ath9k_hw_capabilities {
2523 struct ath9k_ops_config {
2524 int dma_beacon_response_time;
2525 int sw_beacon_response_time;
2526 - int additional_swba_backoff;
2527 int ack_6mb;
2528 u32 cwm_ignore_extcca;
2529 - bool pcieSerDesWrite;
2530 - u8 pcie_clock_req;
2531 u32 pcie_waen;
2532 u8 analog_shiftreg;
2533 u32 ofdm_trig_low;
2534 @@ -295,18 +292,11 @@ struct ath9k_ops_config {
2535 int serialize_regmode;
2536 bool rx_intr_mitigation;
2537 bool tx_intr_mitigation;
2538 -#define SPUR_DISABLE 0
2539 -#define SPUR_ENABLE_IOCTL 1
2540 -#define SPUR_ENABLE_EEPROM 2
2541 -#define AR_SPUR_5413_1 1640
2542 -#define AR_SPUR_5413_2 1200
2543 #define AR_NO_SPUR 0x8000
2544 #define AR_BASE_FREQ_2GHZ 2300
2545 #define AR_BASE_FREQ_5GHZ 4900
2546 #define AR_SPUR_FEEQ_BOUND_HT40 19
2547 #define AR_SPUR_FEEQ_BOUND_HT20 10
2548 - int spurmode;
2549 - u16 spurchans[AR_EEPROM_MODAL_SPURS][2];
2550 u8 max_txtrig_level;
2551 u16 ani_poll_interval; /* ANI poll interval in ms */
2552
2553 @@ -316,6 +306,8 @@ struct ath9k_ops_config {
2554 u32 ant_ctrl_comm2g_switch_enable;
2555 bool xatten_margin_cfg;
2556 bool alt_mingainidx;
2557 + bool no_pll_pwrsave;
2558 + bool tx_gain_buffalo;
2559 };
2560
2561 enum ath9k_int {
2562 @@ -459,10 +451,6 @@ struct ath9k_beacon_state {
2563 u32 bs_intval;
2564 #define ATH9K_TSFOOR_THRESHOLD 0x00004240 /* 16k us */
2565 u32 bs_dtimperiod;
2566 - u16 bs_cfpperiod;
2567 - u16 bs_cfpmaxduration;
2568 - u32 bs_cfpnext;
2569 - u16 bs_timoffset;
2570 u16 bs_bmissthreshold;
2571 u32 bs_sleepduration;
2572 u32 bs_tsfoor_threshold;
2573 @@ -498,12 +486,6 @@ struct ath9k_hw_version {
2574
2575 #define AR_GENTMR_BIT(_index) (1 << (_index))
2576
2577 -/*
2578 - * Using de Bruijin sequence to look up 1's index in a 32 bit number
2579 - * debruijn32 = 0000 0111 0111 1100 1011 0101 0011 0001
2580 - */
2581 -#define debruijn32 0x077CB531U
2582 -
2583 struct ath_gen_timer_configuration {
2584 u32 next_addr;
2585 u32 period_addr;
2586 @@ -519,12 +501,8 @@ struct ath_gen_timer {
2587 };
2588
2589 struct ath_gen_timer_table {
2590 - u32 gen_timer_index[32];
2591 struct ath_gen_timer *timers[ATH_MAX_GEN_TIMER];
2592 - union {
2593 - unsigned long timer_bits;
2594 - u16 val;
2595 - } timer_mask;
2596 + u16 timer_mask;
2597 };
2598
2599 struct ath_hw_antcomb_conf {
2600 @@ -689,7 +667,8 @@ struct ath_hw_ops {
2601 struct ath9k_channel *chan,
2602 u8 rxchainmask,
2603 bool longcal);
2604 - bool (*get_isr)(struct ath_hw *ah, enum ath9k_int *masked);
2605 + bool (*get_isr)(struct ath_hw *ah, enum ath9k_int *masked,
2606 + u32 *sync_cause_p);
2607 void (*set_txdesc)(struct ath_hw *ah, void *ds,
2608 struct ath_tx_info *i);
2609 int (*proc_txdesc)(struct ath_hw *ah, void *ds,
2610 @@ -785,7 +764,6 @@ struct ath_hw {
2611 u32 txurn_interrupt_mask;
2612 atomic_t intr_ref_cnt;
2613 bool chip_fullsleep;
2614 - u32 atim_window;
2615 u32 modes_index;
2616
2617 /* Calibration */
2618 @@ -864,6 +842,7 @@ struct ath_hw {
2619 u32 gpio_mask;
2620 u32 gpio_val;
2621
2622 + struct ar5416IniArray ini_dfs;
2623 struct ar5416IniArray iniModes;
2624 struct ar5416IniArray iniCommon;
2625 struct ar5416IniArray iniBB_RfGain;
2626 @@ -920,7 +899,7 @@ struct ath_hw {
2627 /* Enterprise mode cap */
2628 u32 ent_mode;
2629
2630 -#ifdef CONFIG_PM_SLEEP
2631 +#ifdef CONFIG_ATH9K_WOW
2632 u32 wow_event_mask;
2633 #endif
2634 bool is_clk_25mhz;
2635 @@ -1016,13 +995,6 @@ bool ath9k_hw_check_alive(struct ath_hw
2636
2637 bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode);
2638
2639 -#ifdef CPTCFG_ATH9K_DEBUGFS
2640 -void ath9k_debug_sync_cause(struct ath_common *common, u32 sync_cause);
2641 -#else
2642 -static inline void ath9k_debug_sync_cause(struct ath_common *common,
2643 - u32 sync_cause) {}
2644 -#endif
2645 -
2646 /* Generic hw timer primitives */
2647 struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
2648 void (*trigger)(void *),
2649 @@ -1126,7 +1098,7 @@ ath9k_hw_get_btcoex_scheme(struct ath_hw
2650 #endif /* CPTCFG_ATH9K_BTCOEX_SUPPORT */
2651
2652
2653 -#ifdef CONFIG_PM_SLEEP
2654 +#ifdef CONFIG_ATH9K_WOW
2655 const char *ath9k_hw_wow_event_to_string(u32 wow_event);
2656 void ath9k_hw_wow_apply_pattern(struct ath_hw *ah, u8 *user_pattern,
2657 u8 *user_mask, int pattern_count,
2658 --- a/drivers/net/wireless/ath/ath9k/init.c
2659 +++ b/drivers/net/wireless/ath/ath9k/init.c
2660 @@ -470,7 +470,6 @@ static int ath9k_init_queues(struct ath_
2661
2662 sc->beacon.beaconq = ath9k_hw_beaconq_setup(sc->sc_ah);
2663 sc->beacon.cabq = ath_txq_setup(sc, ATH9K_TX_QUEUE_CAB, 0);
2664 -
2665 ath_cabq_update(sc);
2666
2667 sc->tx.uapsdq = ath_txq_setup(sc, ATH9K_TX_QUEUE_UAPSD, 0);
2668 @@ -554,7 +553,7 @@ static void ath9k_init_misc(struct ath_s
2669 sc->spec_config.fft_period = 0xF;
2670 }
2671
2672 -static void ath9k_init_platform(struct ath_softc *sc)
2673 +static void ath9k_init_pcoem_platform(struct ath_softc *sc)
2674 {
2675 struct ath_hw *ah = sc->sc_ah;
2676 struct ath9k_hw_capabilities *pCap = &ah->caps;
2677 @@ -609,6 +608,11 @@ static void ath9k_init_platform(struct a
2678 ah->config.pcie_waen = 0x0040473b;
2679 ath_info(common, "Enable WAR for ASPM D3/L1\n");
2680 }
2681 +
2682 + if (sc->driver_data & ATH9K_PCI_NO_PLL_PWRSAVE) {
2683 + ah->config.no_pll_pwrsave = true;
2684 + ath_info(common, "Disable PLL PowerSave\n");
2685 + }
2686 }
2687
2688 static void ath9k_eeprom_request_cb(const struct firmware *eeprom_blob,
2689 @@ -656,6 +660,27 @@ static void ath9k_eeprom_release(struct
2690 release_firmware(sc->sc_ah->eeprom_blob);
2691 }
2692
2693 +static int ath9k_init_soc_platform(struct ath_softc *sc)
2694 +{
2695 + struct ath9k_platform_data *pdata = sc->dev->platform_data;
2696 + struct ath_hw *ah = sc->sc_ah;
2697 + int ret = 0;
2698 +
2699 + if (!pdata)
2700 + return 0;
2701 +
2702 + if (pdata->eeprom_name) {
2703 + ret = ath9k_eeprom_request(sc, pdata->eeprom_name);
2704 + if (ret)
2705 + return ret;
2706 + }
2707 +
2708 + if (pdata->tx_gain_buffalo)
2709 + ah->config.tx_gain_buffalo = true;
2710 +
2711 + return ret;
2712 +}
2713 +
2714 static int ath9k_init_softc(u16 devid, struct ath_softc *sc,
2715 const struct ath_bus_ops *bus_ops)
2716 {
2717 @@ -676,13 +701,13 @@ static int ath9k_init_softc(u16 devid, s
2718 ah->reg_ops.read = ath9k_ioread32;
2719 ah->reg_ops.write = ath9k_iowrite32;
2720 ah->reg_ops.rmw = ath9k_reg_rmw;
2721 - atomic_set(&ah->intr_ref_cnt, -1);
2722 sc->sc_ah = ah;
2723 pCap = &ah->caps;
2724
2725 common = ath9k_hw_common(ah);
2726 sc->dfs_detector = dfs_pattern_detector_init(common, NL80211_DFS_UNSET);
2727 sc->tx99_power = MAX_RATE_POWER + 1;
2728 + init_waitqueue_head(&sc->tx_wait);
2729
2730 if (!pdata) {
2731 ah->ah_flags |= AH_USE_EEPROM;
2732 @@ -708,7 +733,11 @@ static int ath9k_init_softc(u16 devid, s
2733 /*
2734 * Platform quirks.
2735 */
2736 - ath9k_init_platform(sc);
2737 + ath9k_init_pcoem_platform(sc);
2738 +
2739 + ret = ath9k_init_soc_platform(sc);
2740 + if (ret)
2741 + return ret;
2742
2743 /*
2744 * Enable WLAN/BT RX Antenna diversity only when:
2745 @@ -722,7 +751,6 @@ static int ath9k_init_softc(u16 devid, s
2746 common->bt_ant_diversity = 1;
2747
2748 spin_lock_init(&common->cc_lock);
2749 -
2750 spin_lock_init(&sc->sc_serial_rw);
2751 spin_lock_init(&sc->sc_pm_lock);
2752 mutex_init(&sc->mutex);
2753 @@ -730,6 +758,7 @@ static int ath9k_init_softc(u16 devid, s
2754 tasklet_init(&sc->bcon_tasklet, ath9k_beacon_tasklet,
2755 (unsigned long)sc);
2756
2757 + setup_timer(&sc->sleep_timer, ath_ps_full_sleep, (unsigned long)sc);
2758 INIT_WORK(&sc->hw_reset_work, ath_reset_work);
2759 INIT_WORK(&sc->hw_check_work, ath_hw_check);
2760 INIT_WORK(&sc->paprd_work, ath_paprd_calibrate);
2761 @@ -743,12 +772,6 @@ static int ath9k_init_softc(u16 devid, s
2762 ath_read_cachesize(common, &csz);
2763 common->cachelsz = csz << 2; /* convert to bytes */
2764
2765 - if (pdata && pdata->eeprom_name) {
2766 - ret = ath9k_eeprom_request(sc, pdata->eeprom_name);
2767 - if (ret)
2768 - return ret;
2769 - }
2770 -
2771 /* Initializes the hardware for all supported chipsets */
2772 ret = ath9k_hw_init(ah);
2773 if (ret)
2774 @@ -845,7 +868,8 @@ static const struct ieee80211_iface_limi
2775 };
2776
2777 static const struct ieee80211_iface_limit if_dfs_limits[] = {
2778 - { .max = 1, .types = BIT(NL80211_IFTYPE_AP) },
2779 + { .max = 1, .types = BIT(NL80211_IFTYPE_AP) |
2780 + BIT(NL80211_IFTYPE_ADHOC) },
2781 };
2782
2783 static const struct ieee80211_iface_combination if_comb[] = {
2784 @@ -862,21 +886,12 @@ static const struct ieee80211_iface_comb
2785 .max_interfaces = 1,
2786 .num_different_channels = 1,
2787 .beacon_int_infra_match = true,
2788 - .radar_detect_widths = BIT(NL80211_CHAN_NO_HT) |
2789 - BIT(NL80211_CHAN_HT20),
2790 + .radar_detect_widths = BIT(NL80211_CHAN_WIDTH_20_NOHT) |
2791 + BIT(NL80211_CHAN_WIDTH_20),
2792 }
2793 };
2794
2795 -#ifdef CONFIG_PM
2796 -static const struct wiphy_wowlan_support ath9k_wowlan_support = {
2797 - .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
2798 - .n_patterns = MAX_NUM_USER_PATTERN,
2799 - .pattern_min_len = 1,
2800 - .pattern_max_len = MAX_PATTERN_SIZE,
2801 -};
2802 -#endif
2803 -
2804 -void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
2805 +static void ath9k_set_hw_capab(struct ath_softc *sc, struct ieee80211_hw *hw)
2806 {
2807 struct ath_hw *ah = sc->sc_ah;
2808 struct ath_common *common = ath9k_hw_common(ah);
2809 @@ -925,16 +940,6 @@ void ath9k_set_hw_capab(struct ath_softc
2810 hw->wiphy->flags |= WIPHY_FLAG_SUPPORTS_5_10_MHZ;
2811 hw->wiphy->flags |= WIPHY_FLAG_HAS_CHANNEL_SWITCH;
2812
2813 -#ifdef CONFIG_PM_SLEEP
2814 - if ((ah->caps.hw_caps & ATH9K_HW_WOW_DEVICE_CAPABLE) &&
2815 - (sc->driver_data & ATH9K_PCI_WOW) &&
2816 - device_can_wakeup(sc->dev))
2817 - hw->wiphy->wowlan = &ath9k_wowlan_support;
2818 -
2819 - atomic_set(&sc->wow_sleep_proc_intr, -1);
2820 - atomic_set(&sc->wow_got_bmiss_intr, -1);
2821 -#endif
2822 -
2823 hw->queues = 4;
2824 hw->max_rates = 4;
2825 hw->channel_change_time = 5000;
2826 @@ -960,6 +965,7 @@ void ath9k_set_hw_capab(struct ath_softc
2827 hw->wiphy->bands[IEEE80211_BAND_5GHZ] =
2828 &sc->sbands[IEEE80211_BAND_5GHZ];
2829
2830 + ath9k_init_wow(hw);
2831 ath9k_reload_chainmask_settings(sc);
2832
2833 SET_IEEE80211_PERM_ADDR(hw, common->macaddr);
2834 @@ -1058,6 +1064,7 @@ static void ath9k_deinit_softc(struct at
2835 if (ATH_TXQ_SETUP(sc, i))
2836 ath_tx_cleanupq(sc, &sc->tx.txq[i]);
2837
2838 + del_timer_sync(&sc->sleep_timer);
2839 ath9k_hw_deinit(sc->sc_ah);
2840 if (sc->dfs_detector != NULL)
2841 sc->dfs_detector->exit(sc->dfs_detector);
2842 --- a/drivers/net/wireless/ath/ath9k/main.c
2843 +++ b/drivers/net/wireless/ath/ath9k/main.c
2844 @@ -82,6 +82,22 @@ static bool ath9k_setpower(struct ath_so
2845 return ret;
2846 }
2847
2848 +void ath_ps_full_sleep(unsigned long data)
2849 +{
2850 + struct ath_softc *sc = (struct ath_softc *) data;
2851 + struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2852 + bool reset;
2853 +
2854 + spin_lock(&common->cc_lock);
2855 + ath_hw_cycle_counters_update(common);
2856 + spin_unlock(&common->cc_lock);
2857 +
2858 + ath9k_hw_setrxabort(sc->sc_ah, 1);
2859 + ath9k_hw_stopdmarecv(sc->sc_ah, &reset);
2860 +
2861 + ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_FULL_SLEEP);
2862 +}
2863 +
2864 void ath9k_ps_wakeup(struct ath_softc *sc)
2865 {
2866 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2867 @@ -92,6 +108,7 @@ void ath9k_ps_wakeup(struct ath_softc *s
2868 if (++sc->ps_usecount != 1)
2869 goto unlock;
2870
2871 + del_timer_sync(&sc->sleep_timer);
2872 power_mode = sc->sc_ah->power_mode;
2873 ath9k_hw_setpower(sc->sc_ah, ATH9K_PM_AWAKE);
2874
2875 @@ -117,17 +134,17 @@ void ath9k_ps_restore(struct ath_softc *
2876 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
2877 enum ath9k_power_mode mode;
2878 unsigned long flags;
2879 - bool reset;
2880
2881 spin_lock_irqsave(&sc->sc_pm_lock, flags);
2882 if (--sc->ps_usecount != 0)
2883 goto unlock;
2884
2885 if (sc->ps_idle) {
2886 - ath9k_hw_setrxabort(sc->sc_ah, 1);
2887 - ath9k_hw_stopdmarecv(sc->sc_ah, &reset);
2888 - mode = ATH9K_PM_FULL_SLEEP;
2889 - } else if (sc->ps_enabled &&
2890 + mod_timer(&sc->sleep_timer, jiffies + HZ / 10);
2891 + goto unlock;
2892 + }
2893 +
2894 + if (sc->ps_enabled &&
2895 !(sc->ps_flags & (PS_WAIT_FOR_BEACON |
2896 PS_WAIT_FOR_CAB |
2897 PS_WAIT_FOR_PSPOLL_DATA |
2898 @@ -163,13 +180,13 @@ static void __ath_cancel_work(struct ath
2899 #endif
2900 }
2901
2902 -static void ath_cancel_work(struct ath_softc *sc)
2903 +void ath_cancel_work(struct ath_softc *sc)
2904 {
2905 __ath_cancel_work(sc);
2906 cancel_work_sync(&sc->hw_reset_work);
2907 }
2908
2909 -static void ath_restart_work(struct ath_softc *sc)
2910 +void ath_restart_work(struct ath_softc *sc)
2911 {
2912 ieee80211_queue_delayed_work(sc->hw, &sc->tx_complete_work, 0);
2913
2914 @@ -487,8 +504,13 @@ void ath9k_tasklet(unsigned long data)
2915 ath_tx_edma_tasklet(sc);
2916 else
2917 ath_tx_tasklet(sc);
2918 +
2919 + wake_up(&sc->tx_wait);
2920 }
2921
2922 + if (status & ATH9K_INT_GENTIMER)
2923 + ath_gen_timer_isr(sc->sc_ah);
2924 +
2925 ath9k_btcoex_handle_interrupt(sc, status);
2926
2927 /* re-enable hardware interrupt */
2928 @@ -519,6 +541,7 @@ irqreturn_t ath_isr(int irq, void *dev)
2929 struct ath_hw *ah = sc->sc_ah;
2930 struct ath_common *common = ath9k_hw_common(ah);
2931 enum ath9k_int status;
2932 + u32 sync_cause;
2933 bool sched = false;
2934
2935 /*
2936 @@ -545,7 +568,8 @@ irqreturn_t ath_isr(int irq, void *dev)
2937 * bits we haven't explicitly enabled so we mask the
2938 * value to insure we only process bits we requested.
2939 */
2940 - ath9k_hw_getisr(ah, &status); /* NB: clears ISR too */
2941 + ath9k_hw_getisr(ah, &status, &sync_cause); /* NB: clears ISR too */
2942 + ath9k_debug_sync_cause(sc, sync_cause);
2943 status &= ah->imask; /* discard unasked-for bits */
2944
2945 /*
2946 @@ -579,7 +603,8 @@ irqreturn_t ath_isr(int irq, void *dev)
2947
2948 goto chip_reset;
2949 }
2950 -#ifdef CONFIG_PM_SLEEP
2951 +
2952 +#ifdef CONFIG_ATH9K_WOW
2953 if (status & ATH9K_INT_BMISS) {
2954 if (atomic_read(&sc->wow_sleep_proc_intr) == 0) {
2955 ath_dbg(common, ANY, "during WoW we got a BMISS\n");
2956 @@ -588,6 +613,8 @@ irqreturn_t ath_isr(int irq, void *dev)
2957 }
2958 }
2959 #endif
2960 +
2961 +
2962 if (status & ATH9K_INT_SWBA)
2963 tasklet_schedule(&sc->bcon_tasklet);
2964
2965 @@ -627,7 +654,7 @@ chip_reset:
2966 #undef SCHED_INTR
2967 }
2968
2969 -static int ath_reset(struct ath_softc *sc)
2970 +int ath_reset(struct ath_softc *sc)
2971 {
2972 int r;
2973
2974 @@ -735,6 +762,8 @@ static int ath9k_start(struct ieee80211_
2975 */
2976 ath9k_cmn_init_crypto(sc->sc_ah);
2977
2978 + ath9k_hw_reset_tsf(ah);
2979 +
2980 spin_unlock_bh(&sc->sc_pcu_lock);
2981
2982 mutex_unlock(&sc->mutex);
2983 @@ -1635,13 +1664,8 @@ static void ath9k_bss_info_changed(struc
2984 }
2985
2986 if ((changed & BSS_CHANGED_BEACON_ENABLED) ||
2987 - (changed & BSS_CHANGED_BEACON_INT)) {
2988 - if (ah->opmode == NL80211_IFTYPE_AP &&
2989 - bss_conf->enable_beacon)
2990 - ath9k_set_tsfadjust(sc, vif);
2991 - if (ath9k_allow_beacon_config(sc, vif))
2992 - ath9k_beacon_config(sc, vif, changed);
2993 - }
2994 + (changed & BSS_CHANGED_BEACON_INT))
2995 + ath9k_beacon_config(sc, vif, changed);
2996
2997 if (changed & BSS_CHANGED_ERP_SLOT) {
2998 if (bss_conf->use_short_slot)
2999 @@ -1817,13 +1841,31 @@ static void ath9k_set_coverage_class(str
3000 mutex_unlock(&sc->mutex);
3001 }
3002
3003 +static bool ath9k_has_tx_pending(struct ath_softc *sc)
3004 +{
3005 + int i, npend;
3006 +
3007 + for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
3008 + if (!ATH_TXQ_SETUP(sc, i))
3009 + continue;
3010 +
3011 + if (!sc->tx.txq[i].axq_depth)
3012 + continue;
3013 +
3014 + npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]);
3015 + if (npend)
3016 + break;
3017 + }
3018 +
3019 + return !!npend;
3020 +}
3021 +
3022 static void ath9k_flush(struct ieee80211_hw *hw, u32 queues, bool drop)
3023 {
3024 struct ath_softc *sc = hw->priv;
3025 struct ath_hw *ah = sc->sc_ah;
3026 struct ath_common *common = ath9k_hw_common(ah);
3027 - int timeout = 200; /* ms */
3028 - int i, j;
3029 + int timeout = HZ / 5; /* 200 ms */
3030 bool drain_txq;
3031
3032 mutex_lock(&sc->mutex);
3033 @@ -1841,25 +1883,9 @@ static void ath9k_flush(struct ieee80211
3034 return;
3035 }
3036
3037 - for (j = 0; j < timeout; j++) {
3038 - bool npend = false;
3039 -
3040 - if (j)
3041 - usleep_range(1000, 2000);
3042 -
3043 - for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
3044 - if (!ATH_TXQ_SETUP(sc, i))
3045 - continue;
3046 -
3047 - npend = ath9k_has_pending_frames(sc, &sc->tx.txq[i]);
3048 -
3049 - if (npend)
3050 - break;
3051 - }
3052 -
3053 - if (!npend)
3054 - break;
3055 - }
3056 + if (wait_event_timeout(sc->tx_wait, !ath9k_has_tx_pending(sc),
3057 + timeout) > 0)
3058 + drop = false;
3059
3060 if (drop) {
3061 ath9k_ps_wakeup(sc);
3062 @@ -2021,333 +2047,6 @@ static int ath9k_get_antenna(struct ieee
3063 return 0;
3064 }
3065
3066 -#ifdef CONFIG_PM_SLEEP
3067 -
3068 -static void ath9k_wow_map_triggers(struct ath_softc *sc,
3069 - struct cfg80211_wowlan *wowlan,
3070 - u32 *wow_triggers)
3071 -{
3072 - if (wowlan->disconnect)
3073 - *wow_triggers |= AH_WOW_LINK_CHANGE |
3074 - AH_WOW_BEACON_MISS;
3075 - if (wowlan->magic_pkt)
3076 - *wow_triggers |= AH_WOW_MAGIC_PATTERN_EN;
3077 -
3078 - if (wowlan->n_patterns)
3079 - *wow_triggers |= AH_WOW_USER_PATTERN_EN;
3080 -
3081 - sc->wow_enabled = *wow_triggers;
3082 -
3083 -}
3084 -
3085 -static void ath9k_wow_add_disassoc_deauth_pattern(struct ath_softc *sc)
3086 -{
3087 - struct ath_hw *ah = sc->sc_ah;
3088 - struct ath_common *common = ath9k_hw_common(ah);
3089 - int pattern_count = 0;
3090 - int i, byte_cnt;
3091 - u8 dis_deauth_pattern[MAX_PATTERN_SIZE];
3092 - u8 dis_deauth_mask[MAX_PATTERN_SIZE];
3093 -
3094 - memset(dis_deauth_pattern, 0, MAX_PATTERN_SIZE);
3095 - memset(dis_deauth_mask, 0, MAX_PATTERN_SIZE);
3096 -
3097 - /*
3098 - * Create Dissassociate / Deauthenticate packet filter
3099 - *
3100 - * 2 bytes 2 byte 6 bytes 6 bytes 6 bytes
3101 - * +--------------+----------+---------+--------+--------+----
3102 - * + Frame Control+ Duration + DA + SA + BSSID +
3103 - * +--------------+----------+---------+--------+--------+----
3104 - *
3105 - * The above is the management frame format for disassociate/
3106 - * deauthenticate pattern, from this we need to match the first byte
3107 - * of 'Frame Control' and DA, SA, and BSSID fields
3108 - * (skipping 2nd byte of FC and Duration feild.
3109 - *
3110 - * Disassociate pattern
3111 - * --------------------
3112 - * Frame control = 00 00 1010
3113 - * DA, SA, BSSID = x:x:x:x:x:x
3114 - * Pattern will be A0000000 | x:x:x:x:x:x | x:x:x:x:x:x
3115 - * | x:x:x:x:x:x -- 22 bytes
3116 - *
3117 - * Deauthenticate pattern
3118 - * ----------------------
3119 - * Frame control = 00 00 1100
3120 - * DA, SA, BSSID = x:x:x:x:x:x
3121 - * Pattern will be C0000000 | x:x:x:x:x:x | x:x:x:x:x:x
3122 - * | x:x:x:x:x:x -- 22 bytes
3123 - */
3124 -
3125 - /* Create Disassociate Pattern first */
3126 -
3127 - byte_cnt = 0;
3128 -
3129 - /* Fill out the mask with all FF's */
3130 -
3131 - for (i = 0; i < MAX_PATTERN_MASK_SIZE; i++)
3132 - dis_deauth_mask[i] = 0xff;
3133 -
3134 - /* copy the first byte of frame control field */
3135 - dis_deauth_pattern[byte_cnt] = 0xa0;
3136 - byte_cnt++;
3137 -
3138 - /* skip 2nd byte of frame control and Duration field */
3139 - byte_cnt += 3;
3140 -
3141 - /*
3142 - * need not match the destination mac address, it can be a broadcast
3143 - * mac address or an unicast to this station
3144 - */
3145 - byte_cnt += 6;
3146 -
3147 - /* copy the source mac address */
3148 - memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN);
3149 -
3150 - byte_cnt += 6;
3151 -
3152 - /* copy the bssid, its same as the source mac address */
3153 -
3154 - memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN);
3155 -
3156 - /* Create Disassociate pattern mask */
3157 -
3158 - dis_deauth_mask[0] = 0xfe;
3159 - dis_deauth_mask[1] = 0x03;
3160 - dis_deauth_mask[2] = 0xc0;
3161 -
3162 - ath_dbg(common, WOW, "Adding disassoc/deauth patterns for WoW\n");
3163 -
3164 - ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask,
3165 - pattern_count, byte_cnt);
3166 -
3167 - pattern_count++;
3168 - /*
3169 - * for de-authenticate pattern, only the first byte of the frame
3170 - * control field gets changed from 0xA0 to 0xC0
3171 - */
3172 - dis_deauth_pattern[0] = 0xC0;
3173 -
3174 - ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask,
3175 - pattern_count, byte_cnt);
3176 -
3177 -}
3178 -
3179 -static void ath9k_wow_add_pattern(struct ath_softc *sc,
3180 - struct cfg80211_wowlan *wowlan)
3181 -{
3182 - struct ath_hw *ah = sc->sc_ah;
3183 - struct ath9k_wow_pattern *wow_pattern = NULL;
3184 - struct cfg80211_pkt_pattern *patterns = wowlan->patterns;
3185 - int mask_len;
3186 - s8 i = 0;
3187 -
3188 - if (!wowlan->n_patterns)
3189 - return;
3190 -
3191 - /*
3192 - * Add the new user configured patterns
3193 - */
3194 - for (i = 0; i < wowlan->n_patterns; i++) {
3195 -
3196 - wow_pattern = kzalloc(sizeof(*wow_pattern), GFP_KERNEL);
3197 -
3198 - if (!wow_pattern)
3199 - return;
3200 -
3201 - /*
3202 - * TODO: convert the generic user space pattern to
3203 - * appropriate chip specific/802.11 pattern.
3204 - */
3205 -
3206 - mask_len = DIV_ROUND_UP(wowlan->patterns[i].pattern_len, 8);
3207 - memset(wow_pattern->pattern_bytes, 0, MAX_PATTERN_SIZE);
3208 - memset(wow_pattern->mask_bytes, 0, MAX_PATTERN_SIZE);
3209 - memcpy(wow_pattern->pattern_bytes, patterns[i].pattern,
3210 - patterns[i].pattern_len);
3211 - memcpy(wow_pattern->mask_bytes, patterns[i].mask, mask_len);
3212 - wow_pattern->pattern_len = patterns[i].pattern_len;
3213 -
3214 - /*
3215 - * just need to take care of deauth and disssoc pattern,
3216 - * make sure we don't overwrite them.
3217 - */
3218 -
3219 - ath9k_hw_wow_apply_pattern(ah, wow_pattern->pattern_bytes,
3220 - wow_pattern->mask_bytes,
3221 - i + 2,
3222 - wow_pattern->pattern_len);
3223 - kfree(wow_pattern);
3224 -
3225 - }
3226 -
3227 -}
3228 -
3229 -static int ath9k_suspend(struct ieee80211_hw *hw,
3230 - struct cfg80211_wowlan *wowlan)
3231 -{
3232 - struct ath_softc *sc = hw->priv;
3233 - struct ath_hw *ah = sc->sc_ah;
3234 - struct ath_common *common = ath9k_hw_common(ah);
3235 - u32 wow_triggers_enabled = 0;
3236 - int ret = 0;
3237 -
3238 - mutex_lock(&sc->mutex);
3239 -
3240 - ath_cancel_work(sc);
3241 - ath_stop_ani(sc);
3242 - del_timer_sync(&sc->rx_poll_timer);
3243 -
3244 - if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
3245 - ath_dbg(common, ANY, "Device not present\n");
3246 - ret = -EINVAL;
3247 - goto fail_wow;
3248 - }
3249 -
3250 - if (WARN_ON(!wowlan)) {
3251 - ath_dbg(common, WOW, "None of the WoW triggers enabled\n");
3252 - ret = -EINVAL;
3253 - goto fail_wow;
3254 - }
3255 -
3256 - if (!device_can_wakeup(sc->dev)) {
3257 - ath_dbg(common, WOW, "device_can_wakeup failed, WoW is not enabled\n");
3258 - ret = 1;
3259 - goto fail_wow;
3260 - }
3261 -
3262 - /*
3263 - * none of the sta vifs are associated
3264 - * and we are not currently handling multivif
3265 - * cases, for instance we have to seperately
3266 - * configure 'keep alive frame' for each
3267 - * STA.
3268 - */
3269 -
3270 - if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
3271 - ath_dbg(common, WOW, "None of the STA vifs are associated\n");
3272 - ret = 1;
3273 - goto fail_wow;
3274 - }
3275 -
3276 - if (sc->nvifs > 1) {
3277 - ath_dbg(common, WOW, "WoW for multivif is not yet supported\n");
3278 - ret = 1;
3279 - goto fail_wow;
3280 - }
3281 -
3282 - ath9k_wow_map_triggers(sc, wowlan, &wow_triggers_enabled);
3283 -
3284 - ath_dbg(common, WOW, "WoW triggers enabled 0x%x\n",
3285 - wow_triggers_enabled);
3286 -
3287 - ath9k_ps_wakeup(sc);
3288 -
3289 - ath9k_stop_btcoex(sc);
3290 -
3291 - /*
3292 - * Enable wake up on recieving disassoc/deauth
3293 - * frame by default.
3294 - */
3295 - ath9k_wow_add_disassoc_deauth_pattern(sc);
3296 -
3297 - if (wow_triggers_enabled & AH_WOW_USER_PATTERN_EN)
3298 - ath9k_wow_add_pattern(sc, wowlan);
3299 -
3300 - spin_lock_bh(&sc->sc_pcu_lock);
3301 - /*
3302 - * To avoid false wake, we enable beacon miss interrupt only
3303 - * when we go to sleep. We save the current interrupt mask
3304 - * so we can restore it after the system wakes up
3305 - */
3306 - sc->wow_intr_before_sleep = ah->imask;
3307 - ah->imask &= ~ATH9K_INT_GLOBAL;
3308 - ath9k_hw_disable_interrupts(ah);
3309 - ah->imask = ATH9K_INT_BMISS | ATH9K_INT_GLOBAL;
3310 - ath9k_hw_set_interrupts(ah);
3311 - ath9k_hw_enable_interrupts(ah);
3312 -
3313 - spin_unlock_bh(&sc->sc_pcu_lock);
3314 -
3315 - /*
3316 - * we can now sync irq and kill any running tasklets, since we already
3317 - * disabled interrupts and not holding a spin lock
3318 - */
3319 - synchronize_irq(sc->irq);
3320 - tasklet_kill(&sc->intr_tq);
3321 -
3322 - ath9k_hw_wow_enable(ah, wow_triggers_enabled);
3323 -
3324 - ath9k_ps_restore(sc);
3325 - ath_dbg(common, ANY, "WoW enabled in ath9k\n");
3326 - atomic_inc(&sc->wow_sleep_proc_intr);
3327 -
3328 -fail_wow:
3329 - mutex_unlock(&sc->mutex);
3330 - return ret;
3331 -}
3332 -
3333 -static int ath9k_resume(struct ieee80211_hw *hw)
3334 -{
3335 - struct ath_softc *sc = hw->priv;
3336 - struct ath_hw *ah = sc->sc_ah;
3337 - struct ath_common *common = ath9k_hw_common(ah);
3338 - u32 wow_status;
3339 -
3340 - mutex_lock(&sc->mutex);
3341 -
3342 - ath9k_ps_wakeup(sc);
3343 -
3344 - spin_lock_bh(&sc->sc_pcu_lock);
3345 -
3346 - ath9k_hw_disable_interrupts(ah);
3347 - ah->imask = sc->wow_intr_before_sleep;
3348 - ath9k_hw_set_interrupts(ah);
3349 - ath9k_hw_enable_interrupts(ah);
3350 -
3351 - spin_unlock_bh(&sc->sc_pcu_lock);
3352 -
3353 - wow_status = ath9k_hw_wow_wakeup(ah);
3354 -
3355 - if (atomic_read(&sc->wow_got_bmiss_intr) == 0) {
3356 - /*
3357 - * some devices may not pick beacon miss
3358 - * as the reason they woke up so we add
3359 - * that here for that shortcoming.
3360 - */
3361 - wow_status |= AH_WOW_BEACON_MISS;
3362 - atomic_dec(&sc->wow_got_bmiss_intr);
3363 - ath_dbg(common, ANY, "Beacon miss interrupt picked up during WoW sleep\n");
3364 - }
3365 -
3366 - atomic_dec(&sc->wow_sleep_proc_intr);
3367 -
3368 - if (wow_status) {
3369 - ath_dbg(common, ANY, "Waking up due to WoW triggers %s with WoW status = %x\n",
3370 - ath9k_hw_wow_event_to_string(wow_status), wow_status);
3371 - }
3372 -
3373 - ath_restart_work(sc);
3374 - ath9k_start_btcoex(sc);
3375 -
3376 - ath9k_ps_restore(sc);
3377 - mutex_unlock(&sc->mutex);
3378 -
3379 - return 0;
3380 -}
3381 -
3382 -static void ath9k_set_wakeup(struct ieee80211_hw *hw, bool enabled)
3383 -{
3384 - struct ath_softc *sc = hw->priv;
3385 -
3386 - mutex_lock(&sc->mutex);
3387 - device_init_wakeup(sc->dev, 1);
3388 - device_set_wakeup_enable(sc->dev, enabled);
3389 - mutex_unlock(&sc->mutex);
3390 -}
3391 -
3392 -#endif
3393 static void ath9k_sw_scan_start(struct ieee80211_hw *hw)
3394 {
3395 struct ath_softc *sc = hw->priv;
3396 @@ -2373,134 +2072,6 @@ static void ath9k_channel_switch_beacon(
3397 sc->csa_vif = vif;
3398 }
3399
3400 -static void ath9k_tx99_stop(struct ath_softc *sc)
3401 -{
3402 - struct ath_hw *ah = sc->sc_ah;
3403 - struct ath_common *common = ath9k_hw_common(ah);
3404 -
3405 - ath_drain_all_txq(sc);
3406 - ath_startrecv(sc);
3407 -
3408 - ath9k_hw_set_interrupts(ah);
3409 - ath9k_hw_enable_interrupts(ah);
3410 -
3411 - ieee80211_wake_queues(sc->hw);
3412 -
3413 - kfree_skb(sc->tx99_skb);
3414 - sc->tx99_skb = NULL;
3415 - sc->tx99_state = false;
3416 -
3417 - ath9k_hw_tx99_stop(sc->sc_ah);
3418 - ath_dbg(common, XMIT, "TX99 stopped\n");
3419 -}
3420 -
3421 -static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc)
3422 -{
3423 - static u8 PN9Data[] = {0xff, 0x87, 0xb8, 0x59, 0xb7, 0xa1, 0xcc, 0x24,
3424 - 0x57, 0x5e, 0x4b, 0x9c, 0x0e, 0xe9, 0xea, 0x50,
3425 - 0x2a, 0xbe, 0xb4, 0x1b, 0xb6, 0xb0, 0x5d, 0xf1,
3426 - 0xe6, 0x9a, 0xe3, 0x45, 0xfd, 0x2c, 0x53, 0x18,
3427 - 0x0c, 0xca, 0xc9, 0xfb, 0x49, 0x37, 0xe5, 0xa8,
3428 - 0x51, 0x3b, 0x2f, 0x61, 0xaa, 0x72, 0x18, 0x84,
3429 - 0x02, 0x23, 0x23, 0xab, 0x63, 0x89, 0x51, 0xb3,
3430 - 0xe7, 0x8b, 0x72, 0x90, 0x4c, 0xe8, 0xfb, 0xc0};
3431 - u32 len = 1200;
3432 - struct ieee80211_hw *hw = sc->hw;
3433 - struct ieee80211_hdr *hdr;
3434 - struct ieee80211_tx_info *tx_info;
3435 - struct sk_buff *skb;
3436 -
3437 - skb = alloc_skb(len, GFP_KERNEL);
3438 - if (!skb)
3439 - return NULL;
3440 -
3441 - skb_put(skb, len);
3442 -
3443 - memset(skb->data, 0, len);
3444 -
3445 - hdr = (struct ieee80211_hdr *)skb->data;
3446 - hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA);
3447 - hdr->duration_id = 0;
3448 -
3449 - memcpy(hdr->addr1, hw->wiphy->perm_addr, ETH_ALEN);
3450 - memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN);
3451 - memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);
3452 -
3453 - hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
3454 -
3455 - tx_info = IEEE80211_SKB_CB(skb);
3456 - memset(tx_info, 0, sizeof(*tx_info));
3457 - tx_info->band = hw->conf.chandef.chan->band;
3458 - tx_info->flags = IEEE80211_TX_CTL_NO_ACK;
3459 - tx_info->control.vif = sc->tx99_vif;
3460 -
3461 - memcpy(skb->data + sizeof(*hdr), PN9Data, sizeof(PN9Data));
3462 -
3463 - return skb;
3464 -}
3465 -
3466 -void ath9k_tx99_deinit(struct ath_softc *sc)
3467 -{
3468 - ath_reset(sc);
3469 -
3470 - ath9k_ps_wakeup(sc);
3471 - ath9k_tx99_stop(sc);
3472 - ath9k_ps_restore(sc);
3473 -}
3474 -
3475 -int ath9k_tx99_init(struct ath_softc *sc)
3476 -{
3477 - struct ieee80211_hw *hw = sc->hw;
3478 - struct ath_hw *ah = sc->sc_ah;
3479 - struct ath_common *common = ath9k_hw_common(ah);
3480 - struct ath_tx_control txctl;
3481 - int r;
3482 -
3483 - if (sc->sc_flags & SC_OP_INVALID) {
3484 - ath_err(common,
3485 - "driver is in invalid state unable to use TX99");
3486 - return -EINVAL;
3487 - }
3488 -
3489 - sc->tx99_skb = ath9k_build_tx99_skb(sc);
3490 - if (!sc->tx99_skb)
3491 - return -ENOMEM;
3492 -
3493 - memset(&txctl, 0, sizeof(txctl));
3494 - txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO];
3495 -
3496 - ath_reset(sc);
3497 -
3498 - ath9k_ps_wakeup(sc);
3499 -
3500 - ath9k_hw_disable_interrupts(ah);
3501 - atomic_set(&ah->intr_ref_cnt, -1);
3502 - ath_drain_all_txq(sc);
3503 - ath_stoprecv(sc);
3504 -
3505 - sc->tx99_state = true;
3506 -
3507 - ieee80211_stop_queues(hw);
3508 -
3509 - if (sc->tx99_power == MAX_RATE_POWER + 1)
3510 - sc->tx99_power = MAX_RATE_POWER;
3511 -
3512 - ath9k_hw_tx99_set_txpower(ah, sc->tx99_power);
3513 - r = ath9k_tx99_send(sc, sc->tx99_skb, &txctl);
3514 - if (r) {
3515 - ath_dbg(common, XMIT, "Failed to xmit TX99 skb\n");
3516 - return r;
3517 - }
3518 -
3519 - ath_dbg(common, XMIT, "TX99 xmit started using %d ( %ddBm)\n",
3520 - sc->tx99_power,
3521 - sc->tx99_power / 2);
3522 -
3523 - /* We leave the harware awake as it will be chugging on */
3524 -
3525 - return 0;
3526 -}
3527 -
3528 struct ieee80211_ops ath9k_ops = {
3529 .tx = ath9k_tx,
3530 .start = ath9k_start,
3531 @@ -2531,7 +2102,7 @@ struct ieee80211_ops ath9k_ops = {
3532 .set_antenna = ath9k_set_antenna,
3533 .get_antenna = ath9k_get_antenna,
3534
3535 -#ifdef CONFIG_PM_SLEEP
3536 +#ifdef CONFIG_ATH9K_WOW
3537 .suspend = ath9k_suspend,
3538 .resume = ath9k_resume,
3539 .set_wakeup = ath9k_set_wakeup,
3540 --- a/drivers/net/wireless/ath/ath9k/wow.c
3541 +++ b/drivers/net/wireless/ath/ath9k/wow.c
3542 @@ -1,5 +1,5 @@
3543 /*
3544 - * Copyright (c) 2012 Qualcomm Atheros, Inc.
3545 + * Copyright (c) 2013 Qualcomm Atheros, Inc.
3546 *
3547 * Permission to use, copy, modify, and/or distribute this software for any
3548 * purpose with or without fee is hereby granted, provided that the above
3549 @@ -14,409 +14,348 @@
3550 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3551 */
3552
3553 -#include <linux/export.h>
3554 #include "ath9k.h"
3555 -#include "reg.h"
3556 -#include "hw-ops.h"
3557
3558 -const char *ath9k_hw_wow_event_to_string(u32 wow_event)
3559 +static const struct wiphy_wowlan_support ath9k_wowlan_support = {
3560 + .flags = WIPHY_WOWLAN_MAGIC_PKT | WIPHY_WOWLAN_DISCONNECT,
3561 + .n_patterns = MAX_NUM_USER_PATTERN,
3562 + .pattern_min_len = 1,
3563 + .pattern_max_len = MAX_PATTERN_SIZE,
3564 +};
3565 +
3566 +static void ath9k_wow_map_triggers(struct ath_softc *sc,
3567 + struct cfg80211_wowlan *wowlan,
3568 + u32 *wow_triggers)
3569 {
3570 - if (wow_event & AH_WOW_MAGIC_PATTERN_EN)
3571 - return "Magic pattern";
3572 - if (wow_event & AH_WOW_USER_PATTERN_EN)
3573 - return "User pattern";
3574 - if (wow_event & AH_WOW_LINK_CHANGE)
3575 - return "Link change";
3576 - if (wow_event & AH_WOW_BEACON_MISS)
3577 - return "Beacon miss";
3578 + if (wowlan->disconnect)
3579 + *wow_triggers |= AH_WOW_LINK_CHANGE |
3580 + AH_WOW_BEACON_MISS;
3581 + if (wowlan->magic_pkt)
3582 + *wow_triggers |= AH_WOW_MAGIC_PATTERN_EN;
3583 +
3584 + if (wowlan->n_patterns)
3585 + *wow_triggers |= AH_WOW_USER_PATTERN_EN;
3586 +
3587 + sc->wow_enabled = *wow_triggers;
3588
3589 - return "unknown reason";
3590 }
3591 -EXPORT_SYMBOL(ath9k_hw_wow_event_to_string);
3592
3593 -static void ath9k_hw_set_powermode_wow_sleep(struct ath_hw *ah)
3594 +static void ath9k_wow_add_disassoc_deauth_pattern(struct ath_softc *sc)
3595 {
3596 + struct ath_hw *ah = sc->sc_ah;
3597 struct ath_common *common = ath9k_hw_common(ah);
3598 + int pattern_count = 0;
3599 + int i, byte_cnt;
3600 + u8 dis_deauth_pattern[MAX_PATTERN_SIZE];
3601 + u8 dis_deauth_mask[MAX_PATTERN_SIZE];
3602
3603 - REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
3604 + memset(dis_deauth_pattern, 0, MAX_PATTERN_SIZE);
3605 + memset(dis_deauth_mask, 0, MAX_PATTERN_SIZE);
3606
3607 - /* set rx disable bit */
3608 - REG_WRITE(ah, AR_CR, AR_CR_RXD);
3609 + /*
3610 + * Create Dissassociate / Deauthenticate packet filter
3611 + *
3612 + * 2 bytes 2 byte 6 bytes 6 bytes 6 bytes
3613 + * +--------------+----------+---------+--------+--------+----
3614 + * + Frame Control+ Duration + DA + SA + BSSID +
3615 + * +--------------+----------+---------+--------+--------+----
3616 + *
3617 + * The above is the management frame format for disassociate/
3618 + * deauthenticate pattern, from this we need to match the first byte
3619 + * of 'Frame Control' and DA, SA, and BSSID fields
3620 + * (skipping 2nd byte of FC and Duration feild.
3621 + *
3622 + * Disassociate pattern
3623 + * --------------------
3624 + * Frame control = 00 00 1010
3625 + * DA, SA, BSSID = x:x:x:x:x:x
3626 + * Pattern will be A0000000 | x:x:x:x:x:x | x:x:x:x:x:x
3627 + * | x:x:x:x:x:x -- 22 bytes
3628 + *
3629 + * Deauthenticate pattern
3630 + * ----------------------
3631 + * Frame control = 00 00 1100
3632 + * DA, SA, BSSID = x:x:x:x:x:x
3633 + * Pattern will be C0000000 | x:x:x:x:x:x | x:x:x:x:x:x
3634 + * | x:x:x:x:x:x -- 22 bytes
3635 + */
3636
3637 - if (!ath9k_hw_wait(ah, AR_CR, AR_CR_RXE, 0, AH_WAIT_TIMEOUT)) {
3638 - ath_err(common, "Failed to stop Rx DMA in 10ms AR_CR=0x%08x AR_DIAG_SW=0x%08x\n",
3639 - REG_READ(ah, AR_CR), REG_READ(ah, AR_DIAG_SW));
3640 - return;
3641 - }
3642 + /* Create Disassociate Pattern first */
3643
3644 - REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_ON_INT);
3645 -}
3646 + byte_cnt = 0;
3647
3648 -static void ath9k_wow_create_keep_alive_pattern(struct ath_hw *ah)
3649 -{
3650 - struct ath_common *common = ath9k_hw_common(ah);
3651 - u8 sta_mac_addr[ETH_ALEN], ap_mac_addr[ETH_ALEN];
3652 - u32 ctl[13] = {0};
3653 - u32 data_word[KAL_NUM_DATA_WORDS];
3654 - u8 i;
3655 - u32 wow_ka_data_word0;
3656 -
3657 - memcpy(sta_mac_addr, common->macaddr, ETH_ALEN);
3658 - memcpy(ap_mac_addr, common->curbssid, ETH_ALEN);
3659 -
3660 - /* set the transmit buffer */
3661 - ctl[0] = (KAL_FRAME_LEN | (MAX_RATE_POWER << 16));
3662 - ctl[1] = 0;
3663 - ctl[3] = 0xb; /* OFDM_6M hardware value for this rate */
3664 - ctl[4] = 0;
3665 - ctl[7] = (ah->txchainmask) << 2;
3666 - ctl[2] = 0xf << 16; /* tx_tries 0 */
3667 -
3668 - for (i = 0; i < KAL_NUM_DESC_WORDS; i++)
3669 - REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]);
3670 -
3671 - REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]);
3672 -
3673 - data_word[0] = (KAL_FRAME_TYPE << 2) | (KAL_FRAME_SUB_TYPE << 4) |
3674 - (KAL_TO_DS << 8) | (KAL_DURATION_ID << 16);
3675 - data_word[1] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) |
3676 - (ap_mac_addr[1] << 8) | (ap_mac_addr[0]);
3677 - data_word[2] = (sta_mac_addr[1] << 24) | (sta_mac_addr[0] << 16) |
3678 - (ap_mac_addr[5] << 8) | (ap_mac_addr[4]);
3679 - data_word[3] = (sta_mac_addr[5] << 24) | (sta_mac_addr[4] << 16) |
3680 - (sta_mac_addr[3] << 8) | (sta_mac_addr[2]);
3681 - data_word[4] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) |
3682 - (ap_mac_addr[1] << 8) | (ap_mac_addr[0]);
3683 - data_word[5] = (ap_mac_addr[5] << 8) | (ap_mac_addr[4]);
3684 -
3685 - if (AR_SREV_9462_20(ah)) {
3686 - /* AR9462 2.0 has an extra descriptor word (time based
3687 - * discard) compared to other chips */
3688 - REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + (12 * 4)), 0);
3689 - wow_ka_data_word0 = AR_WOW_TXBUF(13);
3690 - } else {
3691 - wow_ka_data_word0 = AR_WOW_TXBUF(12);
3692 - }
3693 + /* Fill out the mask with all FF's */
3694
3695 - for (i = 0; i < KAL_NUM_DATA_WORDS; i++)
3696 - REG_WRITE(ah, (wow_ka_data_word0 + i*4), data_word[i]);
3697 + for (i = 0; i < MAX_PATTERN_MASK_SIZE; i++)
3698 + dis_deauth_mask[i] = 0xff;
3699
3700 -}
3701 + /* copy the first byte of frame control field */
3702 + dis_deauth_pattern[byte_cnt] = 0xa0;
3703 + byte_cnt++;
3704
3705 -void ath9k_hw_wow_apply_pattern(struct ath_hw *ah, u8 *user_pattern,
3706 - u8 *user_mask, int pattern_count,
3707 - int pattern_len)
3708 -{
3709 - int i;
3710 - u32 pattern_val, mask_val;
3711 - u32 set, clr;
3712 + /* skip 2nd byte of frame control and Duration field */
3713 + byte_cnt += 3;
3714
3715 - /* FIXME: should check count by querying the hardware capability */
3716 - if (pattern_count >= MAX_NUM_PATTERN)
3717 - return;
3718 + /*
3719 + * need not match the destination mac address, it can be a broadcast
3720 + * mac address or an unicast to this station
3721 + */
3722 + byte_cnt += 6;
3723
3724 - REG_SET_BIT(ah, AR_WOW_PATTERN, BIT(pattern_count));
3725 + /* copy the source mac address */
3726 + memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN);
3727
3728 - /* set the registers for pattern */
3729 - for (i = 0; i < MAX_PATTERN_SIZE; i += 4) {
3730 - memcpy(&pattern_val, user_pattern, 4);
3731 - REG_WRITE(ah, (AR_WOW_TB_PATTERN(pattern_count) + i),
3732 - pattern_val);
3733 - user_pattern += 4;
3734 - }
3735 + byte_cnt += 6;
3736
3737 - /* set the registers for mask */
3738 - for (i = 0; i < MAX_PATTERN_MASK_SIZE; i += 4) {
3739 - memcpy(&mask_val, user_mask, 4);
3740 - REG_WRITE(ah, (AR_WOW_TB_MASK(pattern_count) + i), mask_val);
3741 - user_mask += 4;
3742 - }
3743 + /* copy the bssid, its same as the source mac address */
3744
3745 - /* set the pattern length to be matched
3746 - *
3747 - * AR_WOW_LENGTH1_REG1
3748 - * bit 31:24 pattern 0 length
3749 - * bit 23:16 pattern 1 length
3750 - * bit 15:8 pattern 2 length
3751 - * bit 7:0 pattern 3 length
3752 - *
3753 - * AR_WOW_LENGTH1_REG2
3754 - * bit 31:24 pattern 4 length
3755 - * bit 23:16 pattern 5 length
3756 - * bit 15:8 pattern 6 length
3757 - * bit 7:0 pattern 7 length
3758 - *
3759 - * the below logic writes out the new
3760 - * pattern length for the corresponding
3761 - * pattern_count, while masking out the
3762 - * other fields
3763 - */
3764 + memcpy((dis_deauth_pattern + byte_cnt), common->curbssid, ETH_ALEN);
3765
3766 - ah->wow_event_mask |= BIT(pattern_count + AR_WOW_PAT_FOUND_SHIFT);
3767 + /* Create Disassociate pattern mask */
3768
3769 - if (pattern_count < 4) {
3770 - /* Pattern 0-3 uses AR_WOW_LENGTH1 register */
3771 - set = (pattern_len & AR_WOW_LENGTH_MAX) <<
3772 - AR_WOW_LEN1_SHIFT(pattern_count);
3773 - clr = AR_WOW_LENGTH1_MASK(pattern_count);
3774 - REG_RMW(ah, AR_WOW_LENGTH1, set, clr);
3775 - } else {
3776 - /* Pattern 4-7 uses AR_WOW_LENGTH2 register */
3777 - set = (pattern_len & AR_WOW_LENGTH_MAX) <<
3778 - AR_WOW_LEN2_SHIFT(pattern_count);
3779 - clr = AR_WOW_LENGTH2_MASK(pattern_count);
3780 - REG_RMW(ah, AR_WOW_LENGTH2, set, clr);
3781 - }
3782 + dis_deauth_mask[0] = 0xfe;
3783 + dis_deauth_mask[1] = 0x03;
3784 + dis_deauth_mask[2] = 0xc0;
3785
3786 -}
3787 -EXPORT_SYMBOL(ath9k_hw_wow_apply_pattern);
3788 + ath_dbg(common, WOW, "Adding disassoc/deauth patterns for WoW\n");
3789
3790 -u32 ath9k_hw_wow_wakeup(struct ath_hw *ah)
3791 -{
3792 - u32 wow_status = 0;
3793 - u32 val = 0, rval;
3794 + ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask,
3795 + pattern_count, byte_cnt);
3796
3797 + pattern_count++;
3798 /*
3799 - * read the WoW status register to know
3800 - * the wakeup reason
3801 + * for de-authenticate pattern, only the first byte of the frame
3802 + * control field gets changed from 0xA0 to 0xC0
3803 */
3804 - rval = REG_READ(ah, AR_WOW_PATTERN);
3805 - val = AR_WOW_STATUS(rval);
3806 + dis_deauth_pattern[0] = 0xC0;
3807
3808 - /*
3809 - * mask only the WoW events that we have enabled. Sometimes
3810 - * we have spurious WoW events from the AR_WOW_PATTERN
3811 - * register. This mask will clean it up.
3812 - */
3813 + ath9k_hw_wow_apply_pattern(ah, dis_deauth_pattern, dis_deauth_mask,
3814 + pattern_count, byte_cnt);
3815
3816 - val &= ah->wow_event_mask;
3817 +}
3818
3819 - if (val) {
3820 - if (val & AR_WOW_MAGIC_PAT_FOUND)
3821 - wow_status |= AH_WOW_MAGIC_PATTERN_EN;
3822 - if (AR_WOW_PATTERN_FOUND(val))
3823 - wow_status |= AH_WOW_USER_PATTERN_EN;
3824 - if (val & AR_WOW_KEEP_ALIVE_FAIL)
3825 - wow_status |= AH_WOW_LINK_CHANGE;
3826 - if (val & AR_WOW_BEACON_FAIL)
3827 - wow_status |= AH_WOW_BEACON_MISS;
3828 - }
3829 +static void ath9k_wow_add_pattern(struct ath_softc *sc,
3830 + struct cfg80211_wowlan *wowlan)
3831 +{
3832 + struct ath_hw *ah = sc->sc_ah;
3833 + struct ath9k_wow_pattern *wow_pattern = NULL;
3834 + struct cfg80211_pkt_pattern *patterns = wowlan->patterns;
3835 + int mask_len;
3836 + s8 i = 0;
3837 +
3838 + if (!wowlan->n_patterns)
3839 + return;
3840
3841 /*
3842 - * set and clear WOW_PME_CLEAR registers for the chip to
3843 - * generate next wow signal.
3844 - * disable D3 before accessing other registers ?
3845 + * Add the new user configured patterns
3846 */
3847 + for (i = 0; i < wowlan->n_patterns; i++) {
3848
3849 - /* do we need to check the bit value 0x01000000 (7-10) ?? */
3850 - REG_RMW(ah, AR_PCIE_PM_CTRL, AR_PMCTRL_WOW_PME_CLR,
3851 - AR_PMCTRL_PWR_STATE_D1D3);
3852 + wow_pattern = kzalloc(sizeof(*wow_pattern), GFP_KERNEL);
3853
3854 - /*
3855 - * clear all events
3856 - */
3857 - REG_WRITE(ah, AR_WOW_PATTERN,
3858 - AR_WOW_CLEAR_EVENTS(REG_READ(ah, AR_WOW_PATTERN)));
3859 + if (!wow_pattern)
3860 + return;
3861
3862 - /*
3863 - * restore the beacon threshold to init value
3864 - */
3865 - REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);
3866 + /*
3867 + * TODO: convert the generic user space pattern to
3868 + * appropriate chip specific/802.11 pattern.
3869 + */
3870
3871 - /*
3872 - * Restore the way the PCI-E reset, Power-On-Reset, external
3873 - * PCIE_POR_SHORT pins are tied to its original value.
3874 - * Previously just before WoW sleep, we untie the PCI-E
3875 - * reset to our Chip's Power On Reset so that any PCI-E
3876 - * reset from the bus will not reset our chip
3877 - */
3878 - if (ah->is_pciexpress)
3879 - ath9k_hw_configpcipowersave(ah, false);
3880 + mask_len = DIV_ROUND_UP(wowlan->patterns[i].pattern_len, 8);
3881 + memset(wow_pattern->pattern_bytes, 0, MAX_PATTERN_SIZE);
3882 + memset(wow_pattern->mask_bytes, 0, MAX_PATTERN_SIZE);
3883 + memcpy(wow_pattern->pattern_bytes, patterns[i].pattern,
3884 + patterns[i].pattern_len);
3885 + memcpy(wow_pattern->mask_bytes, patterns[i].mask, mask_len);
3886 + wow_pattern->pattern_len = patterns[i].pattern_len;
3887 +
3888 + /*
3889 + * just need to take care of deauth and disssoc pattern,
3890 + * make sure we don't overwrite them.
3891 + */
3892 +
3893 + ath9k_hw_wow_apply_pattern(ah, wow_pattern->pattern_bytes,
3894 + wow_pattern->mask_bytes,
3895 + i + 2,
3896 + wow_pattern->pattern_len);
3897 + kfree(wow_pattern);
3898
3899 - ah->wow_event_mask = 0;
3900 + }
3901
3902 - return wow_status;
3903 }
3904 -EXPORT_SYMBOL(ath9k_hw_wow_wakeup);
3905
3906 -void ath9k_hw_wow_enable(struct ath_hw *ah, u32 pattern_enable)
3907 +int ath9k_suspend(struct ieee80211_hw *hw,
3908 + struct cfg80211_wowlan *wowlan)
3909 {
3910 - u32 wow_event_mask;
3911 - u32 set, clr;
3912 + struct ath_softc *sc = hw->priv;
3913 + struct ath_hw *ah = sc->sc_ah;
3914 + struct ath_common *common = ath9k_hw_common(ah);
3915 + u32 wow_triggers_enabled = 0;
3916 + int ret = 0;
3917
3918 - /*
3919 - * wow_event_mask is a mask to the AR_WOW_PATTERN register to
3920 - * indicate which WoW events we have enabled. The WoW events
3921 - * are from the 'pattern_enable' in this function and
3922 - * 'pattern_count' of ath9k_hw_wow_apply_pattern()
3923 - */
3924 - wow_event_mask = ah->wow_event_mask;
3925 + mutex_lock(&sc->mutex);
3926
3927 - /*
3928 - * Untie Power-on-Reset from the PCI-E-Reset. When we are in
3929 - * WOW sleep, we do want the Reset from the PCI-E to disturb
3930 - * our hw state
3931 - */
3932 - if (ah->is_pciexpress) {
3933 - /*
3934 - * we need to untie the internal POR (power-on-reset)
3935 - * to the external PCI-E reset. We also need to tie
3936 - * the PCI-E Phy reset to the PCI-E reset.
3937 - */
3938 - set = AR_WA_RESET_EN | AR_WA_POR_SHORT;
3939 - clr = AR_WA_UNTIE_RESET_EN | AR_WA_D3_L1_DISABLE;
3940 - REG_RMW(ah, AR_WA, set, clr);
3941 + ath_cancel_work(sc);
3942 + ath_stop_ani(sc);
3943 + del_timer_sync(&sc->rx_poll_timer);
3944 +
3945 + if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
3946 + ath_dbg(common, ANY, "Device not present\n");
3947 + ret = -EINVAL;
3948 + goto fail_wow;
3949 }
3950
3951 - /*
3952 - * set the power states appropriately and enable PME
3953 - */
3954 - set = AR_PMCTRL_HOST_PME_EN | AR_PMCTRL_PWR_PM_CTRL_ENA |
3955 - AR_PMCTRL_AUX_PWR_DET | AR_PMCTRL_WOW_PME_CLR;
3956 + if (WARN_ON(!wowlan)) {
3957 + ath_dbg(common, WOW, "None of the WoW triggers enabled\n");
3958 + ret = -EINVAL;
3959 + goto fail_wow;
3960 + }
3961
3962 - /*
3963 - * set and clear WOW_PME_CLEAR registers for the chip
3964 - * to generate next wow signal.
3965 - */
3966 - REG_SET_BIT(ah, AR_PCIE_PM_CTRL, set);
3967 - clr = AR_PMCTRL_WOW_PME_CLR;
3968 - REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, clr);
3969 + if (!device_can_wakeup(sc->dev)) {
3970 + ath_dbg(common, WOW, "device_can_wakeup failed, WoW is not enabled\n");
3971 + ret = 1;
3972 + goto fail_wow;
3973 + }
3974
3975 /*
3976 - * Setup for:
3977 - * - beacon misses
3978 - * - magic pattern
3979 - * - keep alive timeout
3980 - * - pattern matching
3981 + * none of the sta vifs are associated
3982 + * and we are not currently handling multivif
3983 + * cases, for instance we have to seperately
3984 + * configure 'keep alive frame' for each
3985 + * STA.
3986 */
3987
3988 - /*
3989 - * Program default values for pattern backoff, aifs/slot/KAL count,
3990 - * beacon miss timeout, KAL timeout, etc.
3991 - */
3992 - set = AR_WOW_BACK_OFF_SHIFT(AR_WOW_PAT_BACKOFF);
3993 - REG_SET_BIT(ah, AR_WOW_PATTERN, set);
3994 + if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
3995 + ath_dbg(common, WOW, "None of the STA vifs are associated\n");
3996 + ret = 1;
3997 + goto fail_wow;
3998 + }
3999 +
4000 + if (sc->nvifs > 1) {
4001 + ath_dbg(common, WOW, "WoW for multivif is not yet supported\n");
4002 + ret = 1;
4003 + goto fail_wow;
4004 + }
4005
4006 - set = AR_WOW_AIFS_CNT(AR_WOW_CNT_AIFS_CNT) |
4007 - AR_WOW_SLOT_CNT(AR_WOW_CNT_SLOT_CNT) |
4008 - AR_WOW_KEEP_ALIVE_CNT(AR_WOW_CNT_KA_CNT);
4009 - REG_SET_BIT(ah, AR_WOW_COUNT, set);
4010 -
4011 - if (pattern_enable & AH_WOW_BEACON_MISS)
4012 - set = AR_WOW_BEACON_TIMO;
4013 - /* We are not using beacon miss, program a large value */
4014 - else
4015 - set = AR_WOW_BEACON_TIMO_MAX;
4016 + ath9k_wow_map_triggers(sc, wowlan, &wow_triggers_enabled);
4017
4018 - REG_WRITE(ah, AR_WOW_BCN_TIMO, set);
4019 + ath_dbg(common, WOW, "WoW triggers enabled 0x%x\n",
4020 + wow_triggers_enabled);
4021
4022 - /*
4023 - * Keep alive timo in ms except AR9280
4024 - */
4025 - if (!pattern_enable)
4026 - set = AR_WOW_KEEP_ALIVE_NEVER;
4027 - else
4028 - set = KAL_TIMEOUT * 32;
4029 + ath9k_ps_wakeup(sc);
4030
4031 - REG_WRITE(ah, AR_WOW_KEEP_ALIVE_TIMO, set);
4032 + ath9k_stop_btcoex(sc);
4033
4034 /*
4035 - * Keep alive delay in us. based on 'power on clock',
4036 - * therefore in usec
4037 + * Enable wake up on recieving disassoc/deauth
4038 + * frame by default.
4039 */
4040 - set = KAL_DELAY * 1000;
4041 - REG_WRITE(ah, AR_WOW_KEEP_ALIVE_DELAY, set);
4042 + ath9k_wow_add_disassoc_deauth_pattern(sc);
4043
4044 - /*
4045 - * Create keep alive pattern to respond to beacons
4046 - */
4047 - ath9k_wow_create_keep_alive_pattern(ah);
4048 + if (wow_triggers_enabled & AH_WOW_USER_PATTERN_EN)
4049 + ath9k_wow_add_pattern(sc, wowlan);
4050
4051 + spin_lock_bh(&sc->sc_pcu_lock);
4052 /*
4053 - * Configure MAC WoW Registers
4054 + * To avoid false wake, we enable beacon miss interrupt only
4055 + * when we go to sleep. We save the current interrupt mask
4056 + * so we can restore it after the system wakes up
4057 */
4058 - set = 0;
4059 - /* Send keep alive timeouts anyway */
4060 - clr = AR_WOW_KEEP_ALIVE_AUTO_DIS;
4061 -
4062 - if (pattern_enable & AH_WOW_LINK_CHANGE)
4063 - wow_event_mask |= AR_WOW_KEEP_ALIVE_FAIL;
4064 - else
4065 - set = AR_WOW_KEEP_ALIVE_FAIL_DIS;
4066 + sc->wow_intr_before_sleep = ah->imask;
4067 + ah->imask &= ~ATH9K_INT_GLOBAL;
4068 + ath9k_hw_disable_interrupts(ah);
4069 + ah->imask = ATH9K_INT_BMISS | ATH9K_INT_GLOBAL;
4070 + ath9k_hw_set_interrupts(ah);
4071 + ath9k_hw_enable_interrupts(ah);
4072
4073 - set = AR_WOW_KEEP_ALIVE_FAIL_DIS;
4074 - REG_RMW(ah, AR_WOW_KEEP_ALIVE, set, clr);
4075 + spin_unlock_bh(&sc->sc_pcu_lock);
4076
4077 /*
4078 - * we are relying on a bmiss failure. ensure we have
4079 - * enough threshold to prevent false positives
4080 + * we can now sync irq and kill any running tasklets, since we already
4081 + * disabled interrupts and not holding a spin lock
4082 */
4083 - REG_RMW_FIELD(ah, AR_RSSI_THR, AR_RSSI_THR_BM_THR,
4084 - AR_WOW_BMISSTHRESHOLD);
4085 + synchronize_irq(sc->irq);
4086 + tasklet_kill(&sc->intr_tq);
4087 +
4088 + ath9k_hw_wow_enable(ah, wow_triggers_enabled);
4089
4090 - set = 0;
4091 - clr = 0;
4092 + ath9k_ps_restore(sc);
4093 + ath_dbg(common, ANY, "WoW enabled in ath9k\n");
4094 + atomic_inc(&sc->wow_sleep_proc_intr);
4095
4096 - if (pattern_enable & AH_WOW_BEACON_MISS) {
4097 - set = AR_WOW_BEACON_FAIL_EN;
4098 - wow_event_mask |= AR_WOW_BEACON_FAIL;
4099 - } else {
4100 - clr = AR_WOW_BEACON_FAIL_EN;
4101 +fail_wow:
4102 + mutex_unlock(&sc->mutex);
4103 + return ret;
4104 +}
4105 +
4106 +int ath9k_resume(struct ieee80211_hw *hw)
4107 +{
4108 + struct ath_softc *sc = hw->priv;
4109 + struct ath_hw *ah = sc->sc_ah;
4110 + struct ath_common *common = ath9k_hw_common(ah);
4111 + u32 wow_status;
4112 +
4113 + mutex_lock(&sc->mutex);
4114 +
4115 + ath9k_ps_wakeup(sc);
4116 +
4117 + spin_lock_bh(&sc->sc_pcu_lock);
4118 +
4119 + ath9k_hw_disable_interrupts(ah);
4120 + ah->imask = sc->wow_intr_before_sleep;
4121 + ath9k_hw_set_interrupts(ah);
4122 + ath9k_hw_enable_interrupts(ah);
4123 +
4124 + spin_unlock_bh(&sc->sc_pcu_lock);
4125 +
4126 + wow_status = ath9k_hw_wow_wakeup(ah);
4127 +
4128 + if (atomic_read(&sc->wow_got_bmiss_intr) == 0) {
4129 + /*
4130 + * some devices may not pick beacon miss
4131 + * as the reason they woke up so we add
4132 + * that here for that shortcoming.
4133 + */
4134 + wow_status |= AH_WOW_BEACON_MISS;
4135 + atomic_dec(&sc->wow_got_bmiss_intr);
4136 + ath_dbg(common, ANY, "Beacon miss interrupt picked up during WoW sleep\n");
4137 }
4138
4139 - REG_RMW(ah, AR_WOW_BCN_EN, set, clr);
4140 + atomic_dec(&sc->wow_sleep_proc_intr);
4141
4142 - set = 0;
4143 - clr = 0;
4144 - /*
4145 - * Enable the magic packet registers
4146 - */
4147 - if (pattern_enable & AH_WOW_MAGIC_PATTERN_EN) {
4148 - set = AR_WOW_MAGIC_EN;
4149 - wow_event_mask |= AR_WOW_MAGIC_PAT_FOUND;
4150 - } else {
4151 - clr = AR_WOW_MAGIC_EN;
4152 + if (wow_status) {
4153 + ath_dbg(common, ANY, "Waking up due to WoW triggers %s with WoW status = %x\n",
4154 + ath9k_hw_wow_event_to_string(wow_status), wow_status);
4155 }
4156 - set |= AR_WOW_MAC_INTR_EN;
4157 - REG_RMW(ah, AR_WOW_PATTERN, set, clr);
4158
4159 - REG_WRITE(ah, AR_WOW_PATTERN_MATCH_LT_256B,
4160 - AR_WOW_PATTERN_SUPPORTED);
4161 + ath_restart_work(sc);
4162 + ath9k_start_btcoex(sc);
4163
4164 - /*
4165 - * Set the power states appropriately and enable PME
4166 - */
4167 - clr = 0;
4168 - set = AR_PMCTRL_PWR_STATE_D1D3 | AR_PMCTRL_HOST_PME_EN |
4169 - AR_PMCTRL_PWR_PM_CTRL_ENA;
4170 + ath9k_ps_restore(sc);
4171 + mutex_unlock(&sc->mutex);
4172
4173 - clr = AR_PCIE_PM_CTRL_ENA;
4174 - REG_RMW(ah, AR_PCIE_PM_CTRL, set, clr);
4175 + return 0;
4176 +}
4177
4178 - /*
4179 - * this is needed to prevent the chip waking up
4180 - * the host within 3-4 seconds with certain
4181 - * platform/BIOS. The fix is to enable
4182 - * D1 & D3 to match original definition and
4183 - * also match the OTP value. Anyway this
4184 - * is more related to SW WOW.
4185 - */
4186 - clr = AR_PMCTRL_PWR_STATE_D1D3;
4187 - REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, clr);
4188 +void ath9k_set_wakeup(struct ieee80211_hw *hw, bool enabled)
4189 +{
4190 + struct ath_softc *sc = hw->priv;
4191
4192 - set = AR_PMCTRL_PWR_STATE_D1D3_REAL;
4193 - REG_SET_BIT(ah, AR_PCIE_PM_CTRL, set);
4194 + mutex_lock(&sc->mutex);
4195 + device_init_wakeup(sc->dev, 1);
4196 + device_set_wakeup_enable(sc->dev, enabled);
4197 + mutex_unlock(&sc->mutex);
4198 +}
4199
4200 - REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM);
4201 +void ath9k_init_wow(struct ieee80211_hw *hw)
4202 +{
4203 + struct ath_softc *sc = hw->priv;
4204
4205 - /* to bring down WOW power low margin */
4206 - set = BIT(13);
4207 - REG_SET_BIT(ah, AR_PCIE_PHY_REG3, set);
4208 - /* HW WoW */
4209 - clr = BIT(5);
4210 - REG_CLR_BIT(ah, AR_PCU_MISC_MODE3, clr);
4211 + if ((sc->sc_ah->caps.hw_caps & ATH9K_HW_WOW_DEVICE_CAPABLE) &&
4212 + (sc->driver_data & ATH9K_PCI_WOW) &&
4213 + device_can_wakeup(sc->dev))
4214 + hw->wiphy->wowlan = &ath9k_wowlan_support;
4215
4216 - ath9k_hw_set_powermode_wow_sleep(ah);
4217 - ah->wow_event_mask = wow_event_mask;
4218 + atomic_set(&sc->wow_sleep_proc_intr, -1);
4219 + atomic_set(&sc->wow_got_bmiss_intr, -1);
4220 }
4221 -EXPORT_SYMBOL(ath9k_hw_wow_enable);
4222 --- a/drivers/net/wireless/ath/ath9k/xmit.c
4223 +++ b/drivers/net/wireless/ath/ath9k/xmit.c
4224 @@ -174,14 +174,7 @@ static void ath_txq_skb_done(struct ath_
4225 static struct ath_atx_tid *
4226 ath_get_skb_tid(struct ath_softc *sc, struct ath_node *an, struct sk_buff *skb)
4227 {
4228 - struct ieee80211_hdr *hdr;
4229 - u8 tidno = 0;
4230 -
4231 - hdr = (struct ieee80211_hdr *) skb->data;
4232 - if (ieee80211_is_data_qos(hdr->frame_control))
4233 - tidno = ieee80211_get_qos_ctl(hdr)[0];
4234 -
4235 - tidno &= IEEE80211_QOS_CTL_TID_MASK;
4236 + u8 tidno = skb->priority & IEEE80211_QOS_CTL_TID_MASK;
4237 return ATH_AN_2_TID(an, tidno);
4238 }
4239
4240 @@ -1276,6 +1269,10 @@ static void ath_tx_fill_desc(struct ath_
4241 if (!rts_thresh || (len > rts_thresh))
4242 rts = true;
4243 }
4244 +
4245 + if (!aggr)
4246 + len = fi->framelen;
4247 +
4248 ath_buf_set_rate(sc, bf, &info, len, rts);
4249 }
4250
4251 @@ -1786,6 +1783,9 @@ bool ath_drain_all_txq(struct ath_softc
4252 if (!ATH_TXQ_SETUP(sc, i))
4253 continue;
4254
4255 + if (!sc->tx.txq[i].axq_depth)
4256 + continue;
4257 +
4258 if (ath9k_hw_numtxpending(ah, sc->tx.txq[i].axq_qnum))
4259 npend |= BIT(i);
4260 }
4261 @@ -2749,6 +2749,8 @@ void ath_tx_node_cleanup(struct ath_soft
4262 }
4263 }
4264
4265 +#ifdef CONFIG_ATH9K_TX99
4266 +
4267 int ath9k_tx99_send(struct ath_softc *sc, struct sk_buff *skb,
4268 struct ath_tx_control *txctl)
4269 {
4270 @@ -2791,3 +2793,5 @@ int ath9k_tx99_send(struct ath_softc *sc
4271
4272 return 0;
4273 }
4274 +
4275 +#endif /* CONFIG_ATH9K_TX99 */
4276 --- a/drivers/net/wireless/ath/regd.c
4277 +++ b/drivers/net/wireless/ath/regd.c
4278 @@ -37,17 +37,17 @@ static int __ath_regd_init(struct ath_re
4279
4280 /* We enable active scan on these a case by case basis by regulatory domain */
4281 #define ATH9K_2GHZ_CH12_13 REG_RULE(2467-10, 2472+10, 40, 0, 20,\
4282 - NL80211_RRF_PASSIVE_SCAN)
4283 + NL80211_RRF_NO_IR)
4284 #define ATH9K_2GHZ_CH14 REG_RULE(2484-10, 2484+10, 40, 0, 20,\
4285 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_OFDM)
4286 + NL80211_RRF_NO_IR | NL80211_RRF_NO_OFDM)
4287
4288 /* We allow IBSS on these on a case by case basis by regulatory domain */
4289 #define ATH9K_5GHZ_5150_5350 REG_RULE(5150-10, 5350+10, 80, 0, 30,\
4290 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
4291 + NL80211_RRF_NO_IR)
4292 #define ATH9K_5GHZ_5470_5850 REG_RULE(5470-10, 5850+10, 80, 0, 30,\
4293 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
4294 + NL80211_RRF_NO_IR)
4295 #define ATH9K_5GHZ_5725_5850 REG_RULE(5725-10, 5850+10, 80, 0, 30,\
4296 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS)
4297 + NL80211_RRF_NO_IR)
4298
4299 #define ATH9K_2GHZ_ALL ATH9K_2GHZ_CH01_11, \
4300 ATH9K_2GHZ_CH12_13, \
4301 @@ -224,17 +224,16 @@ ath_reg_apply_beaconing_flags(struct wip
4302 * regulatory_hint().
4303 */
4304 if (!(reg_rule->flags &
4305 - NL80211_RRF_NO_IBSS))
4306 + NL80211_RRF_NO_IR))
4307 ch->flags &=
4308 - ~IEEE80211_CHAN_NO_IBSS;
4309 + ~IEEE80211_CHAN_NO_IR;
4310 if (!(reg_rule->flags &
4311 - NL80211_RRF_PASSIVE_SCAN))
4312 + NL80211_RRF_NO_IR))
4313 ch->flags &=
4314 - ~IEEE80211_CHAN_PASSIVE_SCAN;
4315 + ~IEEE80211_CHAN_NO_IR;
4316 } else {
4317 if (ch->beacon_found)
4318 - ch->flags &= ~(IEEE80211_CHAN_NO_IBSS |
4319 - IEEE80211_CHAN_PASSIVE_SCAN);
4320 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
4321 }
4322 }
4323 }
4324 @@ -260,11 +259,11 @@ ath_reg_apply_active_scan_flags(struct w
4325 */
4326 if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
4327 ch = &sband->channels[11]; /* CH 12 */
4328 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4329 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
4330 + if (ch->flags & IEEE80211_CHAN_NO_IR)
4331 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
4332 ch = &sband->channels[12]; /* CH 13 */
4333 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4334 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
4335 + if (ch->flags & IEEE80211_CHAN_NO_IR)
4336 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
4337 return;
4338 }
4339
4340 @@ -278,17 +277,17 @@ ath_reg_apply_active_scan_flags(struct w
4341 ch = &sband->channels[11]; /* CH 12 */
4342 reg_rule = freq_reg_info(wiphy, ch->center_freq);
4343 if (!IS_ERR(reg_rule)) {
4344 - if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
4345 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4346 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
4347 + if (!(reg_rule->flags & NL80211_RRF_NO_IR))
4348 + if (ch->flags & IEEE80211_CHAN_NO_IR)
4349 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
4350 }
4351
4352 ch = &sband->channels[12]; /* CH 13 */
4353 reg_rule = freq_reg_info(wiphy, ch->center_freq);
4354 if (!IS_ERR(reg_rule)) {
4355 - if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
4356 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4357 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
4358 + if (!(reg_rule->flags & NL80211_RRF_NO_IR))
4359 + if (ch->flags & IEEE80211_CHAN_NO_IR)
4360 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
4361 }
4362 }
4363
4364 @@ -320,8 +319,8 @@ static void ath_reg_apply_radar_flags(st
4365 */
4366 if (!(ch->flags & IEEE80211_CHAN_DISABLED))
4367 ch->flags |= IEEE80211_CHAN_RADAR |
4368 - IEEE80211_CHAN_NO_IBSS |
4369 - IEEE80211_CHAN_PASSIVE_SCAN;
4370 + IEEE80211_CHAN_NO_IR |
4371 + IEEE80211_CHAN_NO_IR;
4372 }
4373 }
4374
4375 --- a/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
4376 +++ b/drivers/net/wireless/brcm80211/brcmfmac/p2p.c
4377 @@ -812,7 +812,7 @@ static s32 brcmf_p2p_run_escan(struct br
4378 struct ieee80211_channel *chan = request->channels[i];
4379
4380 if (chan->flags & (IEEE80211_CHAN_RADAR |
4381 - IEEE80211_CHAN_PASSIVE_SCAN))
4382 + IEEE80211_CHAN_NO_IR))
4383 continue;
4384
4385 chanspecs[i] = channel_to_chanspec(&p2p->cfg->d11inf,
4386 --- a/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
4387 +++ b/drivers/net/wireless/brcm80211/brcmfmac/wl_cfg80211.c
4388 @@ -202,9 +202,9 @@ static struct ieee80211_supported_band _
4389
4390 /* This is to override regulatory domains defined in cfg80211 module (reg.c)
4391 * By default world regulatory domain defined in reg.c puts the flags
4392 - * NL80211_RRF_PASSIVE_SCAN and NL80211_RRF_NO_IBSS for 5GHz channels (for
4393 - * 36..48 and 149..165). With respect to these flags, wpa_supplicant doesn't
4394 - * start p2p operations on 5GHz channels. All the changes in world regulatory
4395 + * NL80211_RRF_NO_IR for 5GHz channels (for * 36..48 and 149..165).
4396 + * With respect to these flags, wpa_supplicant doesn't * start p2p
4397 + * operations on 5GHz channels. All the changes in world regulatory
4398 * domain are to be done here.
4399 */
4400 static const struct ieee80211_regdomain brcmf_regdom = {
4401 @@ -5197,10 +5197,10 @@ static s32 brcmf_construct_reginfo(struc
4402 if (channel & WL_CHAN_RADAR)
4403 band_chan_arr[index].flags |=
4404 (IEEE80211_CHAN_RADAR |
4405 - IEEE80211_CHAN_NO_IBSS);
4406 + IEEE80211_CHAN_NO_IR);
4407 if (channel & WL_CHAN_PASSIVE)
4408 band_chan_arr[index].flags |=
4409 - IEEE80211_CHAN_PASSIVE_SCAN;
4410 + IEEE80211_CHAN_NO_IR;
4411 }
4412 }
4413 if (!update)
4414 --- a/drivers/net/wireless/brcm80211/brcmsmac/channel.c
4415 +++ b/drivers/net/wireless/brcm80211/brcmsmac/channel.c
4416 @@ -59,23 +59,20 @@
4417
4418 #define BRCM_2GHZ_2412_2462 REG_RULE(2412-10, 2462+10, 40, 0, 19, 0)
4419 #define BRCM_2GHZ_2467_2472 REG_RULE(2467-10, 2472+10, 20, 0, 19, \
4420 - NL80211_RRF_PASSIVE_SCAN | \
4421 - NL80211_RRF_NO_IBSS)
4422 + NL80211_RRF_NO_IR)
4423
4424 #define BRCM_5GHZ_5180_5240 REG_RULE(5180-10, 5240+10, 40, 0, 21, \
4425 - NL80211_RRF_PASSIVE_SCAN | \
4426 - NL80211_RRF_NO_IBSS)
4427 + NL80211_RRF_NO_IR)
4428 #define BRCM_5GHZ_5260_5320 REG_RULE(5260-10, 5320+10, 40, 0, 21, \
4429 - NL80211_RRF_PASSIVE_SCAN | \
4430 + NL80211_RRF_NO_IR | \
4431 NL80211_RRF_DFS | \
4432 - NL80211_RRF_NO_IBSS)
4433 + NL80211_RRF_NO_IR)
4434 #define BRCM_5GHZ_5500_5700 REG_RULE(5500-10, 5700+10, 40, 0, 21, \
4435 - NL80211_RRF_PASSIVE_SCAN | \
4436 + NL80211_RRF_NO_IR | \
4437 NL80211_RRF_DFS | \
4438 - NL80211_RRF_NO_IBSS)
4439 + NL80211_RRF_NO_IR)
4440 #define BRCM_5GHZ_5745_5825 REG_RULE(5745-10, 5825+10, 40, 0, 21, \
4441 - NL80211_RRF_PASSIVE_SCAN | \
4442 - NL80211_RRF_NO_IBSS)
4443 + NL80211_RRF_NO_IR)
4444
4445 static const struct ieee80211_regdomain brcms_regdom_x2 = {
4446 .n_reg_rules = 6,
4447 @@ -395,7 +392,7 @@ brcms_c_channel_set_chanspec(struct brcm
4448 brcms_c_set_gmode(wlc, wlc->protection->gmode_user, false);
4449
4450 brcms_b_set_chanspec(wlc->hw, chanspec,
4451 - !!(ch->flags & IEEE80211_CHAN_PASSIVE_SCAN),
4452 + !!(ch->flags & IEEE80211_CHAN_NO_IR),
4453 &txpwr);
4454 }
4455
4456 @@ -657,8 +654,8 @@ static void brcms_reg_apply_radar_flags(
4457 */
4458 if (!(ch->flags & IEEE80211_CHAN_DISABLED))
4459 ch->flags |= IEEE80211_CHAN_RADAR |
4460 - IEEE80211_CHAN_NO_IBSS |
4461 - IEEE80211_CHAN_PASSIVE_SCAN;
4462 + IEEE80211_CHAN_NO_IR |
4463 + IEEE80211_CHAN_NO_IR;
4464 }
4465 }
4466
4467 @@ -688,14 +685,13 @@ brcms_reg_apply_beaconing_flags(struct w
4468 if (IS_ERR(rule))
4469 continue;
4470
4471 - if (!(rule->flags & NL80211_RRF_NO_IBSS))
4472 - ch->flags &= ~IEEE80211_CHAN_NO_IBSS;
4473 - if (!(rule->flags & NL80211_RRF_PASSIVE_SCAN))
4474 + if (!(rule->flags & NL80211_RRF_NO_IR))
4475 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
4476 + if (!(rule->flags & NL80211_RRF_NO_IR))
4477 ch->flags &=
4478 - ~IEEE80211_CHAN_PASSIVE_SCAN;
4479 + ~IEEE80211_CHAN_NO_IR;
4480 } else if (ch->beacon_found) {
4481 - ch->flags &= ~(IEEE80211_CHAN_NO_IBSS |
4482 - IEEE80211_CHAN_PASSIVE_SCAN);
4483 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
4484 }
4485 }
4486 }
4487 --- a/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
4488 +++ b/drivers/net/wireless/brcm80211/brcmsmac/mac80211_if.c
4489 @@ -125,13 +125,13 @@ static struct ieee80211_channel brcms_2g
4490 CHAN2GHZ(10, 2457, IEEE80211_CHAN_NO_HT40PLUS),
4491 CHAN2GHZ(11, 2462, IEEE80211_CHAN_NO_HT40PLUS),
4492 CHAN2GHZ(12, 2467,
4493 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS |
4494 + IEEE80211_CHAN_NO_IR |
4495 IEEE80211_CHAN_NO_HT40PLUS),
4496 CHAN2GHZ(13, 2472,
4497 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS |
4498 + IEEE80211_CHAN_NO_IR |
4499 IEEE80211_CHAN_NO_HT40PLUS),
4500 CHAN2GHZ(14, 2484,
4501 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_IBSS |
4502 + IEEE80211_CHAN_NO_IR |
4503 IEEE80211_CHAN_NO_HT40PLUS | IEEE80211_CHAN_NO_HT40MINUS |
4504 IEEE80211_CHAN_NO_OFDM)
4505 };
4506 @@ -144,51 +144,51 @@ static struct ieee80211_channel brcms_5g
4507 CHAN5GHZ(48, IEEE80211_CHAN_NO_HT40PLUS),
4508 /* UNII-2 */
4509 CHAN5GHZ(52,
4510 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4511 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS),
4512 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4513 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40MINUS),
4514 CHAN5GHZ(56,
4515 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4516 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS),
4517 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4518 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS),
4519 CHAN5GHZ(60,
4520 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4521 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS),
4522 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4523 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40MINUS),
4524 CHAN5GHZ(64,
4525 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4526 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS),
4527 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4528 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS),
4529 /* MID */
4530 CHAN5GHZ(100,
4531 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4532 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS),
4533 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4534 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40MINUS),
4535 CHAN5GHZ(104,
4536 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4537 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS),
4538 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4539 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS),
4540 CHAN5GHZ(108,
4541 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4542 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS),
4543 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4544 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40MINUS),
4545 CHAN5GHZ(112,
4546 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4547 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS),
4548 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4549 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS),
4550 CHAN5GHZ(116,
4551 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4552 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS),
4553 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4554 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40MINUS),
4555 CHAN5GHZ(120,
4556 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4557 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS),
4558 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4559 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS),
4560 CHAN5GHZ(124,
4561 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4562 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS),
4563 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4564 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40MINUS),
4565 CHAN5GHZ(128,
4566 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4567 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS),
4568 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4569 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS),
4570 CHAN5GHZ(132,
4571 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4572 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40MINUS),
4573 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4574 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40MINUS),
4575 CHAN5GHZ(136,
4576 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4577 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS),
4578 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4579 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS),
4580 CHAN5GHZ(140,
4581 - IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IBSS |
4582 - IEEE80211_CHAN_PASSIVE_SCAN | IEEE80211_CHAN_NO_HT40PLUS |
4583 + IEEE80211_CHAN_RADAR | IEEE80211_CHAN_NO_IR |
4584 + IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_NO_HT40PLUS |
4585 IEEE80211_CHAN_NO_HT40MINUS),
4586 /* UNII-3 */
4587 CHAN5GHZ(149, IEEE80211_CHAN_NO_HT40MINUS),
4588 --- a/drivers/net/wireless/cw1200/scan.c
4589 +++ b/drivers/net/wireless/cw1200/scan.c
4590 @@ -197,9 +197,9 @@ void cw1200_scan_work(struct work_struct
4591 if ((*it)->band != first->band)
4592 break;
4593 if (((*it)->flags ^ first->flags) &
4594 - IEEE80211_CHAN_PASSIVE_SCAN)
4595 + IEEE80211_CHAN_NO_IR)
4596 break;
4597 - if (!(first->flags & IEEE80211_CHAN_PASSIVE_SCAN) &&
4598 + if (!(first->flags & IEEE80211_CHAN_NO_IR) &&
4599 (*it)->max_power != first->max_power)
4600 break;
4601 }
4602 @@ -210,7 +210,7 @@ void cw1200_scan_work(struct work_struct
4603 else
4604 scan.max_tx_rate = WSM_TRANSMIT_RATE_1;
4605 scan.num_probes =
4606 - (first->flags & IEEE80211_CHAN_PASSIVE_SCAN) ? 0 : 2;
4607 + (first->flags & IEEE80211_CHAN_NO_IR) ? 0 : 2;
4608 scan.num_ssids = priv->scan.n_ssids;
4609 scan.ssids = &priv->scan.ssids[0];
4610 scan.num_channels = it - priv->scan.curr;
4611 @@ -233,7 +233,7 @@ void cw1200_scan_work(struct work_struct
4612 }
4613 for (i = 0; i < scan.num_channels; ++i) {
4614 scan.ch[i].number = priv->scan.curr[i]->hw_value;
4615 - if (priv->scan.curr[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN) {
4616 + if (priv->scan.curr[i]->flags & IEEE80211_CHAN_NO_IR) {
4617 scan.ch[i].min_chan_time = 50;
4618 scan.ch[i].max_chan_time = 100;
4619 } else {
4620 @@ -241,7 +241,7 @@ void cw1200_scan_work(struct work_struct
4621 scan.ch[i].max_chan_time = 25;
4622 }
4623 }
4624 - if (!(first->flags & IEEE80211_CHAN_PASSIVE_SCAN) &&
4625 + if (!(first->flags & IEEE80211_CHAN_NO_IR) &&
4626 priv->scan.output_power != first->max_power) {
4627 priv->scan.output_power = first->max_power;
4628 wsm_set_output_power(priv,
4629 --- a/drivers/net/wireless/ipw2x00/ipw2100.c
4630 +++ b/drivers/net/wireless/ipw2x00/ipw2100.c
4631 @@ -1934,10 +1934,10 @@ static int ipw2100_wdev_init(struct net_
4632 bg_band->channels[i].max_power = geo->bg[i].max_power;
4633 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY)
4634 bg_band->channels[i].flags |=
4635 - IEEE80211_CHAN_PASSIVE_SCAN;
4636 + IEEE80211_CHAN_NO_IR;
4637 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS)
4638 bg_band->channels[i].flags |=
4639 - IEEE80211_CHAN_NO_IBSS;
4640 + IEEE80211_CHAN_NO_IR;
4641 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT)
4642 bg_band->channels[i].flags |=
4643 IEEE80211_CHAN_RADAR;
4644 --- a/drivers/net/wireless/ipw2x00/ipw2200.c
4645 +++ b/drivers/net/wireless/ipw2x00/ipw2200.c
4646 @@ -11472,10 +11472,10 @@ static int ipw_wdev_init(struct net_devi
4647 bg_band->channels[i].max_power = geo->bg[i].max_power;
4648 if (geo->bg[i].flags & LIBIPW_CH_PASSIVE_ONLY)
4649 bg_band->channels[i].flags |=
4650 - IEEE80211_CHAN_PASSIVE_SCAN;
4651 + IEEE80211_CHAN_NO_IR;
4652 if (geo->bg[i].flags & LIBIPW_CH_NO_IBSS)
4653 bg_band->channels[i].flags |=
4654 - IEEE80211_CHAN_NO_IBSS;
4655 + IEEE80211_CHAN_NO_IR;
4656 if (geo->bg[i].flags & LIBIPW_CH_RADAR_DETECT)
4657 bg_band->channels[i].flags |=
4658 IEEE80211_CHAN_RADAR;
4659 @@ -11511,10 +11511,10 @@ static int ipw_wdev_init(struct net_devi
4660 a_band->channels[i].max_power = geo->a[i].max_power;
4661 if (geo->a[i].flags & LIBIPW_CH_PASSIVE_ONLY)
4662 a_band->channels[i].flags |=
4663 - IEEE80211_CHAN_PASSIVE_SCAN;
4664 + IEEE80211_CHAN_NO_IR;
4665 if (geo->a[i].flags & LIBIPW_CH_NO_IBSS)
4666 a_band->channels[i].flags |=
4667 - IEEE80211_CHAN_NO_IBSS;
4668 + IEEE80211_CHAN_NO_IR;
4669 if (geo->a[i].flags & LIBIPW_CH_RADAR_DETECT)
4670 a_band->channels[i].flags |=
4671 IEEE80211_CHAN_RADAR;
4672 --- a/drivers/net/wireless/iwlegacy/3945-mac.c
4673 +++ b/drivers/net/wireless/iwlegacy/3945-mac.c
4674 @@ -1595,7 +1595,7 @@ il3945_get_channels_for_scan(struct il_p
4675 * and use long active_dwell time.
4676 */
4677 if (!is_active || il_is_channel_passive(ch_info) ||
4678 - (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)) {
4679 + (chan->flags & IEEE80211_CHAN_NO_IR)) {
4680 scan_ch->type = 0; /* passive */
4681 if (IL_UCODE_API(il->ucode_ver) == 1)
4682 scan_ch->active_dwell =
4683 --- a/drivers/net/wireless/iwlegacy/4965-mac.c
4684 +++ b/drivers/net/wireless/iwlegacy/4965-mac.c
4685 @@ -805,7 +805,7 @@ il4965_get_channels_for_scan(struct il_p
4686 }
4687
4688 if (!is_active || il_is_channel_passive(ch_info) ||
4689 - (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN))
4690 + (chan->flags & IEEE80211_CHAN_NO_IR))
4691 scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
4692 else
4693 scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE;
4694 --- a/drivers/net/wireless/iwlegacy/common.c
4695 +++ b/drivers/net/wireless/iwlegacy/common.c
4696 @@ -3447,10 +3447,10 @@ il_init_geos(struct il_priv *il)
4697
4698 if (il_is_channel_valid(ch)) {
4699 if (!(ch->flags & EEPROM_CHANNEL_IBSS))
4700 - geo_ch->flags |= IEEE80211_CHAN_NO_IBSS;
4701 + geo_ch->flags |= IEEE80211_CHAN_NO_IR;
4702
4703 if (!(ch->flags & EEPROM_CHANNEL_ACTIVE))
4704 - geo_ch->flags |= IEEE80211_CHAN_PASSIVE_SCAN;
4705 + geo_ch->flags |= IEEE80211_CHAN_NO_IR;
4706
4707 if (ch->flags & EEPROM_CHANNEL_RADAR)
4708 geo_ch->flags |= IEEE80211_CHAN_RADAR;
4709 --- a/drivers/net/wireless/iwlegacy/debug.c
4710 +++ b/drivers/net/wireless/iwlegacy/debug.c
4711 @@ -567,12 +567,12 @@ il_dbgfs_channels_read(struct file *file
4712 flags & IEEE80211_CHAN_RADAR ?
4713 " (IEEE 802.11h required)" : "",
4714 ((channels[i].
4715 - flags & IEEE80211_CHAN_NO_IBSS) ||
4716 + flags & IEEE80211_CHAN_NO_IR) ||
4717 (channels[i].
4718 flags & IEEE80211_CHAN_RADAR)) ? "" :
4719 ", IBSS",
4720 channels[i].
4721 - flags & IEEE80211_CHAN_PASSIVE_SCAN ?
4722 + flags & IEEE80211_CHAN_NO_IR ?
4723 "passive only" : "active/passive");
4724 }
4725 supp_band = il_get_hw_mode(il, IEEE80211_BAND_5GHZ);
4726 @@ -594,12 +594,12 @@ il_dbgfs_channels_read(struct file *file
4727 flags & IEEE80211_CHAN_RADAR ?
4728 " (IEEE 802.11h required)" : "",
4729 ((channels[i].
4730 - flags & IEEE80211_CHAN_NO_IBSS) ||
4731 + flags & IEEE80211_CHAN_NO_IR) ||
4732 (channels[i].
4733 flags & IEEE80211_CHAN_RADAR)) ? "" :
4734 ", IBSS",
4735 channels[i].
4736 - flags & IEEE80211_CHAN_PASSIVE_SCAN ?
4737 + flags & IEEE80211_CHAN_NO_IR ?
4738 "passive only" : "active/passive");
4739 }
4740 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
4741 --- a/drivers/net/wireless/iwlwifi/dvm/debugfs.c
4742 +++ b/drivers/net/wireless/iwlwifi/dvm/debugfs.c
4743 @@ -352,12 +352,12 @@ static ssize_t iwl_dbgfs_channels_read(s
4744 channels[i].max_power,
4745 channels[i].flags & IEEE80211_CHAN_RADAR ?
4746 " (IEEE 802.11h required)" : "",
4747 - ((channels[i].flags & IEEE80211_CHAN_NO_IBSS)
4748 + ((channels[i].flags & IEEE80211_CHAN_NO_IR)
4749 || (channels[i].flags &
4750 IEEE80211_CHAN_RADAR)) ? "" :
4751 ", IBSS",
4752 channels[i].flags &
4753 - IEEE80211_CHAN_PASSIVE_SCAN ?
4754 + IEEE80211_CHAN_NO_IR ?
4755 "passive only" : "active/passive");
4756 }
4757 supp_band = iwl_get_hw_mode(priv, IEEE80211_BAND_5GHZ);
4758 @@ -375,12 +375,12 @@ static ssize_t iwl_dbgfs_channels_read(s
4759 channels[i].max_power,
4760 channels[i].flags & IEEE80211_CHAN_RADAR ?
4761 " (IEEE 802.11h required)" : "",
4762 - ((channels[i].flags & IEEE80211_CHAN_NO_IBSS)
4763 + ((channels[i].flags & IEEE80211_CHAN_NO_IR)
4764 || (channels[i].flags &
4765 IEEE80211_CHAN_RADAR)) ? "" :
4766 ", IBSS",
4767 channels[i].flags &
4768 - IEEE80211_CHAN_PASSIVE_SCAN ?
4769 + IEEE80211_CHAN_NO_IR ?
4770 "passive only" : "active/passive");
4771 }
4772 ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos);
4773 --- a/drivers/net/wireless/iwlwifi/dvm/scan.c
4774 +++ b/drivers/net/wireless/iwlwifi/dvm/scan.c
4775 @@ -544,7 +544,7 @@ static int iwl_get_channels_for_scan(str
4776 channel = chan->hw_value;
4777 scan_ch->channel = cpu_to_le16(channel);
4778
4779 - if (!is_active || (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN))
4780 + if (!is_active || (chan->flags & IEEE80211_CHAN_NO_IR))
4781 scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE;
4782 else
4783 scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE;
4784 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c
4785 +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom-parse.c
4786 @@ -614,10 +614,10 @@ static int iwl_init_channel_map(struct d
4787 channel->flags = IEEE80211_CHAN_NO_HT40;
4788
4789 if (!(eeprom_ch->flags & EEPROM_CHANNEL_IBSS))
4790 - channel->flags |= IEEE80211_CHAN_NO_IBSS;
4791 + channel->flags |= IEEE80211_CHAN_NO_IR;
4792
4793 if (!(eeprom_ch->flags & EEPROM_CHANNEL_ACTIVE))
4794 - channel->flags |= IEEE80211_CHAN_PASSIVE_SCAN;
4795 + channel->flags |= IEEE80211_CHAN_NO_IR;
4796
4797 if (eeprom_ch->flags & EEPROM_CHANNEL_RADAR)
4798 channel->flags |= IEEE80211_CHAN_RADAR;
4799 --- a/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
4800 +++ b/drivers/net/wireless/iwlwifi/iwl-nvm-parse.c
4801 @@ -223,10 +223,10 @@ static int iwl_init_channel_map(struct d
4802 channel->flags |= IEEE80211_CHAN_NO_160MHZ;
4803
4804 if (!(ch_flags & NVM_CHANNEL_IBSS))
4805 - channel->flags |= IEEE80211_CHAN_NO_IBSS;
4806 + channel->flags |= IEEE80211_CHAN_NO_IR;
4807
4808 if (!(ch_flags & NVM_CHANNEL_ACTIVE))
4809 - channel->flags |= IEEE80211_CHAN_PASSIVE_SCAN;
4810 + channel->flags |= IEEE80211_CHAN_NO_IR;
4811
4812 if (ch_flags & NVM_CHANNEL_RADAR)
4813 channel->flags |= IEEE80211_CHAN_RADAR;
4814 --- a/drivers/net/wireless/iwlwifi/mvm/scan.c
4815 +++ b/drivers/net/wireless/iwlwifi/mvm/scan.c
4816 @@ -192,7 +192,7 @@ static void iwl_mvm_scan_fill_channels(s
4817 for (i = 0; i < cmd->channel_count; i++) {
4818 chan->channel = cpu_to_le16(req->channels[i]->hw_value);
4819 chan->type = cpu_to_le32(type);
4820 - if (req->channels[i]->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4821 + if (req->channels[i]->flags & IEEE80211_CHAN_NO_IR)
4822 chan->type &= cpu_to_le32(~SCAN_CHANNEL_TYPE_ACTIVE);
4823 chan->active_dwell = cpu_to_le16(active_dwell);
4824 chan->passive_dwell = cpu_to_le16(passive_dwell);
4825 @@ -642,7 +642,7 @@ static void iwl_build_channel_cfg(struct
4826 channels->iter_count[index] = cpu_to_le16(1);
4827 channels->iter_interval[index] = 0;
4828
4829 - if (!(s_band->channels[i].flags & IEEE80211_CHAN_PASSIVE_SCAN))
4830 + if (!(s_band->channels[i].flags & IEEE80211_CHAN_NO_IR))
4831 channels->type[index] |=
4832 cpu_to_le32(IWL_SCAN_OFFLOAD_CHANNEL_ACTIVE);
4833
4834 --- a/drivers/net/wireless/mac80211_hwsim.c
4835 +++ b/drivers/net/wireless/mac80211_hwsim.c
4836 @@ -159,7 +159,7 @@ static const struct ieee80211_regdomain
4837 .reg_rules = {
4838 REG_RULE(2412-10, 2462+10, 40, 0, 20, 0),
4839 REG_RULE(5725-10, 5850+10, 40, 0, 30,
4840 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS),
4841 + NL80211_RRF_NO_IR),
4842 }
4843 };
4844
4845 @@ -1485,7 +1485,7 @@ static void hw_scan_work(struct work_str
4846 req->channels[hwsim->scan_chan_idx]->center_freq);
4847
4848 hwsim->tmp_chan = req->channels[hwsim->scan_chan_idx];
4849 - if (hwsim->tmp_chan->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
4850 + if (hwsim->tmp_chan->flags & IEEE80211_CHAN_NO_IR ||
4851 !req->n_ssids) {
4852 dwell = 120;
4853 } else {
4854 --- a/drivers/net/wireless/mwifiex/cfg80211.c
4855 +++ b/drivers/net/wireless/mwifiex/cfg80211.c
4856 @@ -50,24 +50,24 @@ static const struct ieee80211_regdomain
4857 REG_RULE(2412-10, 2462+10, 40, 3, 20, 0),
4858 /* Channel 12 - 13 */
4859 REG_RULE(2467-10, 2472+10, 20, 3, 20,
4860 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS),
4861 + NL80211_RRF_NO_IR),
4862 /* Channel 14 */
4863 REG_RULE(2484-10, 2484+10, 20, 3, 20,
4864 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS |
4865 + NL80211_RRF_NO_IR |
4866 NL80211_RRF_NO_OFDM),
4867 /* Channel 36 - 48 */
4868 REG_RULE(5180-10, 5240+10, 40, 3, 20,
4869 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS),
4870 + NL80211_RRF_NO_IR),
4871 /* Channel 149 - 165 */
4872 REG_RULE(5745-10, 5825+10, 40, 3, 20,
4873 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS),
4874 + NL80211_RRF_NO_IR),
4875 /* Channel 52 - 64 */
4876 REG_RULE(5260-10, 5320+10, 40, 3, 30,
4877 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS |
4878 + NL80211_RRF_NO_IR |
4879 NL80211_RRF_DFS),
4880 /* Channel 100 - 140 */
4881 REG_RULE(5500-10, 5700+10, 40, 3, 30,
4882 - NL80211_RRF_PASSIVE_SCAN | NL80211_RRF_NO_IBSS |
4883 + NL80211_RRF_NO_IR |
4884 NL80211_RRF_DFS),
4885 }
4886 };
4887 @@ -1968,7 +1968,7 @@ mwifiex_cfg80211_scan(struct wiphy *wiph
4888 user_scan_cfg->chan_list[i].chan_number = chan->hw_value;
4889 user_scan_cfg->chan_list[i].radio_type = chan->band;
4890
4891 - if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4892 + if (chan->flags & IEEE80211_CHAN_NO_IR)
4893 user_scan_cfg->chan_list[i].scan_type =
4894 MWIFIEX_SCAN_TYPE_PASSIVE;
4895 else
4896 --- a/drivers/net/wireless/mwifiex/scan.c
4897 +++ b/drivers/net/wireless/mwifiex/scan.c
4898 @@ -515,14 +515,14 @@ mwifiex_scan_create_channel_list(struct
4899 scan_chan_list[chan_idx].max_scan_time =
4900 cpu_to_le16((u16) user_scan_in->
4901 chan_list[0].scan_time);
4902 - else if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4903 + else if (ch->flags & IEEE80211_CHAN_NO_IR)
4904 scan_chan_list[chan_idx].max_scan_time =
4905 cpu_to_le16(adapter->passive_scan_time);
4906 else
4907 scan_chan_list[chan_idx].max_scan_time =
4908 cpu_to_le16(adapter->active_scan_time);
4909
4910 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
4911 + if (ch->flags & IEEE80211_CHAN_NO_IR)
4912 scan_chan_list[chan_idx].chan_scan_mode_bitmap
4913 |= MWIFIEX_PASSIVE_SCAN;
4914 else
4915 --- a/drivers/net/wireless/rt2x00/rt2x00lib.h
4916 +++ b/drivers/net/wireless/rt2x00/rt2x00lib.h
4917 @@ -146,7 +146,7 @@ void rt2x00queue_remove_l2pad(struct sk_
4918 * @local: frame is not from mac80211
4919 */
4920 int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
4921 - bool local);
4922 + struct ieee80211_sta *sta, bool local);
4923
4924 /**
4925 * rt2x00queue_update_beacon - Send new beacon from mac80211
4926 --- a/drivers/net/wireless/rt2x00/rt2x00mac.c
4927 +++ b/drivers/net/wireless/rt2x00/rt2x00mac.c
4928 @@ -90,7 +90,7 @@ static int rt2x00mac_tx_rts_cts(struct r
4929 frag_skb->data, data_length, tx_info,
4930 (struct ieee80211_rts *)(skb->data));
4931
4932 - retval = rt2x00queue_write_tx_frame(queue, skb, true);
4933 + retval = rt2x00queue_write_tx_frame(queue, skb, NULL, true);
4934 if (retval) {
4935 dev_kfree_skb_any(skb);
4936 rt2x00_warn(rt2x00dev, "Failed to send RTS/CTS frame\n");
4937 @@ -151,7 +151,7 @@ void rt2x00mac_tx(struct ieee80211_hw *h
4938 goto exit_fail;
4939 }
4940
4941 - if (unlikely(rt2x00queue_write_tx_frame(queue, skb, false)))
4942 + if (unlikely(rt2x00queue_write_tx_frame(queue, skb, control->sta, false)))
4943 goto exit_fail;
4944
4945 /*
4946 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c
4947 +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c
4948 @@ -635,7 +635,7 @@ static void rt2x00queue_bar_check(struct
4949 }
4950
4951 int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb,
4952 - bool local)
4953 + struct ieee80211_sta *sta, bool local)
4954 {
4955 struct ieee80211_tx_info *tx_info;
4956 struct queue_entry *entry;
4957 @@ -649,7 +649,7 @@ int rt2x00queue_write_tx_frame(struct da
4958 * after that we are free to use the skb->cb array
4959 * for our information.
4960 */
4961 - rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, NULL);
4962 + rt2x00queue_create_tx_descriptor(queue->rt2x00dev, skb, &txdesc, sta);
4963
4964 /*
4965 * All information is retrieved from the skb->cb array,
4966 --- a/drivers/net/wireless/rtl818x/rtl8187/dev.c
4967 +++ b/drivers/net/wireless/rtl818x/rtl8187/dev.c
4968 @@ -416,7 +416,7 @@ static int rtl8187_init_urbs(struct ieee
4969 struct rtl8187_rx_info *info;
4970 int ret = 0;
4971
4972 - while (skb_queue_len(&priv->rx_queue) < 16) {
4973 + while (skb_queue_len(&priv->rx_queue) < 32) {
4974 skb = __dev_alloc_skb(RTL8187_MAX_RX, GFP_KERNEL);
4975 if (!skb) {
4976 ret = -ENOMEM;
4977 --- a/drivers/net/wireless/rtlwifi/base.c
4978 +++ b/drivers/net/wireless/rtlwifi/base.c
4979 @@ -1078,8 +1078,8 @@ u8 rtl_is_special_data(struct ieee80211_
4980
4981 ip = (struct iphdr *)((u8 *) skb->data + mac_hdr_len +
4982 SNAP_SIZE + PROTOC_TYPE_SIZE);
4983 - ether_type = *(u16 *) ((u8 *) skb->data + mac_hdr_len + SNAP_SIZE);
4984 - /* ether_type = ntohs(ether_type); */
4985 + ether_type = be16_to_cpu(*(__be16 *)((u8 *)skb->data + mac_hdr_len +
4986 + SNAP_SIZE));
4987
4988 if (ETH_P_IP == ether_type) {
4989 if (IPPROTO_UDP == ip->protocol) {
4990 --- a/drivers/net/wireless/rtlwifi/regd.c
4991 +++ b/drivers/net/wireless/rtlwifi/regd.c
4992 @@ -59,30 +59,27 @@ static struct country_code_to_enum_rd al
4993 */
4994 #define RTL819x_2GHZ_CH12_13 \
4995 REG_RULE(2467-10, 2472+10, 40, 0, 20,\
4996 - NL80211_RRF_PASSIVE_SCAN)
4997 + NL80211_RRF_NO_IR)
4998
4999 #define RTL819x_2GHZ_CH14 \
5000 REG_RULE(2484-10, 2484+10, 40, 0, 20, \
5001 - NL80211_RRF_PASSIVE_SCAN | \
5002 + NL80211_RRF_NO_IR | \
5003 NL80211_RRF_NO_OFDM)
5004
5005 /* 5G chan 36 - chan 64*/
5006 #define RTL819x_5GHZ_5150_5350 \
5007 REG_RULE(5150-10, 5350+10, 40, 0, 30, \
5008 - NL80211_RRF_PASSIVE_SCAN | \
5009 - NL80211_RRF_NO_IBSS)
5010 + NL80211_RRF_NO_IR)
5011
5012 /* 5G chan 100 - chan 165*/
5013 #define RTL819x_5GHZ_5470_5850 \
5014 REG_RULE(5470-10, 5850+10, 40, 0, 30, \
5015 - NL80211_RRF_PASSIVE_SCAN | \
5016 - NL80211_RRF_NO_IBSS)
5017 + NL80211_RRF_NO_IR)
5018
5019 /* 5G chan 149 - chan 165*/
5020 #define RTL819x_5GHZ_5725_5850 \
5021 REG_RULE(5725-10, 5850+10, 40, 0, 30, \
5022 - NL80211_RRF_PASSIVE_SCAN | \
5023 - NL80211_RRF_NO_IBSS)
5024 + NL80211_RRF_NO_IR)
5025
5026 #define RTL819x_5GHZ_ALL \
5027 (RTL819x_5GHZ_5150_5350, RTL819x_5GHZ_5470_5850)
5028 @@ -185,16 +182,15 @@ static void _rtl_reg_apply_beaconing_fla
5029 *regulatory_hint().
5030 */
5031
5032 - if (!(reg_rule->flags & NL80211_RRF_NO_IBSS))
5033 - ch->flags &= ~IEEE80211_CHAN_NO_IBSS;
5034 + if (!(reg_rule->flags & NL80211_RRF_NO_IR))
5035 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
5036 if (!(reg_rule->
5037 - flags & NL80211_RRF_PASSIVE_SCAN))
5038 + flags & NL80211_RRF_NO_IR))
5039 ch->flags &=
5040 - ~IEEE80211_CHAN_PASSIVE_SCAN;
5041 + ~IEEE80211_CHAN_NO_IR;
5042 } else {
5043 if (ch->beacon_found)
5044 - ch->flags &= ~(IEEE80211_CHAN_NO_IBSS |
5045 - IEEE80211_CHAN_PASSIVE_SCAN);
5046 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
5047 }
5048 }
5049 }
5050 @@ -219,11 +215,11 @@ static void _rtl_reg_apply_active_scan_f
5051 */
5052 if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
5053 ch = &sband->channels[11]; /* CH 12 */
5054 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
5055 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
5056 + if (ch->flags & IEEE80211_CHAN_NO_IR)
5057 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
5058 ch = &sband->channels[12]; /* CH 13 */
5059 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
5060 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
5061 + if (ch->flags & IEEE80211_CHAN_NO_IR)
5062 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
5063 return;
5064 }
5065
5066 @@ -237,17 +233,17 @@ static void _rtl_reg_apply_active_scan_f
5067 ch = &sband->channels[11]; /* CH 12 */
5068 reg_rule = freq_reg_info(wiphy, ch->center_freq);
5069 if (!IS_ERR(reg_rule)) {
5070 - if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
5071 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
5072 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
5073 + if (!(reg_rule->flags & NL80211_RRF_NO_IR))
5074 + if (ch->flags & IEEE80211_CHAN_NO_IR)
5075 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
5076 }
5077
5078 ch = &sband->channels[12]; /* CH 13 */
5079 reg_rule = freq_reg_info(wiphy, ch->center_freq);
5080 if (!IS_ERR(reg_rule)) {
5081 - if (!(reg_rule->flags & NL80211_RRF_PASSIVE_SCAN))
5082 - if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
5083 - ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
5084 + if (!(reg_rule->flags & NL80211_RRF_NO_IR))
5085 + if (ch->flags & IEEE80211_CHAN_NO_IR)
5086 + ch->flags &= ~IEEE80211_CHAN_NO_IR;
5087 }
5088 }
5089
5090 @@ -284,8 +280,8 @@ static void _rtl_reg_apply_radar_flags(s
5091 */
5092 if (!(ch->flags & IEEE80211_CHAN_DISABLED))
5093 ch->flags |= IEEE80211_CHAN_RADAR |
5094 - IEEE80211_CHAN_NO_IBSS |
5095 - IEEE80211_CHAN_PASSIVE_SCAN;
5096 + IEEE80211_CHAN_NO_IR |
5097 + IEEE80211_CHAN_NO_IR;
5098 }
5099 }
5100
5101 --- a/drivers/net/wireless/ti/wl12xx/scan.c
5102 +++ b/drivers/net/wireless/ti/wl12xx/scan.c
5103 @@ -47,7 +47,7 @@ static int wl1271_get_scan_channels(stru
5104 * In active scans, we only scan channels not
5105 * marked as passive.
5106 */
5107 - (passive || !(flags & IEEE80211_CHAN_PASSIVE_SCAN))) {
5108 + (passive || !(flags & IEEE80211_CHAN_NO_IR))) {
5109 wl1271_debug(DEBUG_SCAN, "band %d, center_freq %d ",
5110 req->channels[i]->band,
5111 req->channels[i]->center_freq);
5112 --- a/drivers/net/wireless/ti/wlcore/cmd.c
5113 +++ b/drivers/net/wireless/ti/wlcore/cmd.c
5114 @@ -1688,7 +1688,7 @@ int wlcore_cmd_regdomain_config_locked(s
5115
5116 if (channel->flags & (IEEE80211_CHAN_DISABLED |
5117 IEEE80211_CHAN_RADAR |
5118 - IEEE80211_CHAN_PASSIVE_SCAN))
5119 + IEEE80211_CHAN_NO_IR))
5120 continue;
5121
5122 ch_bit_idx = wlcore_get_reg_conf_ch_idx(b, ch);
5123 --- a/drivers/net/wireless/ti/wlcore/main.c
5124 +++ b/drivers/net/wireless/ti/wlcore/main.c
5125 @@ -91,8 +91,7 @@ static void wl1271_reg_notify(struct wip
5126 continue;
5127
5128 if (ch->flags & IEEE80211_CHAN_RADAR)
5129 - ch->flags |= IEEE80211_CHAN_NO_IBSS |
5130 - IEEE80211_CHAN_PASSIVE_SCAN;
5131 + ch->flags |= IEEE80211_CHAN_NO_IR;
5132
5133 }
5134
5135 --- a/drivers/net/wireless/ti/wlcore/scan.c
5136 +++ b/drivers/net/wireless/ti/wlcore/scan.c
5137 @@ -189,14 +189,14 @@ wlcore_scan_get_channels(struct wl1271 *
5138 flags = req_channels[i]->flags;
5139
5140 if (force_passive)
5141 - flags |= IEEE80211_CHAN_PASSIVE_SCAN;
5142 + flags |= IEEE80211_CHAN_NO_IR;
5143
5144 if ((req_channels[i]->band == band) &&
5145 !(flags & IEEE80211_CHAN_DISABLED) &&
5146 (!!(flags & IEEE80211_CHAN_RADAR) == radar) &&
5147 /* if radar is set, we ignore the passive flag */
5148 (radar ||
5149 - !!(flags & IEEE80211_CHAN_PASSIVE_SCAN) == passive)) {
5150 + !!(flags & IEEE80211_CHAN_NO_IR) == passive)) {
5151
5152
5153 if (flags & IEEE80211_CHAN_RADAR) {
5154 @@ -221,7 +221,7 @@ wlcore_scan_get_channels(struct wl1271 *
5155 (band == IEEE80211_BAND_2GHZ) &&
5156 (channels[j].channel >= 12) &&
5157 (channels[j].channel <= 14) &&
5158 - (flags & IEEE80211_CHAN_PASSIVE_SCAN) &&
5159 + (flags & IEEE80211_CHAN_NO_IR) &&
5160 !force_passive) {
5161 /* pactive channels treated as DFS */
5162 channels[j].flags = SCAN_CHANNEL_FLAGS_DFS;
5163 @@ -244,7 +244,7 @@ wlcore_scan_get_channels(struct wl1271 *
5164 max_dwell_time_active,
5165 flags & IEEE80211_CHAN_RADAR ?
5166 ", DFS" : "",
5167 - flags & IEEE80211_CHAN_PASSIVE_SCAN ?
5168 + flags & IEEE80211_CHAN_NO_IR ?
5169 ", PASSIVE" : "");
5170 j++;
5171 }
5172 --- a/include/net/cfg80211.h
5173 +++ b/include/net/cfg80211.h
5174 @@ -91,9 +91,8 @@ enum ieee80211_band {
5175 * Channel flags set by the regulatory control code.
5176 *
5177 * @IEEE80211_CHAN_DISABLED: This channel is disabled.
5178 - * @IEEE80211_CHAN_PASSIVE_SCAN: Only passive scanning is permitted
5179 - * on this channel.
5180 - * @IEEE80211_CHAN_NO_IBSS: IBSS is not allowed on this channel.
5181 + * @IEEE80211_CHAN_NO_IR: do not initiate radiation, this includes
5182 + * sending probe requests or beaconing.
5183 * @IEEE80211_CHAN_RADAR: Radar detection is required on this channel.
5184 * @IEEE80211_CHAN_NO_HT40PLUS: extension channel above this channel
5185 * is not permitted.
5186 @@ -113,8 +112,8 @@ enum ieee80211_band {
5187 */
5188 enum ieee80211_channel_flags {
5189 IEEE80211_CHAN_DISABLED = 1<<0,
5190 - IEEE80211_CHAN_PASSIVE_SCAN = 1<<1,
5191 - IEEE80211_CHAN_NO_IBSS = 1<<2,
5192 + IEEE80211_CHAN_NO_IR = 1<<1,
5193 + /* hole at 1<<2 */
5194 IEEE80211_CHAN_RADAR = 1<<3,
5195 IEEE80211_CHAN_NO_HT40PLUS = 1<<4,
5196 IEEE80211_CHAN_NO_HT40MINUS = 1<<5,
5197 @@ -4149,6 +4148,7 @@ void cfg80211_radar_event(struct wiphy *
5198 /**
5199 * cfg80211_cac_event - Channel availability check (CAC) event
5200 * @netdev: network device
5201 + * @chandef: chandef for the current channel
5202 * @event: type of event
5203 * @gfp: context flags
5204 *
5205 @@ -4157,6 +4157,7 @@ void cfg80211_radar_event(struct wiphy *
5206 * also by full-MAC drivers.
5207 */
5208 void cfg80211_cac_event(struct net_device *netdev,
5209 + const struct cfg80211_chan_def *chandef,
5210 enum nl80211_radar_event event, gfp_t gfp);
5211
5212
5213 @@ -4282,7 +4283,8 @@ bool cfg80211_reg_can_beacon(struct wiph
5214 * @dev: the device which switched channels
5215 * @chandef: the new channel definition
5216 *
5217 - * Acquires wdev_lock, so must only be called from sleepable driver context!
5218 + * Caller must acquire wdev_lock, therefore must only be called from sleepable
5219 + * driver context!
5220 */
5221 void cfg80211_ch_switch_notify(struct net_device *dev,
5222 struct cfg80211_chan_def *chandef);
5223 --- a/include/uapi/linux/nl80211.h
5224 +++ b/include/uapi/linux/nl80211.h
5225 @@ -1508,6 +1508,12 @@ enum nl80211_commands {
5226 * to react to radar events, e.g. initiate a channel switch or leave the
5227 * IBSS network.
5228 *
5229 + * @NL80211_ATTR_SUPPORT_5_MHZ: A flag indicating that the device supports
5230 + * 5 MHz channel bandwidth.
5231 + *
5232 + * @NL80211_ATTR_SUPPORT_10_MHZ: A flag indicating that the device supports
5233 + * 10 MHz channel bandwidth.
5234 + *
5235 * @NL80211_ATTR_MAX: highest attribute number currently defined
5236 * @__NL80211_ATTR_AFTER_LAST: internal use
5237 */
5238 @@ -1824,6 +1830,9 @@ enum nl80211_attrs {
5239
5240 NL80211_ATTR_HANDLE_DFS,
5241
5242 + NL80211_ATTR_SUPPORT_5_MHZ,
5243 + NL80211_ATTR_SUPPORT_10_MHZ,
5244 +
5245 /* add attributes here, update the policy in nl80211.c */
5246
5247 __NL80211_ATTR_AFTER_LAST,
5248 @@ -2224,10 +2233,9 @@ enum nl80211_band_attr {
5249 * @NL80211_FREQUENCY_ATTR_FREQ: Frequency in MHz
5250 * @NL80211_FREQUENCY_ATTR_DISABLED: Channel is disabled in current
5251 * regulatory domain.
5252 - * @NL80211_FREQUENCY_ATTR_PASSIVE_SCAN: Only passive scanning is
5253 - * permitted on this channel in current regulatory domain.
5254 - * @NL80211_FREQUENCY_ATTR_NO_IBSS: IBSS networks are not permitted
5255 - * on this channel in current regulatory domain.
5256 + * @NL80211_FREQUENCY_ATTR_NO_IR: no mechanisms that initiate radiation
5257 + * are permitted on this channel, this includes sending probe
5258 + * requests, or modes of operation that require beaconing.
5259 * @NL80211_FREQUENCY_ATTR_RADAR: Radar detection is mandatory
5260 * on this channel in current regulatory domain.
5261 * @NL80211_FREQUENCY_ATTR_MAX_TX_POWER: Maximum transmission power in mBm
5262 @@ -2254,8 +2262,8 @@ enum nl80211_frequency_attr {
5263 __NL80211_FREQUENCY_ATTR_INVALID,
5264 NL80211_FREQUENCY_ATTR_FREQ,
5265 NL80211_FREQUENCY_ATTR_DISABLED,
5266 - NL80211_FREQUENCY_ATTR_PASSIVE_SCAN,
5267 - NL80211_FREQUENCY_ATTR_NO_IBSS,
5268 + NL80211_FREQUENCY_ATTR_NO_IR,
5269 + __NL80211_FREQUENCY_ATTR_NO_IBSS,
5270 NL80211_FREQUENCY_ATTR_RADAR,
5271 NL80211_FREQUENCY_ATTR_MAX_TX_POWER,
5272 NL80211_FREQUENCY_ATTR_DFS_STATE,
5273 @@ -2271,6 +2279,9 @@ enum nl80211_frequency_attr {
5274 };
5275
5276 #define NL80211_FREQUENCY_ATTR_MAX_TX_POWER NL80211_FREQUENCY_ATTR_MAX_TX_POWER
5277 +#define NL80211_FREQUENCY_ATTR_PASSIVE_SCAN NL80211_FREQUENCY_ATTR_NO_IR
5278 +#define NL80211_FREQUENCY_ATTR_NO_IBSS NL80211_FREQUENCY_ATTR_NO_IR
5279 +#define NL80211_FREQUENCY_ATTR_NO_IR NL80211_FREQUENCY_ATTR_NO_IR
5280
5281 /**
5282 * enum nl80211_bitrate_attr - bitrate attributes
5283 @@ -2413,8 +2424,9 @@ enum nl80211_sched_scan_match_attr {
5284 * @NL80211_RRF_DFS: DFS support is required to be used
5285 * @NL80211_RRF_PTP_ONLY: this is only for Point To Point links
5286 * @NL80211_RRF_PTMP_ONLY: this is only for Point To Multi Point links
5287 - * @NL80211_RRF_PASSIVE_SCAN: passive scan is required
5288 - * @NL80211_RRF_NO_IBSS: no IBSS is allowed
5289 + * @NL80211_RRF_NO_IR: no mechanisms that initiate radiation are allowed,
5290 + * this includes probe requests or modes of operation that require
5291 + * beaconing.
5292 */
5293 enum nl80211_reg_rule_flags {
5294 NL80211_RRF_NO_OFDM = 1<<0,
5295 @@ -2424,10 +2436,17 @@ enum nl80211_reg_rule_flags {
5296 NL80211_RRF_DFS = 1<<4,
5297 NL80211_RRF_PTP_ONLY = 1<<5,
5298 NL80211_RRF_PTMP_ONLY = 1<<6,
5299 - NL80211_RRF_PASSIVE_SCAN = 1<<7,
5300 - NL80211_RRF_NO_IBSS = 1<<8,
5301 + NL80211_RRF_NO_IR = 1<<7,
5302 + __NL80211_RRF_NO_IBSS = 1<<8,
5303 };
5304
5305 +#define NL80211_RRF_PASSIVE_SCAN NL80211_RRF_NO_IR
5306 +#define NL80211_RRF_NO_IBSS NL80211_RRF_NO_IR
5307 +#define NL80211_RRF_NO_IR NL80211_RRF_NO_IR
5308 +
5309 +/* For backport compatibility with older userspace */
5310 +#define NL80211_RRF_NO_IR_ALL (NL80211_RRF_NO_IR | __NL80211_RRF_NO_IBSS)
5311 +
5312 /**
5313 * enum nl80211_dfs_regions - regulatory DFS regions
5314 *
5315 --- a/net/mac80211/cfg.c
5316 +++ b/net/mac80211/cfg.c
5317 @@ -846,7 +846,7 @@ static int ieee80211_set_probe_resp(stru
5318 if (!resp || !resp_len)
5319 return 1;
5320
5321 - old = rtnl_dereference(sdata->u.ap.probe_resp);
5322 + old = sdata_dereference(sdata->u.ap.probe_resp, sdata);
5323
5324 new = kzalloc(sizeof(struct probe_resp) + resp_len, GFP_KERNEL);
5325 if (!new)
5326 @@ -870,7 +870,8 @@ int ieee80211_assign_beacon(struct ieee8
5327 int size, err;
5328 u32 changed = BSS_CHANGED_BEACON;
5329
5330 - old = rtnl_dereference(sdata->u.ap.beacon);
5331 + old = sdata_dereference(sdata->u.ap.beacon, sdata);
5332 +
5333
5334 /* Need to have a beacon head if we don't have one yet */
5335 if (!params->head && !old)
5336 @@ -947,7 +948,7 @@ static int ieee80211_start_ap(struct wip
5337 BSS_CHANGED_P2P_PS;
5338 int err;
5339
5340 - old = rtnl_dereference(sdata->u.ap.beacon);
5341 + old = sdata_dereference(sdata->u.ap.beacon, sdata);
5342 if (old)
5343 return -EALREADY;
5344
5345 @@ -1001,7 +1002,8 @@ static int ieee80211_start_ap(struct wip
5346
5347 err = drv_start_ap(sdata->local, sdata);
5348 if (err) {
5349 - old = rtnl_dereference(sdata->u.ap.beacon);
5350 + old = sdata_dereference(sdata->u.ap.beacon, sdata);
5351 +
5352 if (old)
5353 kfree_rcu(old, rcu_head);
5354 RCU_INIT_POINTER(sdata->u.ap.beacon, NULL);
5355 @@ -1032,7 +1034,7 @@ static int ieee80211_change_beacon(struc
5356 if (sdata->vif.csa_active)
5357 return -EBUSY;
5358
5359 - old = rtnl_dereference(sdata->u.ap.beacon);
5360 + old = sdata_dereference(sdata->u.ap.beacon, sdata);
5361 if (!old)
5362 return -ENOENT;
5363
5364 @@ -1050,15 +1052,18 @@ static int ieee80211_stop_ap(struct wiph
5365 struct ieee80211_local *local = sdata->local;
5366 struct beacon_data *old_beacon;
5367 struct probe_resp *old_probe_resp;
5368 + struct cfg80211_chan_def chandef;
5369
5370 - old_beacon = rtnl_dereference(sdata->u.ap.beacon);
5371 + old_beacon = sdata_dereference(sdata->u.ap.beacon, sdata);
5372 if (!old_beacon)
5373 return -ENOENT;
5374 - old_probe_resp = rtnl_dereference(sdata->u.ap.probe_resp);
5375 + old_probe_resp = sdata_dereference(sdata->u.ap.probe_resp, sdata);
5376
5377 /* abort any running channel switch */
5378 sdata->vif.csa_active = false;
5379 - cancel_work_sync(&sdata->csa_finalize_work);
5380 + kfree(sdata->u.ap.next_beacon);
5381 + sdata->u.ap.next_beacon = NULL;
5382 +
5383 cancel_work_sync(&sdata->u.ap.request_smps_work);
5384
5385 /* turn off carrier for this interface and dependent VLANs */
5386 @@ -1091,8 +1096,10 @@ static int ieee80211_stop_ap(struct wiph
5387 ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_BEACON_ENABLED);
5388
5389 if (sdata->wdev.cac_started) {
5390 + chandef = sdata->vif.bss_conf.chandef;
5391 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
5392 - cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_ABORTED,
5393 + cfg80211_cac_event(sdata->dev, &chandef,
5394 + NL80211_RADAR_CAC_ABORTED,
5395 GFP_KERNEL);
5396 }
5397
5398 @@ -1368,7 +1375,7 @@ static int sta_apply_parameters(struct i
5399 changed |=
5400 ieee80211_mps_set_sta_local_pm(sta,
5401 params->local_pm);
5402 - ieee80211_bss_info_change_notify(sdata, changed);
5403 + ieee80211_mbss_info_change_notify(sdata, changed);
5404 #endif
5405 }
5406
5407 @@ -1953,7 +1960,7 @@ static int ieee80211_change_bss(struct w
5408 enum ieee80211_band band;
5409 u32 changed = 0;
5410
5411 - if (!rtnl_dereference(sdata->u.ap.beacon))
5412 + if (!sdata_dereference(sdata->u.ap.beacon, sdata))
5413 return -ENOENT;
5414
5415 band = ieee80211_get_sdata_band(sdata);
5416 @@ -2964,27 +2971,33 @@ void ieee80211_csa_finalize_work(struct
5417 struct ieee80211_local *local = sdata->local;
5418 int err, changed = 0;
5419
5420 + sdata_lock(sdata);
5421 + /* AP might have been stopped while waiting for the lock. */
5422 + if (!sdata->vif.csa_active)
5423 + goto unlock;
5424 +
5425 if (!ieee80211_sdata_running(sdata))
5426 - return;
5427 + goto unlock;
5428
5429 sdata->radar_required = sdata->csa_radar_required;
5430 - err = ieee80211_vif_change_channel(sdata, &local->csa_chandef,
5431 - &changed);
5432 + err = ieee80211_vif_change_channel(sdata, &changed);
5433 if (WARN_ON(err < 0))
5434 - return;
5435 + goto unlock;
5436
5437 if (!local->use_chanctx) {
5438 - local->_oper_chandef = local->csa_chandef;
5439 + local->_oper_chandef = sdata->csa_chandef;
5440 ieee80211_hw_config(local, 0);
5441 }
5442
5443 ieee80211_bss_info_change_notify(sdata, changed);
5444
5445 + sdata->vif.csa_active = false;
5446 switch (sdata->vif.type) {
5447 case NL80211_IFTYPE_AP:
5448 err = ieee80211_assign_beacon(sdata, sdata->u.ap.next_beacon);
5449 if (err < 0)
5450 - return;
5451 + goto unlock;
5452 +
5453 changed |= err;
5454 kfree(sdata->u.ap.next_beacon);
5455 sdata->u.ap.next_beacon = NULL;
5456 @@ -2998,20 +3011,22 @@ void ieee80211_csa_finalize_work(struct
5457 case NL80211_IFTYPE_MESH_POINT:
5458 err = ieee80211_mesh_finish_csa(sdata);
5459 if (err < 0)
5460 - return;
5461 + goto unlock;
5462 break;
5463 #endif
5464 default:
5465 WARN_ON(1);
5466 - return;
5467 + goto unlock;
5468 }
5469 - sdata->vif.csa_active = false;
5470
5471 ieee80211_wake_queues_by_reason(&sdata->local->hw,
5472 IEEE80211_MAX_QUEUE_MAP,
5473 IEEE80211_QUEUE_STOP_REASON_CSA);
5474
5475 - cfg80211_ch_switch_notify(sdata->dev, &local->csa_chandef);
5476 + cfg80211_ch_switch_notify(sdata->dev, &sdata->csa_chandef);
5477 +
5478 +unlock:
5479 + sdata_unlock(sdata);
5480 }
5481
5482 static int ieee80211_channel_switch(struct wiphy *wiphy, struct net_device *dev,
5483 @@ -3024,6 +3039,8 @@ static int ieee80211_channel_switch(stru
5484 struct ieee80211_if_mesh __maybe_unused *ifmsh;
5485 int err, num_chanctx;
5486
5487 + lockdep_assert_held(&sdata->wdev.mtx);
5488 +
5489 if (!list_empty(&local->roc_list) || local->scanning)
5490 return -EBUSY;
5491
5492 @@ -3120,9 +3137,17 @@ static int ieee80211_channel_switch(stru
5493 params->chandef.chan->band)
5494 return -EINVAL;
5495
5496 + ifmsh->chsw_init = true;
5497 + if (!ifmsh->pre_value)
5498 + ifmsh->pre_value = 1;
5499 + else
5500 + ifmsh->pre_value++;
5501 +
5502 err = ieee80211_mesh_csa_beacon(sdata, params, true);
5503 - if (err < 0)
5504 + if (err < 0) {
5505 + ifmsh->chsw_init = false;
5506 return err;
5507 + }
5508 break;
5509 #endif
5510 default:
5511 @@ -3136,7 +3161,7 @@ static int ieee80211_channel_switch(stru
5512 IEEE80211_MAX_QUEUE_MAP,
5513 IEEE80211_QUEUE_STOP_REASON_CSA);
5514
5515 - local->csa_chandef = params->chandef;
5516 + sdata->csa_chandef = params->chandef;
5517 sdata->vif.csa_active = true;
5518
5519 ieee80211_bss_info_change_notify(sdata, err);
5520 --- a/net/mac80211/iface.c
5521 +++ b/net/mac80211/iface.c
5522 @@ -749,6 +749,7 @@ static void ieee80211_do_stop(struct iee
5523 u32 hw_reconf_flags = 0;
5524 int i, flushed;
5525 struct ps_data *ps;
5526 + struct cfg80211_chan_def chandef;
5527
5528 clear_bit(SDATA_STATE_RUNNING, &sdata->state);
5529
5530 @@ -828,11 +829,13 @@ static void ieee80211_do_stop(struct iee
5531 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
5532
5533 if (sdata->wdev.cac_started) {
5534 + chandef = sdata->vif.bss_conf.chandef;
5535 WARN_ON(local->suspended);
5536 mutex_lock(&local->iflist_mtx);
5537 ieee80211_vif_release_channel(sdata);
5538 mutex_unlock(&local->iflist_mtx);
5539 - cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_ABORTED,
5540 + cfg80211_cac_event(sdata->dev, &chandef,
5541 + NL80211_RADAR_CAC_ABORTED,
5542 GFP_KERNEL);
5543 }
5544
5545 @@ -1340,7 +1343,6 @@ static void ieee80211_setup_sdata(struct
5546 sdata->vif.bss_conf.bssid = NULL;
5547 break;
5548 case NL80211_IFTYPE_AP_VLAN:
5549 - break;
5550 case NL80211_IFTYPE_P2P_DEVICE:
5551 sdata->vif.bss_conf.bssid = sdata->vif.addr;
5552 break;
5553 --- a/net/mac80211/mlme.c
5554 +++ b/net/mac80211/mlme.c
5555 @@ -886,8 +886,7 @@ static void ieee80211_chswitch_work(stru
5556 if (!ifmgd->associated)
5557 goto out;
5558
5559 - ret = ieee80211_vif_change_channel(sdata, &local->csa_chandef,
5560 - &changed);
5561 + ret = ieee80211_vif_change_channel(sdata, &changed);
5562 if (ret) {
5563 sdata_info(sdata,
5564 "vif channel switch failed, disconnecting\n");
5565 @@ -897,7 +896,7 @@ static void ieee80211_chswitch_work(stru
5566 }
5567
5568 if (!local->use_chanctx) {
5569 - local->_oper_chandef = local->csa_chandef;
5570 + local->_oper_chandef = sdata->csa_chandef;
5571 /* Call "hw_config" only if doing sw channel switch.
5572 * Otherwise update the channel directly
5573 */
5574 @@ -908,7 +907,7 @@ static void ieee80211_chswitch_work(stru
5575 }
5576
5577 /* XXX: shouldn't really modify cfg80211-owned data! */
5578 - ifmgd->associated->channel = local->csa_chandef.chan;
5579 + ifmgd->associated->channel = sdata->csa_chandef.chan;
5580
5581 /* XXX: wait for a beacon first? */
5582 ieee80211_wake_queues_by_reason(&local->hw,
5583 @@ -1035,7 +1034,7 @@ ieee80211_sta_process_chanswitch(struct
5584 }
5585 mutex_unlock(&local->chanctx_mtx);
5586
5587 - local->csa_chandef = csa_ie.chandef;
5588 + sdata->csa_chandef = csa_ie.chandef;
5589
5590 if (csa_ie.mode)
5591 ieee80211_stop_queues_by_reason(&local->hw,
5592 @@ -1398,10 +1397,12 @@ void ieee80211_dfs_cac_timer_work(struct
5593 struct ieee80211_sub_if_data *sdata =
5594 container_of(delayed_work, struct ieee80211_sub_if_data,
5595 dfs_cac_timer_work);
5596 + struct cfg80211_chan_def chandef = sdata->vif.bss_conf.chandef;
5597
5598 ieee80211_vif_release_channel(sdata);
5599 -
5600 - cfg80211_cac_event(sdata->dev, NL80211_RADAR_CAC_FINISHED, GFP_KERNEL);
5601 + cfg80211_cac_event(sdata->dev, &chandef,
5602 + NL80211_RADAR_CAC_FINISHED,
5603 + GFP_KERNEL);
5604 }
5605
5606 /* MLME */
5607 --- a/net/mac80211/rx.c
5608 +++ b/net/mac80211/rx.c
5609 @@ -729,9 +729,7 @@ static void ieee80211_release_reorder_fr
5610 lockdep_assert_held(&tid_agg_rx->reorder_lock);
5611
5612 while (ieee80211_sn_less(tid_agg_rx->head_seq_num, head_seq_num)) {
5613 - index = ieee80211_sn_sub(tid_agg_rx->head_seq_num,
5614 - tid_agg_rx->ssn) %
5615 - tid_agg_rx->buf_size;
5616 + index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size;
5617 ieee80211_release_reorder_frame(sdata, tid_agg_rx, index,
5618 frames);
5619 }
5620 @@ -757,8 +755,7 @@ static void ieee80211_sta_reorder_releas
5621 lockdep_assert_held(&tid_agg_rx->reorder_lock);
5622
5623 /* release the buffer until next missing frame */
5624 - index = ieee80211_sn_sub(tid_agg_rx->head_seq_num,
5625 - tid_agg_rx->ssn) % tid_agg_rx->buf_size;
5626 + index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size;
5627 if (!tid_agg_rx->reorder_buf[index] &&
5628 tid_agg_rx->stored_mpdu_num) {
5629 /*
5630 @@ -793,15 +790,11 @@ static void ieee80211_sta_reorder_releas
5631 } else while (tid_agg_rx->reorder_buf[index]) {
5632 ieee80211_release_reorder_frame(sdata, tid_agg_rx, index,
5633 frames);
5634 - index = ieee80211_sn_sub(tid_agg_rx->head_seq_num,
5635 - tid_agg_rx->ssn) %
5636 - tid_agg_rx->buf_size;
5637 + index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size;
5638 }
5639
5640 if (tid_agg_rx->stored_mpdu_num) {
5641 - j = index = ieee80211_sn_sub(tid_agg_rx->head_seq_num,
5642 - tid_agg_rx->ssn) %
5643 - tid_agg_rx->buf_size;
5644 + j = index = tid_agg_rx->head_seq_num % tid_agg_rx->buf_size;
5645
5646 for (; j != (index - 1) % tid_agg_rx->buf_size;
5647 j = (j + 1) % tid_agg_rx->buf_size) {
5648 @@ -861,8 +854,7 @@ static bool ieee80211_sta_manage_reorder
5649
5650 /* Now the new frame is always in the range of the reordering buffer */
5651
5652 - index = ieee80211_sn_sub(mpdu_seq_num,
5653 - tid_agg_rx->ssn) % tid_agg_rx->buf_size;
5654 + index = mpdu_seq_num % tid_agg_rx->buf_size;
5655
5656 /* check if we already stored this frame */
5657 if (tid_agg_rx->reorder_buf[index]) {
5658 @@ -911,7 +903,8 @@ static void ieee80211_rx_reorder_ampdu(s
5659 u16 sc;
5660 u8 tid, ack_policy;
5661
5662 - if (!ieee80211_is_data_qos(hdr->frame_control))
5663 + if (!ieee80211_is_data_qos(hdr->frame_control) ||
5664 + is_multicast_ether_addr(hdr->addr1))
5665 goto dont_reorder;
5666
5667 /*
5668 --- a/net/mac80211/scan.c
5669 +++ b/net/mac80211/scan.c
5670 @@ -526,7 +526,7 @@ static int __ieee80211_start_scan(struct
5671 ieee80211_hw_config(local, 0);
5672
5673 if ((req->channels[0]->flags &
5674 - IEEE80211_CHAN_PASSIVE_SCAN) ||
5675 + IEEE80211_CHAN_NO_IR) ||
5676 !local->scan_req->n_ssids) {
5677 next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
5678 } else {
5679 @@ -572,7 +572,7 @@ ieee80211_scan_get_channel_time(struct i
5680 * TODO: channel switching also consumes quite some time,
5681 * add that delay as well to get a better estimation
5682 */
5683 - if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)
5684 + if (chan->flags & IEEE80211_CHAN_NO_IR)
5685 return IEEE80211_PASSIVE_CHANNEL_TIME;
5686 return IEEE80211_PROBE_DELAY + IEEE80211_CHANNEL_TIME;
5687 }
5688 @@ -696,7 +696,7 @@ static void ieee80211_scan_state_set_cha
5689 *
5690 * In any case, it is not necessary for a passive scan.
5691 */
5692 - if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN ||
5693 + if (chan->flags & IEEE80211_CHAN_NO_IR ||
5694 !local->scan_req->n_ssids) {
5695 *next_delay = IEEE80211_PASSIVE_CHANNEL_TIME;
5696 local->next_scan_state = SCAN_DECISION;
5697 @@ -881,7 +881,7 @@ int ieee80211_request_ibss_scan(struct i
5698 struct ieee80211_channel *tmp_ch =
5699 &local->hw.wiphy->bands[band]->channels[i];
5700
5701 - if (tmp_ch->flags & (IEEE80211_CHAN_NO_IBSS |
5702 + if (tmp_ch->flags & (IEEE80211_CHAN_NO_IR |
5703 IEEE80211_CHAN_DISABLED))
5704 continue;
5705
5706 @@ -895,7 +895,7 @@ int ieee80211_request_ibss_scan(struct i
5707
5708 local->int_scan_req->n_channels = n_ch;
5709 } else {
5710 - if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IBSS |
5711 + if (WARN_ON_ONCE(chan->flags & (IEEE80211_CHAN_NO_IR |
5712 IEEE80211_CHAN_DISABLED)))
5713 goto unlock;
5714
5715 --- a/net/mac80211/tx.c
5716 +++ b/net/mac80211/tx.c
5717 @@ -463,7 +463,6 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
5718 {
5719 struct sta_info *sta = tx->sta;
5720 struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
5721 - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
5722 struct ieee80211_local *local = tx->local;
5723
5724 if (unlikely(!sta))
5725 @@ -474,15 +473,6 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
5726 !(info->flags & IEEE80211_TX_CTL_NO_PS_BUFFER))) {
5727 int ac = skb_get_queue_mapping(tx->skb);
5728
5729 - /* only deauth, disassoc and action are bufferable MMPDUs */
5730 - if (ieee80211_is_mgmt(hdr->frame_control) &&
5731 - !ieee80211_is_deauth(hdr->frame_control) &&
5732 - !ieee80211_is_disassoc(hdr->frame_control) &&
5733 - !ieee80211_is_action(hdr->frame_control)) {
5734 - info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
5735 - return TX_CONTINUE;
5736 - }
5737 -
5738 ps_dbg(sta->sdata, "STA %pM aid %d: PS buffer for AC %d\n",
5739 sta->sta.addr, sta->sta.aid, ac);
5740 if (tx->local->total_ps_buffered >= TOTAL_MAX_TX_BUFFER)
5741 @@ -525,9 +515,21 @@ ieee80211_tx_h_unicast_ps_buf(struct iee
5742 static ieee80211_tx_result debug_noinline
5743 ieee80211_tx_h_ps_buf(struct ieee80211_tx_data *tx)
5744 {
5745 + struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb);
5746 + struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data;
5747 +
5748 if (unlikely(tx->flags & IEEE80211_TX_PS_BUFFERED))
5749 return TX_CONTINUE;
5750
5751 + /* only deauth, disassoc and action are bufferable MMPDUs */
5752 + if (ieee80211_is_mgmt(hdr->frame_control) &&
5753 + !ieee80211_is_deauth(hdr->frame_control) &&
5754 + !ieee80211_is_disassoc(hdr->frame_control) &&
5755 + !ieee80211_is_action(hdr->frame_control)) {
5756 + info->flags |= IEEE80211_TX_CTL_NO_PS_BUFFER;
5757 + return TX_CONTINUE;
5758 + }
5759 +
5760 if (tx->flags & IEEE80211_TX_UNICAST)
5761 return ieee80211_tx_h_unicast_ps_buf(tx);
5762 else
5763 @@ -1728,8 +1730,7 @@ netdev_tx_t ieee80211_monitor_start_xmit
5764 * radar detection by itself. We can do that later by adding a
5765 * monitor flag interfaces used for AP support.
5766 */
5767 - if ((chan->flags & (IEEE80211_CHAN_NO_IBSS | IEEE80211_CHAN_RADAR |
5768 - IEEE80211_CHAN_PASSIVE_SCAN)))
5769 + if ((chan->flags & (IEEE80211_CHAN_NO_IR | IEEE80211_CHAN_RADAR)))
5770 goto fail_rcu;
5771
5772 ieee80211_xmit(sdata, skb, chan->band);
5773 @@ -2530,7 +2531,8 @@ struct sk_buff *ieee80211_beacon_get_tim
5774 */
5775 skb = dev_alloc_skb(local->tx_headroom +
5776 beacon->head_len +
5777 - beacon->tail_len + 256);
5778 + beacon->tail_len + 256 +
5779 + local->hw.extra_beacon_tailroom);
5780 if (!skb)
5781 goto out;
5782
5783 @@ -2562,7 +2564,8 @@ struct sk_buff *ieee80211_beacon_get_tim
5784 ieee80211_update_csa(sdata, presp);
5785
5786
5787 - skb = dev_alloc_skb(local->tx_headroom + presp->head_len);
5788 + skb = dev_alloc_skb(local->tx_headroom + presp->head_len +
5789 + local->hw.extra_beacon_tailroom);
5790 if (!skb)
5791 goto out;
5792 skb_reserve(skb, local->tx_headroom);
5793 @@ -2589,7 +2592,8 @@ struct sk_buff *ieee80211_beacon_get_tim
5794 skb = dev_alloc_skb(local->tx_headroom +
5795 bcn->head_len +
5796 256 + /* TIM IE */
5797 - bcn->tail_len);
5798 + bcn->tail_len +
5799 + local->hw.extra_beacon_tailroom);
5800 if (!skb)
5801 goto out;
5802 skb_reserve(skb, local->tx_headroom);
5803 --- a/net/mac80211/util.c
5804 +++ b/net/mac80211/util.c
5805 @@ -2259,14 +2259,17 @@ u64 ieee80211_calculate_rx_timestamp(str
5806 void ieee80211_dfs_cac_cancel(struct ieee80211_local *local)
5807 {
5808 struct ieee80211_sub_if_data *sdata;
5809 + struct cfg80211_chan_def chandef;
5810
5811 mutex_lock(&local->iflist_mtx);
5812 list_for_each_entry(sdata, &local->interfaces, list) {
5813 cancel_delayed_work_sync(&sdata->dfs_cac_timer_work);
5814
5815 if (sdata->wdev.cac_started) {
5816 + chandef = sdata->vif.bss_conf.chandef;
5817 ieee80211_vif_release_channel(sdata);
5818 cfg80211_cac_event(sdata->dev,
5819 + &chandef,
5820 NL80211_RADAR_CAC_ABORTED,
5821 GFP_KERNEL);
5822 }
5823 @@ -2459,16 +2462,146 @@ int ieee80211_send_action_csa(struct iee
5824 WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT : 0x00;
5825 put_unaligned_le16(WLAN_REASON_MESH_CHAN, pos); /* Reason Cd */
5826 pos += 2;
5827 - if (!ifmsh->pre_value)
5828 - ifmsh->pre_value = 1;
5829 - else
5830 - ifmsh->pre_value++;
5831 pre_value = cpu_to_le16(ifmsh->pre_value);
5832 memcpy(pos, &pre_value, 2); /* Precedence Value */
5833 pos += 2;
5834 - ifmsh->chsw_init = true;
5835 }
5836
5837 ieee80211_tx_skb(sdata, skb);
5838 return 0;
5839 }
5840 +
5841 +static bool
5842 +ieee80211_extend_noa_desc(struct ieee80211_noa_data *data, u32 tsf, int i)
5843 +{
5844 + s32 end = data->desc[i].start + data->desc[i].duration - (tsf + 1);
5845 + int skip;
5846 +
5847 + if (end > 0)
5848 + return false;
5849 +
5850 + /* End time is in the past, check for repetitions */
5851 + skip = DIV_ROUND_UP(-end, data->desc[i].interval);
5852 + if (data->count[i] < 255) {
5853 + if (data->count[i] <= skip) {
5854 + data->count[i] = 0;
5855 + return false;
5856 + }
5857 +
5858 + data->count[i] -= skip;
5859 + }
5860 +
5861 + data->desc[i].start += skip * data->desc[i].interval;
5862 +
5863 + return true;
5864 +}
5865 +
5866 +static bool
5867 +ieee80211_extend_absent_time(struct ieee80211_noa_data *data, u32 tsf,
5868 + s32 *offset)
5869 +{
5870 + bool ret = false;
5871 + int i;
5872 +
5873 + for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
5874 + s32 cur;
5875 +
5876 + if (!data->count[i])
5877 + continue;
5878 +
5879 + if (ieee80211_extend_noa_desc(data, tsf + *offset, i))
5880 + ret = true;
5881 +
5882 + cur = data->desc[i].start - tsf;
5883 + if (cur > *offset)
5884 + continue;
5885 +
5886 + cur = data->desc[i].start + data->desc[i].duration - tsf;
5887 + if (cur > *offset)
5888 + *offset = cur;
5889 + }
5890 +
5891 + return ret;
5892 +}
5893 +
5894 +static u32
5895 +ieee80211_get_noa_absent_time(struct ieee80211_noa_data *data, u32 tsf)
5896 +{
5897 + s32 offset = 0;
5898 + int tries = 0;
5899 +
5900 + ieee80211_extend_absent_time(data, tsf, &offset);
5901 + do {
5902 + if (!ieee80211_extend_absent_time(data, tsf, &offset))
5903 + break;
5904 +
5905 + tries++;
5906 + } while (tries < 5);
5907 +
5908 + return offset;
5909 +}
5910 +
5911 +void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf)
5912 +{
5913 + u32 next_offset = BIT(31) - 1;
5914 + int i;
5915 +
5916 + data->absent = 0;
5917 + data->has_next_tsf = false;
5918 + for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
5919 + s32 start;
5920 +
5921 + if (!data->count[i])
5922 + continue;
5923 +
5924 + ieee80211_extend_noa_desc(data, tsf, i);
5925 + start = data->desc[i].start - tsf;
5926 + if (start <= 0)
5927 + data->absent |= BIT(i);
5928 +
5929 + if (next_offset > start)
5930 + next_offset = start;
5931 +
5932 + data->has_next_tsf = true;
5933 + }
5934 +
5935 + if (data->absent)
5936 + next_offset = ieee80211_get_noa_absent_time(data, tsf);
5937 +
5938 + data->next_tsf = tsf + next_offset;
5939 +}
5940 +EXPORT_SYMBOL(ieee80211_update_p2p_noa);
5941 +
5942 +int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr,
5943 + struct ieee80211_noa_data *data, u32 tsf)
5944 +{
5945 + int ret = 0;
5946 + int i;
5947 +
5948 + memset(data, 0, sizeof(*data));
5949 +
5950 + for (i = 0; i < IEEE80211_P2P_NOA_DESC_MAX; i++) {
5951 + const struct ieee80211_p2p_noa_desc *desc = &attr->desc[i];
5952 +
5953 + if (!desc->count || !desc->duration)
5954 + continue;
5955 +
5956 + data->count[i] = desc->count;
5957 + data->desc[i].start = le32_to_cpu(desc->start_time);
5958 + data->desc[i].duration = le32_to_cpu(desc->duration);
5959 + data->desc[i].interval = le32_to_cpu(desc->interval);
5960 +
5961 + if (data->count[i] > 1 &&
5962 + data->desc[i].interval < data->desc[i].duration)
5963 + continue;
5964 +
5965 + ieee80211_extend_noa_desc(data, tsf, i);
5966 + ret++;
5967 + }
5968 +
5969 + if (ret)
5970 + ieee80211_update_p2p_noa(data, tsf);
5971 +
5972 + return ret;
5973 +}
5974 +EXPORT_SYMBOL(ieee80211_parse_p2p_noa);
5975 --- a/net/wireless/chan.c
5976 +++ b/net/wireless/chan.c
5977 @@ -277,6 +277,32 @@ void cfg80211_set_dfs_state(struct wiphy
5978 width, dfs_state);
5979 }
5980
5981 +static u32 cfg80211_get_start_freq(u32 center_freq,
5982 + u32 bandwidth)
5983 +{
5984 + u32 start_freq;
5985 +
5986 + if (bandwidth <= 20)
5987 + start_freq = center_freq;
5988 + else
5989 + start_freq = center_freq - bandwidth/2 + 10;
5990 +
5991 + return start_freq;
5992 +}
5993 +
5994 +static u32 cfg80211_get_end_freq(u32 center_freq,
5995 + u32 bandwidth)
5996 +{
5997 + u32 end_freq;
5998 +
5999 + if (bandwidth <= 20)
6000 + end_freq = center_freq;
6001 + else
6002 + end_freq = center_freq + bandwidth/2 - 10;
6003 +
6004 + return end_freq;
6005 +}
6006 +
6007 static int cfg80211_get_chans_dfs_required(struct wiphy *wiphy,
6008 u32 center_freq,
6009 u32 bandwidth)
6010 @@ -284,13 +310,8 @@ static int cfg80211_get_chans_dfs_requir
6011 struct ieee80211_channel *c;
6012 u32 freq, start_freq, end_freq;
6013
6014 - if (bandwidth <= 20) {
6015 - start_freq = center_freq;
6016 - end_freq = center_freq;
6017 - } else {
6018 - start_freq = center_freq - bandwidth/2 + 10;
6019 - end_freq = center_freq + bandwidth/2 - 10;
6020 - }
6021 + start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
6022 + end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
6023
6024 for (freq = start_freq; freq <= end_freq; freq += 20) {
6025 c = ieee80211_get_channel(wiphy, freq);
6026 @@ -330,33 +351,159 @@ int cfg80211_chandef_dfs_required(struct
6027 }
6028 EXPORT_SYMBOL(cfg80211_chandef_dfs_required);
6029
6030 -static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
6031 - u32 center_freq, u32 bandwidth,
6032 - u32 prohibited_flags)
6033 +static int cfg80211_get_chans_dfs_usable(struct wiphy *wiphy,
6034 + u32 center_freq,
6035 + u32 bandwidth)
6036 {
6037 struct ieee80211_channel *c;
6038 u32 freq, start_freq, end_freq;
6039 + int count = 0;
6040
6041 - if (bandwidth <= 20) {
6042 - start_freq = center_freq;
6043 - end_freq = center_freq;
6044 - } else {
6045 - start_freq = center_freq - bandwidth/2 + 10;
6046 - end_freq = center_freq + bandwidth/2 - 10;
6047 + start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
6048 + end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
6049 +
6050 + /*
6051 + * Check entire range of channels for the bandwidth.
6052 + * Check all channels are DFS channels (DFS_USABLE or
6053 + * DFS_AVAILABLE). Return number of usable channels
6054 + * (require CAC). Allow DFS and non-DFS channel mix.
6055 + */
6056 + for (freq = start_freq; freq <= end_freq; freq += 20) {
6057 + c = ieee80211_get_channel(wiphy, freq);
6058 + if (!c)
6059 + return -EINVAL;
6060 +
6061 + if (c->flags & IEEE80211_CHAN_DISABLED)
6062 + return -EINVAL;
6063 +
6064 + if (c->flags & IEEE80211_CHAN_RADAR) {
6065 + if (c->dfs_state == NL80211_DFS_UNAVAILABLE)
6066 + return -EINVAL;
6067 +
6068 + if (c->dfs_state == NL80211_DFS_USABLE)
6069 + count++;
6070 + }
6071 + }
6072 +
6073 + return count;
6074 +}
6075 +
6076 +bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
6077 + const struct cfg80211_chan_def *chandef)
6078 +{
6079 + int width;
6080 + int r1, r2 = 0;
6081 +
6082 + if (WARN_ON(!cfg80211_chandef_valid(chandef)))
6083 + return false;
6084 +
6085 + width = cfg80211_chandef_get_width(chandef);
6086 + if (width < 0)
6087 + return false;
6088 +
6089 + r1 = cfg80211_get_chans_dfs_usable(wiphy, chandef->center_freq1,
6090 + width);
6091 +
6092 + if (r1 < 0)
6093 + return false;
6094 +
6095 + switch (chandef->width) {
6096 + case NL80211_CHAN_WIDTH_80P80:
6097 + WARN_ON(!chandef->center_freq2);
6098 + r2 = cfg80211_get_chans_dfs_usable(wiphy,
6099 + chandef->center_freq2,
6100 + width);
6101 + if (r2 < 0)
6102 + return false;
6103 + break;
6104 + default:
6105 + WARN_ON(chandef->center_freq2);
6106 + break;
6107 }
6108
6109 + return (r1 + r2 > 0);
6110 +}
6111 +
6112 +
6113 +static bool cfg80211_get_chans_dfs_available(struct wiphy *wiphy,
6114 + u32 center_freq,
6115 + u32 bandwidth)
6116 +{
6117 + struct ieee80211_channel *c;
6118 + u32 freq, start_freq, end_freq;
6119 +
6120 + start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
6121 + end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
6122 +
6123 + /*
6124 + * Check entire range of channels for the bandwidth.
6125 + * If any channel in between is disabled or has not
6126 + * had gone through CAC return false
6127 + */
6128 for (freq = start_freq; freq <= end_freq; freq += 20) {
6129 c = ieee80211_get_channel(wiphy, freq);
6130 if (!c)
6131 return false;
6132
6133 - /* check for radar flags */
6134 - if ((prohibited_flags & c->flags & IEEE80211_CHAN_RADAR) &&
6135 + if (c->flags & IEEE80211_CHAN_DISABLED)
6136 + return false;
6137 +
6138 + if ((c->flags & IEEE80211_CHAN_RADAR) &&
6139 (c->dfs_state != NL80211_DFS_AVAILABLE))
6140 return false;
6141 + }
6142 +
6143 + return true;
6144 +}
6145 +
6146 +static bool cfg80211_chandef_dfs_available(struct wiphy *wiphy,
6147 + const struct cfg80211_chan_def *chandef)
6148 +{
6149 + int width;
6150 + int r;
6151 +
6152 + if (WARN_ON(!cfg80211_chandef_valid(chandef)))
6153 + return false;
6154
6155 - /* check for the other flags */
6156 - if (c->flags & prohibited_flags & ~IEEE80211_CHAN_RADAR)
6157 + width = cfg80211_chandef_get_width(chandef);
6158 + if (width < 0)
6159 + return false;
6160 +
6161 + r = cfg80211_get_chans_dfs_available(wiphy, chandef->center_freq1,
6162 + width);
6163 +
6164 + /* If any of channels unavailable for cf1 just return */
6165 + if (!r)
6166 + return r;
6167 +
6168 + switch (chandef->width) {
6169 + case NL80211_CHAN_WIDTH_80P80:
6170 + WARN_ON(!chandef->center_freq2);
6171 + r = cfg80211_get_chans_dfs_available(wiphy,
6172 + chandef->center_freq2,
6173 + width);
6174 + default:
6175 + WARN_ON(chandef->center_freq2);
6176 + break;
6177 + }
6178 +
6179 + return r;
6180 +}
6181 +
6182 +
6183 +static bool cfg80211_secondary_chans_ok(struct wiphy *wiphy,
6184 + u32 center_freq, u32 bandwidth,
6185 + u32 prohibited_flags)
6186 +{
6187 + struct ieee80211_channel *c;
6188 + u32 freq, start_freq, end_freq;
6189 +
6190 + start_freq = cfg80211_get_start_freq(center_freq, bandwidth);
6191 + end_freq = cfg80211_get_end_freq(center_freq, bandwidth);
6192 +
6193 + for (freq = start_freq; freq <= end_freq; freq += 20) {
6194 + c = ieee80211_get_channel(wiphy, freq);
6195 + if (!c || c->flags & prohibited_flags)
6196 return false;
6197 }
6198
6199 @@ -462,14 +609,19 @@ bool cfg80211_reg_can_beacon(struct wiph
6200 struct cfg80211_chan_def *chandef)
6201 {
6202 bool res;
6203 + u32 prohibited_flags = IEEE80211_CHAN_DISABLED |
6204 + IEEE80211_CHAN_NO_IR |
6205 + IEEE80211_CHAN_RADAR;
6206
6207 trace_cfg80211_reg_can_beacon(wiphy, chandef);
6208
6209 - res = cfg80211_chandef_usable(wiphy, chandef,
6210 - IEEE80211_CHAN_DISABLED |
6211 - IEEE80211_CHAN_PASSIVE_SCAN |
6212 - IEEE80211_CHAN_NO_IBSS |
6213 - IEEE80211_CHAN_RADAR);
6214 + if (cfg80211_chandef_dfs_required(wiphy, chandef) > 0 &&
6215 + cfg80211_chandef_dfs_available(wiphy, chandef)) {
6216 + /* We can skip IEEE80211_CHAN_NO_IR if chandef dfs available */
6217 + prohibited_flags = IEEE80211_CHAN_DISABLED;
6218 + }
6219 +
6220 + res = cfg80211_chandef_usable(wiphy, chandef, prohibited_flags);
6221
6222 trace_cfg80211_return_bool(res);
6223 return res;
6224 --- a/net/wireless/core.h
6225 +++ b/net/wireless/core.h
6226 @@ -382,6 +382,19 @@ int cfg80211_can_use_iftype_chan(struct
6227 enum cfg80211_chan_mode chanmode,
6228 u8 radar_detect);
6229
6230 +/**
6231 + * cfg80211_chandef_dfs_usable - checks if chandef is DFS usable
6232 + * @wiphy: the wiphy to validate against
6233 + * @chandef: the channel definition to check
6234 + *
6235 + * Checks if chandef is usable and we can/need start CAC on such channel.
6236 + *
6237 + * Return: Return true if all channels available and at least
6238 + * one channel require CAC (NL80211_DFS_USABLE)
6239 + */
6240 +bool cfg80211_chandef_dfs_usable(struct wiphy *wiphy,
6241 + const struct cfg80211_chan_def *chandef);
6242 +
6243 void cfg80211_set_dfs_state(struct wiphy *wiphy,
6244 const struct cfg80211_chan_def *chandef,
6245 enum nl80211_dfs_state dfs_state);
6246 --- a/net/wireless/genregdb.awk
6247 +++ b/net/wireless/genregdb.awk
6248 @@ -107,10 +107,13 @@ active && /^[ \t]*\(/ {
6249 } else if (flagarray[arg] == "PTMP-ONLY") {
6250 flags = flags "\n\t\t\tNL80211_RRF_PTMP_ONLY | "
6251 } else if (flagarray[arg] == "PASSIVE-SCAN") {
6252 - flags = flags "\n\t\t\tNL80211_RRF_PASSIVE_SCAN | "
6253 + flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
6254 } else if (flagarray[arg] == "NO-IBSS") {
6255 - flags = flags "\n\t\t\tNL80211_RRF_NO_IBSS | "
6256 + flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
6257 + } else if (flagarray[arg] == "NO-IR") {
6258 + flags = flags "\n\t\t\tNL80211_RRF_NO_IR | "
6259 }
6260 +
6261 }
6262 flags = flags "0"
6263 printf "\t\tREG_RULE(%d, %d, %d, %d, %d, %s),\n", start, end, bw, gain, power, flags
6264 --- a/net/wireless/ibss.c
6265 +++ b/net/wireless/ibss.c
6266 @@ -274,7 +274,7 @@ int cfg80211_ibss_wext_join(struct cfg80
6267
6268 for (i = 0; i < sband->n_channels; i++) {
6269 chan = &sband->channels[i];
6270 - if (chan->flags & IEEE80211_CHAN_NO_IBSS)
6271 + if (chan->flags & IEEE80211_CHAN_NO_IR)
6272 continue;
6273 if (chan->flags & IEEE80211_CHAN_DISABLED)
6274 continue;
6275 @@ -345,7 +345,7 @@ int cfg80211_ibss_wext_siwfreq(struct ne
6276 chan = ieee80211_get_channel(wdev->wiphy, freq);
6277 if (!chan)
6278 return -EINVAL;
6279 - if (chan->flags & IEEE80211_CHAN_NO_IBSS ||
6280 + if (chan->flags & IEEE80211_CHAN_NO_IR ||
6281 chan->flags & IEEE80211_CHAN_DISABLED)
6282 return -EINVAL;
6283 }
6284 --- a/net/wireless/mesh.c
6285 +++ b/net/wireless/mesh.c
6286 @@ -141,8 +141,7 @@ int __cfg80211_join_mesh(struct cfg80211
6287
6288 for (i = 0; i < sband->n_channels; i++) {
6289 chan = &sband->channels[i];
6290 - if (chan->flags & (IEEE80211_CHAN_NO_IBSS |
6291 - IEEE80211_CHAN_PASSIVE_SCAN |
6292 + if (chan->flags & (IEEE80211_CHAN_NO_IR |
6293 IEEE80211_CHAN_DISABLED |
6294 IEEE80211_CHAN_RADAR))
6295 continue;
6296 --- a/net/wireless/mlme.c
6297 +++ b/net/wireless/mlme.c
6298 @@ -763,12 +763,12 @@ void cfg80211_radar_event(struct wiphy *
6299 EXPORT_SYMBOL(cfg80211_radar_event);
6300
6301 void cfg80211_cac_event(struct net_device *netdev,
6302 + const struct cfg80211_chan_def *chandef,
6303 enum nl80211_radar_event event, gfp_t gfp)
6304 {
6305 struct wireless_dev *wdev = netdev->ieee80211_ptr;
6306 struct wiphy *wiphy = wdev->wiphy;
6307 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
6308 - struct cfg80211_chan_def chandef;
6309 unsigned long timeout;
6310
6311 trace_cfg80211_cac_event(netdev, event);
6312 @@ -779,14 +779,12 @@ void cfg80211_cac_event(struct net_devic
6313 if (WARN_ON(!wdev->channel))
6314 return;
6315
6316 - cfg80211_chandef_create(&chandef, wdev->channel, NL80211_CHAN_NO_HT);
6317 -
6318 switch (event) {
6319 case NL80211_RADAR_CAC_FINISHED:
6320 timeout = wdev->cac_start_time +
6321 msecs_to_jiffies(IEEE80211_DFS_MIN_CAC_TIME_MS);
6322 WARN_ON(!time_after_eq(jiffies, timeout));
6323 - cfg80211_set_dfs_state(wiphy, &chandef, NL80211_DFS_AVAILABLE);
6324 + cfg80211_set_dfs_state(wiphy, chandef, NL80211_DFS_AVAILABLE);
6325 break;
6326 case NL80211_RADAR_CAC_ABORTED:
6327 break;
6328 @@ -796,6 +794,6 @@ void cfg80211_cac_event(struct net_devic
6329 }
6330 wdev->cac_started = false;
6331
6332 - nl80211_radar_notify(rdev, &chandef, event, netdev, gfp);
6333 + nl80211_radar_notify(rdev, chandef, event, netdev, gfp);
6334 }
6335 EXPORT_SYMBOL(cfg80211_cac_event);
6336 --- a/net/wireless/nl80211.c
6337 +++ b/net/wireless/nl80211.c
6338 @@ -545,12 +545,12 @@ static int nl80211_msg_put_channel(struc
6339 if ((chan->flags & IEEE80211_CHAN_DISABLED) &&
6340 nla_put_flag(msg, NL80211_FREQUENCY_ATTR_DISABLED))
6341 goto nla_put_failure;
6342 - if ((chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) &&
6343 - nla_put_flag(msg, NL80211_FREQUENCY_ATTR_PASSIVE_SCAN))
6344 - goto nla_put_failure;
6345 - if ((chan->flags & IEEE80211_CHAN_NO_IBSS) &&
6346 - nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IBSS))
6347 - goto nla_put_failure;
6348 + if (chan->flags & IEEE80211_CHAN_NO_IR) {
6349 + if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_NO_IR))
6350 + goto nla_put_failure;
6351 + if (nla_put_flag(msg, __NL80211_FREQUENCY_ATTR_NO_IBSS))
6352 + goto nla_put_failure;
6353 + }
6354 if (chan->flags & IEEE80211_CHAN_RADAR) {
6355 if (nla_put_flag(msg, NL80211_FREQUENCY_ATTR_RADAR))
6356 goto nla_put_failure;
6357 @@ -1229,7 +1229,8 @@ static int nl80211_send_wiphy(struct cfg
6358 nla_put_flag(msg, NL80211_ATTR_TDLS_EXTERNAL_SETUP))
6359 goto nla_put_failure;
6360 if ((dev->wiphy.flags & WIPHY_FLAG_SUPPORTS_5_10_MHZ) &&
6361 - nla_put_flag(msg, WIPHY_FLAG_SUPPORTS_5_10_MHZ))
6362 + (nla_put_flag(msg, NL80211_ATTR_SUPPORT_5_MHZ) ||
6363 + nla_put_flag(msg, NL80211_ATTR_SUPPORT_10_MHZ)))
6364 goto nla_put_failure;
6365
6366 state->split_start++;
6367 @@ -2170,7 +2171,7 @@ static inline u64 wdev_id(struct wireles
6368 }
6369
6370 static int nl80211_send_chandef(struct sk_buff *msg,
6371 - struct cfg80211_chan_def *chandef)
6372 + const struct cfg80211_chan_def *chandef)
6373 {
6374 WARN_ON(!cfg80211_chandef_valid(chandef));
6375
6376 @@ -3219,6 +3220,7 @@ static int nl80211_start_ap(struct sk_bu
6377 return PTR_ERR(params.acl);
6378 }
6379
6380 + wdev_lock(wdev);
6381 err = rdev_start_ap(rdev, dev, &params);
6382 if (!err) {
6383 wdev->preset_chandef = params.chandef;
6384 @@ -3227,6 +3229,7 @@ static int nl80211_start_ap(struct sk_bu
6385 wdev->ssid_len = params.ssid_len;
6386 memcpy(wdev->ssid, params.ssid, wdev->ssid_len);
6387 }
6388 + wdev_unlock(wdev);
6389
6390 kfree(params.acl);
6391
6392 @@ -3255,7 +3258,11 @@ static int nl80211_set_beacon(struct sk_
6393 if (err)
6394 return err;
6395
6396 - return rdev_change_beacon(rdev, dev, &params);
6397 + wdev_lock(wdev);
6398 + err = rdev_change_beacon(rdev, dev, &params);
6399 + wdev_unlock(wdev);
6400 +
6401 + return err;
6402 }
6403
6404 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
6405 @@ -4461,7 +4468,9 @@ static int nl80211_set_bss(struct sk_buf
6406 {
6407 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6408 struct net_device *dev = info->user_ptr[1];
6409 + struct wireless_dev *wdev = dev->ieee80211_ptr;
6410 struct bss_parameters params;
6411 + int err;
6412
6413 memset(&params, 0, sizeof(params));
6414 /* default to not changing parameters */
6415 @@ -4527,7 +4536,11 @@ static int nl80211_set_bss(struct sk_buf
6416 dev->ieee80211_ptr->iftype != NL80211_IFTYPE_P2P_GO)
6417 return -EOPNOTSUPP;
6418
6419 - return rdev_change_bss(rdev, dev, &params);
6420 + wdev_lock(wdev);
6421 + err = rdev_change_bss(rdev, dev, &params);
6422 + wdev_unlock(wdev);
6423 +
6424 + return err;
6425 }
6426
6427 static const struct nla_policy reg_rule_policy[NL80211_REG_RULE_ATTR_MAX + 1] = {
6428 @@ -5653,7 +5666,7 @@ static int nl80211_start_radar_detection
6429 if (err == 0)
6430 return -EINVAL;
6431
6432 - if (chandef.chan->dfs_state != NL80211_DFS_USABLE)
6433 + if (!cfg80211_chandef_dfs_usable(wdev->wiphy, &chandef))
6434 return -EINVAL;
6435
6436 if (!rdev->ops->start_radar_detection)
6437 @@ -5793,7 +5806,11 @@ skip_beacons:
6438 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
6439 params.block_tx = true;
6440
6441 - return rdev_channel_switch(rdev, dev, &params);
6442 + wdev_lock(wdev);
6443 + err = rdev_channel_switch(rdev, dev, &params);
6444 + wdev_unlock(wdev);
6445 +
6446 + return err;
6447 }
6448
6449 static int nl80211_send_bss(struct sk_buff *msg, struct netlink_callback *cb,
6450 @@ -10809,21 +10826,18 @@ void cfg80211_ch_switch_notify(struct ne
6451 struct wiphy *wiphy = wdev->wiphy;
6452 struct cfg80211_registered_device *rdev = wiphy_to_dev(wiphy);
6453
6454 - trace_cfg80211_ch_switch_notify(dev, chandef);
6455 + ASSERT_WDEV_LOCK(wdev);
6456
6457 - wdev_lock(wdev);
6458 + trace_cfg80211_ch_switch_notify(dev, chandef);
6459
6460 if (WARN_ON(wdev->iftype != NL80211_IFTYPE_AP &&
6461 wdev->iftype != NL80211_IFTYPE_P2P_GO &&
6462 wdev->iftype != NL80211_IFTYPE_ADHOC &&
6463 wdev->iftype != NL80211_IFTYPE_MESH_POINT))
6464 - goto out;
6465 + return;
6466
6467 wdev->channel = chandef->chan;
6468 nl80211_ch_switch_notify(rdev, dev, chandef, GFP_KERNEL);
6469 -out:
6470 - wdev_unlock(wdev);
6471 - return;
6472 }
6473 EXPORT_SYMBOL(cfg80211_ch_switch_notify);
6474
6475 @@ -10882,7 +10896,7 @@ EXPORT_SYMBOL(cfg80211_cqm_txe_notify);
6476
6477 void
6478 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
6479 - struct cfg80211_chan_def *chandef,
6480 + const struct cfg80211_chan_def *chandef,
6481 enum nl80211_radar_event event,
6482 struct net_device *netdev, gfp_t gfp)
6483 {
6484 --- a/net/wireless/nl80211.h
6485 +++ b/net/wireless/nl80211.h
6486 @@ -70,7 +70,7 @@ int nl80211_send_mgmt(struct cfg80211_re
6487
6488 void
6489 nl80211_radar_notify(struct cfg80211_registered_device *rdev,
6490 - struct cfg80211_chan_def *chandef,
6491 + const struct cfg80211_chan_def *chandef,
6492 enum nl80211_radar_event event,
6493 struct net_device *netdev, gfp_t gfp);
6494
6495 --- a/net/wireless/reg.c
6496 +++ b/net/wireless/reg.c
6497 @@ -163,35 +163,29 @@ static const struct ieee80211_regdomain
6498 REG_RULE(2412-10, 2462+10, 40, 6, 20, 0),
6499 /* IEEE 802.11b/g, channels 12..13. */
6500 REG_RULE(2467-10, 2472+10, 40, 6, 20,
6501 - NL80211_RRF_PASSIVE_SCAN |
6502 - NL80211_RRF_NO_IBSS),
6503 + NL80211_RRF_NO_IR),
6504 /* IEEE 802.11 channel 14 - Only JP enables
6505 * this and for 802.11b only */
6506 REG_RULE(2484-10, 2484+10, 20, 6, 20,
6507 - NL80211_RRF_PASSIVE_SCAN |
6508 - NL80211_RRF_NO_IBSS |
6509 + NL80211_RRF_NO_IR |
6510 NL80211_RRF_NO_OFDM),
6511 /* IEEE 802.11a, channel 36..48 */
6512 REG_RULE(5180-10, 5240+10, 160, 6, 20,
6513 - NL80211_RRF_PASSIVE_SCAN |
6514 - NL80211_RRF_NO_IBSS),
6515 + NL80211_RRF_NO_IR),
6516
6517 /* IEEE 802.11a, channel 52..64 - DFS required */
6518 REG_RULE(5260-10, 5320+10, 160, 6, 20,
6519 - NL80211_RRF_PASSIVE_SCAN |
6520 - NL80211_RRF_NO_IBSS |
6521 + NL80211_RRF_NO_IR |
6522 NL80211_RRF_DFS),
6523
6524 /* IEEE 802.11a, channel 100..144 - DFS required */
6525 REG_RULE(5500-10, 5720+10, 160, 6, 20,
6526 - NL80211_RRF_PASSIVE_SCAN |
6527 - NL80211_RRF_NO_IBSS |
6528 + NL80211_RRF_NO_IR |
6529 NL80211_RRF_DFS),
6530
6531 /* IEEE 802.11a, channel 149..165 */
6532 REG_RULE(5745-10, 5825+10, 80, 6, 20,
6533 - NL80211_RRF_PASSIVE_SCAN |
6534 - NL80211_RRF_NO_IBSS),
6535 + NL80211_RRF_NO_IR),
6536
6537 /* IEEE 802.11ad (60gHz), channels 1..3 */
6538 REG_RULE(56160+2160*1-1080, 56160+2160*3+1080, 2160, 0, 0, 0),
6539 @@ -698,10 +692,8 @@ regdom_intersect(const struct ieee80211_
6540 static u32 map_regdom_flags(u32 rd_flags)
6541 {
6542 u32 channel_flags = 0;
6543 - if (rd_flags & NL80211_RRF_PASSIVE_SCAN)
6544 - channel_flags |= IEEE80211_CHAN_PASSIVE_SCAN;
6545 - if (rd_flags & NL80211_RRF_NO_IBSS)
6546 - channel_flags |= IEEE80211_CHAN_NO_IBSS;
6547 + if (rd_flags & NL80211_RRF_NO_IR_ALL)
6548 + channel_flags |= IEEE80211_CHAN_NO_IR;
6549 if (rd_flags & NL80211_RRF_DFS)
6550 channel_flags |= IEEE80211_CHAN_RADAR;
6551 if (rd_flags & NL80211_RRF_NO_OFDM)
6552 @@ -1066,13 +1058,8 @@ static void handle_reg_beacon(struct wip
6553 chan_before.center_freq = chan->center_freq;
6554 chan_before.flags = chan->flags;
6555
6556 - if (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN) {
6557 - chan->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
6558 - channel_changed = true;
6559 - }
6560 -
6561 - if (chan->flags & IEEE80211_CHAN_NO_IBSS) {
6562 - chan->flags &= ~IEEE80211_CHAN_NO_IBSS;
6563 + if (chan->flags & IEEE80211_CHAN_NO_IR) {
6564 + chan->flags &= ~IEEE80211_CHAN_NO_IR;
6565 channel_changed = true;
6566 }
6567
6568 --- /dev/null
6569 +++ b/drivers/net/wireless/ath/ath9k/ar9003_wow.c
6570 @@ -0,0 +1,422 @@
6571 +/*
6572 + * Copyright (c) 2012 Qualcomm Atheros, Inc.
6573 + *
6574 + * Permission to use, copy, modify, and/or distribute this software for any
6575 + * purpose with or without fee is hereby granted, provided that the above
6576 + * copyright notice and this permission notice appear in all copies.
6577 + *
6578 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
6579 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
6580 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
6581 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
6582 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
6583 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
6584 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
6585 + */
6586 +
6587 +#include <linux/export.h>
6588 +#include "ath9k.h"
6589 +#include "reg.h"
6590 +#include "hw-ops.h"
6591 +
6592 +const char *ath9k_hw_wow_event_to_string(u32 wow_event)
6593 +{
6594 + if (wow_event & AH_WOW_MAGIC_PATTERN_EN)
6595 + return "Magic pattern";
6596 + if (wow_event & AH_WOW_USER_PATTERN_EN)
6597 + return "User pattern";
6598 + if (wow_event & AH_WOW_LINK_CHANGE)
6599 + return "Link change";
6600 + if (wow_event & AH_WOW_BEACON_MISS)
6601 + return "Beacon miss";
6602 +
6603 + return "unknown reason";
6604 +}
6605 +EXPORT_SYMBOL(ath9k_hw_wow_event_to_string);
6606 +
6607 +static void ath9k_hw_set_powermode_wow_sleep(struct ath_hw *ah)
6608 +{
6609 + struct ath_common *common = ath9k_hw_common(ah);
6610 +
6611 + REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
6612 +
6613 + /* set rx disable bit */
6614 + REG_WRITE(ah, AR_CR, AR_CR_RXD);
6615 +
6616 + if (!ath9k_hw_wait(ah, AR_CR, AR_CR_RXE, 0, AH_WAIT_TIMEOUT)) {
6617 + ath_err(common, "Failed to stop Rx DMA in 10ms AR_CR=0x%08x AR_DIAG_SW=0x%08x\n",
6618 + REG_READ(ah, AR_CR), REG_READ(ah, AR_DIAG_SW));
6619 + return;
6620 + }
6621 +
6622 + REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_ON_INT);
6623 +}
6624 +
6625 +static void ath9k_wow_create_keep_alive_pattern(struct ath_hw *ah)
6626 +{
6627 + struct ath_common *common = ath9k_hw_common(ah);
6628 + u8 sta_mac_addr[ETH_ALEN], ap_mac_addr[ETH_ALEN];
6629 + u32 ctl[13] = {0};
6630 + u32 data_word[KAL_NUM_DATA_WORDS];
6631 + u8 i;
6632 + u32 wow_ka_data_word0;
6633 +
6634 + memcpy(sta_mac_addr, common->macaddr, ETH_ALEN);
6635 + memcpy(ap_mac_addr, common->curbssid, ETH_ALEN);
6636 +
6637 + /* set the transmit buffer */
6638 + ctl[0] = (KAL_FRAME_LEN | (MAX_RATE_POWER << 16));
6639 + ctl[1] = 0;
6640 + ctl[3] = 0xb; /* OFDM_6M hardware value for this rate */
6641 + ctl[4] = 0;
6642 + ctl[7] = (ah->txchainmask) << 2;
6643 + ctl[2] = 0xf << 16; /* tx_tries 0 */
6644 +
6645 + for (i = 0; i < KAL_NUM_DESC_WORDS; i++)
6646 + REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]);
6647 +
6648 + REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + i * 4), ctl[i]);
6649 +
6650 + data_word[0] = (KAL_FRAME_TYPE << 2) | (KAL_FRAME_SUB_TYPE << 4) |
6651 + (KAL_TO_DS << 8) | (KAL_DURATION_ID << 16);
6652 + data_word[1] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) |
6653 + (ap_mac_addr[1] << 8) | (ap_mac_addr[0]);
6654 + data_word[2] = (sta_mac_addr[1] << 24) | (sta_mac_addr[0] << 16) |
6655 + (ap_mac_addr[5] << 8) | (ap_mac_addr[4]);
6656 + data_word[3] = (sta_mac_addr[5] << 24) | (sta_mac_addr[4] << 16) |
6657 + (sta_mac_addr[3] << 8) | (sta_mac_addr[2]);
6658 + data_word[4] = (ap_mac_addr[3] << 24) | (ap_mac_addr[2] << 16) |
6659 + (ap_mac_addr[1] << 8) | (ap_mac_addr[0]);
6660 + data_word[5] = (ap_mac_addr[5] << 8) | (ap_mac_addr[4]);
6661 +
6662 + if (AR_SREV_9462_20(ah)) {
6663 + /* AR9462 2.0 has an extra descriptor word (time based
6664 + * discard) compared to other chips */
6665 + REG_WRITE(ah, (AR_WOW_KA_DESC_WORD2 + (12 * 4)), 0);
6666 + wow_ka_data_word0 = AR_WOW_TXBUF(13);
6667 + } else {
6668 + wow_ka_data_word0 = AR_WOW_TXBUF(12);
6669 + }
6670 +
6671 + for (i = 0; i < KAL_NUM_DATA_WORDS; i++)
6672 + REG_WRITE(ah, (wow_ka_data_word0 + i*4), data_word[i]);
6673 +
6674 +}
6675 +
6676 +void ath9k_hw_wow_apply_pattern(struct ath_hw *ah, u8 *user_pattern,
6677 + u8 *user_mask, int pattern_count,
6678 + int pattern_len)
6679 +{
6680 + int i;
6681 + u32 pattern_val, mask_val;
6682 + u32 set, clr;
6683 +
6684 + /* FIXME: should check count by querying the hardware capability */
6685 + if (pattern_count >= MAX_NUM_PATTERN)
6686 + return;
6687 +
6688 + REG_SET_BIT(ah, AR_WOW_PATTERN, BIT(pattern_count));
6689 +
6690 + /* set the registers for pattern */
6691 + for (i = 0; i < MAX_PATTERN_SIZE; i += 4) {
6692 + memcpy(&pattern_val, user_pattern, 4);
6693 + REG_WRITE(ah, (AR_WOW_TB_PATTERN(pattern_count) + i),
6694 + pattern_val);
6695 + user_pattern += 4;
6696 + }
6697 +
6698 + /* set the registers for mask */
6699 + for (i = 0; i < MAX_PATTERN_MASK_SIZE; i += 4) {
6700 + memcpy(&mask_val, user_mask, 4);
6701 + REG_WRITE(ah, (AR_WOW_TB_MASK(pattern_count) + i), mask_val);
6702 + user_mask += 4;
6703 + }
6704 +
6705 + /* set the pattern length to be matched
6706 + *
6707 + * AR_WOW_LENGTH1_REG1
6708 + * bit 31:24 pattern 0 length
6709 + * bit 23:16 pattern 1 length
6710 + * bit 15:8 pattern 2 length
6711 + * bit 7:0 pattern 3 length
6712 + *
6713 + * AR_WOW_LENGTH1_REG2
6714 + * bit 31:24 pattern 4 length
6715 + * bit 23:16 pattern 5 length
6716 + * bit 15:8 pattern 6 length
6717 + * bit 7:0 pattern 7 length
6718 + *
6719 + * the below logic writes out the new
6720 + * pattern length for the corresponding
6721 + * pattern_count, while masking out the
6722 + * other fields
6723 + */
6724 +
6725 + ah->wow_event_mask |= BIT(pattern_count + AR_WOW_PAT_FOUND_SHIFT);
6726 +
6727 + if (pattern_count < 4) {
6728 + /* Pattern 0-3 uses AR_WOW_LENGTH1 register */
6729 + set = (pattern_len & AR_WOW_LENGTH_MAX) <<
6730 + AR_WOW_LEN1_SHIFT(pattern_count);
6731 + clr = AR_WOW_LENGTH1_MASK(pattern_count);
6732 + REG_RMW(ah, AR_WOW_LENGTH1, set, clr);
6733 + } else {
6734 + /* Pattern 4-7 uses AR_WOW_LENGTH2 register */
6735 + set = (pattern_len & AR_WOW_LENGTH_MAX) <<
6736 + AR_WOW_LEN2_SHIFT(pattern_count);
6737 + clr = AR_WOW_LENGTH2_MASK(pattern_count);
6738 + REG_RMW(ah, AR_WOW_LENGTH2, set, clr);
6739 + }
6740 +
6741 +}
6742 +EXPORT_SYMBOL(ath9k_hw_wow_apply_pattern);
6743 +
6744 +u32 ath9k_hw_wow_wakeup(struct ath_hw *ah)
6745 +{
6746 + u32 wow_status = 0;
6747 + u32 val = 0, rval;
6748 +
6749 + /*
6750 + * read the WoW status register to know
6751 + * the wakeup reason
6752 + */
6753 + rval = REG_READ(ah, AR_WOW_PATTERN);
6754 + val = AR_WOW_STATUS(rval);
6755 +
6756 + /*
6757 + * mask only the WoW events that we have enabled. Sometimes
6758 + * we have spurious WoW events from the AR_WOW_PATTERN
6759 + * register. This mask will clean it up.
6760 + */
6761 +
6762 + val &= ah->wow_event_mask;
6763 +
6764 + if (val) {
6765 + if (val & AR_WOW_MAGIC_PAT_FOUND)
6766 + wow_status |= AH_WOW_MAGIC_PATTERN_EN;
6767 + if (AR_WOW_PATTERN_FOUND(val))
6768 + wow_status |= AH_WOW_USER_PATTERN_EN;
6769 + if (val & AR_WOW_KEEP_ALIVE_FAIL)
6770 + wow_status |= AH_WOW_LINK_CHANGE;
6771 + if (val & AR_WOW_BEACON_FAIL)
6772 + wow_status |= AH_WOW_BEACON_MISS;
6773 + }
6774 +
6775 + /*
6776 + * set and clear WOW_PME_CLEAR registers for the chip to
6777 + * generate next wow signal.
6778 + * disable D3 before accessing other registers ?
6779 + */
6780 +
6781 + /* do we need to check the bit value 0x01000000 (7-10) ?? */
6782 + REG_RMW(ah, AR_PCIE_PM_CTRL, AR_PMCTRL_WOW_PME_CLR,
6783 + AR_PMCTRL_PWR_STATE_D1D3);
6784 +
6785 + /*
6786 + * clear all events
6787 + */
6788 + REG_WRITE(ah, AR_WOW_PATTERN,
6789 + AR_WOW_CLEAR_EVENTS(REG_READ(ah, AR_WOW_PATTERN)));
6790 +
6791 + /*
6792 + * restore the beacon threshold to init value
6793 + */
6794 + REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);
6795 +
6796 + /*
6797 + * Restore the way the PCI-E reset, Power-On-Reset, external
6798 + * PCIE_POR_SHORT pins are tied to its original value.
6799 + * Previously just before WoW sleep, we untie the PCI-E
6800 + * reset to our Chip's Power On Reset so that any PCI-E
6801 + * reset from the bus will not reset our chip
6802 + */
6803 + if (ah->is_pciexpress)
6804 + ath9k_hw_configpcipowersave(ah, false);
6805 +
6806 + ah->wow_event_mask = 0;
6807 +
6808 + return wow_status;
6809 +}
6810 +EXPORT_SYMBOL(ath9k_hw_wow_wakeup);
6811 +
6812 +void ath9k_hw_wow_enable(struct ath_hw *ah, u32 pattern_enable)
6813 +{
6814 + u32 wow_event_mask;
6815 + u32 set, clr;
6816 +
6817 + /*
6818 + * wow_event_mask is a mask to the AR_WOW_PATTERN register to
6819 + * indicate which WoW events we have enabled. The WoW events
6820 + * are from the 'pattern_enable' in this function and
6821 + * 'pattern_count' of ath9k_hw_wow_apply_pattern()
6822 + */
6823 + wow_event_mask = ah->wow_event_mask;
6824 +
6825 + /*
6826 + * Untie Power-on-Reset from the PCI-E-Reset. When we are in
6827 + * WOW sleep, we do want the Reset from the PCI-E to disturb
6828 + * our hw state
6829 + */
6830 + if (ah->is_pciexpress) {
6831 + /*
6832 + * we need to untie the internal POR (power-on-reset)
6833 + * to the external PCI-E reset. We also need to tie
6834 + * the PCI-E Phy reset to the PCI-E reset.
6835 + */
6836 + set = AR_WA_RESET_EN | AR_WA_POR_SHORT;
6837 + clr = AR_WA_UNTIE_RESET_EN | AR_WA_D3_L1_DISABLE;
6838 + REG_RMW(ah, AR_WA, set, clr);
6839 + }
6840 +
6841 + /*
6842 + * set the power states appropriately and enable PME
6843 + */
6844 + set = AR_PMCTRL_HOST_PME_EN | AR_PMCTRL_PWR_PM_CTRL_ENA |
6845 + AR_PMCTRL_AUX_PWR_DET | AR_PMCTRL_WOW_PME_CLR;
6846 +
6847 + /*
6848 + * set and clear WOW_PME_CLEAR registers for the chip
6849 + * to generate next wow signal.
6850 + */
6851 + REG_SET_BIT(ah, AR_PCIE_PM_CTRL, set);
6852 + clr = AR_PMCTRL_WOW_PME_CLR;
6853 + REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, clr);
6854 +
6855 + /*
6856 + * Setup for:
6857 + * - beacon misses
6858 + * - magic pattern
6859 + * - keep alive timeout
6860 + * - pattern matching
6861 + */
6862 +
6863 + /*
6864 + * Program default values for pattern backoff, aifs/slot/KAL count,
6865 + * beacon miss timeout, KAL timeout, etc.
6866 + */
6867 + set = AR_WOW_BACK_OFF_SHIFT(AR_WOW_PAT_BACKOFF);
6868 + REG_SET_BIT(ah, AR_WOW_PATTERN, set);
6869 +
6870 + set = AR_WOW_AIFS_CNT(AR_WOW_CNT_AIFS_CNT) |
6871 + AR_WOW_SLOT_CNT(AR_WOW_CNT_SLOT_CNT) |
6872 + AR_WOW_KEEP_ALIVE_CNT(AR_WOW_CNT_KA_CNT);
6873 + REG_SET_BIT(ah, AR_WOW_COUNT, set);
6874 +
6875 + if (pattern_enable & AH_WOW_BEACON_MISS)
6876 + set = AR_WOW_BEACON_TIMO;
6877 + /* We are not using beacon miss, program a large value */
6878 + else
6879 + set = AR_WOW_BEACON_TIMO_MAX;
6880 +
6881 + REG_WRITE(ah, AR_WOW_BCN_TIMO, set);
6882 +
6883 + /*
6884 + * Keep alive timo in ms except AR9280
6885 + */
6886 + if (!pattern_enable)
6887 + set = AR_WOW_KEEP_ALIVE_NEVER;
6888 + else
6889 + set = KAL_TIMEOUT * 32;
6890 +
6891 + REG_WRITE(ah, AR_WOW_KEEP_ALIVE_TIMO, set);
6892 +
6893 + /*
6894 + * Keep alive delay in us. based on 'power on clock',
6895 + * therefore in usec
6896 + */
6897 + set = KAL_DELAY * 1000;
6898 + REG_WRITE(ah, AR_WOW_KEEP_ALIVE_DELAY, set);
6899 +
6900 + /*
6901 + * Create keep alive pattern to respond to beacons
6902 + */
6903 + ath9k_wow_create_keep_alive_pattern(ah);
6904 +
6905 + /*
6906 + * Configure MAC WoW Registers
6907 + */
6908 + set = 0;
6909 + /* Send keep alive timeouts anyway */
6910 + clr = AR_WOW_KEEP_ALIVE_AUTO_DIS;
6911 +
6912 + if (pattern_enable & AH_WOW_LINK_CHANGE)
6913 + wow_event_mask |= AR_WOW_KEEP_ALIVE_FAIL;
6914 + else
6915 + set = AR_WOW_KEEP_ALIVE_FAIL_DIS;
6916 +
6917 + set = AR_WOW_KEEP_ALIVE_FAIL_DIS;
6918 + REG_RMW(ah, AR_WOW_KEEP_ALIVE, set, clr);
6919 +
6920 + /*
6921 + * we are relying on a bmiss failure. ensure we have
6922 + * enough threshold to prevent false positives
6923 + */
6924 + REG_RMW_FIELD(ah, AR_RSSI_THR, AR_RSSI_THR_BM_THR,
6925 + AR_WOW_BMISSTHRESHOLD);
6926 +
6927 + set = 0;
6928 + clr = 0;
6929 +
6930 + if (pattern_enable & AH_WOW_BEACON_MISS) {
6931 + set = AR_WOW_BEACON_FAIL_EN;
6932 + wow_event_mask |= AR_WOW_BEACON_FAIL;
6933 + } else {
6934 + clr = AR_WOW_BEACON_FAIL_EN;
6935 + }
6936 +
6937 + REG_RMW(ah, AR_WOW_BCN_EN, set, clr);
6938 +
6939 + set = 0;
6940 + clr = 0;
6941 + /*
6942 + * Enable the magic packet registers
6943 + */
6944 + if (pattern_enable & AH_WOW_MAGIC_PATTERN_EN) {
6945 + set = AR_WOW_MAGIC_EN;
6946 + wow_event_mask |= AR_WOW_MAGIC_PAT_FOUND;
6947 + } else {
6948 + clr = AR_WOW_MAGIC_EN;
6949 + }
6950 + set |= AR_WOW_MAC_INTR_EN;
6951 + REG_RMW(ah, AR_WOW_PATTERN, set, clr);
6952 +
6953 + REG_WRITE(ah, AR_WOW_PATTERN_MATCH_LT_256B,
6954 + AR_WOW_PATTERN_SUPPORTED);
6955 +
6956 + /*
6957 + * Set the power states appropriately and enable PME
6958 + */
6959 + clr = 0;
6960 + set = AR_PMCTRL_PWR_STATE_D1D3 | AR_PMCTRL_HOST_PME_EN |
6961 + AR_PMCTRL_PWR_PM_CTRL_ENA;
6962 +
6963 + clr = AR_PCIE_PM_CTRL_ENA;
6964 + REG_RMW(ah, AR_PCIE_PM_CTRL, set, clr);
6965 +
6966 + /*
6967 + * this is needed to prevent the chip waking up
6968 + * the host within 3-4 seconds with certain
6969 + * platform/BIOS. The fix is to enable
6970 + * D1 & D3 to match original definition and
6971 + * also match the OTP value. Anyway this
6972 + * is more related to SW WOW.
6973 + */
6974 + clr = AR_PMCTRL_PWR_STATE_D1D3;
6975 + REG_CLR_BIT(ah, AR_PCIE_PM_CTRL, clr);
6976 +
6977 + set = AR_PMCTRL_PWR_STATE_D1D3_REAL;
6978 + REG_SET_BIT(ah, AR_PCIE_PM_CTRL, set);
6979 +
6980 + REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM);
6981 +
6982 + /* to bring down WOW power low margin */
6983 + set = BIT(13);
6984 + REG_SET_BIT(ah, AR_PCIE_PHY_REG3, set);
6985 + /* HW WoW */
6986 + clr = BIT(5);
6987 + REG_CLR_BIT(ah, AR_PCU_MISC_MODE3, clr);
6988 +
6989 + ath9k_hw_set_powermode_wow_sleep(ah);
6990 + ah->wow_event_mask = wow_event_mask;
6991 +}
6992 +EXPORT_SYMBOL(ath9k_hw_wow_enable);
6993 --- /dev/null
6994 +++ b/drivers/net/wireless/ath/ath9k/tx99.c
6995 @@ -0,0 +1,263 @@
6996 +/*
6997 + * Copyright (c) 2013 Qualcomm Atheros, Inc.
6998 + *
6999 + * Permission to use, copy, modify, and/or distribute this software for any
7000 + * purpose with or without fee is hereby granted, provided that the above
7001 + * copyright notice and this permission notice appear in all copies.
7002 + *
7003 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
7004 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
7005 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
7006 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
7007 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
7008 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
7009 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
7010 + */
7011 +
7012 +#include "ath9k.h"
7013 +
7014 +static void ath9k_tx99_stop(struct ath_softc *sc)
7015 +{
7016 + struct ath_hw *ah = sc->sc_ah;
7017 + struct ath_common *common = ath9k_hw_common(ah);
7018 +
7019 + ath_drain_all_txq(sc);
7020 + ath_startrecv(sc);
7021 +
7022 + ath9k_hw_set_interrupts(ah);
7023 + ath9k_hw_enable_interrupts(ah);
7024 +
7025 + ieee80211_wake_queues(sc->hw);
7026 +
7027 + kfree_skb(sc->tx99_skb);
7028 + sc->tx99_skb = NULL;
7029 + sc->tx99_state = false;
7030 +
7031 + ath9k_hw_tx99_stop(sc->sc_ah);
7032 + ath_dbg(common, XMIT, "TX99 stopped\n");
7033 +}
7034 +
7035 +static struct sk_buff *ath9k_build_tx99_skb(struct ath_softc *sc)
7036 +{
7037 + static u8 PN9Data[] = {0xff, 0x87, 0xb8, 0x59, 0xb7, 0xa1, 0xcc, 0x24,
7038 + 0x57, 0x5e, 0x4b, 0x9c, 0x0e, 0xe9, 0xea, 0x50,
7039 + 0x2a, 0xbe, 0xb4, 0x1b, 0xb6, 0xb0, 0x5d, 0xf1,
7040 + 0xe6, 0x9a, 0xe3, 0x45, 0xfd, 0x2c, 0x53, 0x18,
7041 + 0x0c, 0xca, 0xc9, 0xfb, 0x49, 0x37, 0xe5, 0xa8,
7042 + 0x51, 0x3b, 0x2f, 0x61, 0xaa, 0x72, 0x18, 0x84,
7043 + 0x02, 0x23, 0x23, 0xab, 0x63, 0x89, 0x51, 0xb3,
7044 + 0xe7, 0x8b, 0x72, 0x90, 0x4c, 0xe8, 0xfb, 0xc0};
7045 + u32 len = 1200;
7046 + struct ieee80211_hw *hw = sc->hw;
7047 + struct ieee80211_hdr *hdr;
7048 + struct ieee80211_tx_info *tx_info;
7049 + struct sk_buff *skb;
7050 +
7051 + skb = alloc_skb(len, GFP_KERNEL);
7052 + if (!skb)
7053 + return NULL;
7054 +
7055 + skb_put(skb, len);
7056 +
7057 + memset(skb->data, 0, len);
7058 +
7059 + hdr = (struct ieee80211_hdr *)skb->data;
7060 + hdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_DATA);
7061 + hdr->duration_id = 0;
7062 +
7063 + memcpy(hdr->addr1, hw->wiphy->perm_addr, ETH_ALEN);
7064 + memcpy(hdr->addr2, hw->wiphy->perm_addr, ETH_ALEN);
7065 + memcpy(hdr->addr3, hw->wiphy->perm_addr, ETH_ALEN);
7066 +
7067 + hdr->seq_ctrl |= cpu_to_le16(sc->tx.seq_no);
7068 +
7069 + tx_info = IEEE80211_SKB_CB(skb);
7070 + memset(tx_info, 0, sizeof(*tx_info));
7071 + tx_info->band = hw->conf.chandef.chan->band;
7072 + tx_info->flags = IEEE80211_TX_CTL_NO_ACK;
7073 + tx_info->control.vif = sc->tx99_vif;
7074 +
7075 + memcpy(skb->data + sizeof(*hdr), PN9Data, sizeof(PN9Data));
7076 +
7077 + return skb;
7078 +}
7079 +
7080 +static void ath9k_tx99_deinit(struct ath_softc *sc)
7081 +{
7082 + ath_reset(sc);
7083 +
7084 + ath9k_ps_wakeup(sc);
7085 + ath9k_tx99_stop(sc);
7086 + ath9k_ps_restore(sc);
7087 +}
7088 +
7089 +static int ath9k_tx99_init(struct ath_softc *sc)
7090 +{
7091 + struct ieee80211_hw *hw = sc->hw;
7092 + struct ath_hw *ah = sc->sc_ah;
7093 + struct ath_common *common = ath9k_hw_common(ah);
7094 + struct ath_tx_control txctl;
7095 + int r;
7096 +
7097 + if (test_bit(SC_OP_INVALID, &sc->sc_flags)) {
7098 + ath_err(common,
7099 + "driver is in invalid state unable to use TX99");
7100 + return -EINVAL;
7101 + }
7102 +
7103 + sc->tx99_skb = ath9k_build_tx99_skb(sc);
7104 + if (!sc->tx99_skb)
7105 + return -ENOMEM;
7106 +
7107 + memset(&txctl, 0, sizeof(txctl));
7108 + txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO];
7109 +
7110 + ath_reset(sc);
7111 +
7112 + ath9k_ps_wakeup(sc);
7113 +
7114 + ath9k_hw_disable_interrupts(ah);
7115 + atomic_set(&ah->intr_ref_cnt, -1);
7116 + ath_drain_all_txq(sc);
7117 + ath_stoprecv(sc);
7118 +
7119 + sc->tx99_state = true;
7120 +
7121 + ieee80211_stop_queues(hw);
7122 +
7123 + if (sc->tx99_power == MAX_RATE_POWER + 1)
7124 + sc->tx99_power = MAX_RATE_POWER;
7125 +
7126 + ath9k_hw_tx99_set_txpower(ah, sc->tx99_power);
7127 + r = ath9k_tx99_send(sc, sc->tx99_skb, &txctl);
7128 + if (r) {
7129 + ath_dbg(common, XMIT, "Failed to xmit TX99 skb\n");
7130 + return r;
7131 + }
7132 +
7133 + ath_dbg(common, XMIT, "TX99 xmit started using %d ( %ddBm)\n",
7134 + sc->tx99_power,
7135 + sc->tx99_power / 2);
7136 +
7137 + /* We leave the harware awake as it will be chugging on */
7138 +
7139 + return 0;
7140 +}
7141 +
7142 +static ssize_t read_file_tx99(struct file *file, char __user *user_buf,
7143 + size_t count, loff_t *ppos)
7144 +{
7145 + struct ath_softc *sc = file->private_data;
7146 + char buf[3];
7147 + unsigned int len;
7148 +
7149 + len = sprintf(buf, "%d\n", sc->tx99_state);
7150 + return simple_read_from_buffer(user_buf, count, ppos, buf, len);
7151 +}
7152 +
7153 +static ssize_t write_file_tx99(struct file *file, const char __user *user_buf,
7154 + size_t count, loff_t *ppos)
7155 +{
7156 + struct ath_softc *sc = file->private_data;
7157 + struct ath_common *common = ath9k_hw_common(sc->sc_ah);
7158 + char buf[32];
7159 + bool start;
7160 + ssize_t len;
7161 + int r;
7162 +
7163 + if (sc->nvifs > 1)
7164 + return -EOPNOTSUPP;
7165 +
7166 + len = min(count, sizeof(buf) - 1);
7167 + if (copy_from_user(buf, user_buf, len))
7168 + return -EFAULT;
7169 +
7170 + if (strtobool(buf, &start))
7171 + return -EINVAL;
7172 +
7173 + if (start == sc->tx99_state) {
7174 + if (!start)
7175 + return count;
7176 + ath_dbg(common, XMIT, "Resetting TX99\n");
7177 + ath9k_tx99_deinit(sc);
7178 + }
7179 +
7180 + if (!start) {
7181 + ath9k_tx99_deinit(sc);
7182 + return count;
7183 + }
7184 +
7185 + r = ath9k_tx99_init(sc);
7186 + if (r)
7187 + return r;
7188 +
7189 + return count;
7190 +}
7191 +
7192 +static const struct file_operations fops_tx99 = {
7193 + .read = read_file_tx99,
7194 + .write = write_file_tx99,
7195 + .open = simple_open,
7196 + .owner = THIS_MODULE,
7197 + .llseek = default_llseek,
7198 +};
7199 +
7200 +static ssize_t read_file_tx99_power(struct file *file,
7201 + char __user *user_buf,
7202 + size_t count, loff_t *ppos)
7203 +{
7204 + struct ath_softc *sc = file->private_data;
7205 + char buf[32];
7206 + unsigned int len;
7207 +
7208 + len = sprintf(buf, "%d (%d dBm)\n",
7209 + sc->tx99_power,
7210 + sc->tx99_power / 2);
7211 +
7212 + return simple_read_from_buffer(user_buf, count, ppos, buf, len);
7213 +}
7214 +
7215 +static ssize_t write_file_tx99_power(struct file *file,
7216 + const char __user *user_buf,
7217 + size_t count, loff_t *ppos)
7218 +{
7219 + struct ath_softc *sc = file->private_data;
7220 + int r;
7221 + u8 tx_power;
7222 +
7223 + r = kstrtou8_from_user(user_buf, count, 0, &tx_power);
7224 + if (r)
7225 + return r;
7226 +
7227 + if (tx_power > MAX_RATE_POWER)
7228 + return -EINVAL;
7229 +
7230 + sc->tx99_power = tx_power;
7231 +
7232 + ath9k_ps_wakeup(sc);
7233 + ath9k_hw_tx99_set_txpower(sc->sc_ah, sc->tx99_power);
7234 + ath9k_ps_restore(sc);
7235 +
7236 + return count;
7237 +}
7238 +
7239 +static const struct file_operations fops_tx99_power = {
7240 + .read = read_file_tx99_power,
7241 + .write = write_file_tx99_power,
7242 + .open = simple_open,
7243 + .owner = THIS_MODULE,
7244 + .llseek = default_llseek,
7245 +};
7246 +
7247 +void ath9k_tx99_init_debug(struct ath_softc *sc)
7248 +{
7249 + if (!AR_SREV_9300_20_OR_LATER(sc->sc_ah))
7250 + return;
7251 +
7252 + debugfs_create_file("tx99", S_IRUSR | S_IWUSR,
7253 + sc->debug.debugfs_phy, sc,
7254 + &fops_tx99);
7255 + debugfs_create_file("tx99_power", S_IRUSR | S_IWUSR,
7256 + sc->debug.debugfs_phy, sc,
7257 + &fops_tx99_power);
7258 +}
7259 --- a/drivers/net/wireless/ath/ath9k/dfs_debug.c
7260 +++ b/drivers/net/wireless/ath/ath9k/dfs_debug.c
7261 @@ -44,14 +44,20 @@ static ssize_t read_file_dfs(struct file
7262 if (buf == NULL)
7263 return -ENOMEM;
7264
7265 - if (sc->dfs_detector)
7266 - dfs_pool_stats = sc->dfs_detector->get_stats(sc->dfs_detector);
7267 -
7268 len += scnprintf(buf + len, size - len, "DFS support for "
7269 "macVersion = 0x%x, macRev = 0x%x: %s\n",
7270 hw_ver->macVersion, hw_ver->macRev,
7271 (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_DFS) ?
7272 "enabled" : "disabled");
7273 +
7274 + if (!sc->dfs_detector) {
7275 + len += scnprintf(buf + len, size - len,
7276 + "DFS detector not enabled\n");
7277 + goto exit;
7278 + }
7279 +
7280 + dfs_pool_stats = sc->dfs_detector->get_stats(sc->dfs_detector);
7281 +
7282 len += scnprintf(buf + len, size - len, "Pulse detector statistics:\n");
7283 ATH9K_DFS_STAT("pulse events reported ", pulses_total);
7284 ATH9K_DFS_STAT("invalid pulse events ", pulses_no_dfs);
7285 @@ -76,6 +82,7 @@ static ssize_t read_file_dfs(struct file
7286 ATH9K_DFS_POOL_STAT("Seqs. alloc error ", pseq_alloc_error);
7287 ATH9K_DFS_POOL_STAT("Seqs. in use ", pseq_used);
7288
7289 +exit:
7290 if (len > size)
7291 len = size;
7292
7293 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c
7294 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c
7295 @@ -641,11 +641,12 @@ static void ar9003_hw_override_ini(struc
7296 else
7297 ah->enabled_cals &= ~TX_IQ_CAL;
7298
7299 - if (REG_READ(ah, AR_PHY_CL_CAL_CTL) & AR_PHY_CL_CAL_ENABLE)
7300 - ah->enabled_cals |= TX_CL_CAL;
7301 - else
7302 - ah->enabled_cals &= ~TX_CL_CAL;
7303 }
7304 +
7305 + if (REG_READ(ah, AR_PHY_CL_CAL_CTL) & AR_PHY_CL_CAL_ENABLE)
7306 + ah->enabled_cals |= TX_CL_CAL;
7307 + else
7308 + ah->enabled_cals &= ~TX_CL_CAL;
7309 }
7310
7311 static void ar9003_hw_prog_ini(struct ath_hw *ah,
7312 @@ -701,6 +702,54 @@ static int ar9550_hw_get_modes_txgain_in
7313 return ret;
7314 }
7315
7316 +static void ar9003_doubler_fix(struct ath_hw *ah)
7317 +{
7318 + if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9550(ah)) {
7319 + REG_RMW(ah, AR_PHY_65NM_CH0_RXTX2,
7320 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S |
7321 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S, 0);
7322 + REG_RMW(ah, AR_PHY_65NM_CH1_RXTX2,
7323 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S |
7324 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S, 0);
7325 + REG_RMW(ah, AR_PHY_65NM_CH2_RXTX2,
7326 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S |
7327 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S, 0);
7328 +
7329 + udelay(200);
7330 +
7331 + REG_CLR_BIT(ah, AR_PHY_65NM_CH0_RXTX2,
7332 + AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK);
7333 + REG_CLR_BIT(ah, AR_PHY_65NM_CH1_RXTX2,
7334 + AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK);
7335 + REG_CLR_BIT(ah, AR_PHY_65NM_CH2_RXTX2,
7336 + AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK);
7337 +
7338 + udelay(1);
7339 +
7340 + REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX2,
7341 + AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK, 1);
7342 + REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX2,
7343 + AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK, 1);
7344 + REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX2,
7345 + AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK, 1);
7346 +
7347 + udelay(200);
7348 +
7349 + REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_SYNTH12,
7350 + AR_PHY_65NM_CH0_SYNTH12_VREFMUL3, 0xf);
7351 +
7352 + REG_RMW(ah, AR_PHY_65NM_CH0_RXTX2, 0,
7353 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S |
7354 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S);
7355 + REG_RMW(ah, AR_PHY_65NM_CH1_RXTX2, 0,
7356 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S |
7357 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S);
7358 + REG_RMW(ah, AR_PHY_65NM_CH2_RXTX2, 0,
7359 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S |
7360 + 1 << AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S);
7361 + }
7362 +}
7363 +
7364 static int ar9003_hw_process_ini(struct ath_hw *ah,
7365 struct ath9k_channel *chan)
7366 {
7367 @@ -726,6 +775,8 @@ static int ar9003_hw_process_ini(struct
7368 modesIndex);
7369 }
7370
7371 + ar9003_doubler_fix(ah);
7372 +
7373 /*
7374 * RXGAIN initvals.
7375 */
7376 @@ -1281,6 +1332,7 @@ static void ar9003_hw_ani_cache_ini_regs
7377 static void ar9003_hw_set_radar_params(struct ath_hw *ah,
7378 struct ath_hw_radar_conf *conf)
7379 {
7380 + unsigned int regWrites = 0;
7381 u32 radar_0 = 0, radar_1 = 0;
7382
7383 if (!conf) {
7384 @@ -1307,6 +1359,11 @@ static void ar9003_hw_set_radar_params(s
7385 REG_SET_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA);
7386 else
7387 REG_CLR_BIT(ah, AR_PHY_RADAR_EXT, AR_PHY_RADAR_EXT_ENA);
7388 +
7389 + if (AR_SREV_9300(ah) || AR_SREV_9340(ah) || AR_SREV_9580(ah)) {
7390 + REG_WRITE_ARRAY(&ah->ini_dfs,
7391 + IS_CHAN_HT40(ah->curchan) ? 2 : 1, regWrites);
7392 + }
7393 }
7394
7395 static void ar9003_hw_set_radar_conf(struct ath_hw *ah)
7396 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.h
7397 +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h
7398 @@ -270,7 +270,7 @@
7399 #define AR_PHY_AGC (AR_AGC_BASE + 0x14)
7400 #define AR_PHY_EXT_ATTEN_CTL_0 (AR_AGC_BASE + 0x18)
7401 #define AR_PHY_CCA_0 (AR_AGC_BASE + 0x1c)
7402 -#define AR_PHY_EXT_CCA0 (AR_AGC_BASE + 0x20)
7403 +#define AR_PHY_CCA_CTRL_0 (AR_AGC_BASE + 0x20)
7404 #define AR_PHY_RESTART (AR_AGC_BASE + 0x24)
7405
7406 /*
7407 @@ -341,14 +341,15 @@
7408 #define AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ -95
7409 #define AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ -100
7410
7411 +#define AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_2GHZ -95
7412 +#define AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_5GHZ -100
7413 +
7414 #define AR_PHY_CCA_NOM_VAL_9462_2GHZ -127
7415 #define AR_PHY_CCA_MIN_GOOD_VAL_9462_2GHZ -127
7416 #define AR_PHY_CCA_MAX_GOOD_VAL_9462_2GHZ -60
7417 -#define AR_PHY_CCA_MAX_GOOD_VAL_9462_FCC_2GHZ -95
7418 #define AR_PHY_CCA_NOM_VAL_9462_5GHZ -127
7419 #define AR_PHY_CCA_MIN_GOOD_VAL_9462_5GHZ -127
7420 #define AR_PHY_CCA_MAX_GOOD_VAL_9462_5GHZ -60
7421 -#define AR_PHY_CCA_MAX_GOOD_VAL_9462_FCC_5GHZ -100
7422
7423 #define AR_PHY_CCA_NOM_VAL_9330_2GHZ -118
7424
7425 @@ -397,6 +398,8 @@
7426 #define AR9280_PHY_CCA_THRESH62_S 12
7427 #define AR_PHY_EXT_CCA0_THRESH62 0x000000FF
7428 #define AR_PHY_EXT_CCA0_THRESH62_S 0
7429 +#define AR_PHY_EXT_CCA0_THRESH62_1 0x000001FF
7430 +#define AR_PHY_EXT_CCA0_THRESH62_1_S 0
7431 #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK 0x0000003F
7432 #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S 0
7433 #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME 0x00001FC0
7434 @@ -656,13 +659,24 @@
7435 #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x00000001 : 0x00000002)
7436 #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S ((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0 : 1)
7437 #define AR_PHY_65NM_CH0_SYNTH7 0x16098
7438 +#define AR_PHY_65NM_CH0_SYNTH12 0x160ac
7439 #define AR_PHY_65NM_CH0_BIAS1 0x160c0
7440 #define AR_PHY_65NM_CH0_BIAS2 0x160c4
7441 #define AR_PHY_65NM_CH0_BIAS4 0x160cc
7442 +#define AR_PHY_65NM_CH0_RXTX2 0x16104
7443 +#define AR_PHY_65NM_CH1_RXTX2 0x16504
7444 +#define AR_PHY_65NM_CH2_RXTX2 0x16904
7445 #define AR_PHY_65NM_CH0_RXTX4 0x1610c
7446 #define AR_PHY_65NM_CH1_RXTX4 0x1650c
7447 #define AR_PHY_65NM_CH2_RXTX4 0x1690c
7448
7449 +#define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3 0x00780000
7450 +#define AR_PHY_65NM_CH0_SYNTH12_VREFMUL3_S 19
7451 +#define AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK 0x00000004
7452 +#define AR_PHY_65NM_CH0_RXTX2_SYNTHON_MASK_S 2
7453 +#define AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK 0x00000008
7454 +#define AR_PHY_65NM_CH0_RXTX2_SYNTHOVR_MASK_S 3
7455 +
7456 #define AR_CH0_TOP (AR_SREV_9300(ah) ? 0x16288 : \
7457 (((AR_SREV_9462(ah) || AR_SREV_9565(ah)) ? 0x1628c : 0x16280)))
7458 #define AR_CH0_TOP_XPABIASLVL (AR_SREV_9550(ah) ? 0x3c0 : 0x300)
7459 --- a/drivers/net/wireless/rt2x00/rt2x00dev.c
7460 +++ b/drivers/net/wireless/rt2x00/rt2x00dev.c
7461 @@ -181,6 +181,7 @@ static void rt2x00lib_autowakeup(struct
7462 static void rt2x00lib_bc_buffer_iter(void *data, u8 *mac,
7463 struct ieee80211_vif *vif)
7464 {
7465 + struct ieee80211_tx_control control = {};
7466 struct rt2x00_dev *rt2x00dev = data;
7467 struct sk_buff *skb;
7468
7469 @@ -195,7 +196,7 @@ static void rt2x00lib_bc_buffer_iter(voi
7470 */
7471 skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif);
7472 while (skb) {
7473 - rt2x00mac_tx(rt2x00dev->hw, NULL, skb);
7474 + rt2x00mac_tx(rt2x00dev->hw, &control, skb);
7475 skb = ieee80211_get_buffered_bc(rt2x00dev->hw, vif);
7476 }
7477 }
7478 --- a/drivers/net/wireless/ath/ath9k/ar9003_calib.c
7479 +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c
7480 @@ -898,7 +898,7 @@ static void ar9003_hw_tx_iq_cal_reload(s
7481
7482 static void ar9003_hw_manual_peak_cal(struct ath_hw *ah, u8 chain, bool is_2g)
7483 {
7484 - int offset[8], total = 0, test;
7485 + int offset[8] = {0}, total = 0, test;
7486 int agc_out, i;
7487
7488 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_GAINSTAGES(chain),
7489 @@ -923,12 +923,18 @@ static void ar9003_hw_manual_peak_cal(st
7490 AR_PHY_65NM_RXRF_AGC_AGC_ON_OVR, 0x1);
7491 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
7492 AR_PHY_65NM_RXRF_AGC_AGC_CAL_OVR, 0x1);
7493 - if (is_2g)
7494 - REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
7495 - AR_PHY_65NM_RXRF_AGC_AGC2G_DBDAC_OVR, 0x0);
7496 - else
7497 +
7498 + if (AR_SREV_9330_11(ah)) {
7499 REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
7500 - AR_PHY_65NM_RXRF_AGC_AGC5G_DBDAC_OVR, 0x0);
7501 + AR_PHY_65NM_RXRF_AGC_AGC2G_CALDAC_OVR, 0x0);
7502 + } else {
7503 + if (is_2g)
7504 + REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
7505 + AR_PHY_65NM_RXRF_AGC_AGC2G_DBDAC_OVR, 0x0);
7506 + else
7507 + REG_RMW_FIELD(ah, AR_PHY_65NM_RXRF_AGC(chain),
7508 + AR_PHY_65NM_RXRF_AGC_AGC5G_DBDAC_OVR, 0x0);
7509 + }
7510
7511 for (i = 6; i > 0; i--) {
7512 offset[i] = BIT(i - 1);
7513 @@ -964,9 +970,9 @@ static void ar9003_hw_manual_peak_cal(st
7514 AR_PHY_65NM_RXRF_AGC_AGC_CAL_OVR, 0);
7515 }
7516
7517 -static void ar9003_hw_do_manual_peak_cal(struct ath_hw *ah,
7518 - struct ath9k_channel *chan,
7519 - bool run_rtt_cal)
7520 +static void ar9003_hw_do_pcoem_manual_peak_cal(struct ath_hw *ah,
7521 + struct ath9k_channel *chan,
7522 + bool run_rtt_cal)
7523 {
7524 struct ath9k_hw_cal_data *caldata = ah->caldata;
7525 int i;
7526 @@ -1040,14 +1046,14 @@ static void ar9003_hw_cl_cal_post_proc(s
7527 }
7528 }
7529
7530 -static bool ar9003_hw_init_cal(struct ath_hw *ah,
7531 - struct ath9k_channel *chan)
7532 +static bool ar9003_hw_init_cal_pcoem(struct ath_hw *ah,
7533 + struct ath9k_channel *chan)
7534 {
7535 struct ath_common *common = ath9k_hw_common(ah);
7536 struct ath9k_hw_cal_data *caldata = ah->caldata;
7537 bool txiqcal_done = false;
7538 bool is_reusable = true, status = true;
7539 - bool run_rtt_cal = false, run_agc_cal, sep_iq_cal = false;
7540 + bool run_rtt_cal = false, run_agc_cal;
7541 bool rtt = !!(ah->caps.hw_caps & ATH9K_HW_CAP_RTT);
7542 u32 rx_delay = 0;
7543 u32 agc_ctrl = 0, agc_supp_cals = AR_PHY_AGC_CONTROL_OFFSET_CAL |
7544 @@ -1119,22 +1125,12 @@ static bool ar9003_hw_init_cal(struct at
7545 REG_CLR_BIT(ah, AR_PHY_TX_IQCAL_CONTROL_0,
7546 AR_PHY_TX_IQCAL_CONTROL_0_ENABLE_TXIQ_CAL);
7547 txiqcal_done = run_agc_cal = true;
7548 - } else if (caldata && !test_bit(TXIQCAL_DONE, &caldata->cal_flags)) {
7549 - run_agc_cal = true;
7550 - sep_iq_cal = true;
7551 }
7552
7553 skip_tx_iqcal:
7554 if (ath9k_hw_mci_is_enabled(ah) && IS_CHAN_2GHZ(chan) && run_agc_cal)
7555 ar9003_mci_init_cal_req(ah, &is_reusable);
7556
7557 - if (sep_iq_cal) {
7558 - txiqcal_done = ar9003_hw_tx_iq_cal_run(ah);
7559 - REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
7560 - udelay(5);
7561 - REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
7562 - }
7563 -
7564 if (REG_READ(ah, AR_PHY_CL_CAL_CTL) & AR_PHY_CL_CAL_ENABLE) {
7565 rx_delay = REG_READ(ah, AR_PHY_RX_DELAY);
7566 /* Disable BB_active */
7567 @@ -1155,7 +1151,7 @@ skip_tx_iqcal:
7568 AR_PHY_AGC_CONTROL_CAL,
7569 0, AH_WAIT_TIMEOUT);
7570
7571 - ar9003_hw_do_manual_peak_cal(ah, chan, run_rtt_cal);
7572 + ar9003_hw_do_pcoem_manual_peak_cal(ah, chan, run_rtt_cal);
7573 }
7574
7575 if (REG_READ(ah, AR_PHY_CL_CAL_CTL) & AR_PHY_CL_CAL_ENABLE) {
7576 @@ -1228,13 +1224,112 @@ skip_tx_iqcal:
7577 return true;
7578 }
7579
7580 +static bool ar9003_hw_init_cal_soc(struct ath_hw *ah,
7581 + struct ath9k_channel *chan)
7582 +{
7583 + struct ath_common *common = ath9k_hw_common(ah);
7584 + struct ath9k_hw_cal_data *caldata = ah->caldata;
7585 + bool txiqcal_done = false;
7586 + bool is_reusable = true, status = true;
7587 + bool run_agc_cal = false, sep_iq_cal = false;
7588 +
7589 + /* Use chip chainmask only for calibration */
7590 + ar9003_hw_set_chain_masks(ah, ah->caps.rx_chainmask, ah->caps.tx_chainmask);
7591 +
7592 + if (ah->enabled_cals & TX_CL_CAL) {
7593 + REG_SET_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE);
7594 + run_agc_cal = true;
7595 + }
7596 +
7597 + if (IS_CHAN_HALF_RATE(chan) || IS_CHAN_QUARTER_RATE(chan))
7598 + goto skip_tx_iqcal;
7599 +
7600 + /* Do Tx IQ Calibration */
7601 + REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_1,
7602 + AR_PHY_TX_IQCAL_CONTROL_1_IQCORR_I_Q_COFF_DELPT,
7603 + DELPT);
7604 +
7605 + /*
7606 + * For AR9485 or later chips, TxIQ cal runs as part of
7607 + * AGC calibration. Specifically, AR9550 in SoC chips.
7608 + */
7609 + if (ah->enabled_cals & TX_IQ_ON_AGC_CAL) {
7610 + txiqcal_done = true;
7611 + run_agc_cal = true;
7612 + } else {
7613 + sep_iq_cal = true;
7614 + run_agc_cal = true;
7615 + }
7616 +
7617 + /*
7618 + * In the SoC family, this will run for AR9300, AR9331 and AR9340.
7619 + */
7620 + if (sep_iq_cal) {
7621 + txiqcal_done = ar9003_hw_tx_iq_cal_run(ah);
7622 + REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS);
7623 + udelay(5);
7624 + REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN);
7625 + }
7626 +
7627 +skip_tx_iqcal:
7628 + if (run_agc_cal || !(ah->ah_flags & AH_FASTCC)) {
7629 + if (AR_SREV_9330_11(ah))
7630 + ar9003_hw_manual_peak_cal(ah, 0, IS_CHAN_2GHZ(chan));
7631 +
7632 + /* Calibrate the AGC */
7633 + REG_WRITE(ah, AR_PHY_AGC_CONTROL,
7634 + REG_READ(ah, AR_PHY_AGC_CONTROL) |
7635 + AR_PHY_AGC_CONTROL_CAL);
7636 +
7637 + /* Poll for offset calibration complete */
7638 + status = ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL,
7639 + AR_PHY_AGC_CONTROL_CAL,
7640 + 0, AH_WAIT_TIMEOUT);
7641 + }
7642 +
7643 + if (!status) {
7644 + ath_dbg(common, CALIBRATE,
7645 + "offset calibration failed to complete in %d ms; noisy environment?\n",
7646 + AH_WAIT_TIMEOUT / 1000);
7647 + return false;
7648 + }
7649 +
7650 + if (txiqcal_done)
7651 + ar9003_hw_tx_iq_cal_post_proc(ah, is_reusable);
7652 +
7653 + /* Revert chainmask to runtime parameters */
7654 + ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask);
7655 +
7656 + /* Initialize list pointers */
7657 + ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL;
7658 +
7659 + INIT_CAL(&ah->iq_caldata);
7660 + INSERT_CAL(ah, &ah->iq_caldata);
7661 + ath_dbg(common, CALIBRATE, "enabling IQ Calibration\n");
7662 +
7663 + /* Initialize current pointer to first element in list */
7664 + ah->cal_list_curr = ah->cal_list;
7665 +
7666 + if (ah->cal_list_curr)
7667 + ath9k_hw_reset_calibration(ah, ah->cal_list_curr);
7668 +
7669 + if (caldata)
7670 + caldata->CalValid = 0;
7671 +
7672 + return true;
7673 +}
7674 +
7675 void ar9003_hw_attach_calib_ops(struct ath_hw *ah)
7676 {
7677 struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
7678 struct ath_hw_ops *ops = ath9k_hw_ops(ah);
7679
7680 + if (AR_SREV_9485(ah) || AR_SREV_9462(ah) || AR_SREV_9565(ah))
7681 + priv_ops->init_cal = ar9003_hw_init_cal_pcoem;
7682 + else
7683 + priv_ops->init_cal = ar9003_hw_init_cal_soc;
7684 +
7685 priv_ops->init_cal_settings = ar9003_hw_init_cal_settings;
7686 - priv_ops->init_cal = ar9003_hw_init_cal;
7687 priv_ops->setup_calibration = ar9003_hw_setup_calibration;
7688
7689 ops->calibrate = ar9003_hw_calibrate;
7690 --- a/drivers/net/wireless/ath/ath9k/common.c
7691 +++ b/drivers/net/wireless/ath/ath9k/common.c
7692 @@ -98,10 +98,8 @@ struct ath9k_channel *ath9k_cmn_get_chan
7693 {
7694 struct ieee80211_channel *curchan = chandef->chan;
7695 struct ath9k_channel *channel;
7696 - u8 chan_idx;
7697
7698 - chan_idx = curchan->hw_value;
7699 - channel = &ah->channels[chan_idx];
7700 + channel = &ah->channels[curchan->hw_value];
7701 ath9k_cmn_update_ichannel(channel, chandef);
7702
7703 return channel;
7704 --- a/net/mac80211/rc80211_minstrel_ht.c
7705 +++ b/net/mac80211/rc80211_minstrel_ht.c
7706 @@ -226,7 +226,7 @@ minstrel_ht_calc_tp(struct minstrel_ht_s
7707 nsecs = 1000 * mi->overhead / MINSTREL_TRUNC(mi->avg_ampdu_len);
7708
7709 nsecs += minstrel_mcs_groups[group].duration[rate];
7710 - tp = 1000000 * ((mr->probability * 1000) / nsecs);
7711 + tp = 1000000 * ((prob * 1000) / nsecs);
7712
7713 mr->cur_tp = MINSTREL_TRUNC(tp);
7714 }
7715 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
7716 +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c
7717 @@ -131,6 +131,7 @@ static const struct ar9300_eeprom ar9300
7718 .thresh62 = 28,
7719 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
7720 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
7721 + .switchcomspdt = 0,
7722 .xlna_bias_strength = 0,
7723 .futureModal = {
7724 0, 0, 0, 0, 0, 0, 0,
7725 @@ -138,7 +139,7 @@ static const struct ar9300_eeprom ar9300
7726 },
7727 .base_ext1 = {
7728 .ant_div_control = 0,
7729 - .future = {0, 0, 0},
7730 + .future = {0, 0},
7731 .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
7732 },
7733 .calFreqPier2G = {
7734 @@ -333,6 +334,7 @@ static const struct ar9300_eeprom ar9300
7735 .thresh62 = 28,
7736 .papdRateMaskHt20 = LE32(0x0c80c080),
7737 .papdRateMaskHt40 = LE32(0x0080c080),
7738 + .switchcomspdt = 0,
7739 .xlna_bias_strength = 0,
7740 .futureModal = {
7741 0, 0, 0, 0, 0, 0, 0,
7742 @@ -707,6 +709,7 @@ static const struct ar9300_eeprom ar9300
7743 .thresh62 = 28,
7744 .papdRateMaskHt20 = LE32(0x0c80c080),
7745 .papdRateMaskHt40 = LE32(0x0080c080),
7746 + .switchcomspdt = 0,
7747 .xlna_bias_strength = 0,
7748 .futureModal = {
7749 0, 0, 0, 0, 0, 0, 0,
7750 @@ -714,7 +717,7 @@ static const struct ar9300_eeprom ar9300
7751 },
7752 .base_ext1 = {
7753 .ant_div_control = 0,
7754 - .future = {0, 0, 0},
7755 + .future = {0, 0},
7756 .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
7757 },
7758 .calFreqPier2G = {
7759 @@ -909,6 +912,7 @@ static const struct ar9300_eeprom ar9300
7760 .thresh62 = 28,
7761 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
7762 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
7763 + .switchcomspdt = 0,
7764 .xlna_bias_strength = 0,
7765 .futureModal = {
7766 0, 0, 0, 0, 0, 0, 0,
7767 @@ -1284,6 +1288,7 @@ static const struct ar9300_eeprom ar9300
7768 .thresh62 = 28,
7769 .papdRateMaskHt20 = LE32(0x0c80c080),
7770 .papdRateMaskHt40 = LE32(0x0080c080),
7771 + .switchcomspdt = 0,
7772 .xlna_bias_strength = 0,
7773 .futureModal = {
7774 0, 0, 0, 0, 0, 0, 0,
7775 @@ -1291,7 +1296,7 @@ static const struct ar9300_eeprom ar9300
7776 },
7777 .base_ext1 = {
7778 .ant_div_control = 0,
7779 - .future = {0, 0, 0},
7780 + .future = {0, 0},
7781 .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
7782 },
7783 .calFreqPier2G = {
7784 @@ -1486,6 +1491,7 @@ static const struct ar9300_eeprom ar9300
7785 .thresh62 = 28,
7786 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
7787 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
7788 + .switchcomspdt = 0,
7789 .xlna_bias_strength = 0,
7790 .futureModal = {
7791 0, 0, 0, 0, 0, 0, 0,
7792 @@ -1861,6 +1867,7 @@ static const struct ar9300_eeprom ar9300
7793 .thresh62 = 28,
7794 .papdRateMaskHt20 = LE32(0x0c80c080),
7795 .papdRateMaskHt40 = LE32(0x0080c080),
7796 + .switchcomspdt = 0,
7797 .xlna_bias_strength = 0,
7798 .futureModal = {
7799 0, 0, 0, 0, 0, 0, 0,
7800 @@ -1868,7 +1875,7 @@ static const struct ar9300_eeprom ar9300
7801 },
7802 .base_ext1 = {
7803 .ant_div_control = 0,
7804 - .future = {0, 0, 0},
7805 + .future = {0, 0},
7806 .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
7807 },
7808 .calFreqPier2G = {
7809 @@ -2063,6 +2070,7 @@ static const struct ar9300_eeprom ar9300
7810 .thresh62 = 28,
7811 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
7812 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
7813 + .switchcomspdt = 0,
7814 .xlna_bias_strength = 0,
7815 .futureModal = {
7816 0, 0, 0, 0, 0, 0, 0,
7817 @@ -2437,6 +2445,7 @@ static const struct ar9300_eeprom ar9300
7818 .thresh62 = 28,
7819 .papdRateMaskHt20 = LE32(0x0c80C080),
7820 .papdRateMaskHt40 = LE32(0x0080C080),
7821 + .switchcomspdt = 0,
7822 .xlna_bias_strength = 0,
7823 .futureModal = {
7824 0, 0, 0, 0, 0, 0, 0,
7825 @@ -2444,7 +2453,7 @@ static const struct ar9300_eeprom ar9300
7826 },
7827 .base_ext1 = {
7828 .ant_div_control = 0,
7829 - .future = {0, 0, 0},
7830 + .future = {0, 0},
7831 .tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
7832 },
7833 .calFreqPier2G = {
7834 @@ -2639,6 +2648,7 @@ static const struct ar9300_eeprom ar9300
7835 .thresh62 = 28,
7836 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
7837 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
7838 + .switchcomspdt = 0,
7839 .xlna_bias_strength = 0,
7840 .futureModal = {
7841 0, 0, 0, 0, 0, 0, 0,
7842 @@ -3965,7 +3975,7 @@ static void ar9003_hw_apply_tuning_caps(
7843 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
7844 u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0];
7845
7846 - if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah))
7847 + if (AR_SREV_9340(ah))
7848 return;
7849
7850 if (eep->baseEepHeader.featureEnable & 0x40) {
7851 @@ -3984,18 +3994,20 @@ static void ar9003_hw_quick_drop_apply(s
7852 int quick_drop;
7853 s32 t[3], f[3] = {5180, 5500, 5785};
7854
7855 - if (!(pBase->miscConfiguration & BIT(1)))
7856 + if (!(pBase->miscConfiguration & BIT(4)))
7857 return;
7858
7859 - if (freq < 4000)
7860 - quick_drop = eep->modalHeader2G.quick_drop;
7861 - else {
7862 - t[0] = eep->base_ext1.quick_drop_low;
7863 - t[1] = eep->modalHeader5G.quick_drop;
7864 - t[2] = eep->base_ext1.quick_drop_high;
7865 - quick_drop = ar9003_hw_power_interpolate(freq, f, t, 3);
7866 + if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9340(ah)) {
7867 + if (freq < 4000) {
7868 + quick_drop = eep->modalHeader2G.quick_drop;
7869 + } else {
7870 + t[0] = eep->base_ext1.quick_drop_low;
7871 + t[1] = eep->modalHeader5G.quick_drop;
7872 + t[2] = eep->base_ext1.quick_drop_high;
7873 + quick_drop = ar9003_hw_power_interpolate(freq, f, t, 3);
7874 + }
7875 + REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop);
7876 }
7877 - REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop);
7878 }
7879
7880 static void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, bool is2ghz)
7881 @@ -4035,7 +4047,7 @@ static void ar9003_hw_xlna_bias_strength
7882 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
7883 u8 bias;
7884
7885 - if (!(eep->baseEepHeader.featureEnable & 0x40))
7886 + if (!(eep->baseEepHeader.miscConfiguration & 0x40))
7887 return;
7888
7889 if (!AR_SREV_9300(ah))
7890 @@ -4109,6 +4121,37 @@ static void ar9003_hw_thermo_cal_apply(s
7891 }
7892 }
7893
7894 +static void ar9003_hw_apply_minccapwr_thresh(struct ath_hw *ah,
7895 + bool is2ghz)
7896 +{
7897 + struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
7898 + const u_int32_t cca_ctrl[AR9300_MAX_CHAINS] = {
7899 + AR_PHY_CCA_CTRL_0,
7900 + AR_PHY_CCA_CTRL_1,
7901 + AR_PHY_CCA_CTRL_2,
7902 + };
7903 + int chain;
7904 + u32 val;
7905 +
7906 + if (is2ghz) {
7907 + if (!(eep->base_ext1.misc_enable & BIT(2)))
7908 + return;
7909 + } else {
7910 + if (!(eep->base_ext1.misc_enable & BIT(3)))
7911 + return;
7912 + }
7913 +
7914 + for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
7915 + if (!(ah->caps.tx_chainmask & BIT(chain)))
7916 + continue;
7917 +
7918 + val = ar9003_modal_header(ah, is2ghz)->noiseFloorThreshCh[chain];
7919 + REG_RMW_FIELD(ah, cca_ctrl[chain],
7920 + AR_PHY_EXT_CCA0_THRESH62_1, val);
7921 + }
7922 +
7923 +}
7924 +
7925 static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
7926 struct ath9k_channel *chan)
7927 {
7928 @@ -4120,9 +4163,10 @@ static void ath9k_hw_ar9300_set_board_va
7929 ar9003_hw_xlna_bias_strength_apply(ah, is2ghz);
7930 ar9003_hw_atten_apply(ah, chan);
7931 ar9003_hw_quick_drop_apply(ah, chan->channel);
7932 - if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) && !AR_SREV_9550(ah))
7933 + if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah))
7934 ar9003_hw_internal_regulator_apply(ah);
7935 ar9003_hw_apply_tuning_caps(ah);
7936 + ar9003_hw_apply_minccapwr_thresh(ah, chan);
7937 ar9003_hw_txend_to_xpa_off_apply(ah, is2ghz);
7938 ar9003_hw_thermometer_apply(ah);
7939 ar9003_hw_thermo_cal_apply(ah);
7940 --- a/net/mac80211/ieee80211_i.h
7941 +++ b/net/mac80211/ieee80211_i.h
7942 @@ -735,6 +735,7 @@ struct ieee80211_sub_if_data {
7943 int csa_counter_offset_beacon;
7944 int csa_counter_offset_presp;
7945 bool csa_radar_required;
7946 + struct cfg80211_chan_def csa_chandef;
7947
7948 /* used to reconfigure hardware SM PS */
7949 struct work_struct recalc_smps;
7950 @@ -811,6 +812,9 @@ static inline void sdata_unlock(struct i
7951 __release(&sdata->wdev.mtx);
7952 }
7953
7954 +#define sdata_dereference(p, sdata) \
7955 + rcu_dereference_protected(p, lockdep_is_held(&sdata->wdev.mtx))
7956 +
7957 static inline void
7958 sdata_assert_lock(struct ieee80211_sub_if_data *sdata)
7959 {
7960 @@ -1098,7 +1102,6 @@ struct ieee80211_local {
7961 enum mac80211_scan_state next_scan_state;
7962 struct delayed_work scan_work;
7963 struct ieee80211_sub_if_data __rcu *scan_sdata;
7964 - struct cfg80211_chan_def csa_chandef;
7965 /* For backward compatibility only -- do not use */
7966 struct cfg80211_chan_def _oper_chandef;
7967
7968 @@ -1236,6 +1239,7 @@ struct ieee80211_csa_ie {
7969 u8 mode;
7970 u8 count;
7971 u8 ttl;
7972 + u16 pre_value;
7973 };
7974
7975 /* Parsed Information Elements */
7976 @@ -1738,7 +1742,6 @@ ieee80211_vif_change_bandwidth(struct ie
7977 /* NOTE: only use ieee80211_vif_change_channel() for channel switch */
7978 int __must_check
7979 ieee80211_vif_change_channel(struct ieee80211_sub_if_data *sdata,
7980 - const struct cfg80211_chan_def *chandef,
7981 u32 *changed);
7982 void ieee80211_vif_release_channel(struct ieee80211_sub_if_data *sdata);
7983 void ieee80211_vif_vlan_copy_chanctx(struct ieee80211_sub_if_data *sdata);
7984 --- a/net/mac80211/chan.c
7985 +++ b/net/mac80211/chan.c
7986 @@ -411,12 +411,12 @@ int ieee80211_vif_use_channel(struct iee
7987 }
7988
7989 int ieee80211_vif_change_channel(struct ieee80211_sub_if_data *sdata,
7990 - const struct cfg80211_chan_def *chandef,
7991 u32 *changed)
7992 {
7993 struct ieee80211_local *local = sdata->local;
7994 struct ieee80211_chanctx_conf *conf;
7995 struct ieee80211_chanctx *ctx;
7996 + const struct cfg80211_chan_def *chandef = &sdata->csa_chandef;
7997 int ret;
7998 u32 chanctx_changed = 0;
7999
8000 --- a/net/mac80211/ibss.c
8001 +++ b/net/mac80211/ibss.c
8002 @@ -534,7 +534,7 @@ int ieee80211_ibss_finish_csa(struct iee
8003 int err;
8004 u16 capability;
8005
8006 - sdata_lock(sdata);
8007 + sdata_assert_lock(sdata);
8008 /* update cfg80211 bss information with the new channel */
8009 if (!is_zero_ether_addr(ifibss->bssid)) {
8010 capability = WLAN_CAPABILITY_IBSS;
8011 @@ -550,16 +550,15 @@ int ieee80211_ibss_finish_csa(struct iee
8012 capability);
8013 /* XXX: should not really modify cfg80211 data */
8014 if (cbss) {
8015 - cbss->channel = sdata->local->csa_chandef.chan;
8016 + cbss->channel = sdata->csa_chandef.chan;
8017 cfg80211_put_bss(sdata->local->hw.wiphy, cbss);
8018 }
8019 }
8020
8021 - ifibss->chandef = sdata->local->csa_chandef;
8022 + ifibss->chandef = sdata->csa_chandef;
8023
8024 /* generate the beacon */
8025 err = ieee80211_ibss_csa_beacon(sdata, NULL);
8026 - sdata_unlock(sdata);
8027 if (err < 0)
8028 return err;
8029
8030 @@ -922,7 +921,7 @@ ieee80211_ibss_process_chanswitch(struct
8031 IEEE80211_MAX_QUEUE_MAP,
8032 IEEE80211_QUEUE_STOP_REASON_CSA);
8033
8034 - sdata->local->csa_chandef = params.chandef;
8035 + sdata->csa_chandef = params.chandef;
8036 sdata->vif.csa_active = true;
8037
8038 ieee80211_bss_info_change_notify(sdata, err);
8039 --- a/net/mac80211/mesh.c
8040 +++ b/net/mac80211/mesh.c
8041 @@ -943,14 +943,19 @@ ieee80211_mesh_process_chnswitch(struct
8042 params.chandef.chan->center_freq);
8043
8044 params.block_tx = csa_ie.mode & WLAN_EID_CHAN_SWITCH_PARAM_TX_RESTRICT;
8045 - if (beacon)
8046 + if (beacon) {
8047 ifmsh->chsw_ttl = csa_ie.ttl - 1;
8048 - else
8049 - ifmsh->chsw_ttl = 0;
8050 + if (ifmsh->pre_value >= csa_ie.pre_value)
8051 + return false;
8052 + ifmsh->pre_value = csa_ie.pre_value;
8053 + }
8054
8055 - if (ifmsh->chsw_ttl > 0)
8056 + if (ifmsh->chsw_ttl < ifmsh->mshcfg.dot11MeshTTL) {
8057 if (ieee80211_mesh_csa_beacon(sdata, &params, false) < 0)
8058 return false;
8059 + } else {
8060 + return false;
8061 + }
8062
8063 sdata->csa_radar_required = params.radar_required;
8064
8065 @@ -959,7 +964,7 @@ ieee80211_mesh_process_chnswitch(struct
8066 IEEE80211_MAX_QUEUE_MAP,
8067 IEEE80211_QUEUE_STOP_REASON_CSA);
8068
8069 - sdata->local->csa_chandef = params.chandef;
8070 + sdata->csa_chandef = params.chandef;
8071 sdata->vif.csa_active = true;
8072
8073 ieee80211_bss_info_change_notify(sdata, err);
8074 @@ -1163,7 +1168,6 @@ static int mesh_fwd_csa_frame(struct iee
8075 offset_ttl = (len < 42) ? 7 : 10;
8076 *(pos + offset_ttl) -= 1;
8077 *(pos + offset_ttl + 1) &= ~WLAN_EID_CHAN_SWITCH_PARAM_INITIATOR;
8078 - sdata->u.mesh.chsw_ttl = *(pos + offset_ttl);
8079
8080 memcpy(mgmt_fwd, mgmt, len);
8081 eth_broadcast_addr(mgmt_fwd->da);
8082 @@ -1182,7 +1186,7 @@ static void mesh_rx_csa_frame(struct iee
8083 u16 pre_value;
8084 bool fwd_csa = true;
8085 size_t baselen;
8086 - u8 *pos, ttl;
8087 + u8 *pos;
8088
8089 if (mgmt->u.action.u.measurement.action_code !=
8090 WLAN_ACTION_SPCT_CHL_SWITCH)
8091 @@ -1193,8 +1197,8 @@ static void mesh_rx_csa_frame(struct iee
8092 u.action.u.chan_switch.variable);
8093 ieee802_11_parse_elems(pos, len - baselen, false, &elems);
8094
8095 - ttl = elems.mesh_chansw_params_ie->mesh_ttl;
8096 - if (!--ttl)
8097 + ifmsh->chsw_ttl = elems.mesh_chansw_params_ie->mesh_ttl;
8098 + if (!--ifmsh->chsw_ttl)
8099 fwd_csa = false;
8100
8101 pre_value = le16_to_cpu(elems.mesh_chansw_params_ie->mesh_pre_value);
8102 --- a/net/mac80211/spectmgmt.c
8103 +++ b/net/mac80211/spectmgmt.c
8104 @@ -78,6 +78,8 @@ int ieee80211_parse_ch_switch_ie(struct
8105 if (elems->mesh_chansw_params_ie) {
8106 csa_ie->ttl = elems->mesh_chansw_params_ie->mesh_ttl;
8107 csa_ie->mode = elems->mesh_chansw_params_ie->mesh_flags;
8108 + csa_ie->pre_value = le16_to_cpu(
8109 + elems->mesh_chansw_params_ie->mesh_pre_value);
8110 }
8111
8112 new_freq = ieee80211_channel_to_frequency(new_chan_no, new_band);
8113 --- a/drivers/net/wireless/ath/ath6kl/cfg80211.c
8114 +++ b/drivers/net/wireless/ath/ath6kl/cfg80211.c
8115 @@ -1109,7 +1109,9 @@ void ath6kl_cfg80211_ch_switch_notify(st
8116 (mode == WMI_11G_HT20) ?
8117 NL80211_CHAN_HT20 : NL80211_CHAN_NO_HT);
8118
8119 + mutex_lock(vif->wdev->mtx);
8120 cfg80211_ch_switch_notify(vif->ndev, &chandef);
8121 + mutex_unlock(vif->wdev->mtx);
8122 }
8123
8124 static int ath6kl_cfg80211_add_key(struct wiphy *wiphy, struct net_device *ndev,
8125 --- a/drivers/net/wireless/ath/ath9k/ar9462_2p1_initvals.h
8126 +++ b/drivers/net/wireless/ath/ath9k/ar9462_2p1_initvals.h
8127 @@ -20,6 +20,44 @@
8128
8129 /* AR9462 2.1 */
8130
8131 +#define ar9462_2p1_mac_postamble ar9462_2p0_mac_postamble
8132 +
8133 +#define ar9462_2p1_baseband_core ar9462_2p0_baseband_core
8134 +
8135 +#define ar9462_2p1_radio_core ar9462_2p0_radio_core
8136 +
8137 +#define ar9462_2p1_radio_postamble ar9462_2p0_radio_postamble
8138 +
8139 +#define ar9462_2p1_soc_postamble ar9462_2p0_soc_postamble
8140 +
8141 +#define ar9462_2p1_radio_postamble_sys2ant ar9462_2p0_radio_postamble_sys2ant
8142 +
8143 +#define ar9462_2p1_common_rx_gain ar9462_2p0_common_rx_gain
8144 +
8145 +#define ar9462_2p1_common_mixed_rx_gain ar9462_2p0_common_mixed_rx_gain
8146 +
8147 +#define ar9462_2p1_common_5g_xlna_only_rxgain ar9462_2p0_common_5g_xlna_only_rxgain
8148 +
8149 +#define ar9462_2p1_baseband_core_mix_rxgain ar9462_2p0_baseband_core_mix_rxgain
8150 +
8151 +#define ar9462_2p1_baseband_postamble_mix_rxgain ar9462_2p0_baseband_postamble_mix_rxgain
8152 +
8153 +#define ar9462_2p1_baseband_postamble_5g_xlna ar9462_2p0_baseband_postamble_5g_xlna
8154 +
8155 +#define ar9462_2p1_common_wo_xlna_rx_gain ar9462_2p0_common_wo_xlna_rx_gain
8156 +
8157 +#define ar9462_2p1_modes_low_ob_db_tx_gain ar9462_2p0_modes_low_ob_db_tx_gain
8158 +
8159 +#define ar9462_2p1_modes_high_ob_db_tx_gain ar9462_2p0_modes_high_ob_db_tx_gain
8160 +
8161 +#define ar9462_2p1_modes_mix_ob_db_tx_gain ar9462_2p0_modes_mix_ob_db_tx_gain
8162 +
8163 +#define ar9462_2p1_modes_fast_clock ar9462_2p0_modes_fast_clock
8164 +
8165 +#define ar9462_2p1_baseband_core_txfir_coeff_japan_2484 ar9462_2p0_baseband_core_txfir_coeff_japan_2484
8166 +
8167 +#define ar9462_2p1_pciephy_clkreq_disable_L1 ar9462_2p0_pciephy_clkreq_disable_L1
8168 +
8169 static const u32 ar9462_2p1_mac_core[][2] = {
8170 /* Addr allmodes */
8171 {0x00000008, 0x00000000},
8172 @@ -183,168 +221,6 @@ static const u32 ar9462_2p1_mac_core[][2
8173 {0x000083d0, 0x000301ff},
8174 };
8175
8176 -static const u32 ar9462_2p1_mac_postamble[][5] = {
8177 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
8178 - {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
8179 - {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
8180 - {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
8181 - {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
8182 - {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
8183 - {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
8184 - {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
8185 - {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
8186 -};
8187 -
8188 -static const u32 ar9462_2p1_baseband_core[][2] = {
8189 - /* Addr allmodes */
8190 - {0x00009800, 0xafe68e30},
8191 - {0x00009804, 0xfd14e000},
8192 - {0x00009808, 0x9c0a9f6b},
8193 - {0x0000980c, 0x04900000},
8194 - {0x00009814, 0x9280c00a},
8195 - {0x00009818, 0x00000000},
8196 - {0x0000981c, 0x00020028},
8197 - {0x00009834, 0x6400a290},
8198 - {0x00009838, 0x0108ecff},
8199 - {0x0000983c, 0x0d000600},
8200 - {0x00009880, 0x201fff00},
8201 - {0x00009884, 0x00001042},
8202 - {0x000098a4, 0x00200400},
8203 - {0x000098b0, 0x32440bbe},
8204 - {0x000098d0, 0x004b6a8e},
8205 - {0x000098d4, 0x00000820},
8206 - {0x000098dc, 0x00000000},
8207 - {0x000098e4, 0x01ffffff},
8208 - {0x000098e8, 0x01ffffff},
8209 - {0x000098ec, 0x01ffffff},
8210 - {0x000098f0, 0x00000000},
8211 - {0x000098f4, 0x00000000},
8212 - {0x00009bf0, 0x80000000},
8213 - {0x00009c04, 0xff55ff55},
8214 - {0x00009c08, 0x0320ff55},
8215 - {0x00009c0c, 0x00000000},
8216 - {0x00009c10, 0x00000000},
8217 - {0x00009c14, 0x00046384},
8218 - {0x00009c18, 0x05b6b440},
8219 - {0x00009c1c, 0x00b6b440},
8220 - {0x00009d00, 0xc080a333},
8221 - {0x00009d04, 0x40206c10},
8222 - {0x00009d08, 0x009c4060},
8223 - {0x00009d0c, 0x9883800a},
8224 - {0x00009d10, 0x01834061},
8225 - {0x00009d14, 0x00c0040b},
8226 - {0x00009d18, 0x00000000},
8227 - {0x00009e08, 0x0038230c},
8228 - {0x00009e24, 0x990bb515},
8229 - {0x00009e28, 0x0c6f0000},
8230 - {0x00009e30, 0x06336f77},
8231 - {0x00009e34, 0x6af6532f},
8232 - {0x00009e38, 0x0cc80c00},
8233 - {0x00009e40, 0x15262820},
8234 - {0x00009e4c, 0x00001004},
8235 - {0x00009e50, 0x00ff03f1},
8236 - {0x00009e54, 0xe4c555c2},
8237 - {0x00009e58, 0xfd857722},
8238 - {0x00009e5c, 0xe9198724},
8239 - {0x00009fc0, 0x803e4788},
8240 - {0x00009fc4, 0x0001efb5},
8241 - {0x00009fcc, 0x40000014},
8242 - {0x00009fd0, 0x0a193b93},
8243 - {0x0000a20c, 0x00000000},
8244 - {0x0000a220, 0x00000000},
8245 - {0x0000a224, 0x00000000},
8246 - {0x0000a228, 0x10002310},
8247 - {0x0000a23c, 0x00000000},
8248 - {0x0000a244, 0x0c000000},
8249 - {0x0000a2a0, 0x00000001},
8250 - {0x0000a2c0, 0x00000001},
8251 - {0x0000a2c8, 0x00000000},
8252 - {0x0000a2cc, 0x18c43433},
8253 - {0x0000a2d4, 0x00000000},
8254 - {0x0000a2ec, 0x00000000},
8255 - {0x0000a2f0, 0x00000000},
8256 - {0x0000a2f4, 0x00000000},
8257 - {0x0000a2f8, 0x00000000},
8258 - {0x0000a344, 0x00000000},
8259 - {0x0000a34c, 0x00000000},
8260 - {0x0000a350, 0x0000a000},
8261 - {0x0000a364, 0x00000000},
8262 - {0x0000a370, 0x00000000},
8263 - {0x0000a390, 0x00000001},
8264 - {0x0000a394, 0x00000444},
8265 - {0x0000a398, 0x001f0e0f},
8266 - {0x0000a39c, 0x0075393f},
8267 - {0x0000a3a0, 0xb79f6427},
8268 - {0x0000a3c0, 0x20202020},
8269 - {0x0000a3c4, 0x22222220},
8270 - {0x0000a3c8, 0x20200020},
8271 - {0x0000a3cc, 0x20202020},
8272 - {0x0000a3d0, 0x20202020},
8273 - {0x0000a3d4, 0x20202020},
8274 - {0x0000a3d8, 0x20202020},
8275 - {0x0000a3dc, 0x20202020},
8276 - {0x0000a3e0, 0x20202020},
8277 - {0x0000a3e4, 0x20202020},
8278 - {0x0000a3e8, 0x20202020},
8279 - {0x0000a3ec, 0x20202020},
8280 - {0x0000a3f0, 0x00000000},
8281 - {0x0000a3f4, 0x00000006},
8282 - {0x0000a3f8, 0x0c9bd380},
8283 - {0x0000a3fc, 0x000f0f01},
8284 - {0x0000a400, 0x8fa91f01},
8285 - {0x0000a404, 0x00000000},
8286 - {0x0000a408, 0x0e79e5c6},
8287 - {0x0000a40c, 0x00820820},
8288 - {0x0000a414, 0x1ce739ce},
8289 - {0x0000a418, 0x2d001dce},
8290 - {0x0000a434, 0x00000000},
8291 - {0x0000a438, 0x00001801},
8292 - {0x0000a43c, 0x00100000},
8293 - {0x0000a444, 0x00000000},
8294 - {0x0000a448, 0x05000080},
8295 - {0x0000a44c, 0x00000001},
8296 - {0x0000a450, 0x00010000},
8297 - {0x0000a454, 0x07000000},
8298 - {0x0000a644, 0xbfad9d74},
8299 - {0x0000a648, 0x0048060a},
8300 - {0x0000a64c, 0x00002037},
8301 - {0x0000a670, 0x03020100},
8302 - {0x0000a674, 0x09080504},
8303 - {0x0000a678, 0x0d0c0b0a},
8304 - {0x0000a67c, 0x13121110},
8305 - {0x0000a680, 0x31301514},
8306 - {0x0000a684, 0x35343332},
8307 - {0x0000a688, 0x00000036},
8308 - {0x0000a690, 0x00000838},
8309 - {0x0000a6b0, 0x0000000a},
8310 - {0x0000a6b4, 0x00512c01},
8311 - {0x0000a7c0, 0x00000000},
8312 - {0x0000a7c4, 0xfffffffc},
8313 - {0x0000a7c8, 0x00000000},
8314 - {0x0000a7cc, 0x00000000},
8315 - {0x0000a7d0, 0x00000000},
8316 - {0x0000a7d4, 0x00000004},
8317 - {0x0000a7dc, 0x00000000},
8318 - {0x0000a7f0, 0x80000000},
8319 - {0x0000a8d0, 0x004b6a8e},
8320 - {0x0000a8d4, 0x00000820},
8321 - {0x0000a8dc, 0x00000000},
8322 - {0x0000a8f0, 0x00000000},
8323 - {0x0000a8f4, 0x00000000},
8324 - {0x0000abf0, 0x80000000},
8325 - {0x0000b2d0, 0x00000080},
8326 - {0x0000b2d4, 0x00000000},
8327 - {0x0000b2ec, 0x00000000},
8328 - {0x0000b2f0, 0x00000000},
8329 - {0x0000b2f4, 0x00000000},
8330 - {0x0000b2f8, 0x00000000},
8331 - {0x0000b408, 0x0e79e5c0},
8332 - {0x0000b40c, 0x00820820},
8333 - {0x0000b420, 0x00000000},
8334 - {0x0000b6b0, 0x0000000a},
8335 - {0x0000b6b4, 0x00000001},
8336 -};
8337 -
8338 static const u32 ar9462_2p1_baseband_postamble[][5] = {
8339 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
8340 {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a800d},
8341 @@ -361,7 +237,7 @@ static const u32 ar9462_2p1_baseband_pos
8342 {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3236605e, 0x32365a5e},
8343 {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
8344 {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
8345 - {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
8346 + {0x00009e20, 0x000003a5, 0x000003a5, 0x000003a5, 0x000003a5},
8347 {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021},
8348 {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c282},
8349 {0x00009e44, 0x62321e27, 0x62321e27, 0xfe291e27, 0xfe291e27},
8350 @@ -400,1375 +276,16 @@ static const u32 ar9462_2p1_baseband_pos
8351 {0x0000ae04, 0x001c0000, 0x001c0000, 0x001c0000, 0x00100000},
8352 {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
8353 {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
8354 - {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce},
8355 + {0x0000ae20, 0x000001a6, 0x000001a6, 0x000001aa, 0x000001aa},
8356 {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550},
8357 };
8358
8359 -static const u32 ar9462_2p1_radio_core[][2] = {
8360 - /* Addr allmodes */
8361 - {0x00016000, 0x36db6db6},
8362 - {0x00016004, 0x6db6db40},
8363 - {0x00016008, 0x73f00000},
8364 - {0x0001600c, 0x00000000},
8365 - {0x00016010, 0x6d820001},
8366 - {0x00016040, 0x7f80fff8},
8367 - {0x0001604c, 0x2699e04f},
8368 - {0x00016050, 0x6db6db6c},
8369 - {0x00016058, 0x6c200000},
8370 - {0x00016080, 0x000c0000},
8371 - {0x00016084, 0x9a68048c},
8372 - {0x00016088, 0x54214514},
8373 - {0x0001608c, 0x1203040b},
8374 - {0x00016090, 0x24926490},
8375 - {0x00016098, 0xd2888888},
8376 - {0x000160a0, 0x0a108ffe},
8377 - {0x000160a4, 0x812fc491},
8378 - {0x000160a8, 0x423c8000},
8379 - {0x000160b4, 0x92000000},
8380 - {0x000160b8, 0x0285dddc},
8381 - {0x000160bc, 0x02908888},
8382 - {0x000160c0, 0x00adb6d0},
8383 - {0x000160c4, 0x6db6db60},
8384 - {0x000160c8, 0x6db6db6c},
8385 - {0x000160cc, 0x0de6c1b0},
8386 - {0x00016100, 0x3fffbe04},
8387 - {0x00016104, 0xfff80000},
8388 - {0x00016108, 0x00200400},
8389 - {0x00016110, 0x00000000},
8390 - {0x00016144, 0x02084080},
8391 - {0x00016148, 0x000080c0},
8392 - {0x00016280, 0x050a0001},
8393 - {0x00016284, 0x3d841418},
8394 - {0x00016288, 0x00000000},
8395 - {0x0001628c, 0xe3000000},
8396 - {0x00016290, 0xa1005080},
8397 - {0x00016294, 0x00000020},
8398 - {0x00016298, 0x54a82900},
8399 - {0x00016340, 0x121e4276},
8400 - {0x00016344, 0x00300000},
8401 - {0x00016400, 0x36db6db6},
8402 - {0x00016404, 0x6db6db40},
8403 - {0x00016408, 0x73f00000},
8404 - {0x0001640c, 0x00000000},
8405 - {0x00016410, 0x6c800001},
8406 - {0x00016440, 0x7f80fff8},
8407 - {0x0001644c, 0x4699e04f},
8408 - {0x00016450, 0x6db6db6c},
8409 - {0x00016500, 0x3fffbe04},
8410 - {0x00016504, 0xfff80000},
8411 - {0x00016508, 0x00200400},
8412 - {0x00016510, 0x00000000},
8413 - {0x00016544, 0x02084080},
8414 - {0x00016548, 0x000080c0},
8415 -};
8416 -
8417 -static const u32 ar9462_2p1_radio_postamble[][5] = {
8418 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
8419 - {0x0001609c, 0x0b8ee524, 0x0b8ee524, 0x0b8ee524, 0x0b8ee524},
8420 - {0x000160b0, 0x01d67f70, 0x01d67f70, 0x01d67f70, 0x01d67f70},
8421 - {0x0001610c, 0x48000000, 0x40000000, 0x40000000, 0x40000000},
8422 - {0x0001650c, 0x48000000, 0x40000000, 0x40000000, 0x40000000},
8423 -};
8424 -
8425 static const u32 ar9462_2p1_soc_preamble[][2] = {
8426 /* Addr allmodes */
8427 - {0x000040a4, 0x00a0c1c9},
8428 + {0x000040a4, 0x00a0c9c9},
8429 {0x00007020, 0x00000000},
8430 {0x00007034, 0x00000002},
8431 {0x00007038, 0x000004c2},
8432 };
8433
8434 -static const u32 ar9462_2p1_soc_postamble[][5] = {
8435 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
8436 - {0x00007010, 0x00000033, 0x00000033, 0x00000033, 0x00000033},
8437 -};
8438 -
8439 -static const u32 ar9462_2p1_radio_postamble_sys2ant[][5] = {
8440 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
8441 - {0x000160ac, 0xa4646c08, 0xa4646c08, 0x24645808, 0x24645808},
8442 - {0x00016140, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
8443 - {0x00016540, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
8444 -};
8445 -
8446 -static const u32 ar9462_2p1_common_rx_gain[][2] = {
8447 - /* Addr allmodes */
8448 - {0x0000a000, 0x00010000},
8449 - {0x0000a004, 0x00030002},
8450 - {0x0000a008, 0x00050004},
8451 - {0x0000a00c, 0x00810080},
8452 - {0x0000a010, 0x00830082},
8453 - {0x0000a014, 0x01810180},
8454 - {0x0000a018, 0x01830182},
8455 - {0x0000a01c, 0x01850184},
8456 - {0x0000a020, 0x01890188},
8457 - {0x0000a024, 0x018b018a},
8458 - {0x0000a028, 0x018d018c},
8459 - {0x0000a02c, 0x01910190},
8460 - {0x0000a030, 0x01930192},
8461 - {0x0000a034, 0x01950194},
8462 - {0x0000a038, 0x038a0196},
8463 - {0x0000a03c, 0x038c038b},
8464 - {0x0000a040, 0x0390038d},
8465 - {0x0000a044, 0x03920391},
8466 - {0x0000a048, 0x03940393},
8467 - {0x0000a04c, 0x03960395},
8468 - {0x0000a050, 0x00000000},
8469 - {0x0000a054, 0x00000000},
8470 - {0x0000a058, 0x00000000},
8471 - {0x0000a05c, 0x00000000},
8472 - {0x0000a060, 0x00000000},
8473 - {0x0000a064, 0x00000000},
8474 - {0x0000a068, 0x00000000},
8475 - {0x0000a06c, 0x00000000},
8476 - {0x0000a070, 0x00000000},
8477 - {0x0000a074, 0x00000000},
8478 - {0x0000a078, 0x00000000},
8479 - {0x0000a07c, 0x00000000},
8480 - {0x0000a080, 0x22222229},
8481 - {0x0000a084, 0x1d1d1d1d},
8482 - {0x0000a088, 0x1d1d1d1d},
8483 - {0x0000a08c, 0x1d1d1d1d},
8484 - {0x0000a090, 0x171d1d1d},
8485 - {0x0000a094, 0x11111717},
8486 - {0x0000a098, 0x00030311},
8487 - {0x0000a09c, 0x00000000},
8488 - {0x0000a0a0, 0x00000000},
8489 - {0x0000a0a4, 0x00000000},
8490 - {0x0000a0a8, 0x00000000},
8491 - {0x0000a0ac, 0x00000000},
8492 - {0x0000a0b0, 0x00000000},
8493 - {0x0000a0b4, 0x00000000},
8494 - {0x0000a0b8, 0x00000000},
8495 - {0x0000a0bc, 0x00000000},
8496 - {0x0000a0c0, 0x001f0000},
8497 - {0x0000a0c4, 0x01000101},
8498 - {0x0000a0c8, 0x011e011f},
8499 - {0x0000a0cc, 0x011c011d},
8500 - {0x0000a0d0, 0x02030204},
8501 - {0x0000a0d4, 0x02010202},
8502 - {0x0000a0d8, 0x021f0200},
8503 - {0x0000a0dc, 0x0302021e},
8504 - {0x0000a0e0, 0x03000301},
8505 - {0x0000a0e4, 0x031e031f},
8506 - {0x0000a0e8, 0x0402031d},
8507 - {0x0000a0ec, 0x04000401},
8508 - {0x0000a0f0, 0x041e041f},
8509 - {0x0000a0f4, 0x0502041d},
8510 - {0x0000a0f8, 0x05000501},
8511 - {0x0000a0fc, 0x051e051f},
8512 - {0x0000a100, 0x06010602},
8513 - {0x0000a104, 0x061f0600},
8514 - {0x0000a108, 0x061d061e},
8515 - {0x0000a10c, 0x07020703},
8516 - {0x0000a110, 0x07000701},
8517 - {0x0000a114, 0x00000000},
8518 - {0x0000a118, 0x00000000},
8519 - {0x0000a11c, 0x00000000},
8520 - {0x0000a120, 0x00000000},
8521 - {0x0000a124, 0x00000000},
8522 - {0x0000a128, 0x00000000},
8523 - {0x0000a12c, 0x00000000},
8524 - {0x0000a130, 0x00000000},
8525 - {0x0000a134, 0x00000000},
8526 - {0x0000a138, 0x00000000},
8527 - {0x0000a13c, 0x00000000},
8528 - {0x0000a140, 0x001f0000},
8529 - {0x0000a144, 0x01000101},
8530 - {0x0000a148, 0x011e011f},
8531 - {0x0000a14c, 0x011c011d},
8532 - {0x0000a150, 0x02030204},
8533 - {0x0000a154, 0x02010202},
8534 - {0x0000a158, 0x021f0200},
8535 - {0x0000a15c, 0x0302021e},
8536 - {0x0000a160, 0x03000301},
8537 - {0x0000a164, 0x031e031f},
8538 - {0x0000a168, 0x0402031d},
8539 - {0x0000a16c, 0x04000401},
8540 - {0x0000a170, 0x041e041f},
8541 - {0x0000a174, 0x0502041d},
8542 - {0x0000a178, 0x05000501},
8543 - {0x0000a17c, 0x051e051f},
8544 - {0x0000a180, 0x06010602},
8545 - {0x0000a184, 0x061f0600},
8546 - {0x0000a188, 0x061d061e},
8547 - {0x0000a18c, 0x07020703},
8548 - {0x0000a190, 0x07000701},
8549 - {0x0000a194, 0x00000000},
8550 - {0x0000a198, 0x00000000},
8551 - {0x0000a19c, 0x00000000},
8552 - {0x0000a1a0, 0x00000000},
8553 - {0x0000a1a4, 0x00000000},
8554 - {0x0000a1a8, 0x00000000},
8555 - {0x0000a1ac, 0x00000000},
8556 - {0x0000a1b0, 0x00000000},
8557 - {0x0000a1b4, 0x00000000},
8558 - {0x0000a1b8, 0x00000000},
8559 - {0x0000a1bc, 0x00000000},
8560 - {0x0000a1c0, 0x00000000},
8561 - {0x0000a1c4, 0x00000000},
8562 - {0x0000a1c8, 0x00000000},
8563 - {0x0000a1cc, 0x00000000},
8564 - {0x0000a1d0, 0x00000000},
8565 - {0x0000a1d4, 0x00000000},
8566 - {0x0000a1d8, 0x00000000},
8567 - {0x0000a1dc, 0x00000000},
8568 - {0x0000a1e0, 0x00000000},
8569 - {0x0000a1e4, 0x00000000},
8570 - {0x0000a1e8, 0x00000000},
8571 - {0x0000a1ec, 0x00000000},
8572 - {0x0000a1f0, 0x00000396},
8573 - {0x0000a1f4, 0x00000396},
8574 - {0x0000a1f8, 0x00000396},
8575 - {0x0000a1fc, 0x00000196},
8576 - {0x0000b000, 0x00010000},
8577 - {0x0000b004, 0x00030002},
8578 - {0x0000b008, 0x00050004},
8579 - {0x0000b00c, 0x00810080},
8580 - {0x0000b010, 0x00830082},
8581 - {0x0000b014, 0x01810180},
8582 - {0x0000b018, 0x01830182},
8583 - {0x0000b01c, 0x01850184},
8584 - {0x0000b020, 0x02810280},
8585 - {0x0000b024, 0x02830282},
8586 - {0x0000b028, 0x02850284},
8587 - {0x0000b02c, 0x02890288},
8588 - {0x0000b030, 0x028b028a},
8589 - {0x0000b034, 0x0388028c},
8590 - {0x0000b038, 0x038a0389},
8591 - {0x0000b03c, 0x038c038b},
8592 - {0x0000b040, 0x0390038d},
8593 - {0x0000b044, 0x03920391},
8594 - {0x0000b048, 0x03940393},
8595 - {0x0000b04c, 0x03960395},
8596 - {0x0000b050, 0x00000000},
8597 - {0x0000b054, 0x00000000},
8598 - {0x0000b058, 0x00000000},
8599 - {0x0000b05c, 0x00000000},
8600 - {0x0000b060, 0x00000000},
8601 - {0x0000b064, 0x00000000},
8602 - {0x0000b068, 0x00000000},
8603 - {0x0000b06c, 0x00000000},
8604 - {0x0000b070, 0x00000000},
8605 - {0x0000b074, 0x00000000},
8606 - {0x0000b078, 0x00000000},
8607 - {0x0000b07c, 0x00000000},
8608 - {0x0000b080, 0x2a2d2f32},
8609 - {0x0000b084, 0x21232328},
8610 - {0x0000b088, 0x19191c1e},
8611 - {0x0000b08c, 0x12141417},
8612 - {0x0000b090, 0x07070e0e},
8613 - {0x0000b094, 0x03030305},
8614 - {0x0000b098, 0x00000003},
8615 - {0x0000b09c, 0x00000000},
8616 - {0x0000b0a0, 0x00000000},
8617 - {0x0000b0a4, 0x00000000},
8618 - {0x0000b0a8, 0x00000000},
8619 - {0x0000b0ac, 0x00000000},
8620 - {0x0000b0b0, 0x00000000},
8621 - {0x0000b0b4, 0x00000000},
8622 - {0x0000b0b8, 0x00000000},
8623 - {0x0000b0bc, 0x00000000},
8624 - {0x0000b0c0, 0x003f0020},
8625 - {0x0000b0c4, 0x00400041},
8626 - {0x0000b0c8, 0x0140005f},
8627 - {0x0000b0cc, 0x0160015f},
8628 - {0x0000b0d0, 0x017e017f},
8629 - {0x0000b0d4, 0x02410242},
8630 - {0x0000b0d8, 0x025f0240},
8631 - {0x0000b0dc, 0x027f0260},
8632 - {0x0000b0e0, 0x0341027e},
8633 - {0x0000b0e4, 0x035f0340},
8634 - {0x0000b0e8, 0x037f0360},
8635 - {0x0000b0ec, 0x04400441},
8636 - {0x0000b0f0, 0x0460045f},
8637 - {0x0000b0f4, 0x0541047f},
8638 - {0x0000b0f8, 0x055f0540},
8639 - {0x0000b0fc, 0x057f0560},
8640 - {0x0000b100, 0x06400641},
8641 - {0x0000b104, 0x0660065f},
8642 - {0x0000b108, 0x067e067f},
8643 - {0x0000b10c, 0x07410742},
8644 - {0x0000b110, 0x075f0740},
8645 - {0x0000b114, 0x077f0760},
8646 - {0x0000b118, 0x07800781},
8647 - {0x0000b11c, 0x07a0079f},
8648 - {0x0000b120, 0x07c107bf},
8649 - {0x0000b124, 0x000007c0},
8650 - {0x0000b128, 0x00000000},
8651 - {0x0000b12c, 0x00000000},
8652 - {0x0000b130, 0x00000000},
8653 - {0x0000b134, 0x00000000},
8654 - {0x0000b138, 0x00000000},
8655 - {0x0000b13c, 0x00000000},
8656 - {0x0000b140, 0x003f0020},
8657 - {0x0000b144, 0x00400041},
8658 - {0x0000b148, 0x0140005f},
8659 - {0x0000b14c, 0x0160015f},
8660 - {0x0000b150, 0x017e017f},
8661 - {0x0000b154, 0x02410242},
8662 - {0x0000b158, 0x025f0240},
8663 - {0x0000b15c, 0x027f0260},
8664 - {0x0000b160, 0x0341027e},
8665 - {0x0000b164, 0x035f0340},
8666 - {0x0000b168, 0x037f0360},
8667 - {0x0000b16c, 0x04400441},
8668 - {0x0000b170, 0x0460045f},
8669 - {0x0000b174, 0x0541047f},
8670 - {0x0000b178, 0x055f0540},
8671 - {0x0000b17c, 0x057f0560},
8672 - {0x0000b180, 0x06400641},
8673 - {0x0000b184, 0x0660065f},
8674 - {0x0000b188, 0x067e067f},
8675 - {0x0000b18c, 0x07410742},
8676 - {0x0000b190, 0x075f0740},
8677 - {0x0000b194, 0x077f0760},
8678 - {0x0000b198, 0x07800781},
8679 - {0x0000b19c, 0x07a0079f},
8680 - {0x0000b1a0, 0x07c107bf},
8681 - {0x0000b1a4, 0x000007c0},
8682 - {0x0000b1a8, 0x00000000},
8683 - {0x0000b1ac, 0x00000000},
8684 - {0x0000b1b0, 0x00000000},
8685 - {0x0000b1b4, 0x00000000},
8686 - {0x0000b1b8, 0x00000000},
8687 - {0x0000b1bc, 0x00000000},
8688 - {0x0000b1c0, 0x00000000},
8689 - {0x0000b1c4, 0x00000000},
8690 - {0x0000b1c8, 0x00000000},
8691 - {0x0000b1cc, 0x00000000},
8692 - {0x0000b1d0, 0x00000000},
8693 - {0x0000b1d4, 0x00000000},
8694 - {0x0000b1d8, 0x00000000},
8695 - {0x0000b1dc, 0x00000000},
8696 - {0x0000b1e0, 0x00000000},
8697 - {0x0000b1e4, 0x00000000},
8698 - {0x0000b1e8, 0x00000000},
8699 - {0x0000b1ec, 0x00000000},
8700 - {0x0000b1f0, 0x00000396},
8701 - {0x0000b1f4, 0x00000396},
8702 - {0x0000b1f8, 0x00000396},
8703 - {0x0000b1fc, 0x00000196},
8704 -};
8705 -
8706 -static const u32 ar9462_2p1_common_mixed_rx_gain[][2] = {
8707 - /* Addr allmodes */
8708 - {0x0000a000, 0x00010000},
8709 - {0x0000a004, 0x00030002},
8710 - {0x0000a008, 0x00050004},
8711 - {0x0000a00c, 0x00810080},
8712 - {0x0000a010, 0x00830082},
8713 - {0x0000a014, 0x01810180},
8714 - {0x0000a018, 0x01830182},
8715 - {0x0000a01c, 0x01850184},
8716 - {0x0000a020, 0x01890188},
8717 - {0x0000a024, 0x018b018a},
8718 - {0x0000a028, 0x018d018c},
8719 - {0x0000a02c, 0x03820190},
8720 - {0x0000a030, 0x03840383},
8721 - {0x0000a034, 0x03880385},
8722 - {0x0000a038, 0x038a0389},
8723 - {0x0000a03c, 0x038c038b},
8724 - {0x0000a040, 0x0390038d},
8725 - {0x0000a044, 0x03920391},
8726 - {0x0000a048, 0x03940393},
8727 - {0x0000a04c, 0x03960395},
8728 - {0x0000a050, 0x00000000},
8729 - {0x0000a054, 0x00000000},
8730 - {0x0000a058, 0x00000000},
8731 - {0x0000a05c, 0x00000000},
8732 - {0x0000a060, 0x00000000},
8733 - {0x0000a064, 0x00000000},
8734 - {0x0000a068, 0x00000000},
8735 - {0x0000a06c, 0x00000000},
8736 - {0x0000a070, 0x00000000},
8737 - {0x0000a074, 0x00000000},
8738 - {0x0000a078, 0x00000000},
8739 - {0x0000a07c, 0x00000000},
8740 - {0x0000a080, 0x29292929},
8741 - {0x0000a084, 0x29292929},
8742 - {0x0000a088, 0x29292929},
8743 - {0x0000a08c, 0x29292929},
8744 - {0x0000a090, 0x22292929},
8745 - {0x0000a094, 0x1d1d2222},
8746 - {0x0000a098, 0x0c111117},
8747 - {0x0000a09c, 0x00030303},
8748 - {0x0000a0a0, 0x00000000},
8749 - {0x0000a0a4, 0x00000000},
8750 - {0x0000a0a8, 0x00000000},
8751 - {0x0000a0ac, 0x00000000},
8752 - {0x0000a0b0, 0x00000000},
8753 - {0x0000a0b4, 0x00000000},
8754 - {0x0000a0b8, 0x00000000},
8755 - {0x0000a0bc, 0x00000000},
8756 - {0x0000a0c0, 0x001f0000},
8757 - {0x0000a0c4, 0x01000101},
8758 - {0x0000a0c8, 0x011e011f},
8759 - {0x0000a0cc, 0x011c011d},
8760 - {0x0000a0d0, 0x02030204},
8761 - {0x0000a0d4, 0x02010202},
8762 - {0x0000a0d8, 0x021f0200},
8763 - {0x0000a0dc, 0x0302021e},
8764 - {0x0000a0e0, 0x03000301},
8765 - {0x0000a0e4, 0x031e031f},
8766 - {0x0000a0e8, 0x0402031d},
8767 - {0x0000a0ec, 0x04000401},
8768 - {0x0000a0f0, 0x041e041f},
8769 - {0x0000a0f4, 0x0502041d},
8770 - {0x0000a0f8, 0x05000501},
8771 - {0x0000a0fc, 0x051e051f},
8772 - {0x0000a100, 0x06010602},
8773 - {0x0000a104, 0x061f0600},
8774 - {0x0000a108, 0x061d061e},
8775 - {0x0000a10c, 0x07020703},
8776 - {0x0000a110, 0x07000701},
8777 - {0x0000a114, 0x00000000},
8778 - {0x0000a118, 0x00000000},
8779 - {0x0000a11c, 0x00000000},
8780 - {0x0000a120, 0x00000000},
8781 - {0x0000a124, 0x00000000},
8782 - {0x0000a128, 0x00000000},
8783 - {0x0000a12c, 0x00000000},
8784 - {0x0000a130, 0x00000000},
8785 - {0x0000a134, 0x00000000},
8786 - {0x0000a138, 0x00000000},
8787 - {0x0000a13c, 0x00000000},
8788 - {0x0000a140, 0x001f0000},
8789 - {0x0000a144, 0x01000101},
8790 - {0x0000a148, 0x011e011f},
8791 - {0x0000a14c, 0x011c011d},
8792 - {0x0000a150, 0x02030204},
8793 - {0x0000a154, 0x02010202},
8794 - {0x0000a158, 0x021f0200},
8795 - {0x0000a15c, 0x0302021e},
8796 - {0x0000a160, 0x03000301},
8797 - {0x0000a164, 0x031e031f},
8798 - {0x0000a168, 0x0402031d},
8799 - {0x0000a16c, 0x04000401},
8800 - {0x0000a170, 0x041e041f},
8801 - {0x0000a174, 0x0502041d},
8802 - {0x0000a178, 0x05000501},
8803 - {0x0000a17c, 0x051e051f},
8804 - {0x0000a180, 0x06010602},
8805 - {0x0000a184, 0x061f0600},
8806 - {0x0000a188, 0x061d061e},
8807 - {0x0000a18c, 0x07020703},
8808 - {0x0000a190, 0x07000701},
8809 - {0x0000a194, 0x00000000},
8810 - {0x0000a198, 0x00000000},
8811 - {0x0000a19c, 0x00000000},
8812 - {0x0000a1a0, 0x00000000},
8813 - {0x0000a1a4, 0x00000000},
8814 - {0x0000a1a8, 0x00000000},
8815 - {0x0000a1ac, 0x00000000},
8816 - {0x0000a1b0, 0x00000000},
8817 - {0x0000a1b4, 0x00000000},
8818 - {0x0000a1b8, 0x00000000},
8819 - {0x0000a1bc, 0x00000000},
8820 - {0x0000a1c0, 0x00000000},
8821 - {0x0000a1c4, 0x00000000},
8822 - {0x0000a1c8, 0x00000000},
8823 - {0x0000a1cc, 0x00000000},
8824 - {0x0000a1d0, 0x00000000},
8825 - {0x0000a1d4, 0x00000000},
8826 - {0x0000a1d8, 0x00000000},
8827 - {0x0000a1dc, 0x00000000},
8828 - {0x0000a1e0, 0x00000000},
8829 - {0x0000a1e4, 0x00000000},
8830 - {0x0000a1e8, 0x00000000},
8831 - {0x0000a1ec, 0x00000000},
8832 - {0x0000a1f0, 0x00000396},
8833 - {0x0000a1f4, 0x00000396},
8834 - {0x0000a1f8, 0x00000396},
8835 - {0x0000a1fc, 0x00000196},
8836 - {0x0000b000, 0x00010000},
8837 - {0x0000b004, 0x00030002},
8838 - {0x0000b008, 0x00050004},
8839 - {0x0000b00c, 0x00810080},
8840 - {0x0000b010, 0x00830082},
8841 - {0x0000b014, 0x01810180},
8842 - {0x0000b018, 0x01830182},
8843 - {0x0000b01c, 0x01850184},
8844 - {0x0000b020, 0x02810280},
8845 - {0x0000b024, 0x02830282},
8846 - {0x0000b028, 0x02850284},
8847 - {0x0000b02c, 0x02890288},
8848 - {0x0000b030, 0x028b028a},
8849 - {0x0000b034, 0x0388028c},
8850 - {0x0000b038, 0x038a0389},
8851 - {0x0000b03c, 0x038c038b},
8852 - {0x0000b040, 0x0390038d},
8853 - {0x0000b044, 0x03920391},
8854 - {0x0000b048, 0x03940393},
8855 - {0x0000b04c, 0x03960395},
8856 - {0x0000b050, 0x00000000},
8857 - {0x0000b054, 0x00000000},
8858 - {0x0000b058, 0x00000000},
8859 - {0x0000b05c, 0x00000000},
8860 - {0x0000b060, 0x00000000},
8861 - {0x0000b064, 0x00000000},
8862 - {0x0000b068, 0x00000000},
8863 - {0x0000b06c, 0x00000000},
8864 - {0x0000b070, 0x00000000},
8865 - {0x0000b074, 0x00000000},
8866 - {0x0000b078, 0x00000000},
8867 - {0x0000b07c, 0x00000000},
8868 - {0x0000b080, 0x2a2d2f32},
8869 - {0x0000b084, 0x21232328},
8870 - {0x0000b088, 0x19191c1e},
8871 - {0x0000b08c, 0x12141417},
8872 - {0x0000b090, 0x07070e0e},
8873 - {0x0000b094, 0x03030305},
8874 - {0x0000b098, 0x00000003},
8875 - {0x0000b09c, 0x00000000},
8876 - {0x0000b0a0, 0x00000000},
8877 - {0x0000b0a4, 0x00000000},
8878 - {0x0000b0a8, 0x00000000},
8879 - {0x0000b0ac, 0x00000000},
8880 - {0x0000b0b0, 0x00000000},
8881 - {0x0000b0b4, 0x00000000},
8882 - {0x0000b0b8, 0x00000000},
8883 - {0x0000b0bc, 0x00000000},
8884 - {0x0000b0c0, 0x003f0020},
8885 - {0x0000b0c4, 0x00400041},
8886 - {0x0000b0c8, 0x0140005f},
8887 - {0x0000b0cc, 0x0160015f},
8888 - {0x0000b0d0, 0x017e017f},
8889 - {0x0000b0d4, 0x02410242},
8890 - {0x0000b0d8, 0x025f0240},
8891 - {0x0000b0dc, 0x027f0260},
8892 - {0x0000b0e0, 0x0341027e},
8893 - {0x0000b0e4, 0x035f0340},
8894 - {0x0000b0e8, 0x037f0360},
8895 - {0x0000b0ec, 0x04400441},
8896 - {0x0000b0f0, 0x0460045f},
8897 - {0x0000b0f4, 0x0541047f},
8898 - {0x0000b0f8, 0x055f0540},
8899 - {0x0000b0fc, 0x057f0560},
8900 - {0x0000b100, 0x06400641},
8901 - {0x0000b104, 0x0660065f},
8902 - {0x0000b108, 0x067e067f},
8903 - {0x0000b10c, 0x07410742},
8904 - {0x0000b110, 0x075f0740},
8905 - {0x0000b114, 0x077f0760},
8906 - {0x0000b118, 0x07800781},
8907 - {0x0000b11c, 0x07a0079f},
8908 - {0x0000b120, 0x07c107bf},
8909 - {0x0000b124, 0x000007c0},
8910 - {0x0000b128, 0x00000000},
8911 - {0x0000b12c, 0x00000000},
8912 - {0x0000b130, 0x00000000},
8913 - {0x0000b134, 0x00000000},
8914 - {0x0000b138, 0x00000000},
8915 - {0x0000b13c, 0x00000000},
8916 - {0x0000b140, 0x003f0020},
8917 - {0x0000b144, 0x00400041},
8918 - {0x0000b148, 0x0140005f},
8919 - {0x0000b14c, 0x0160015f},
8920 - {0x0000b150, 0x017e017f},
8921 - {0x0000b154, 0x02410242},
8922 - {0x0000b158, 0x025f0240},
8923 - {0x0000b15c, 0x027f0260},
8924 - {0x0000b160, 0x0341027e},
8925 - {0x0000b164, 0x035f0340},
8926 - {0x0000b168, 0x037f0360},
8927 - {0x0000b16c, 0x04400441},
8928 - {0x0000b170, 0x0460045f},
8929 - {0x0000b174, 0x0541047f},
8930 - {0x0000b178, 0x055f0540},
8931 - {0x0000b17c, 0x057f0560},
8932 - {0x0000b180, 0x06400641},
8933 - {0x0000b184, 0x0660065f},
8934 - {0x0000b188, 0x067e067f},
8935 - {0x0000b18c, 0x07410742},
8936 - {0x0000b190, 0x075f0740},
8937 - {0x0000b194, 0x077f0760},
8938 - {0x0000b198, 0x07800781},
8939 - {0x0000b19c, 0x07a0079f},
8940 - {0x0000b1a0, 0x07c107bf},
8941 - {0x0000b1a4, 0x000007c0},
8942 - {0x0000b1a8, 0x00000000},
8943 - {0x0000b1ac, 0x00000000},
8944 - {0x0000b1b0, 0x00000000},
8945 - {0x0000b1b4, 0x00000000},
8946 - {0x0000b1b8, 0x00000000},
8947 - {0x0000b1bc, 0x00000000},
8948 - {0x0000b1c0, 0x00000000},
8949 - {0x0000b1c4, 0x00000000},
8950 - {0x0000b1c8, 0x00000000},
8951 - {0x0000b1cc, 0x00000000},
8952 - {0x0000b1d0, 0x00000000},
8953 - {0x0000b1d4, 0x00000000},
8954 - {0x0000b1d8, 0x00000000},
8955 - {0x0000b1dc, 0x00000000},
8956 - {0x0000b1e0, 0x00000000},
8957 - {0x0000b1e4, 0x00000000},
8958 - {0x0000b1e8, 0x00000000},
8959 - {0x0000b1ec, 0x00000000},
8960 - {0x0000b1f0, 0x00000396},
8961 - {0x0000b1f4, 0x00000396},
8962 - {0x0000b1f8, 0x00000396},
8963 - {0x0000b1fc, 0x00000196},
8964 -};
8965 -
8966 -static const u32 ar9462_2p1_baseband_core_mix_rxgain[][2] = {
8967 - /* Addr allmodes */
8968 - {0x00009fd0, 0x0a2d6b93},
8969 -};
8970 -
8971 -static const u32 ar9462_2p1_baseband_postamble_mix_rxgain[][5] = {
8972 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
8973 - {0x00009820, 0x206a022e, 0x206a022e, 0x206a01ae, 0x206a01ae},
8974 - {0x00009824, 0x63c640de, 0x5ac640d0, 0x63c640da, 0x63c640da},
8975 - {0x00009828, 0x0796be89, 0x0696b081, 0x0916be81, 0x0916be81},
8976 - {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000d8, 0x6c4000d8},
8977 - {0x00009e10, 0x92c88d2e, 0x7ec88d2e, 0x7ec86d2e, 0x7ec86d2e},
8978 - {0x00009e14, 0x37b95d5e, 0x37b9605e, 0x3236605e, 0x32395c5e},
8979 -};
8980 -
8981 -static const u32 ar9462_2p1_baseband_postamble_5g_xlna[][5] = {
8982 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
8983 - {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c282},
8984 -};
8985 -
8986 -static const u32 ar9462_2p1_common_wo_xlna_rx_gain[][2] = {
8987 - /* Addr allmodes */
8988 - {0x0000a000, 0x00010000},
8989 - {0x0000a004, 0x00030002},
8990 - {0x0000a008, 0x00050004},
8991 - {0x0000a00c, 0x00810080},
8992 - {0x0000a010, 0x00830082},
8993 - {0x0000a014, 0x01810180},
8994 - {0x0000a018, 0x01830182},
8995 - {0x0000a01c, 0x01850184},
8996 - {0x0000a020, 0x01890188},
8997 - {0x0000a024, 0x018b018a},
8998 - {0x0000a028, 0x018d018c},
8999 - {0x0000a02c, 0x03820190},
9000 - {0x0000a030, 0x03840383},
9001 - {0x0000a034, 0x03880385},
9002 - {0x0000a038, 0x038a0389},
9003 - {0x0000a03c, 0x038c038b},
9004 - {0x0000a040, 0x0390038d},
9005 - {0x0000a044, 0x03920391},
9006 - {0x0000a048, 0x03940393},
9007 - {0x0000a04c, 0x03960395},
9008 - {0x0000a050, 0x00000000},
9009 - {0x0000a054, 0x00000000},
9010 - {0x0000a058, 0x00000000},
9011 - {0x0000a05c, 0x00000000},
9012 - {0x0000a060, 0x00000000},
9013 - {0x0000a064, 0x00000000},
9014 - {0x0000a068, 0x00000000},
9015 - {0x0000a06c, 0x00000000},
9016 - {0x0000a070, 0x00000000},
9017 - {0x0000a074, 0x00000000},
9018 - {0x0000a078, 0x00000000},
9019 - {0x0000a07c, 0x00000000},
9020 - {0x0000a080, 0x29292929},
9021 - {0x0000a084, 0x29292929},
9022 - {0x0000a088, 0x29292929},
9023 - {0x0000a08c, 0x29292929},
9024 - {0x0000a090, 0x22292929},
9025 - {0x0000a094, 0x1d1d2222},
9026 - {0x0000a098, 0x0c111117},
9027 - {0x0000a09c, 0x00030303},
9028 - {0x0000a0a0, 0x00000000},
9029 - {0x0000a0a4, 0x00000000},
9030 - {0x0000a0a8, 0x00000000},
9031 - {0x0000a0ac, 0x00000000},
9032 - {0x0000a0b0, 0x00000000},
9033 - {0x0000a0b4, 0x00000000},
9034 - {0x0000a0b8, 0x00000000},
9035 - {0x0000a0bc, 0x00000000},
9036 - {0x0000a0c0, 0x001f0000},
9037 - {0x0000a0c4, 0x01000101},
9038 - {0x0000a0c8, 0x011e011f},
9039 - {0x0000a0cc, 0x011c011d},
9040 - {0x0000a0d0, 0x02030204},
9041 - {0x0000a0d4, 0x02010202},
9042 - {0x0000a0d8, 0x021f0200},
9043 - {0x0000a0dc, 0x0302021e},
9044 - {0x0000a0e0, 0x03000301},
9045 - {0x0000a0e4, 0x031e031f},
9046 - {0x0000a0e8, 0x0402031d},
9047 - {0x0000a0ec, 0x04000401},
9048 - {0x0000a0f0, 0x041e041f},
9049 - {0x0000a0f4, 0x0502041d},
9050 - {0x0000a0f8, 0x05000501},
9051 - {0x0000a0fc, 0x051e051f},
9052 - {0x0000a100, 0x06010602},
9053 - {0x0000a104, 0x061f0600},
9054 - {0x0000a108, 0x061d061e},
9055 - {0x0000a10c, 0x07020703},
9056 - {0x0000a110, 0x07000701},
9057 - {0x0000a114, 0x00000000},
9058 - {0x0000a118, 0x00000000},
9059 - {0x0000a11c, 0x00000000},
9060 - {0x0000a120, 0x00000000},
9061 - {0x0000a124, 0x00000000},
9062 - {0x0000a128, 0x00000000},
9063 - {0x0000a12c, 0x00000000},
9064 - {0x0000a130, 0x00000000},
9065 - {0x0000a134, 0x00000000},
9066 - {0x0000a138, 0x00000000},
9067 - {0x0000a13c, 0x00000000},
9068 - {0x0000a140, 0x001f0000},
9069 - {0x0000a144, 0x01000101},
9070 - {0x0000a148, 0x011e011f},
9071 - {0x0000a14c, 0x011c011d},
9072 - {0x0000a150, 0x02030204},
9073 - {0x0000a154, 0x02010202},
9074 - {0x0000a158, 0x021f0200},
9075 - {0x0000a15c, 0x0302021e},
9076 - {0x0000a160, 0x03000301},
9077 - {0x0000a164, 0x031e031f},
9078 - {0x0000a168, 0x0402031d},
9079 - {0x0000a16c, 0x04000401},
9080 - {0x0000a170, 0x041e041f},
9081 - {0x0000a174, 0x0502041d},
9082 - {0x0000a178, 0x05000501},
9083 - {0x0000a17c, 0x051e051f},
9084 - {0x0000a180, 0x06010602},
9085 - {0x0000a184, 0x061f0600},
9086 - {0x0000a188, 0x061d061e},
9087 - {0x0000a18c, 0x07020703},
9088 - {0x0000a190, 0x07000701},
9089 - {0x0000a194, 0x00000000},
9090 - {0x0000a198, 0x00000000},
9091 - {0x0000a19c, 0x00000000},
9092 - {0x0000a1a0, 0x00000000},
9093 - {0x0000a1a4, 0x00000000},
9094 - {0x0000a1a8, 0x00000000},
9095 - {0x0000a1ac, 0x00000000},
9096 - {0x0000a1b0, 0x00000000},
9097 - {0x0000a1b4, 0x00000000},
9098 - {0x0000a1b8, 0x00000000},
9099 - {0x0000a1bc, 0x00000000},
9100 - {0x0000a1c0, 0x00000000},
9101 - {0x0000a1c4, 0x00000000},
9102 - {0x0000a1c8, 0x00000000},
9103 - {0x0000a1cc, 0x00000000},
9104 - {0x0000a1d0, 0x00000000},
9105 - {0x0000a1d4, 0x00000000},
9106 - {0x0000a1d8, 0x00000000},
9107 - {0x0000a1dc, 0x00000000},
9108 - {0x0000a1e0, 0x00000000},
9109 - {0x0000a1e4, 0x00000000},
9110 - {0x0000a1e8, 0x00000000},
9111 - {0x0000a1ec, 0x00000000},
9112 - {0x0000a1f0, 0x00000396},
9113 - {0x0000a1f4, 0x00000396},
9114 - {0x0000a1f8, 0x00000396},
9115 - {0x0000a1fc, 0x00000196},
9116 - {0x0000b000, 0x00010000},
9117 - {0x0000b004, 0x00030002},
9118 - {0x0000b008, 0x00050004},
9119 - {0x0000b00c, 0x00810080},
9120 - {0x0000b010, 0x00830082},
9121 - {0x0000b014, 0x01810180},
9122 - {0x0000b018, 0x01830182},
9123 - {0x0000b01c, 0x01850184},
9124 - {0x0000b020, 0x02810280},
9125 - {0x0000b024, 0x02830282},
9126 - {0x0000b028, 0x02850284},
9127 - {0x0000b02c, 0x02890288},
9128 - {0x0000b030, 0x028b028a},
9129 - {0x0000b034, 0x0388028c},
9130 - {0x0000b038, 0x038a0389},
9131 - {0x0000b03c, 0x038c038b},
9132 - {0x0000b040, 0x0390038d},
9133 - {0x0000b044, 0x03920391},
9134 - {0x0000b048, 0x03940393},
9135 - {0x0000b04c, 0x03960395},
9136 - {0x0000b050, 0x00000000},
9137 - {0x0000b054, 0x00000000},
9138 - {0x0000b058, 0x00000000},
9139 - {0x0000b05c, 0x00000000},
9140 - {0x0000b060, 0x00000000},
9141 - {0x0000b064, 0x00000000},
9142 - {0x0000b068, 0x00000000},
9143 - {0x0000b06c, 0x00000000},
9144 - {0x0000b070, 0x00000000},
9145 - {0x0000b074, 0x00000000},
9146 - {0x0000b078, 0x00000000},
9147 - {0x0000b07c, 0x00000000},
9148 - {0x0000b080, 0x32323232},
9149 - {0x0000b084, 0x2f2f3232},
9150 - {0x0000b088, 0x23282a2d},
9151 - {0x0000b08c, 0x1c1e2123},
9152 - {0x0000b090, 0x14171919},
9153 - {0x0000b094, 0x0e0e1214},
9154 - {0x0000b098, 0x03050707},
9155 - {0x0000b09c, 0x00030303},
9156 - {0x0000b0a0, 0x00000000},
9157 - {0x0000b0a4, 0x00000000},
9158 - {0x0000b0a8, 0x00000000},
9159 - {0x0000b0ac, 0x00000000},
9160 - {0x0000b0b0, 0x00000000},
9161 - {0x0000b0b4, 0x00000000},
9162 - {0x0000b0b8, 0x00000000},
9163 - {0x0000b0bc, 0x00000000},
9164 - {0x0000b0c0, 0x003f0020},
9165 - {0x0000b0c4, 0x00400041},
9166 - {0x0000b0c8, 0x0140005f},
9167 - {0x0000b0cc, 0x0160015f},
9168 - {0x0000b0d0, 0x017e017f},
9169 - {0x0000b0d4, 0x02410242},
9170 - {0x0000b0d8, 0x025f0240},
9171 - {0x0000b0dc, 0x027f0260},
9172 - {0x0000b0e0, 0x0341027e},
9173 - {0x0000b0e4, 0x035f0340},
9174 - {0x0000b0e8, 0x037f0360},
9175 - {0x0000b0ec, 0x04400441},
9176 - {0x0000b0f0, 0x0460045f},
9177 - {0x0000b0f4, 0x0541047f},
9178 - {0x0000b0f8, 0x055f0540},
9179 - {0x0000b0fc, 0x057f0560},
9180 - {0x0000b100, 0x06400641},
9181 - {0x0000b104, 0x0660065f},
9182 - {0x0000b108, 0x067e067f},
9183 - {0x0000b10c, 0x07410742},
9184 - {0x0000b110, 0x075f0740},
9185 - {0x0000b114, 0x077f0760},
9186 - {0x0000b118, 0x07800781},
9187 - {0x0000b11c, 0x07a0079f},
9188 - {0x0000b120, 0x07c107bf},
9189 - {0x0000b124, 0x000007c0},
9190 - {0x0000b128, 0x00000000},
9191 - {0x0000b12c, 0x00000000},
9192 - {0x0000b130, 0x00000000},
9193 - {0x0000b134, 0x00000000},
9194 - {0x0000b138, 0x00000000},
9195 - {0x0000b13c, 0x00000000},
9196 - {0x0000b140, 0x003f0020},
9197 - {0x0000b144, 0x00400041},
9198 - {0x0000b148, 0x0140005f},
9199 - {0x0000b14c, 0x0160015f},
9200 - {0x0000b150, 0x017e017f},
9201 - {0x0000b154, 0x02410242},
9202 - {0x0000b158, 0x025f0240},
9203 - {0x0000b15c, 0x027f0260},
9204 - {0x0000b160, 0x0341027e},
9205 - {0x0000b164, 0x035f0340},
9206 - {0x0000b168, 0x037f0360},
9207 - {0x0000b16c, 0x04400441},
9208 - {0x0000b170, 0x0460045f},
9209 - {0x0000b174, 0x0541047f},
9210 - {0x0000b178, 0x055f0540},
9211 - {0x0000b17c, 0x057f0560},
9212 - {0x0000b180, 0x06400641},
9213 - {0x0000b184, 0x0660065f},
9214 - {0x0000b188, 0x067e067f},
9215 - {0x0000b18c, 0x07410742},
9216 - {0x0000b190, 0x075f0740},
9217 - {0x0000b194, 0x077f0760},
9218 - {0x0000b198, 0x07800781},
9219 - {0x0000b19c, 0x07a0079f},
9220 - {0x0000b1a0, 0x07c107bf},
9221 - {0x0000b1a4, 0x000007c0},
9222 - {0x0000b1a8, 0x00000000},
9223 - {0x0000b1ac, 0x00000000},
9224 - {0x0000b1b0, 0x00000000},
9225 - {0x0000b1b4, 0x00000000},
9226 - {0x0000b1b8, 0x00000000},
9227 - {0x0000b1bc, 0x00000000},
9228 - {0x0000b1c0, 0x00000000},
9229 - {0x0000b1c4, 0x00000000},
9230 - {0x0000b1c8, 0x00000000},
9231 - {0x0000b1cc, 0x00000000},
9232 - {0x0000b1d0, 0x00000000},
9233 - {0x0000b1d4, 0x00000000},
9234 - {0x0000b1d8, 0x00000000},
9235 - {0x0000b1dc, 0x00000000},
9236 - {0x0000b1e0, 0x00000000},
9237 - {0x0000b1e4, 0x00000000},
9238 - {0x0000b1e8, 0x00000000},
9239 - {0x0000b1ec, 0x00000000},
9240 - {0x0000b1f0, 0x00000396},
9241 - {0x0000b1f4, 0x00000396},
9242 - {0x0000b1f8, 0x00000396},
9243 - {0x0000b1fc, 0x00000196},
9244 -};
9245 -
9246 -static const u32 ar9462_2p1_common_5g_xlna_only_rx_gain[][2] = {
9247 - /* Addr allmodes */
9248 - {0x0000a000, 0x00010000},
9249 - {0x0000a004, 0x00030002},
9250 - {0x0000a008, 0x00050004},
9251 - {0x0000a00c, 0x00810080},
9252 - {0x0000a010, 0x00830082},
9253 - {0x0000a014, 0x01810180},
9254 - {0x0000a018, 0x01830182},
9255 - {0x0000a01c, 0x01850184},
9256 - {0x0000a020, 0x01890188},
9257 - {0x0000a024, 0x018b018a},
9258 - {0x0000a028, 0x018d018c},
9259 - {0x0000a02c, 0x03820190},
9260 - {0x0000a030, 0x03840383},
9261 - {0x0000a034, 0x03880385},
9262 - {0x0000a038, 0x038a0389},
9263 - {0x0000a03c, 0x038c038b},
9264 - {0x0000a040, 0x0390038d},
9265 - {0x0000a044, 0x03920391},
9266 - {0x0000a048, 0x03940393},
9267 - {0x0000a04c, 0x03960395},
9268 - {0x0000a050, 0x00000000},
9269 - {0x0000a054, 0x00000000},
9270 - {0x0000a058, 0x00000000},
9271 - {0x0000a05c, 0x00000000},
9272 - {0x0000a060, 0x00000000},
9273 - {0x0000a064, 0x00000000},
9274 - {0x0000a068, 0x00000000},
9275 - {0x0000a06c, 0x00000000},
9276 - {0x0000a070, 0x00000000},
9277 - {0x0000a074, 0x00000000},
9278 - {0x0000a078, 0x00000000},
9279 - {0x0000a07c, 0x00000000},
9280 - {0x0000a080, 0x29292929},
9281 - {0x0000a084, 0x29292929},
9282 - {0x0000a088, 0x29292929},
9283 - {0x0000a08c, 0x29292929},
9284 - {0x0000a090, 0x22292929},
9285 - {0x0000a094, 0x1d1d2222},
9286 - {0x0000a098, 0x0c111117},
9287 - {0x0000a09c, 0x00030303},
9288 - {0x0000a0a0, 0x00000000},
9289 - {0x0000a0a4, 0x00000000},
9290 - {0x0000a0a8, 0x00000000},
9291 - {0x0000a0ac, 0x00000000},
9292 - {0x0000a0b0, 0x00000000},
9293 - {0x0000a0b4, 0x00000000},
9294 - {0x0000a0b8, 0x00000000},
9295 - {0x0000a0bc, 0x00000000},
9296 - {0x0000a0c0, 0x001f0000},
9297 - {0x0000a0c4, 0x01000101},
9298 - {0x0000a0c8, 0x011e011f},
9299 - {0x0000a0cc, 0x011c011d},
9300 - {0x0000a0d0, 0x02030204},
9301 - {0x0000a0d4, 0x02010202},
9302 - {0x0000a0d8, 0x021f0200},
9303 - {0x0000a0dc, 0x0302021e},
9304 - {0x0000a0e0, 0x03000301},
9305 - {0x0000a0e4, 0x031e031f},
9306 - {0x0000a0e8, 0x0402031d},
9307 - {0x0000a0ec, 0x04000401},
9308 - {0x0000a0f0, 0x041e041f},
9309 - {0x0000a0f4, 0x0502041d},
9310 - {0x0000a0f8, 0x05000501},
9311 - {0x0000a0fc, 0x051e051f},
9312 - {0x0000a100, 0x06010602},
9313 - {0x0000a104, 0x061f0600},
9314 - {0x0000a108, 0x061d061e},
9315 - {0x0000a10c, 0x07020703},
9316 - {0x0000a110, 0x07000701},
9317 - {0x0000a114, 0x00000000},
9318 - {0x0000a118, 0x00000000},
9319 - {0x0000a11c, 0x00000000},
9320 - {0x0000a120, 0x00000000},
9321 - {0x0000a124, 0x00000000},
9322 - {0x0000a128, 0x00000000},
9323 - {0x0000a12c, 0x00000000},
9324 - {0x0000a130, 0x00000000},
9325 - {0x0000a134, 0x00000000},
9326 - {0x0000a138, 0x00000000},
9327 - {0x0000a13c, 0x00000000},
9328 - {0x0000a140, 0x001f0000},
9329 - {0x0000a144, 0x01000101},
9330 - {0x0000a148, 0x011e011f},
9331 - {0x0000a14c, 0x011c011d},
9332 - {0x0000a150, 0x02030204},
9333 - {0x0000a154, 0x02010202},
9334 - {0x0000a158, 0x021f0200},
9335 - {0x0000a15c, 0x0302021e},
9336 - {0x0000a160, 0x03000301},
9337 - {0x0000a164, 0x031e031f},
9338 - {0x0000a168, 0x0402031d},
9339 - {0x0000a16c, 0x04000401},
9340 - {0x0000a170, 0x041e041f},
9341 - {0x0000a174, 0x0502041d},
9342 - {0x0000a178, 0x05000501},
9343 - {0x0000a17c, 0x051e051f},
9344 - {0x0000a180, 0x06010602},
9345 - {0x0000a184, 0x061f0600},
9346 - {0x0000a188, 0x061d061e},
9347 - {0x0000a18c, 0x07020703},
9348 - {0x0000a190, 0x07000701},
9349 - {0x0000a194, 0x00000000},
9350 - {0x0000a198, 0x00000000},
9351 - {0x0000a19c, 0x00000000},
9352 - {0x0000a1a0, 0x00000000},
9353 - {0x0000a1a4, 0x00000000},
9354 - {0x0000a1a8, 0x00000000},
9355 - {0x0000a1ac, 0x00000000},
9356 - {0x0000a1b0, 0x00000000},
9357 - {0x0000a1b4, 0x00000000},
9358 - {0x0000a1b8, 0x00000000},
9359 - {0x0000a1bc, 0x00000000},
9360 - {0x0000a1c0, 0x00000000},
9361 - {0x0000a1c4, 0x00000000},
9362 - {0x0000a1c8, 0x00000000},
9363 - {0x0000a1cc, 0x00000000},
9364 - {0x0000a1d0, 0x00000000},
9365 - {0x0000a1d4, 0x00000000},
9366 - {0x0000a1d8, 0x00000000},
9367 - {0x0000a1dc, 0x00000000},
9368 - {0x0000a1e0, 0x00000000},
9369 - {0x0000a1e4, 0x00000000},
9370 - {0x0000a1e8, 0x00000000},
9371 - {0x0000a1ec, 0x00000000},
9372 - {0x0000a1f0, 0x00000396},
9373 - {0x0000a1f4, 0x00000396},
9374 - {0x0000a1f8, 0x00000396},
9375 - {0x0000a1fc, 0x00000196},
9376 - {0x0000b000, 0x00010000},
9377 - {0x0000b004, 0x00030002},
9378 - {0x0000b008, 0x00050004},
9379 - {0x0000b00c, 0x00810080},
9380 - {0x0000b010, 0x00830082},
9381 - {0x0000b014, 0x01810180},
9382 - {0x0000b018, 0x01830182},
9383 - {0x0000b01c, 0x01850184},
9384 - {0x0000b020, 0x02810280},
9385 - {0x0000b024, 0x02830282},
9386 - {0x0000b028, 0x02850284},
9387 - {0x0000b02c, 0x02890288},
9388 - {0x0000b030, 0x028b028a},
9389 - {0x0000b034, 0x0388028c},
9390 - {0x0000b038, 0x038a0389},
9391 - {0x0000b03c, 0x038c038b},
9392 - {0x0000b040, 0x0390038d},
9393 - {0x0000b044, 0x03920391},
9394 - {0x0000b048, 0x03940393},
9395 - {0x0000b04c, 0x03960395},
9396 - {0x0000b050, 0x00000000},
9397 - {0x0000b054, 0x00000000},
9398 - {0x0000b058, 0x00000000},
9399 - {0x0000b05c, 0x00000000},
9400 - {0x0000b060, 0x00000000},
9401 - {0x0000b064, 0x00000000},
9402 - {0x0000b068, 0x00000000},
9403 - {0x0000b06c, 0x00000000},
9404 - {0x0000b070, 0x00000000},
9405 - {0x0000b074, 0x00000000},
9406 - {0x0000b078, 0x00000000},
9407 - {0x0000b07c, 0x00000000},
9408 - {0x0000b080, 0x2a2d2f32},
9409 - {0x0000b084, 0x21232328},
9410 - {0x0000b088, 0x19191c1e},
9411 - {0x0000b08c, 0x12141417},
9412 - {0x0000b090, 0x07070e0e},
9413 - {0x0000b094, 0x03030305},
9414 - {0x0000b098, 0x00000003},
9415 - {0x0000b09c, 0x00000000},
9416 - {0x0000b0a0, 0x00000000},
9417 - {0x0000b0a4, 0x00000000},
9418 - {0x0000b0a8, 0x00000000},
9419 - {0x0000b0ac, 0x00000000},
9420 - {0x0000b0b0, 0x00000000},
9421 - {0x0000b0b4, 0x00000000},
9422 - {0x0000b0b8, 0x00000000},
9423 - {0x0000b0bc, 0x00000000},
9424 - {0x0000b0c0, 0x003f0020},
9425 - {0x0000b0c4, 0x00400041},
9426 - {0x0000b0c8, 0x0140005f},
9427 - {0x0000b0cc, 0x0160015f},
9428 - {0x0000b0d0, 0x017e017f},
9429 - {0x0000b0d4, 0x02410242},
9430 - {0x0000b0d8, 0x025f0240},
9431 - {0x0000b0dc, 0x027f0260},
9432 - {0x0000b0e0, 0x0341027e},
9433 - {0x0000b0e4, 0x035f0340},
9434 - {0x0000b0e8, 0x037f0360},
9435 - {0x0000b0ec, 0x04400441},
9436 - {0x0000b0f0, 0x0460045f},
9437 - {0x0000b0f4, 0x0541047f},
9438 - {0x0000b0f8, 0x055f0540},
9439 - {0x0000b0fc, 0x057f0560},
9440 - {0x0000b100, 0x06400641},
9441 - {0x0000b104, 0x0660065f},
9442 - {0x0000b108, 0x067e067f},
9443 - {0x0000b10c, 0x07410742},
9444 - {0x0000b110, 0x075f0740},
9445 - {0x0000b114, 0x077f0760},
9446 - {0x0000b118, 0x07800781},
9447 - {0x0000b11c, 0x07a0079f},
9448 - {0x0000b120, 0x07c107bf},
9449 - {0x0000b124, 0x000007c0},
9450 - {0x0000b128, 0x00000000},
9451 - {0x0000b12c, 0x00000000},
9452 - {0x0000b130, 0x00000000},
9453 - {0x0000b134, 0x00000000},
9454 - {0x0000b138, 0x00000000},
9455 - {0x0000b13c, 0x00000000},
9456 - {0x0000b140, 0x003f0020},
9457 - {0x0000b144, 0x00400041},
9458 - {0x0000b148, 0x0140005f},
9459 - {0x0000b14c, 0x0160015f},
9460 - {0x0000b150, 0x017e017f},
9461 - {0x0000b154, 0x02410242},
9462 - {0x0000b158, 0x025f0240},
9463 - {0x0000b15c, 0x027f0260},
9464 - {0x0000b160, 0x0341027e},
9465 - {0x0000b164, 0x035f0340},
9466 - {0x0000b168, 0x037f0360},
9467 - {0x0000b16c, 0x04400441},
9468 - {0x0000b170, 0x0460045f},
9469 - {0x0000b174, 0x0541047f},
9470 - {0x0000b178, 0x055f0540},
9471 - {0x0000b17c, 0x057f0560},
9472 - {0x0000b180, 0x06400641},
9473 - {0x0000b184, 0x0660065f},
9474 - {0x0000b188, 0x067e067f},
9475 - {0x0000b18c, 0x07410742},
9476 - {0x0000b190, 0x075f0740},
9477 - {0x0000b194, 0x077f0760},
9478 - {0x0000b198, 0x07800781},
9479 - {0x0000b19c, 0x07a0079f},
9480 - {0x0000b1a0, 0x07c107bf},
9481 - {0x0000b1a4, 0x000007c0},
9482 - {0x0000b1a8, 0x00000000},
9483 - {0x0000b1ac, 0x00000000},
9484 - {0x0000b1b0, 0x00000000},
9485 - {0x0000b1b4, 0x00000000},
9486 - {0x0000b1b8, 0x00000000},
9487 - {0x0000b1bc, 0x00000000},
9488 - {0x0000b1c0, 0x00000000},
9489 - {0x0000b1c4, 0x00000000},
9490 - {0x0000b1c8, 0x00000000},
9491 - {0x0000b1cc, 0x00000000},
9492 - {0x0000b1d0, 0x00000000},
9493 - {0x0000b1d4, 0x00000000},
9494 - {0x0000b1d8, 0x00000000},
9495 - {0x0000b1dc, 0x00000000},
9496 - {0x0000b1e0, 0x00000000},
9497 - {0x0000b1e4, 0x00000000},
9498 - {0x0000b1e8, 0x00000000},
9499 - {0x0000b1ec, 0x00000000},
9500 - {0x0000b1f0, 0x00000396},
9501 - {0x0000b1f4, 0x00000396},
9502 - {0x0000b1f8, 0x00000396},
9503 - {0x0000b1fc, 0x00000196},
9504 -};
9505 -
9506 -static const u32 ar9462_2p1_modes_low_ob_db_tx_gain[][5] = {
9507 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
9508 - {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
9509 - {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
9510 - {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
9511 - {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
9512 - {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
9513 - {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
9514 - {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9515 - {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9516 - {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
9517 - {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
9518 - {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
9519 - {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
9520 - {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400},
9521 - {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402},
9522 - {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404},
9523 - {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603},
9524 - {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02},
9525 - {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04},
9526 - {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20},
9527 - {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20},
9528 - {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22},
9529 - {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24},
9530 - {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640},
9531 - {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},
9532 - {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},
9533 - {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81},
9534 - {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83},
9535 - {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84},
9536 - {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3},
9537 - {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5},
9538 - {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9},
9539 - {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb},
9540 - {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
9541 - {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
9542 - {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
9543 - {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
9544 - {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
9545 - {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
9546 - {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
9547 - {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9548 - {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9549 - {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9550 - {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9551 - {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9552 - {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
9553 - {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
9554 - {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
9555 - {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
9556 - {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
9557 - {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
9558 - {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
9559 - {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
9560 - {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
9561 - {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
9562 - {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
9563 - {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
9564 - {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
9565 - {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
9566 - {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
9567 - {0x00016044, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
9568 - {0x00016048, 0x64992060, 0x64992060, 0x64992060, 0x64992060},
9569 - {0x00016054, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
9570 - {0x00016444, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
9571 - {0x00016448, 0x64992000, 0x64992000, 0x64992000, 0x64992000},
9572 - {0x00016454, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
9573 -};
9574 -
9575 -static const u32 ar9462_2p1_modes_high_ob_db_tx_gain[][5] = {
9576 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
9577 - {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
9578 - {0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
9579 - {0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
9580 - {0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
9581 - {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
9582 - {0x0000a410, 0x000050da, 0x000050da, 0x000050de, 0x000050de},
9583 - {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9584 - {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
9585 - {0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
9586 - {0x0000a508, 0x0a022220, 0x0a022220, 0x08000004, 0x08000004},
9587 - {0x0000a50c, 0x0f022223, 0x0f022223, 0x0b000200, 0x0b000200},
9588 - {0x0000a510, 0x14022620, 0x14022620, 0x0f000202, 0x0f000202},
9589 - {0x0000a514, 0x18022622, 0x18022622, 0x11000400, 0x11000400},
9590 - {0x0000a518, 0x1b022822, 0x1b022822, 0x15000402, 0x15000402},
9591 - {0x0000a51c, 0x20022842, 0x20022842, 0x19000404, 0x19000404},
9592 - {0x0000a520, 0x22022c41, 0x22022c41, 0x1b000603, 0x1b000603},
9593 - {0x0000a524, 0x28023042, 0x28023042, 0x1f000a02, 0x1f000a02},
9594 - {0x0000a528, 0x2c023044, 0x2c023044, 0x23000a04, 0x23000a04},
9595 - {0x0000a52c, 0x2f023644, 0x2f023644, 0x26000a20, 0x26000a20},
9596 - {0x0000a530, 0x34025643, 0x34025643, 0x2a000e20, 0x2a000e20},
9597 - {0x0000a534, 0x38025a44, 0x38025a44, 0x2e000e22, 0x2e000e22},
9598 - {0x0000a538, 0x3b025e45, 0x3b025e45, 0x31000e24, 0x31000e24},
9599 - {0x0000a53c, 0x41025e4a, 0x41025e4a, 0x34001640, 0x34001640},
9600 - {0x0000a540, 0x48025e6c, 0x48025e6c, 0x38001660, 0x38001660},
9601 - {0x0000a544, 0x4e025e8e, 0x4e025e8e, 0x3b001861, 0x3b001861},
9602 - {0x0000a548, 0x55025eb3, 0x55025eb3, 0x3e001a81, 0x3e001a81},
9603 - {0x0000a54c, 0x58025ef3, 0x58025ef3, 0x42001a83, 0x42001a83},
9604 - {0x0000a550, 0x5d025ef6, 0x5d025ef6, 0x44001a84, 0x44001a84},
9605 - {0x0000a554, 0x62025f56, 0x62025f56, 0x48001ce3, 0x48001ce3},
9606 - {0x0000a558, 0x66027f56, 0x66027f56, 0x4c001ce5, 0x4c001ce5},
9607 - {0x0000a55c, 0x6a029f56, 0x6a029f56, 0x50001ce9, 0x50001ce9},
9608 - {0x0000a560, 0x70049f56, 0x70049f56, 0x54001ceb, 0x54001ceb},
9609 - {0x0000a564, 0x751ffff6, 0x751ffff6, 0x56001eec, 0x56001eec},
9610 - {0x0000a568, 0x751ffff6, 0x751ffff6, 0x58001ef0, 0x58001ef0},
9611 - {0x0000a56c, 0x751ffff6, 0x751ffff6, 0x5a001ef4, 0x5a001ef4},
9612 - {0x0000a570, 0x751ffff6, 0x751ffff6, 0x5c001ff6, 0x5c001ff6},
9613 - {0x0000a574, 0x751ffff6, 0x751ffff6, 0x5c001ff6, 0x5c001ff6},
9614 - {0x0000a578, 0x751ffff6, 0x751ffff6, 0x5c001ff6, 0x5c001ff6},
9615 - {0x0000a57c, 0x751ffff6, 0x751ffff6, 0x5c001ff6, 0x5c001ff6},
9616 - {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9617 - {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9618 - {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9619 - {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9620 - {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
9621 - {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
9622 - {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
9623 - {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
9624 - {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
9625 - {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
9626 - {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
9627 - {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9628 - {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9629 - {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9630 - {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9631 - {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9632 - {0x0000b2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
9633 - {0x0000b2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
9634 - {0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
9635 - {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
9636 - {0x00016044, 0x056d82e4, 0x056d82e4, 0x056d82e4, 0x056d82e4},
9637 - {0x00016048, 0x8db49060, 0x8db49060, 0x8db49060, 0x8db49060},
9638 - {0x00016054, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
9639 - {0x00016444, 0x056d82e4, 0x056d82e4, 0x056d82e4, 0x056d82e4},
9640 - {0x00016448, 0x8db49000, 0x8db49000, 0x8db49000, 0x8db49000},
9641 - {0x00016454, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
9642 -};
9643 -
9644 -static const u32 ar9462_2p1_modes_mix_ob_db_tx_gain[][5] = {
9645 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
9646 - {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
9647 - {0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
9648 - {0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
9649 - {0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
9650 - {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
9651 - {0x0000a410, 0x0000d0da, 0x0000d0da, 0x0000d0de, 0x0000d0de},
9652 - {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9653 - {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
9654 - {0x0000a504, 0x06002223, 0x06002223, 0x04000002, 0x04000002},
9655 - {0x0000a508, 0x0a022220, 0x0a022220, 0x08000004, 0x08000004},
9656 - {0x0000a50c, 0x0f022223, 0x0f022223, 0x0b000200, 0x0b000200},
9657 - {0x0000a510, 0x14022620, 0x14022620, 0x0f000202, 0x0f000202},
9658 - {0x0000a514, 0x18022622, 0x18022622, 0x12000400, 0x12000400},
9659 - {0x0000a518, 0x1b022822, 0x1b022822, 0x16000402, 0x16000402},
9660 - {0x0000a51c, 0x20022842, 0x20022842, 0x19000404, 0x19000404},
9661 - {0x0000a520, 0x22022c41, 0x22022c41, 0x1c000603, 0x1c000603},
9662 - {0x0000a524, 0x28023042, 0x28023042, 0x21000a02, 0x21000a02},
9663 - {0x0000a528, 0x2c023044, 0x2c023044, 0x25000a04, 0x25000a04},
9664 - {0x0000a52c, 0x2f023644, 0x2f023644, 0x28000a20, 0x28000a20},
9665 - {0x0000a530, 0x34025643, 0x34025643, 0x2c000e20, 0x2c000e20},
9666 - {0x0000a534, 0x38025a44, 0x38025a44, 0x30000e22, 0x30000e22},
9667 - {0x0000a538, 0x3b025e45, 0x3b025e45, 0x34000e24, 0x34000e24},
9668 - {0x0000a53c, 0x41025e4a, 0x41025e4a, 0x38001640, 0x38001640},
9669 - {0x0000a540, 0x48025e6c, 0x48025e6c, 0x3c001660, 0x3c001660},
9670 - {0x0000a544, 0x4e025e8e, 0x4e025e8e, 0x3f001861, 0x3f001861},
9671 - {0x0000a548, 0x55025eb3, 0x55025eb3, 0x43001a81, 0x43001a81},
9672 - {0x0000a54c, 0x58025ef3, 0x58025ef3, 0x47001a83, 0x47001a83},
9673 - {0x0000a550, 0x5d025ef6, 0x5d025ef6, 0x4a001c84, 0x4a001c84},
9674 - {0x0000a554, 0x62025f56, 0x62025f56, 0x4e001ce3, 0x4e001ce3},
9675 - {0x0000a558, 0x66027f56, 0x66027f56, 0x52001ce5, 0x52001ce5},
9676 - {0x0000a55c, 0x6a029f56, 0x6a029f56, 0x56001ce9, 0x56001ce9},
9677 - {0x0000a560, 0x70049f56, 0x70049f56, 0x5a001ceb, 0x5a001ceb},
9678 - {0x0000a564, 0x751ffff6, 0x751ffff6, 0x5c001eec, 0x5c001eec},
9679 - {0x0000a568, 0x751ffff6, 0x751ffff6, 0x5e001ef0, 0x5e001ef0},
9680 - {0x0000a56c, 0x751ffff6, 0x751ffff6, 0x60001ef4, 0x60001ef4},
9681 - {0x0000a570, 0x751ffff6, 0x751ffff6, 0x62001ff6, 0x62001ff6},
9682 - {0x0000a574, 0x751ffff6, 0x751ffff6, 0x62001ff6, 0x62001ff6},
9683 - {0x0000a578, 0x751ffff6, 0x751ffff6, 0x62001ff6, 0x62001ff6},
9684 - {0x0000a57c, 0x751ffff6, 0x751ffff6, 0x62001ff6, 0x62001ff6},
9685 - {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9686 - {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9687 - {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9688 - {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9689 - {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
9690 - {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
9691 - {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
9692 - {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
9693 - {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
9694 - {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
9695 - {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
9696 - {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9697 - {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9698 - {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9699 - {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9700 - {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
9701 - {0x0000b2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
9702 - {0x0000b2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
9703 - {0x0000b2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
9704 - {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
9705 -};
9706 -
9707 -static const u32 ar9462_2p1_modes_fast_clock[][3] = {
9708 - /* Addr 5G_HT20 5G_HT40 */
9709 - {0x00001030, 0x00000268, 0x000004d0},
9710 - {0x00001070, 0x0000018c, 0x00000318},
9711 - {0x000010b0, 0x00000fd0, 0x00001fa0},
9712 - {0x00008014, 0x044c044c, 0x08980898},
9713 - {0x0000801c, 0x148ec02b, 0x148ec057},
9714 - {0x00008318, 0x000044c0, 0x00008980},
9715 - {0x00009e00, 0x0372131c, 0x0372131c},
9716 - {0x0000a230, 0x0000400b, 0x00004016},
9717 - {0x0000a254, 0x00000898, 0x00001130},
9718 -};
9719 -
9720 -static const u32 ar9462_2p1_baseband_core_txfir_coeff_japan_2484[][2] = {
9721 - /* Addr allmodes */
9722 - {0x0000a398, 0x00000000},
9723 - {0x0000a39c, 0x6f7f0301},
9724 - {0x0000a3a0, 0xca9228ee},
9725 -};
9726 -
9727 #endif /* INITVALS_9462_2P1_H */
9728 --- a/drivers/net/wireless/ath/ath9k/ar9485_initvals.h
9729 +++ b/drivers/net/wireless/ath/ath9k/ar9485_initvals.h
9730 @@ -20,24 +20,11 @@
9731
9732 /* AR9485 1.1 */
9733
9734 -static const u32 ar9485_1_1_mac_postamble[][5] = {
9735 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
9736 - {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
9737 - {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
9738 - {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
9739 - {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
9740 - {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
9741 - {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
9742 - {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
9743 - {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
9744 -};
9745 +#define ar9485_modes_lowest_ob_db_tx_gain_1_1 ar9485Modes_low_ob_db_tx_gain_1_1
9746
9747 -static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_disable_L1[][2] = {
9748 - /* Addr allmodes */
9749 - {0x00018c00, 0x18012e5e},
9750 - {0x00018c04, 0x000801d8},
9751 - {0x00018c08, 0x0000080c},
9752 -};
9753 +#define ar9485_1_1_mac_postamble ar9331_1p1_mac_postamble
9754 +
9755 +#define ar9485_1_1_baseband_core_txfir_coeff_japan_2484 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
9756
9757 static const u32 ar9485Common_wo_xlna_rx_gain_1_1[][2] = {
9758 /* Addr allmodes */
9759 @@ -553,100 +540,6 @@ static const u32 ar9485Modes_low_ob_db_t
9760 {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
9761 };
9762
9763 -static const u32 ar9485_modes_lowest_ob_db_tx_gain_1_1[][5] = {
9764 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
9765 - {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
9766 - {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0x7999a83a, 0x7999a83a},
9767 - {0x0000a2dc, 0x00000000, 0x00000000, 0xfe2d3552, 0xfe2d3552},
9768 - {0x0000a2e0, 0x00000000, 0x00000000, 0xfe2d3552, 0xfe2d3552},
9769 - {0x0000a2e4, 0x00000000, 0x00000000, 0xfe2d3552, 0xfe2d3552},
9770 - {0x0000a2e8, 0x00000000, 0x00000000, 0xfe2d3552, 0xfe2d3552},
9771 - {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d8, 0x000050d8},
9772 - {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9773 - {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
9774 - {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
9775 - {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
9776 - {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
9777 - {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
9778 - {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
9779 - {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
9780 - {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
9781 - {0x0000a520, 0x2f001f04, 0x2f001f04, 0x21000603, 0x21000603},
9782 - {0x0000a524, 0x35001fc4, 0x35001fc4, 0x25000605, 0x25000605},
9783 - {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2a000a03, 0x2a000a03},
9784 - {0x0000a52c, 0x41023e85, 0x41023e85, 0x2c000a04, 0x2c000a04},
9785 - {0x0000a530, 0x48023ec6, 0x48023ec6, 0x34000e20, 0x34000e20},
9786 - {0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000e21, 0x35000e21},
9787 - {0x0000a538, 0x53023f4b, 0x53023f4b, 0x43000e62, 0x43000e62},
9788 - {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x45000e63, 0x45000e63},
9789 - {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x49000e65, 0x49000e65},
9790 - {0x0000a544, 0x6502feca, 0x6502feca, 0x4b000e66, 0x4b000e66},
9791 - {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x4d001645, 0x4d001645},
9792 - {0x0000a54c, 0x7203feca, 0x7203feca, 0x51001865, 0x51001865},
9793 - {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x55001a86, 0x55001a86},
9794 - {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x57001ce9, 0x57001ce9},
9795 - {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x5a001ceb, 0x5a001ceb},
9796 - {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x5e001eeb, 0x5e001eeb},
9797 - {0x0000a560, 0x900fff0b, 0x900fff0b, 0x5e001eeb, 0x5e001eeb},
9798 - {0x0000a564, 0x960fffcb, 0x960fffcb, 0x5e001eeb, 0x5e001eeb},
9799 - {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
9800 - {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
9801 - {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
9802 - {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
9803 - {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
9804 - {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x5e001eeb, 0x5e001eeb},
9805 - {0x0000a580, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9806 - {0x0000a584, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9807 - {0x0000a588, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9808 - {0x0000a58c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9809 - {0x0000a590, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9810 - {0x0000a594, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9811 - {0x0000a598, 0x00000000, 0x00000000, 0x01404501, 0x01404501},
9812 - {0x0000a59c, 0x00000000, 0x00000000, 0x02808a02, 0x02808a02},
9813 - {0x0000a5a0, 0x00000000, 0x00000000, 0x02808a02, 0x02808a02},
9814 - {0x0000a5a4, 0x00000000, 0x00000000, 0x02808803, 0x02808803},
9815 - {0x0000a5a8, 0x00000000, 0x00000000, 0x04c14b04, 0x04c14b04},
9816 - {0x0000a5ac, 0x00000000, 0x00000000, 0x04c15305, 0x04c15305},
9817 - {0x0000a5b0, 0x00000000, 0x00000000, 0x04c15305, 0x04c15305},
9818 - {0x0000a5b4, 0x00000000, 0x00000000, 0x04c15305, 0x04c15305},
9819 - {0x0000a5b8, 0x00000000, 0x00000000, 0x04c15305, 0x04c15305},
9820 - {0x0000a5bc, 0x00000000, 0x00000000, 0x04c15305, 0x04c15305},
9821 - {0x0000b500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9822 - {0x0000b504, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9823 - {0x0000b508, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9824 - {0x0000b50c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9825 - {0x0000b510, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9826 - {0x0000b514, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9827 - {0x0000b518, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9828 - {0x0000b51c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9829 - {0x0000b520, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9830 - {0x0000b524, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9831 - {0x0000b528, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9832 - {0x0000b52c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9833 - {0x0000b530, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9834 - {0x0000b534, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9835 - {0x0000b538, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9836 - {0x0000b53c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9837 - {0x0000b540, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9838 - {0x0000b544, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9839 - {0x0000b548, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9840 - {0x0000b54c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9841 - {0x0000b550, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9842 - {0x0000b554, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9843 - {0x0000b558, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9844 - {0x0000b55c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9845 - {0x0000b560, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9846 - {0x0000b564, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9847 - {0x0000b568, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9848 - {0x0000b56c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9849 - {0x0000b570, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9850 - {0x0000b574, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9851 - {0x0000b578, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9852 - {0x0000b57c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9853 - {0x00016044, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db, 0x05d6b2db},
9854 - {0x00016048, 0x6c924260, 0x6c924260, 0x6c924260, 0x6c924260},
9855 -};
9856 -
9857 static const u32 ar9485Modes_green_spur_ob_db_tx_gain_1_1[][5] = {
9858 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
9859 {0x000098bc, 0x00000003, 0x00000003, 0x00000003, 0x00000003},
9860 @@ -1101,20 +994,6 @@ static const u32 ar9485_common_rx_gain_1
9861 {0x0000a1fc, 0x00000296},
9862 };
9863
9864 -static const u32 ar9485_1_1_pcie_phy_pll_on_clkreq_enable_L1[][2] = {
9865 - /* Addr allmodes */
9866 - {0x00018c00, 0x18052e5e},
9867 - {0x00018c04, 0x000801d8},
9868 - {0x00018c08, 0x0000080c},
9869 -};
9870 -
9871 -static const u32 ar9485_1_1_pcie_phy_clkreq_enable_L1[][2] = {
9872 - /* Addr allmodes */
9873 - {0x00018c00, 0x18053e5e},
9874 - {0x00018c04, 0x000801d8},
9875 - {0x00018c08, 0x0000080c},
9876 -};
9877 -
9878 static const u32 ar9485_1_1_soc_preamble[][2] = {
9879 /* Addr allmodes */
9880 {0x00004014, 0xba280400},
9881 @@ -1173,13 +1052,6 @@ static const u32 ar9485_1_1_baseband_pos
9882 {0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
9883 };
9884
9885 -static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = {
9886 - /* Addr allmodes */
9887 - {0x00018c00, 0x18013e5e},
9888 - {0x00018c04, 0x000801d8},
9889 - {0x00018c08, 0x0000080c},
9890 -};
9891 -
9892 static const u32 ar9485_1_1_radio_postamble[][2] = {
9893 /* Addr allmodes */
9894 {0x0001609c, 0x0b283f31},
9895 @@ -1351,11 +1223,18 @@ static const u32 ar9485_1_1_mac_core[][2
9896 {0x000083d0, 0x000301ff},
9897 };
9898
9899 -static const u32 ar9485_1_1_baseband_core_txfir_coeff_japan_2484[][2] = {
9900 +static const u32 ar9485_1_1_pcie_phy_clkreq_disable_L1[][2] = {
9901 /* Addr allmodes */
9902 - {0x0000a398, 0x00000000},
9903 - {0x0000a39c, 0x6f7f0301},
9904 - {0x0000a3a0, 0xca9228ee},
9905 + {0x00018c00, 0x18013e5e},
9906 + {0x00018c04, 0x000801d8},
9907 + {0x00018c08, 0x0000080c},
9908 +};
9909 +
9910 +static const u32 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1[][2] = {
9911 + /* Addr allmodes */
9912 + {0x00018c00, 0x1801265e},
9913 + {0x00018c04, 0x000801d8},
9914 + {0x00018c08, 0x0000080c},
9915 };
9916
9917 #endif /* INITVALS_9485_H */
9918 --- a/drivers/net/wireless/ath/ath9k/pci.c
9919 +++ b/drivers/net/wireless/ath/ath9k/pci.c
9920 @@ -195,6 +195,93 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_i
9921 0x3219),
9922 .driver_data = ATH9K_PCI_BT_ANT_DIV },
9923
9924 + /* AR9485 cards with PLL power-save disabled by default. */
9925 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9926 + 0x0032,
9927 + PCI_VENDOR_ID_AZWAVE,
9928 + 0x2C97),
9929 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9930 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9931 + 0x0032,
9932 + PCI_VENDOR_ID_AZWAVE,
9933 + 0x2100),
9934 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9935 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9936 + 0x0032,
9937 + 0x1C56, /* ASKEY */
9938 + 0x4001),
9939 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9940 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9941 + 0x0032,
9942 + 0x11AD, /* LITEON */
9943 + 0x6627),
9944 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9945 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9946 + 0x0032,
9947 + 0x11AD, /* LITEON */
9948 + 0x6628),
9949 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9950 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9951 + 0x0032,
9952 + PCI_VENDOR_ID_FOXCONN,
9953 + 0xE04E),
9954 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9955 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9956 + 0x0032,
9957 + PCI_VENDOR_ID_FOXCONN,
9958 + 0xE04F),
9959 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9960 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9961 + 0x0032,
9962 + 0x144F, /* ASKEY */
9963 + 0x7197),
9964 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9965 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9966 + 0x0032,
9967 + 0x1B9A, /* XAVI */
9968 + 0x2000),
9969 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9970 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9971 + 0x0032,
9972 + 0x1B9A, /* XAVI */
9973 + 0x2001),
9974 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9975 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9976 + 0x0032,
9977 + PCI_VENDOR_ID_AZWAVE,
9978 + 0x1186),
9979 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9980 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9981 + 0x0032,
9982 + PCI_VENDOR_ID_AZWAVE,
9983 + 0x1F86),
9984 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9985 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9986 + 0x0032,
9987 + PCI_VENDOR_ID_AZWAVE,
9988 + 0x1195),
9989 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9990 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9991 + 0x0032,
9992 + PCI_VENDOR_ID_AZWAVE,
9993 + 0x1F95),
9994 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
9995 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
9996 + 0x0032,
9997 + 0x1B9A, /* XAVI */
9998 + 0x1C00),
9999 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
10000 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
10001 + 0x0032,
10002 + 0x1B9A, /* XAVI */
10003 + 0x1C01),
10004 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
10005 + { PCI_DEVICE_SUB(PCI_VENDOR_ID_ATHEROS,
10006 + 0x0032,
10007 + PCI_VENDOR_ID_ASUSTEK,
10008 + 0x850D),
10009 + .driver_data = ATH9K_PCI_NO_PLL_PWRSAVE },
10010 +
10011 { PCI_VDEVICE(ATHEROS, 0x0032) }, /* PCI-E AR9485 */
10012 { PCI_VDEVICE(ATHEROS, 0x0033) }, /* PCI-E AR9580 */
10013
10014 --- a/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h
10015 +++ b/drivers/net/wireless/ath/ath9k/ar9462_2p0_initvals.h
10016 @@ -20,7 +20,15 @@
10017
10018 /* AR9462 2.0 */
10019
10020 -static const u32 ar9462_modes_fast_clock_2p0[][3] = {
10021 +#define ar9462_2p0_mac_postamble ar9331_1p1_mac_postamble
10022 +
10023 +#define ar9462_2p0_common_wo_xlna_rx_gain ar9300Common_wo_xlna_rx_gain_table_2p2
10024 +
10025 +#define ar9462_2p0_common_5g_xlna_only_rxgain ar9462_2p0_common_mixed_rx_gain
10026 +
10027 +#define ar9462_2p0_baseband_core_txfir_coeff_japan_2484 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
10028 +
10029 +static const u32 ar9462_2p0_modes_fast_clock[][3] = {
10030 /* Addr 5G_HT20 5G_HT40 */
10031 {0x00001030, 0x00000268, 0x000004d0},
10032 {0x00001070, 0x0000018c, 0x00000318},
10033 @@ -33,13 +41,6 @@ static const u32 ar9462_modes_fast_clock
10034 {0x0000a254, 0x00000898, 0x00001130},
10035 };
10036
10037 -static const u32 ar9462_pciephy_clkreq_enable_L1_2p0[][2] = {
10038 - /* Addr allmodes */
10039 - {0x00018c00, 0x18253ede},
10040 - {0x00018c04, 0x000801d8},
10041 - {0x00018c08, 0x0003780c},
10042 -};
10043 -
10044 static const u32 ar9462_2p0_baseband_postamble[][5] = {
10045 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10046 {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a800d},
10047 @@ -99,7 +100,7 @@ static const u32 ar9462_2p0_baseband_pos
10048 {0x0000b284, 0x00000000, 0x00000000, 0x00000550, 0x00000550},
10049 };
10050
10051 -static const u32 ar9462_common_rx_gain_table_2p0[][2] = {
10052 +static const u32 ar9462_2p0_common_rx_gain[][2] = {
10053 /* Addr allmodes */
10054 {0x0000a000, 0x00010000},
10055 {0x0000a004, 0x00030002},
10056 @@ -359,20 +360,13 @@ static const u32 ar9462_common_rx_gain_t
10057 {0x0000b1fc, 0x00000196},
10058 };
10059
10060 -static const u32 ar9462_pciephy_clkreq_disable_L1_2p0[][2] = {
10061 +static const u32 ar9462_2p0_pciephy_clkreq_disable_L1[][2] = {
10062 /* Addr allmodes */
10063 {0x00018c00, 0x18213ede},
10064 {0x00018c04, 0x000801d8},
10065 {0x00018c08, 0x0003780c},
10066 };
10067
10068 -static const u32 ar9462_pciephy_pll_on_clkreq_disable_L1_2p0[][2] = {
10069 - /* Addr allmodes */
10070 - {0x00018c00, 0x18212ede},
10071 - {0x00018c04, 0x000801d8},
10072 - {0x00018c08, 0x0003780c},
10073 -};
10074 -
10075 static const u32 ar9462_2p0_radio_postamble_sys2ant[][5] = {
10076 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10077 {0x000160ac, 0xa4646c08, 0xa4646c08, 0x24645808, 0x24645808},
10078 @@ -380,348 +374,81 @@ static const u32 ar9462_2p0_radio_postam
10079 {0x00016540, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
10080 };
10081
10082 -static const u32 ar9462_common_wo_xlna_rx_gain_table_2p0[][2] = {
10083 - /* Addr allmodes */
10084 - {0x0000a000, 0x00010000},
10085 - {0x0000a004, 0x00030002},
10086 - {0x0000a008, 0x00050004},
10087 - {0x0000a00c, 0x00810080},
10088 - {0x0000a010, 0x00830082},
10089 - {0x0000a014, 0x01810180},
10090 - {0x0000a018, 0x01830182},
10091 - {0x0000a01c, 0x01850184},
10092 - {0x0000a020, 0x01890188},
10093 - {0x0000a024, 0x018b018a},
10094 - {0x0000a028, 0x018d018c},
10095 - {0x0000a02c, 0x03820190},
10096 - {0x0000a030, 0x03840383},
10097 - {0x0000a034, 0x03880385},
10098 - {0x0000a038, 0x038a0389},
10099 - {0x0000a03c, 0x038c038b},
10100 - {0x0000a040, 0x0390038d},
10101 - {0x0000a044, 0x03920391},
10102 - {0x0000a048, 0x03940393},
10103 - {0x0000a04c, 0x03960395},
10104 - {0x0000a050, 0x00000000},
10105 - {0x0000a054, 0x00000000},
10106 - {0x0000a058, 0x00000000},
10107 - {0x0000a05c, 0x00000000},
10108 - {0x0000a060, 0x00000000},
10109 - {0x0000a064, 0x00000000},
10110 - {0x0000a068, 0x00000000},
10111 - {0x0000a06c, 0x00000000},
10112 - {0x0000a070, 0x00000000},
10113 - {0x0000a074, 0x00000000},
10114 - {0x0000a078, 0x00000000},
10115 - {0x0000a07c, 0x00000000},
10116 - {0x0000a080, 0x29292929},
10117 - {0x0000a084, 0x29292929},
10118 - {0x0000a088, 0x29292929},
10119 - {0x0000a08c, 0x29292929},
10120 - {0x0000a090, 0x22292929},
10121 - {0x0000a094, 0x1d1d2222},
10122 - {0x0000a098, 0x0c111117},
10123 - {0x0000a09c, 0x00030303},
10124 - {0x0000a0a0, 0x00000000},
10125 - {0x0000a0a4, 0x00000000},
10126 - {0x0000a0a8, 0x00000000},
10127 - {0x0000a0ac, 0x00000000},
10128 - {0x0000a0b0, 0x00000000},
10129 - {0x0000a0b4, 0x00000000},
10130 - {0x0000a0b8, 0x00000000},
10131 - {0x0000a0bc, 0x00000000},
10132 - {0x0000a0c0, 0x001f0000},
10133 - {0x0000a0c4, 0x01000101},
10134 - {0x0000a0c8, 0x011e011f},
10135 - {0x0000a0cc, 0x011c011d},
10136 - {0x0000a0d0, 0x02030204},
10137 - {0x0000a0d4, 0x02010202},
10138 - {0x0000a0d8, 0x021f0200},
10139 - {0x0000a0dc, 0x0302021e},
10140 - {0x0000a0e0, 0x03000301},
10141 - {0x0000a0e4, 0x031e031f},
10142 - {0x0000a0e8, 0x0402031d},
10143 - {0x0000a0ec, 0x04000401},
10144 - {0x0000a0f0, 0x041e041f},
10145 - {0x0000a0f4, 0x0502041d},
10146 - {0x0000a0f8, 0x05000501},
10147 - {0x0000a0fc, 0x051e051f},
10148 - {0x0000a100, 0x06010602},
10149 - {0x0000a104, 0x061f0600},
10150 - {0x0000a108, 0x061d061e},
10151 - {0x0000a10c, 0x07020703},
10152 - {0x0000a110, 0x07000701},
10153 - {0x0000a114, 0x00000000},
10154 - {0x0000a118, 0x00000000},
10155 - {0x0000a11c, 0x00000000},
10156 - {0x0000a120, 0x00000000},
10157 - {0x0000a124, 0x00000000},
10158 - {0x0000a128, 0x00000000},
10159 - {0x0000a12c, 0x00000000},
10160 - {0x0000a130, 0x00000000},
10161 - {0x0000a134, 0x00000000},
10162 - {0x0000a138, 0x00000000},
10163 - {0x0000a13c, 0x00000000},
10164 - {0x0000a140, 0x001f0000},
10165 - {0x0000a144, 0x01000101},
10166 - {0x0000a148, 0x011e011f},
10167 - {0x0000a14c, 0x011c011d},
10168 - {0x0000a150, 0x02030204},
10169 - {0x0000a154, 0x02010202},
10170 - {0x0000a158, 0x021f0200},
10171 - {0x0000a15c, 0x0302021e},
10172 - {0x0000a160, 0x03000301},
10173 - {0x0000a164, 0x031e031f},
10174 - {0x0000a168, 0x0402031d},
10175 - {0x0000a16c, 0x04000401},
10176 - {0x0000a170, 0x041e041f},
10177 - {0x0000a174, 0x0502041d},
10178 - {0x0000a178, 0x05000501},
10179 - {0x0000a17c, 0x051e051f},
10180 - {0x0000a180, 0x06010602},
10181 - {0x0000a184, 0x061f0600},
10182 - {0x0000a188, 0x061d061e},
10183 - {0x0000a18c, 0x07020703},
10184 - {0x0000a190, 0x07000701},
10185 - {0x0000a194, 0x00000000},
10186 - {0x0000a198, 0x00000000},
10187 - {0x0000a19c, 0x00000000},
10188 - {0x0000a1a0, 0x00000000},
10189 - {0x0000a1a4, 0x00000000},
10190 - {0x0000a1a8, 0x00000000},
10191 - {0x0000a1ac, 0x00000000},
10192 - {0x0000a1b0, 0x00000000},
10193 - {0x0000a1b4, 0x00000000},
10194 - {0x0000a1b8, 0x00000000},
10195 - {0x0000a1bc, 0x00000000},
10196 - {0x0000a1c0, 0x00000000},
10197 - {0x0000a1c4, 0x00000000},
10198 - {0x0000a1c8, 0x00000000},
10199 - {0x0000a1cc, 0x00000000},
10200 - {0x0000a1d0, 0x00000000},
10201 - {0x0000a1d4, 0x00000000},
10202 - {0x0000a1d8, 0x00000000},
10203 - {0x0000a1dc, 0x00000000},
10204 - {0x0000a1e0, 0x00000000},
10205 - {0x0000a1e4, 0x00000000},
10206 - {0x0000a1e8, 0x00000000},
10207 - {0x0000a1ec, 0x00000000},
10208 - {0x0000a1f0, 0x00000396},
10209 - {0x0000a1f4, 0x00000396},
10210 - {0x0000a1f8, 0x00000396},
10211 - {0x0000a1fc, 0x00000196},
10212 - {0x0000b000, 0x00010000},
10213 - {0x0000b004, 0x00030002},
10214 - {0x0000b008, 0x00050004},
10215 - {0x0000b00c, 0x00810080},
10216 - {0x0000b010, 0x00830082},
10217 - {0x0000b014, 0x01810180},
10218 - {0x0000b018, 0x01830182},
10219 - {0x0000b01c, 0x01850184},
10220 - {0x0000b020, 0x02810280},
10221 - {0x0000b024, 0x02830282},
10222 - {0x0000b028, 0x02850284},
10223 - {0x0000b02c, 0x02890288},
10224 - {0x0000b030, 0x028b028a},
10225 - {0x0000b034, 0x0388028c},
10226 - {0x0000b038, 0x038a0389},
10227 - {0x0000b03c, 0x038c038b},
10228 - {0x0000b040, 0x0390038d},
10229 - {0x0000b044, 0x03920391},
10230 - {0x0000b048, 0x03940393},
10231 - {0x0000b04c, 0x03960395},
10232 - {0x0000b050, 0x00000000},
10233 - {0x0000b054, 0x00000000},
10234 - {0x0000b058, 0x00000000},
10235 - {0x0000b05c, 0x00000000},
10236 - {0x0000b060, 0x00000000},
10237 - {0x0000b064, 0x00000000},
10238 - {0x0000b068, 0x00000000},
10239 - {0x0000b06c, 0x00000000},
10240 - {0x0000b070, 0x00000000},
10241 - {0x0000b074, 0x00000000},
10242 - {0x0000b078, 0x00000000},
10243 - {0x0000b07c, 0x00000000},
10244 - {0x0000b080, 0x32323232},
10245 - {0x0000b084, 0x2f2f3232},
10246 - {0x0000b088, 0x23282a2d},
10247 - {0x0000b08c, 0x1c1e2123},
10248 - {0x0000b090, 0x14171919},
10249 - {0x0000b094, 0x0e0e1214},
10250 - {0x0000b098, 0x03050707},
10251 - {0x0000b09c, 0x00030303},
10252 - {0x0000b0a0, 0x00000000},
10253 - {0x0000b0a4, 0x00000000},
10254 - {0x0000b0a8, 0x00000000},
10255 - {0x0000b0ac, 0x00000000},
10256 - {0x0000b0b0, 0x00000000},
10257 - {0x0000b0b4, 0x00000000},
10258 - {0x0000b0b8, 0x00000000},
10259 - {0x0000b0bc, 0x00000000},
10260 - {0x0000b0c0, 0x003f0020},
10261 - {0x0000b0c4, 0x00400041},
10262 - {0x0000b0c8, 0x0140005f},
10263 - {0x0000b0cc, 0x0160015f},
10264 - {0x0000b0d0, 0x017e017f},
10265 - {0x0000b0d4, 0x02410242},
10266 - {0x0000b0d8, 0x025f0240},
10267 - {0x0000b0dc, 0x027f0260},
10268 - {0x0000b0e0, 0x0341027e},
10269 - {0x0000b0e4, 0x035f0340},
10270 - {0x0000b0e8, 0x037f0360},
10271 - {0x0000b0ec, 0x04400441},
10272 - {0x0000b0f0, 0x0460045f},
10273 - {0x0000b0f4, 0x0541047f},
10274 - {0x0000b0f8, 0x055f0540},
10275 - {0x0000b0fc, 0x057f0560},
10276 - {0x0000b100, 0x06400641},
10277 - {0x0000b104, 0x0660065f},
10278 - {0x0000b108, 0x067e067f},
10279 - {0x0000b10c, 0x07410742},
10280 - {0x0000b110, 0x075f0740},
10281 - {0x0000b114, 0x077f0760},
10282 - {0x0000b118, 0x07800781},
10283 - {0x0000b11c, 0x07a0079f},
10284 - {0x0000b120, 0x07c107bf},
10285 - {0x0000b124, 0x000007c0},
10286 - {0x0000b128, 0x00000000},
10287 - {0x0000b12c, 0x00000000},
10288 - {0x0000b130, 0x00000000},
10289 - {0x0000b134, 0x00000000},
10290 - {0x0000b138, 0x00000000},
10291 - {0x0000b13c, 0x00000000},
10292 - {0x0000b140, 0x003f0020},
10293 - {0x0000b144, 0x00400041},
10294 - {0x0000b148, 0x0140005f},
10295 - {0x0000b14c, 0x0160015f},
10296 - {0x0000b150, 0x017e017f},
10297 - {0x0000b154, 0x02410242},
10298 - {0x0000b158, 0x025f0240},
10299 - {0x0000b15c, 0x027f0260},
10300 - {0x0000b160, 0x0341027e},
10301 - {0x0000b164, 0x035f0340},
10302 - {0x0000b168, 0x037f0360},
10303 - {0x0000b16c, 0x04400441},
10304 - {0x0000b170, 0x0460045f},
10305 - {0x0000b174, 0x0541047f},
10306 - {0x0000b178, 0x055f0540},
10307 - {0x0000b17c, 0x057f0560},
10308 - {0x0000b180, 0x06400641},
10309 - {0x0000b184, 0x0660065f},
10310 - {0x0000b188, 0x067e067f},
10311 - {0x0000b18c, 0x07410742},
10312 - {0x0000b190, 0x075f0740},
10313 - {0x0000b194, 0x077f0760},
10314 - {0x0000b198, 0x07800781},
10315 - {0x0000b19c, 0x07a0079f},
10316 - {0x0000b1a0, 0x07c107bf},
10317 - {0x0000b1a4, 0x000007c0},
10318 - {0x0000b1a8, 0x00000000},
10319 - {0x0000b1ac, 0x00000000},
10320 - {0x0000b1b0, 0x00000000},
10321 - {0x0000b1b4, 0x00000000},
10322 - {0x0000b1b8, 0x00000000},
10323 - {0x0000b1bc, 0x00000000},
10324 - {0x0000b1c0, 0x00000000},
10325 - {0x0000b1c4, 0x00000000},
10326 - {0x0000b1c8, 0x00000000},
10327 - {0x0000b1cc, 0x00000000},
10328 - {0x0000b1d0, 0x00000000},
10329 - {0x0000b1d4, 0x00000000},
10330 - {0x0000b1d8, 0x00000000},
10331 - {0x0000b1dc, 0x00000000},
10332 - {0x0000b1e0, 0x00000000},
10333 - {0x0000b1e4, 0x00000000},
10334 - {0x0000b1e8, 0x00000000},
10335 - {0x0000b1ec, 0x00000000},
10336 - {0x0000b1f0, 0x00000396},
10337 - {0x0000b1f4, 0x00000396},
10338 - {0x0000b1f8, 0x00000396},
10339 - {0x0000b1fc, 0x00000196},
10340 -};
10341 -
10342 -static const u32 ar9462_2p0_baseband_core_txfir_coeff_japan_2484[][2] = {
10343 - /* Addr allmodes */
10344 - {0x0000a398, 0x00000000},
10345 - {0x0000a39c, 0x6f7f0301},
10346 - {0x0000a3a0, 0xca9228ee},
10347 -};
10348 -
10349 -static const u32 ar9462_modes_low_ob_db_tx_gain_table_2p0[][5] = {
10350 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10351 - {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
10352 - {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
10353 - {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
10354 - {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
10355 - {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
10356 - {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
10357 - {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10358 - {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10359 - {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
10360 - {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
10361 - {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
10362 - {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
10363 - {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400},
10364 - {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402},
10365 - {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404},
10366 - {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603},
10367 - {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02},
10368 - {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04},
10369 - {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20},
10370 - {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20},
10371 - {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22},
10372 - {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24},
10373 - {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640},
10374 - {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},
10375 - {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},
10376 - {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81},
10377 - {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83},
10378 - {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84},
10379 - {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3},
10380 - {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5},
10381 - {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9},
10382 - {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb},
10383 - {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10384 - {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10385 - {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10386 - {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10387 - {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10388 - {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10389 - {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10390 - {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10391 - {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10392 - {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10393 - {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10394 - {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10395 - {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
10396 - {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
10397 - {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
10398 - {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
10399 - {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
10400 - {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
10401 - {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
10402 - {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10403 - {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10404 - {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10405 - {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10406 - {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
10407 - {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
10408 - {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
10409 - {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
10410 - {0x00016044, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
10411 - {0x00016048, 0x64992060, 0x64992060, 0x64992060, 0x64992060},
10412 - {0x00016054, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
10413 - {0x00016444, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
10414 - {0x00016448, 0x64992000, 0x64992000, 0x64992000, 0x64992000},
10415 - {0x00016454, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
10416 -};
10417 -
10418 -static const u32 ar9462_2p0_soc_postamble[][5] = {
10419 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10420 - {0x00007010, 0x00000033, 0x00000033, 0x00000033, 0x00000033},
10421 -};
10422 -
10423 -static const u32 ar9462_2p0_baseband_core[][2] = {
10424 +static const u32 ar9462_2p0_modes_low_ob_db_tx_gain[][5] = {
10425 + /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10426 + {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
10427 + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
10428 + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
10429 + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
10430 + {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
10431 + {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
10432 + {0x0000a458, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10433 + {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10434 + {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
10435 + {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
10436 + {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
10437 + {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
10438 + {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400},
10439 + {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402},
10440 + {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404},
10441 + {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603},
10442 + {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02},
10443 + {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04},
10444 + {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20},
10445 + {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20},
10446 + {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22},
10447 + {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24},
10448 + {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640},
10449 + {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},
10450 + {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},
10451 + {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81},
10452 + {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83},
10453 + {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84},
10454 + {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3},
10455 + {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5},
10456 + {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9},
10457 + {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb},
10458 + {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10459 + {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10460 + {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10461 + {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10462 + {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10463 + {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10464 + {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
10465 + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10466 + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10467 + {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10468 + {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10469 + {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10470 + {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
10471 + {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
10472 + {0x0000a61c, 0x02008802, 0x02008802, 0x02008501, 0x02008501},
10473 + {0x0000a620, 0x0300cc03, 0x0300cc03, 0x0280ca03, 0x0280ca03},
10474 + {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
10475 + {0x0000a628, 0x0300cc03, 0x0300cc03, 0x04014c04, 0x04014c04},
10476 + {0x0000a62c, 0x03810c03, 0x03810c03, 0x04015005, 0x04015005},
10477 + {0x0000a630, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10478 + {0x0000a634, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10479 + {0x0000a638, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10480 + {0x0000a63c, 0x03810e04, 0x03810e04, 0x04015005, 0x04015005},
10481 + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
10482 + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
10483 + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
10484 + {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
10485 + {0x00016044, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
10486 + {0x00016048, 0x64992060, 0x64992060, 0x64992060, 0x64992060},
10487 + {0x00016054, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
10488 + {0x00016444, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
10489 + {0x00016448, 0x64992000, 0x64992000, 0x64992000, 0x64992000},
10490 + {0x00016454, 0x6db60000, 0x6db60000, 0x6db60000, 0x6db60000},
10491 +};
10492 +
10493 +static const u32 ar9462_2p0_soc_postamble[][5] = {
10494 + /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10495 + {0x00007010, 0x00000033, 0x00000033, 0x00000033, 0x00000033},
10496 +};
10497 +
10498 +static const u32 ar9462_2p0_baseband_core[][2] = {
10499 /* Addr allmodes */
10500 {0x00009800, 0xafe68e30},
10501 {0x00009804, 0xfd14e000},
10502 @@ -879,7 +606,7 @@ static const u32 ar9462_2p0_radio_postam
10503 {0x0001650c, 0x48000000, 0x40000000, 0x40000000, 0x40000000},
10504 };
10505
10506 -static const u32 ar9462_modes_mix_ob_db_tx_gain_table_2p0[][5] = {
10507 +static const u32 ar9462_2p0_modes_mix_ob_db_tx_gain[][5] = {
10508 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10509 {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
10510 {0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
10511 @@ -942,7 +669,7 @@ static const u32 ar9462_modes_mix_ob_db_
10512 {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
10513 };
10514
10515 -static const u32 ar9462_modes_high_ob_db_tx_gain_table_2p0[][5] = {
10516 +static const u32 ar9462_2p0_modes_high_ob_db_tx_gain[][5] = {
10517 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10518 {0x000098bc, 0x00000002, 0x00000002, 0x00000002, 0x00000002},
10519 {0x0000a2dc, 0x01feee00, 0x01feee00, 0x03aaa352, 0x03aaa352},
10520 @@ -1240,19 +967,7 @@ static const u32 ar9462_2p0_mac_core[][2
10521 {0x000083d0, 0x000301ff},
10522 };
10523
10524 -static const u32 ar9462_2p0_mac_postamble[][5] = {
10525 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10526 - {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
10527 - {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
10528 - {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
10529 - {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
10530 - {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
10531 - {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
10532 - {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
10533 - {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
10534 -};
10535 -
10536 -static const u32 ar9462_common_mixed_rx_gain_table_2p0[][2] = {
10537 +static const u32 ar9462_2p0_common_mixed_rx_gain[][2] = {
10538 /* Addr allmodes */
10539 {0x0000a000, 0x00010000},
10540 {0x0000a004, 0x00030002},
10541 @@ -1517,266 +1232,6 @@ static const u32 ar9462_2p0_baseband_pos
10542 {0x00009e3c, 0xcf946220, 0xcf946220, 0xcfd5c782, 0xcfd5c282},
10543 };
10544
10545 -static const u32 ar9462_2p0_5g_xlna_only_rxgain[][2] = {
10546 - /* Addr allmodes */
10547 - {0x0000a000, 0x00010000},
10548 - {0x0000a004, 0x00030002},
10549 - {0x0000a008, 0x00050004},
10550 - {0x0000a00c, 0x00810080},
10551 - {0x0000a010, 0x00830082},
10552 - {0x0000a014, 0x01810180},
10553 - {0x0000a018, 0x01830182},
10554 - {0x0000a01c, 0x01850184},
10555 - {0x0000a020, 0x01890188},
10556 - {0x0000a024, 0x018b018a},
10557 - {0x0000a028, 0x018d018c},
10558 - {0x0000a02c, 0x03820190},
10559 - {0x0000a030, 0x03840383},
10560 - {0x0000a034, 0x03880385},
10561 - {0x0000a038, 0x038a0389},
10562 - {0x0000a03c, 0x038c038b},
10563 - {0x0000a040, 0x0390038d},
10564 - {0x0000a044, 0x03920391},
10565 - {0x0000a048, 0x03940393},
10566 - {0x0000a04c, 0x03960395},
10567 - {0x0000a050, 0x00000000},
10568 - {0x0000a054, 0x00000000},
10569 - {0x0000a058, 0x00000000},
10570 - {0x0000a05c, 0x00000000},
10571 - {0x0000a060, 0x00000000},
10572 - {0x0000a064, 0x00000000},
10573 - {0x0000a068, 0x00000000},
10574 - {0x0000a06c, 0x00000000},
10575 - {0x0000a070, 0x00000000},
10576 - {0x0000a074, 0x00000000},
10577 - {0x0000a078, 0x00000000},
10578 - {0x0000a07c, 0x00000000},
10579 - {0x0000a080, 0x29292929},
10580 - {0x0000a084, 0x29292929},
10581 - {0x0000a088, 0x29292929},
10582 - {0x0000a08c, 0x29292929},
10583 - {0x0000a090, 0x22292929},
10584 - {0x0000a094, 0x1d1d2222},
10585 - {0x0000a098, 0x0c111117},
10586 - {0x0000a09c, 0x00030303},
10587 - {0x0000a0a0, 0x00000000},
10588 - {0x0000a0a4, 0x00000000},
10589 - {0x0000a0a8, 0x00000000},
10590 - {0x0000a0ac, 0x00000000},
10591 - {0x0000a0b0, 0x00000000},
10592 - {0x0000a0b4, 0x00000000},
10593 - {0x0000a0b8, 0x00000000},
10594 - {0x0000a0bc, 0x00000000},
10595 - {0x0000a0c0, 0x001f0000},
10596 - {0x0000a0c4, 0x01000101},
10597 - {0x0000a0c8, 0x011e011f},
10598 - {0x0000a0cc, 0x011c011d},
10599 - {0x0000a0d0, 0x02030204},
10600 - {0x0000a0d4, 0x02010202},
10601 - {0x0000a0d8, 0x021f0200},
10602 - {0x0000a0dc, 0x0302021e},
10603 - {0x0000a0e0, 0x03000301},
10604 - {0x0000a0e4, 0x031e031f},
10605 - {0x0000a0e8, 0x0402031d},
10606 - {0x0000a0ec, 0x04000401},
10607 - {0x0000a0f0, 0x041e041f},
10608 - {0x0000a0f4, 0x0502041d},
10609 - {0x0000a0f8, 0x05000501},
10610 - {0x0000a0fc, 0x051e051f},
10611 - {0x0000a100, 0x06010602},
10612 - {0x0000a104, 0x061f0600},
10613 - {0x0000a108, 0x061d061e},
10614 - {0x0000a10c, 0x07020703},
10615 - {0x0000a110, 0x07000701},
10616 - {0x0000a114, 0x00000000},
10617 - {0x0000a118, 0x00000000},
10618 - {0x0000a11c, 0x00000000},
10619 - {0x0000a120, 0x00000000},
10620 - {0x0000a124, 0x00000000},
10621 - {0x0000a128, 0x00000000},
10622 - {0x0000a12c, 0x00000000},
10623 - {0x0000a130, 0x00000000},
10624 - {0x0000a134, 0x00000000},
10625 - {0x0000a138, 0x00000000},
10626 - {0x0000a13c, 0x00000000},
10627 - {0x0000a140, 0x001f0000},
10628 - {0x0000a144, 0x01000101},
10629 - {0x0000a148, 0x011e011f},
10630 - {0x0000a14c, 0x011c011d},
10631 - {0x0000a150, 0x02030204},
10632 - {0x0000a154, 0x02010202},
10633 - {0x0000a158, 0x021f0200},
10634 - {0x0000a15c, 0x0302021e},
10635 - {0x0000a160, 0x03000301},
10636 - {0x0000a164, 0x031e031f},
10637 - {0x0000a168, 0x0402031d},
10638 - {0x0000a16c, 0x04000401},
10639 - {0x0000a170, 0x041e041f},
10640 - {0x0000a174, 0x0502041d},
10641 - {0x0000a178, 0x05000501},
10642 - {0x0000a17c, 0x051e051f},
10643 - {0x0000a180, 0x06010602},
10644 - {0x0000a184, 0x061f0600},
10645 - {0x0000a188, 0x061d061e},
10646 - {0x0000a18c, 0x07020703},
10647 - {0x0000a190, 0x07000701},
10648 - {0x0000a194, 0x00000000},
10649 - {0x0000a198, 0x00000000},
10650 - {0x0000a19c, 0x00000000},
10651 - {0x0000a1a0, 0x00000000},
10652 - {0x0000a1a4, 0x00000000},
10653 - {0x0000a1a8, 0x00000000},
10654 - {0x0000a1ac, 0x00000000},
10655 - {0x0000a1b0, 0x00000000},
10656 - {0x0000a1b4, 0x00000000},
10657 - {0x0000a1b8, 0x00000000},
10658 - {0x0000a1bc, 0x00000000},
10659 - {0x0000a1c0, 0x00000000},
10660 - {0x0000a1c4, 0x00000000},
10661 - {0x0000a1c8, 0x00000000},
10662 - {0x0000a1cc, 0x00000000},
10663 - {0x0000a1d0, 0x00000000},
10664 - {0x0000a1d4, 0x00000000},
10665 - {0x0000a1d8, 0x00000000},
10666 - {0x0000a1dc, 0x00000000},
10667 - {0x0000a1e0, 0x00000000},
10668 - {0x0000a1e4, 0x00000000},
10669 - {0x0000a1e8, 0x00000000},
10670 - {0x0000a1ec, 0x00000000},
10671 - {0x0000a1f0, 0x00000396},
10672 - {0x0000a1f4, 0x00000396},
10673 - {0x0000a1f8, 0x00000396},
10674 - {0x0000a1fc, 0x00000196},
10675 - {0x0000b000, 0x00010000},
10676 - {0x0000b004, 0x00030002},
10677 - {0x0000b008, 0x00050004},
10678 - {0x0000b00c, 0x00810080},
10679 - {0x0000b010, 0x00830082},
10680 - {0x0000b014, 0x01810180},
10681 - {0x0000b018, 0x01830182},
10682 - {0x0000b01c, 0x01850184},
10683 - {0x0000b020, 0x02810280},
10684 - {0x0000b024, 0x02830282},
10685 - {0x0000b028, 0x02850284},
10686 - {0x0000b02c, 0x02890288},
10687 - {0x0000b030, 0x028b028a},
10688 - {0x0000b034, 0x0388028c},
10689 - {0x0000b038, 0x038a0389},
10690 - {0x0000b03c, 0x038c038b},
10691 - {0x0000b040, 0x0390038d},
10692 - {0x0000b044, 0x03920391},
10693 - {0x0000b048, 0x03940393},
10694 - {0x0000b04c, 0x03960395},
10695 - {0x0000b050, 0x00000000},
10696 - {0x0000b054, 0x00000000},
10697 - {0x0000b058, 0x00000000},
10698 - {0x0000b05c, 0x00000000},
10699 - {0x0000b060, 0x00000000},
10700 - {0x0000b064, 0x00000000},
10701 - {0x0000b068, 0x00000000},
10702 - {0x0000b06c, 0x00000000},
10703 - {0x0000b070, 0x00000000},
10704 - {0x0000b074, 0x00000000},
10705 - {0x0000b078, 0x00000000},
10706 - {0x0000b07c, 0x00000000},
10707 - {0x0000b080, 0x2a2d2f32},
10708 - {0x0000b084, 0x21232328},
10709 - {0x0000b088, 0x19191c1e},
10710 - {0x0000b08c, 0x12141417},
10711 - {0x0000b090, 0x07070e0e},
10712 - {0x0000b094, 0x03030305},
10713 - {0x0000b098, 0x00000003},
10714 - {0x0000b09c, 0x00000000},
10715 - {0x0000b0a0, 0x00000000},
10716 - {0x0000b0a4, 0x00000000},
10717 - {0x0000b0a8, 0x00000000},
10718 - {0x0000b0ac, 0x00000000},
10719 - {0x0000b0b0, 0x00000000},
10720 - {0x0000b0b4, 0x00000000},
10721 - {0x0000b0b8, 0x00000000},
10722 - {0x0000b0bc, 0x00000000},
10723 - {0x0000b0c0, 0x003f0020},
10724 - {0x0000b0c4, 0x00400041},
10725 - {0x0000b0c8, 0x0140005f},
10726 - {0x0000b0cc, 0x0160015f},
10727 - {0x0000b0d0, 0x017e017f},
10728 - {0x0000b0d4, 0x02410242},
10729 - {0x0000b0d8, 0x025f0240},
10730 - {0x0000b0dc, 0x027f0260},
10731 - {0x0000b0e0, 0x0341027e},
10732 - {0x0000b0e4, 0x035f0340},
10733 - {0x0000b0e8, 0x037f0360},
10734 - {0x0000b0ec, 0x04400441},
10735 - {0x0000b0f0, 0x0460045f},
10736 - {0x0000b0f4, 0x0541047f},
10737 - {0x0000b0f8, 0x055f0540},
10738 - {0x0000b0fc, 0x057f0560},
10739 - {0x0000b100, 0x06400641},
10740 - {0x0000b104, 0x0660065f},
10741 - {0x0000b108, 0x067e067f},
10742 - {0x0000b10c, 0x07410742},
10743 - {0x0000b110, 0x075f0740},
10744 - {0x0000b114, 0x077f0760},
10745 - {0x0000b118, 0x07800781},
10746 - {0x0000b11c, 0x07a0079f},
10747 - {0x0000b120, 0x07c107bf},
10748 - {0x0000b124, 0x000007c0},
10749 - {0x0000b128, 0x00000000},
10750 - {0x0000b12c, 0x00000000},
10751 - {0x0000b130, 0x00000000},
10752 - {0x0000b134, 0x00000000},
10753 - {0x0000b138, 0x00000000},
10754 - {0x0000b13c, 0x00000000},
10755 - {0x0000b140, 0x003f0020},
10756 - {0x0000b144, 0x00400041},
10757 - {0x0000b148, 0x0140005f},
10758 - {0x0000b14c, 0x0160015f},
10759 - {0x0000b150, 0x017e017f},
10760 - {0x0000b154, 0x02410242},
10761 - {0x0000b158, 0x025f0240},
10762 - {0x0000b15c, 0x027f0260},
10763 - {0x0000b160, 0x0341027e},
10764 - {0x0000b164, 0x035f0340},
10765 - {0x0000b168, 0x037f0360},
10766 - {0x0000b16c, 0x04400441},
10767 - {0x0000b170, 0x0460045f},
10768 - {0x0000b174, 0x0541047f},
10769 - {0x0000b178, 0x055f0540},
10770 - {0x0000b17c, 0x057f0560},
10771 - {0x0000b180, 0x06400641},
10772 - {0x0000b184, 0x0660065f},
10773 - {0x0000b188, 0x067e067f},
10774 - {0x0000b18c, 0x07410742},
10775 - {0x0000b190, 0x075f0740},
10776 - {0x0000b194, 0x077f0760},
10777 - {0x0000b198, 0x07800781},
10778 - {0x0000b19c, 0x07a0079f},
10779 - {0x0000b1a0, 0x07c107bf},
10780 - {0x0000b1a4, 0x000007c0},
10781 - {0x0000b1a8, 0x00000000},
10782 - {0x0000b1ac, 0x00000000},
10783 - {0x0000b1b0, 0x00000000},
10784 - {0x0000b1b4, 0x00000000},
10785 - {0x0000b1b8, 0x00000000},
10786 - {0x0000b1bc, 0x00000000},
10787 - {0x0000b1c0, 0x00000000},
10788 - {0x0000b1c4, 0x00000000},
10789 - {0x0000b1c8, 0x00000000},
10790 - {0x0000b1cc, 0x00000000},
10791 - {0x0000b1d0, 0x00000000},
10792 - {0x0000b1d4, 0x00000000},
10793 - {0x0000b1d8, 0x00000000},
10794 - {0x0000b1dc, 0x00000000},
10795 - {0x0000b1e0, 0x00000000},
10796 - {0x0000b1e4, 0x00000000},
10797 - {0x0000b1e8, 0x00000000},
10798 - {0x0000b1ec, 0x00000000},
10799 - {0x0000b1f0, 0x00000396},
10800 - {0x0000b1f4, 0x00000396},
10801 - {0x0000b1f8, 0x00000396},
10802 - {0x0000b1fc, 0x00000196},
10803 -};
10804 -
10805 static const u32 ar9462_2p0_baseband_core_mix_rxgain[][2] = {
10806 /* Addr allmodes */
10807 {0x00009fd0, 0x0a2d6b93},
10808 --- a/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
10809 +++ b/drivers/net/wireless/ath/ath9k/ar9003_2p2_initvals.h
10810 @@ -303,7 +303,7 @@ static const u32 ar9300_2p2_mac_postambl
10811 {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
10812 {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
10813 {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
10814 - {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
10815 + {0x00008120, 0x18f04800, 0x18f04800, 0x18f04810, 0x18f04810},
10816 {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
10817 {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
10818 };
10819 @@ -352,7 +352,7 @@ static const u32 ar9300_2p2_baseband_pos
10820 {0x0000a288, 0x00000110, 0x00000110, 0x00000110, 0x00000110},
10821 {0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222},
10822 {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
10823 - {0x0000a2d0, 0x00041981, 0x00041981, 0x00041981, 0x00041982},
10824 + {0x0000a2d0, 0x00041983, 0x00041983, 0x00041981, 0x00041982},
10825 {0x0000a2d8, 0x7999a83b, 0x7999a83b, 0x7999a83b, 0x7999a83b},
10826 {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10827 {0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
10828 @@ -378,9 +378,9 @@ static const u32 ar9300_2p2_baseband_cor
10829 {0x00009814, 0x9280c00a},
10830 {0x00009818, 0x00000000},
10831 {0x0000981c, 0x00020028},
10832 - {0x00009834, 0x6400a290},
10833 + {0x00009834, 0x6400a190},
10834 {0x00009838, 0x0108ecff},
10835 - {0x0000983c, 0x0d000600},
10836 + {0x0000983c, 0x14000600},
10837 {0x00009880, 0x201fff00},
10838 {0x00009884, 0x00001042},
10839 {0x000098a4, 0x00200400},
10840 @@ -401,7 +401,7 @@ static const u32 ar9300_2p2_baseband_cor
10841 {0x00009d04, 0x40206c10},
10842 {0x00009d08, 0x009c4060},
10843 {0x00009d0c, 0x9883800a},
10844 - {0x00009d10, 0x01834061},
10845 + {0x00009d10, 0x01884061},
10846 {0x00009d14, 0x00c0040b},
10847 {0x00009d18, 0x00000000},
10848 {0x00009e08, 0x0038230c},
10849 @@ -459,7 +459,7 @@ static const u32 ar9300_2p2_baseband_cor
10850 {0x0000a3e8, 0x20202020},
10851 {0x0000a3ec, 0x20202020},
10852 {0x0000a3f0, 0x00000000},
10853 - {0x0000a3f4, 0x00000246},
10854 + {0x0000a3f4, 0x00000000},
10855 {0x0000a3f8, 0x0c9bd380},
10856 {0x0000a3fc, 0x000f0f01},
10857 {0x0000a400, 0x8fa91f01},
10858 @@ -534,107 +534,107 @@ static const u32 ar9300_2p2_baseband_cor
10859
10860 static const u32 ar9300Modes_high_power_tx_gain_table_2p2[][5] = {
10861 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
10862 - {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
10863 - {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
10864 - {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
10865 + {0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
10866 + {0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
10867 + {0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
10868 {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
10869 - {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
10870 - {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
10871 - {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
10872 - {0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004},
10873 - {0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200},
10874 - {0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202},
10875 - {0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400},
10876 - {0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402},
10877 - {0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404},
10878 - {0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603},
10879 - {0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02},
10880 - {0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04},
10881 - {0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20},
10882 - {0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20},
10883 - {0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22},
10884 - {0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24},
10885 - {0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640},
10886 - {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},
10887 - {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},
10888 - {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81},
10889 - {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},
10890 - {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},
10891 - {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},
10892 - {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5},
10893 - {0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9},
10894 - {0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb},
10895 - {0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
10896 - {0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
10897 - {0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
10898 - {0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
10899 - {0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
10900 - {0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
10901 - {0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
10902 - {0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000},
10903 - {0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002},
10904 - {0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004},
10905 - {0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200},
10906 - {0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202},
10907 - {0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400},
10908 - {0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402},
10909 - {0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404},
10910 - {0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603},
10911 - {0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02},
10912 - {0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04},
10913 - {0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20},
10914 - {0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20},
10915 - {0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22},
10916 - {0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24},
10917 - {0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640},
10918 - {0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660},
10919 - {0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861},
10920 - {0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81},
10921 - {0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83},
10922 - {0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84},
10923 - {0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3},
10924 - {0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5},
10925 - {0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9},
10926 - {0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb},
10927 - {0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
10928 - {0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
10929 - {0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
10930 - {0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
10931 - {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
10932 - {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
10933 - {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
10934 + {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
10935 + {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
10936 + {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
10937 + {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
10938 + {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
10939 + {0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202},
10940 + {0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400},
10941 + {0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402},
10942 + {0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404},
10943 + {0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603},
10944 + {0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02},
10945 + {0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04},
10946 + {0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20},
10947 + {0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20},
10948 + {0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22},
10949 + {0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24},
10950 + {0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640},
10951 + {0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660},
10952 + {0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861},
10953 + {0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81},
10954 + {0x0000a54c, 0x5e08442e, 0x5e08442e, 0x47001a83, 0x47001a83},
10955 + {0x0000a550, 0x620a4431, 0x620a4431, 0x4a001c84, 0x4a001c84},
10956 + {0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3},
10957 + {0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5},
10958 + {0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9},
10959 + {0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb},
10960 + {0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
10961 + {0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
10962 + {0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
10963 + {0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
10964 + {0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
10965 + {0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
10966 + {0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
10967 + {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
10968 + {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},
10969 + {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},
10970 + {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200},
10971 + {0x0000a590, 0x15800028, 0x15800028, 0x0f800202, 0x0f800202},
10972 + {0x0000a594, 0x1b80002b, 0x1b80002b, 0x12800400, 0x12800400},
10973 + {0x0000a598, 0x1f820028, 0x1f820028, 0x16800402, 0x16800402},
10974 + {0x0000a59c, 0x2582002b, 0x2582002b, 0x19800404, 0x19800404},
10975 + {0x0000a5a0, 0x2a84002a, 0x2a84002a, 0x1c800603, 0x1c800603},
10976 + {0x0000a5a4, 0x2e86002a, 0x2e86002a, 0x21800a02, 0x21800a02},
10977 + {0x0000a5a8, 0x3382202d, 0x3382202d, 0x25800a04, 0x25800a04},
10978 + {0x0000a5ac, 0x3884202c, 0x3884202c, 0x28800a20, 0x28800a20},
10979 + {0x0000a5b0, 0x3c86202c, 0x3c86202c, 0x2c800e20, 0x2c800e20},
10980 + {0x0000a5b4, 0x4188202d, 0x4188202d, 0x30800e22, 0x30800e22},
10981 + {0x0000a5b8, 0x4586402d, 0x4586402d, 0x34800e24, 0x34800e24},
10982 + {0x0000a5bc, 0x4986222d, 0x4986222d, 0x38801640, 0x38801640},
10983 + {0x0000a5c0, 0x4d862231, 0x4d862231, 0x3c801660, 0x3c801660},
10984 + {0x0000a5c4, 0x50882231, 0x50882231, 0x3f801861, 0x3f801861},
10985 + {0x0000a5c8, 0x5688422e, 0x5688422e, 0x43801a81, 0x43801a81},
10986 + {0x0000a5cc, 0x5e88442e, 0x5e88442e, 0x47801a83, 0x47801a83},
10987 + {0x0000a5d0, 0x628a4431, 0x628a4431, 0x4a801c84, 0x4a801c84},
10988 + {0x0000a5d4, 0x648a4432, 0x648a4432, 0x4e801ce3, 0x4e801ce3},
10989 + {0x0000a5d8, 0x688a4434, 0x688a4434, 0x52801ce5, 0x52801ce5},
10990 + {0x0000a5dc, 0x6c8a6434, 0x6c8a6434, 0x56801ce9, 0x56801ce9},
10991 + {0x0000a5e0, 0x6f8a6633, 0x6f8a6633, 0x5a801ceb, 0x5a801ceb},
10992 + {0x0000a5e4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
10993 + {0x0000a5e8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
10994 + {0x0000a5ec, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
10995 + {0x0000a5f0, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
10996 + {0x0000a5f4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
10997 + {0x0000a5f8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
10998 + {0x0000a5fc, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
10999 {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11000 {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11001 - {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11002 - {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11003 - {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
11004 - {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
11005 - {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
11006 - {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
11007 - {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
11008 - {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
11009 - {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
11010 - {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
11011 - {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
11012 - {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
11013 - {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
11014 - {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
11015 - {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
11016 - {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
11017 - {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
11018 + {0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
11019 + {0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
11020 + {0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
11021 + {0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000},
11022 + {0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501},
11023 + {0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501},
11024 + {0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03},
11025 + {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
11026 + {0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04},
11027 + {0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11028 + {0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11029 + {0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11030 + {0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11031 + {0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11032 + {0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
11033 + {0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
11034 + {0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
11035 {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
11036 - {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
11037 - {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
11038 - {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
11039 + {0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
11040 + {0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
11041 + {0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
11042 {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
11043 {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
11044 - {0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
11045 + {0x00016048, 0x61200001, 0x61200001, 0x66480001, 0x66480001},
11046 {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11047 {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
11048 - {0x00016448, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
11049 + {0x00016448, 0x61200001, 0x61200001, 0x66480001, 0x66480001},
11050 {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11051 {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
11052 - {0x00016848, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
11053 + {0x00016848, 0x61200001, 0x61200001, 0x66480001, 0x66480001},
11054 {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11055 };
11056
11057 @@ -644,7 +644,7 @@ static const u32 ar9300Modes_high_ob_db_
11058 {0x0000a2e0, 0x0000f000, 0x0000f000, 0x03ccc584, 0x03ccc584},
11059 {0x0000a2e4, 0x01ff0000, 0x01ff0000, 0x03f0f800, 0x03f0f800},
11060 {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
11061 - {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
11062 + {0x0000a410, 0x000050d4, 0x000050d4, 0x000050d9, 0x000050d9},
11063 {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
11064 {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
11065 {0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004},
11066 @@ -1086,8 +1086,8 @@ static const u32 ar9300Common_rx_gain_ta
11067 {0x0000b074, 0x00000000},
11068 {0x0000b078, 0x00000000},
11069 {0x0000b07c, 0x00000000},
11070 - {0x0000b080, 0x2a2d2f32},
11071 - {0x0000b084, 0x21232328},
11072 + {0x0000b080, 0x23232323},
11073 + {0x0000b084, 0x21232323},
11074 {0x0000b088, 0x19191c1e},
11075 {0x0000b08c, 0x12141417},
11076 {0x0000b090, 0x07070e0e},
11077 @@ -1385,9 +1385,9 @@ static const u32 ar9300_2p2_mac_core[][2
11078 {0x000081f8, 0x00000000},
11079 {0x000081fc, 0x00000000},
11080 {0x00008240, 0x00100000},
11081 - {0x00008244, 0x0010f424},
11082 + {0x00008244, 0x0010f400},
11083 {0x00008248, 0x00000800},
11084 - {0x0000824c, 0x0001e848},
11085 + {0x0000824c, 0x0001e800},
11086 {0x00008250, 0x00000000},
11087 {0x00008254, 0x00000000},
11088 {0x00008258, 0x00000000},
11089 @@ -1726,16 +1726,30 @@ static const u32 ar9300PciePhy_pll_on_cl
11090
11091 static const u32 ar9300PciePhy_clkreq_enable_L1_2p2[][2] = {
11092 /* Addr allmodes */
11093 - {0x00004040, 0x08253e5e},
11094 + {0x00004040, 0x0825365e},
11095 {0x00004040, 0x0008003b},
11096 {0x00004044, 0x00000000},
11097 };
11098
11099 static const u32 ar9300PciePhy_clkreq_disable_L1_2p2[][2] = {
11100 /* Addr allmodes */
11101 - {0x00004040, 0x08213e5e},
11102 + {0x00004040, 0x0821365e},
11103 {0x00004040, 0x0008003b},
11104 {0x00004044, 0x00000000},
11105 };
11106
11107 +static const u32 ar9300_2p2_baseband_core_txfir_coeff_japan_2484[][2] = {
11108 + /* Addr allmodes */
11109 + {0x0000a398, 0x00000000},
11110 + {0x0000a39c, 0x6f7f0301},
11111 + {0x0000a3a0, 0xca9228ee},
11112 +};
11113 +
11114 +static const u32 ar9300_2p2_baseband_postamble_dfs_channel[][3] = {
11115 + /* Addr 5G 2G */
11116 + {0x00009824, 0x5ac668d0, 0x5ac668d0},
11117 + {0x00009e0c, 0x6d4000e2, 0x6d4000e2},
11118 + {0x00009e14, 0x37b9625e, 0x37b9625e},
11119 +};
11120 +
11121 #endif /* INITVALS_9003_2P2_H */
11122 --- /dev/null
11123 +++ b/drivers/net/wireless/ath/ath9k/ar9565_1p1_initvals.h
11124 @@ -0,0 +1,64 @@
11125 +/*
11126 + * Copyright (c) 2010-2011 Atheros Communications Inc.
11127 + * Copyright (c) 2011-2012 Qualcomm Atheros Inc.
11128 + *
11129 + * Permission to use, copy, modify, and/or distribute this software for any
11130 + * purpose with or without fee is hereby granted, provided that the above
11131 + * copyright notice and this permission notice appear in all copies.
11132 + *
11133 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11134 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11135 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11136 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11137 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
11138 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
11139 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
11140 + */
11141 +
11142 +#ifndef INITVALS_9565_1P1_H
11143 +#define INITVALS_9565_1P1_H
11144 +
11145 +/* AR9565 1.1 */
11146 +
11147 +#define ar9565_1p1_mac_core ar9565_1p0_mac_core
11148 +
11149 +#define ar9565_1p1_mac_postamble ar9565_1p0_mac_postamble
11150 +
11151 +#define ar9565_1p1_baseband_core ar9565_1p0_baseband_core
11152 +
11153 +#define ar9565_1p1_baseband_postamble ar9565_1p0_baseband_postamble
11154 +
11155 +#define ar9565_1p1_radio_core ar9565_1p0_radio_core
11156 +
11157 +#define ar9565_1p1_soc_preamble ar9565_1p0_soc_preamble
11158 +
11159 +#define ar9565_1p1_soc_postamble ar9565_1p0_soc_postamble
11160 +
11161 +#define ar9565_1p1_Common_rx_gain_table ar9565_1p0_Common_rx_gain_table
11162 +
11163 +#define ar9565_1p1_Modes_lowest_ob_db_tx_gain_table ar9565_1p0_Modes_lowest_ob_db_tx_gain_table
11164 +
11165 +#define ar9565_1p1_pciephy_clkreq_disable_L1 ar9565_1p0_pciephy_clkreq_disable_L1
11166 +
11167 +#define ar9565_1p1_modes_fast_clock ar9565_1p0_modes_fast_clock
11168 +
11169 +#define ar9565_1p1_common_wo_xlna_rx_gain_table ar9565_1p0_common_wo_xlna_rx_gain_table
11170 +
11171 +#define ar9565_1p1_modes_low_ob_db_tx_gain_table ar9565_1p0_modes_low_ob_db_tx_gain_table
11172 +
11173 +#define ar9565_1p1_modes_high_ob_db_tx_gain_table ar9565_1p0_modes_high_ob_db_tx_gain_table
11174 +
11175 +#define ar9565_1p1_modes_high_power_tx_gain_table ar9565_1p0_modes_high_power_tx_gain_table
11176 +
11177 +#define ar9565_1p1_baseband_core_txfir_coeff_japan_2484 ar9565_1p0_baseband_core_txfir_coeff_japan_2484
11178 +
11179 +static const u32 ar9565_1p1_radio_postamble[][5] = {
11180 + /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11181 + {0x0001609c, 0x0b8ee524, 0x0b8ee524, 0x0b8ee524, 0x0b8ee524},
11182 + {0x000160ac, 0xa4646c08, 0xa4646c08, 0x24645808, 0x24645808},
11183 + {0x000160b0, 0x01d67f70, 0x01d67f70, 0x01d67f70, 0x01d67f70},
11184 + {0x0001610c, 0x40000000, 0x40000000, 0x40000000, 0x40000000},
11185 + {0x00016140, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
11186 +};
11187 +
11188 +#endif /* INITVALS_9565_1P1_H */
11189 --- a/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
11190 +++ b/drivers/net/wireless/ath/ath9k/ar9580_1p0_initvals.h
11191 @@ -20,18 +20,34 @@
11192
11193 /* AR9580 1.0 */
11194
11195 +#define ar9580_1p0_soc_preamble ar9300_2p2_soc_preamble
11196 +
11197 +#define ar9580_1p0_soc_postamble ar9300_2p2_soc_postamble
11198 +
11199 +#define ar9580_1p0_radio_core ar9300_2p2_radio_core
11200 +
11201 +#define ar9580_1p0_mac_postamble ar9300_2p2_mac_postamble
11202 +
11203 +#define ar9580_1p0_wo_xlna_rx_gain_table ar9300Common_wo_xlna_rx_gain_table_2p2
11204 +
11205 +#define ar9580_1p0_type5_tx_gain_table ar9300Modes_type5_tx_gain_table_2p2
11206 +
11207 +#define ar9580_1p0_high_ob_db_tx_gain_table ar9300Modes_high_ob_db_tx_gain_table_2p2
11208 +
11209 #define ar9580_1p0_modes_fast_clock ar9300Modes_fast_clock_2p2
11210
11211 +#define ar9580_1p0_baseband_core_txfir_coeff_japan_2484 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
11212 +
11213 static const u32 ar9580_1p0_radio_postamble[][5] = {
11214 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11215 {0x0001609c, 0x0dd08f29, 0x0dd08f29, 0x0b283f31, 0x0b283f31},
11216 {0x000160ac, 0xa4653c00, 0xa4653c00, 0x24652800, 0x24652800},
11217 {0x000160b0, 0x03284f3e, 0x03284f3e, 0x05d08f20, 0x05d08f20},
11218 - {0x0001610c, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
11219 + {0x0001610c, 0xc8000000, 0xc0000000, 0xc0000000, 0xc0000000},
11220 {0x00016140, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
11221 - {0x0001650c, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
11222 + {0x0001650c, 0xc8000000, 0xc0000000, 0xc0000000, 0xc0000000},
11223 {0x00016540, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
11224 - {0x0001690c, 0x08000000, 0x00000000, 0x00000000, 0x00000000},
11225 + {0x0001690c, 0xc8000000, 0xc0000000, 0xc0000000, 0xc0000000},
11226 {0x00016940, 0x10804008, 0x10804008, 0x50804008, 0x50804008},
11227 };
11228
11229 @@ -41,12 +57,10 @@ static const u32 ar9580_1p0_baseband_cor
11230 {0x00009804, 0xfd14e000},
11231 {0x00009808, 0x9c0a9f6b},
11232 {0x0000980c, 0x04900000},
11233 - {0x00009814, 0x3280c00a},
11234 - {0x00009818, 0x00000000},
11235 {0x0000981c, 0x00020028},
11236 - {0x00009834, 0x6400a290},
11237 + {0x00009834, 0x6400a190},
11238 {0x00009838, 0x0108ecff},
11239 - {0x0000983c, 0x0d000600},
11240 + {0x0000983c, 0x14000600},
11241 {0x00009880, 0x201fff00},
11242 {0x00009884, 0x00001042},
11243 {0x000098a4, 0x00200400},
11244 @@ -67,7 +81,7 @@ static const u32 ar9580_1p0_baseband_cor
11245 {0x00009d04, 0x40206c10},
11246 {0x00009d08, 0x009c4060},
11247 {0x00009d0c, 0x9883800a},
11248 - {0x00009d10, 0x01834061},
11249 + {0x00009d10, 0x01884061},
11250 {0x00009d14, 0x00c0040b},
11251 {0x00009d18, 0x00000000},
11252 {0x00009e08, 0x0038230c},
11253 @@ -198,8 +212,6 @@ static const u32 ar9580_1p0_baseband_cor
11254 {0x0000c420, 0x00000000},
11255 };
11256
11257 -#define ar9580_1p0_mac_postamble ar9300_2p2_mac_postamble
11258 -
11259 static const u32 ar9580_1p0_low_ob_db_tx_gain_table[][5] = {
11260 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11261 {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
11262 @@ -306,7 +318,112 @@ static const u32 ar9580_1p0_low_ob_db_tx
11263 {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11264 };
11265
11266 -#define ar9580_1p0_high_power_tx_gain_table ar9580_1p0_low_ob_db_tx_gain_table
11267 +static const u32 ar9580_1p0_high_power_tx_gain_table[][5] = {
11268 + /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11269 + {0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
11270 + {0x0000a2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
11271 + {0x0000a2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
11272 + {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
11273 + {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
11274 + {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11275 + {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
11276 + {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
11277 + {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
11278 + {0x0000a510, 0x15000028, 0x15000028, 0x0f000202, 0x0f000202},
11279 + {0x0000a514, 0x1b00002b, 0x1b00002b, 0x12000400, 0x12000400},
11280 + {0x0000a518, 0x1f020028, 0x1f020028, 0x16000402, 0x16000402},
11281 + {0x0000a51c, 0x2502002b, 0x2502002b, 0x19000404, 0x19000404},
11282 + {0x0000a520, 0x2a04002a, 0x2a04002a, 0x1c000603, 0x1c000603},
11283 + {0x0000a524, 0x2e06002a, 0x2e06002a, 0x21000a02, 0x21000a02},
11284 + {0x0000a528, 0x3302202d, 0x3302202d, 0x25000a04, 0x25000a04},
11285 + {0x0000a52c, 0x3804202c, 0x3804202c, 0x28000a20, 0x28000a20},
11286 + {0x0000a530, 0x3c06202c, 0x3c06202c, 0x2c000e20, 0x2c000e20},
11287 + {0x0000a534, 0x4108202d, 0x4108202d, 0x30000e22, 0x30000e22},
11288 + {0x0000a538, 0x4506402d, 0x4506402d, 0x34000e24, 0x34000e24},
11289 + {0x0000a53c, 0x4906222d, 0x4906222d, 0x38001640, 0x38001640},
11290 + {0x0000a540, 0x4d062231, 0x4d062231, 0x3c001660, 0x3c001660},
11291 + {0x0000a544, 0x50082231, 0x50082231, 0x3f001861, 0x3f001861},
11292 + {0x0000a548, 0x5608422e, 0x5608422e, 0x43001a81, 0x43001a81},
11293 + {0x0000a54c, 0x5e08442e, 0x5e08442e, 0x47001a83, 0x47001a83},
11294 + {0x0000a550, 0x620a4431, 0x620a4431, 0x4a001c84, 0x4a001c84},
11295 + {0x0000a554, 0x640a4432, 0x640a4432, 0x4e001ce3, 0x4e001ce3},
11296 + {0x0000a558, 0x680a4434, 0x680a4434, 0x52001ce5, 0x52001ce5},
11297 + {0x0000a55c, 0x6c0a6434, 0x6c0a6434, 0x56001ce9, 0x56001ce9},
11298 + {0x0000a560, 0x6f0a6633, 0x6f0a6633, 0x5a001ceb, 0x5a001ceb},
11299 + {0x0000a564, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
11300 + {0x0000a568, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
11301 + {0x0000a56c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
11302 + {0x0000a570, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
11303 + {0x0000a574, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
11304 + {0x0000a578, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
11305 + {0x0000a57c, 0x730c6634, 0x730c6634, 0x5d001eec, 0x5d001eec},
11306 + {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000},
11307 + {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002},
11308 + {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004},
11309 + {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200},
11310 + {0x0000a590, 0x15800028, 0x15800028, 0x0f800202, 0x0f800202},
11311 + {0x0000a594, 0x1b80002b, 0x1b80002b, 0x12800400, 0x12800400},
11312 + {0x0000a598, 0x1f820028, 0x1f820028, 0x16800402, 0x16800402},
11313 + {0x0000a59c, 0x2582002b, 0x2582002b, 0x19800404, 0x19800404},
11314 + {0x0000a5a0, 0x2a84002a, 0x2a84002a, 0x1c800603, 0x1c800603},
11315 + {0x0000a5a4, 0x2e86002a, 0x2e86002a, 0x21800a02, 0x21800a02},
11316 + {0x0000a5a8, 0x3382202d, 0x3382202d, 0x25800a04, 0x25800a04},
11317 + {0x0000a5ac, 0x3884202c, 0x3884202c, 0x28800a20, 0x28800a20},
11318 + {0x0000a5b0, 0x3c86202c, 0x3c86202c, 0x2c800e20, 0x2c800e20},
11319 + {0x0000a5b4, 0x4188202d, 0x4188202d, 0x30800e22, 0x30800e22},
11320 + {0x0000a5b8, 0x4586402d, 0x4586402d, 0x34800e24, 0x34800e24},
11321 + {0x0000a5bc, 0x4986222d, 0x4986222d, 0x38801640, 0x38801640},
11322 + {0x0000a5c0, 0x4d862231, 0x4d862231, 0x3c801660, 0x3c801660},
11323 + {0x0000a5c4, 0x50882231, 0x50882231, 0x3f801861, 0x3f801861},
11324 + {0x0000a5c8, 0x5688422e, 0x5688422e, 0x43801a81, 0x43801a81},
11325 + {0x0000a5cc, 0x5a88442e, 0x5a88442e, 0x47801a83, 0x47801a83},
11326 + {0x0000a5d0, 0x5e8a4431, 0x5e8a4431, 0x4a801c84, 0x4a801c84},
11327 + {0x0000a5d4, 0x648a4432, 0x648a4432, 0x4e801ce3, 0x4e801ce3},
11328 + {0x0000a5d8, 0x688a4434, 0x688a4434, 0x52801ce5, 0x52801ce5},
11329 + {0x0000a5dc, 0x6c8a6434, 0x6c8a6434, 0x56801ce9, 0x56801ce9},
11330 + {0x0000a5e0, 0x6f8a6633, 0x6f8a6633, 0x5a801ceb, 0x5a801ceb},
11331 + {0x0000a5e4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
11332 + {0x0000a5e8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
11333 + {0x0000a5ec, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
11334 + {0x0000a5f0, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
11335 + {0x0000a5f4, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
11336 + {0x0000a5f8, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
11337 + {0x0000a5fc, 0x738c6634, 0x738c6634, 0x5d801eec, 0x5d801eec},
11338 + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11339 + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11340 + {0x0000a608, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
11341 + {0x0000a60c, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
11342 + {0x0000a610, 0x01804601, 0x01804601, 0x00000000, 0x00000000},
11343 + {0x0000a614, 0x01804601, 0x01804601, 0x01404000, 0x01404000},
11344 + {0x0000a618, 0x01804601, 0x01804601, 0x01404501, 0x01404501},
11345 + {0x0000a61c, 0x01804601, 0x01804601, 0x02008501, 0x02008501},
11346 + {0x0000a620, 0x03408d02, 0x03408d02, 0x0280ca03, 0x0280ca03},
11347 + {0x0000a624, 0x0300cc03, 0x0300cc03, 0x03010c04, 0x03010c04},
11348 + {0x0000a628, 0x03410d04, 0x03410d04, 0x04014c04, 0x04014c04},
11349 + {0x0000a62c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11350 + {0x0000a630, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11351 + {0x0000a634, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11352 + {0x0000a638, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11353 + {0x0000a63c, 0x03410d04, 0x03410d04, 0x04015005, 0x04015005},
11354 + {0x0000b2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
11355 + {0x0000b2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
11356 + {0x0000b2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
11357 + {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
11358 + {0x0000c2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
11359 + {0x0000c2e0, 0x000f0000, 0x000f0000, 0x03ccc584, 0x03ccc584},
11360 + {0x0000c2e4, 0x03f00000, 0x03f00000, 0x03f0f800, 0x03f0f800},
11361 + {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
11362 + {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
11363 + {0x00016048, 0x65240001, 0x65240001, 0x66480001, 0x66480001},
11364 + {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11365 + {0x00016288, 0x05a2040a, 0x05a2040a, 0x05a20408, 0x05a20408},
11366 + {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
11367 + {0x00016448, 0x65240001, 0x65240001, 0x66480001, 0x66480001},
11368 + {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11369 + {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
11370 + {0x00016848, 0x65240001, 0x65240001, 0x66480001, 0x66480001},
11371 + {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11372 +};
11373
11374 static const u32 ar9580_1p0_lowest_ob_db_tx_gain_table[][5] = {
11375 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11376 @@ -414,8 +531,6 @@ static const u32 ar9580_1p0_lowest_ob_db
11377 {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11378 };
11379
11380 -#define ar9580_1p0_baseband_core_txfir_coeff_japan_2484 ar9462_2p0_baseband_core_txfir_coeff_japan_2484
11381 -
11382 static const u32 ar9580_1p0_mac_core[][2] = {
11383 /* Addr allmodes */
11384 {0x00000008, 0x00000000},
11385 @@ -679,14 +794,6 @@ static const u32 ar9580_1p0_mixed_ob_db_
11386 {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11387 };
11388
11389 -#define ar9580_1p0_wo_xlna_rx_gain_table ar9300Common_wo_xlna_rx_gain_table_2p2
11390 -
11391 -#define ar9580_1p0_soc_postamble ar9300_2p2_soc_postamble
11392 -
11393 -#define ar9580_1p0_high_ob_db_tx_gain_table ar9300Modes_high_ob_db_tx_gain_table_2p2
11394 -
11395 -#define ar9580_1p0_type5_tx_gain_table ar9300Modes_type5_tx_gain_table_2p2
11396 -
11397 static const u32 ar9580_1p0_type6_tx_gain_table[][5] = {
11398 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11399 {0x0000a2dc, 0x000cfff0, 0x000cfff0, 0x03aaa352, 0x03aaa352},
11400 @@ -761,165 +868,271 @@ static const u32 ar9580_1p0_type6_tx_gai
11401 {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
11402 };
11403
11404 -static const u32 ar9580_1p0_soc_preamble[][2] = {
11405 +static const u32 ar9580_1p0_rx_gain_table[][2] = {
11406 /* Addr allmodes */
11407 - {0x000040a4, 0x00a0c1c9},
11408 - {0x00007008, 0x00000000},
11409 - {0x00007020, 0x00000000},
11410 - {0x00007034, 0x00000002},
11411 - {0x00007038, 0x000004c2},
11412 - {0x00007048, 0x00000008},
11413 -};
11414 -
11415 -#define ar9580_1p0_rx_gain_table ar9462_common_rx_gain_table_2p0
11416 -
11417 -static const u32 ar9580_1p0_radio_core[][2] = {
11418 - /* Addr allmodes */
11419 - {0x00016000, 0x36db6db6},
11420 - {0x00016004, 0x6db6db40},
11421 - {0x00016008, 0x73f00000},
11422 - {0x0001600c, 0x00000000},
11423 - {0x00016040, 0x7f80fff8},
11424 - {0x0001604c, 0x76d005b5},
11425 - {0x00016050, 0x556cf031},
11426 - {0x00016054, 0x13449440},
11427 - {0x00016058, 0x0c51c92c},
11428 - {0x0001605c, 0x3db7fffc},
11429 - {0x00016060, 0xfffffffc},
11430 - {0x00016064, 0x000f0278},
11431 - {0x0001606c, 0x6db60000},
11432 - {0x00016080, 0x00000000},
11433 - {0x00016084, 0x0e48048c},
11434 - {0x00016088, 0x54214514},
11435 - {0x0001608c, 0x119f481e},
11436 - {0x00016090, 0x24926490},
11437 - {0x00016098, 0xd2888888},
11438 - {0x000160a0, 0x0a108ffe},
11439 - {0x000160a4, 0x812fc370},
11440 - {0x000160a8, 0x423c8000},
11441 - {0x000160b4, 0x92480080},
11442 - {0x000160c0, 0x00adb6d0},
11443 - {0x000160c4, 0x6db6db60},
11444 - {0x000160c8, 0x6db6db6c},
11445 - {0x000160cc, 0x01e6c000},
11446 - {0x00016100, 0x3fffbe01},
11447 - {0x00016104, 0xfff80000},
11448 - {0x00016108, 0x00080010},
11449 - {0x00016144, 0x02084080},
11450 - {0x00016148, 0x00000000},
11451 - {0x00016280, 0x058a0001},
11452 - {0x00016284, 0x3d840208},
11453 - {0x00016288, 0x05a20408},
11454 - {0x0001628c, 0x00038c07},
11455 - {0x00016290, 0x00000004},
11456 - {0x00016294, 0x458aa14f},
11457 - {0x00016380, 0x00000000},
11458 - {0x00016384, 0x00000000},
11459 - {0x00016388, 0x00800700},
11460 - {0x0001638c, 0x00800700},
11461 - {0x00016390, 0x00800700},
11462 - {0x00016394, 0x00000000},
11463 - {0x00016398, 0x00000000},
11464 - {0x0001639c, 0x00000000},
11465 - {0x000163a0, 0x00000001},
11466 - {0x000163a4, 0x00000001},
11467 - {0x000163a8, 0x00000000},
11468 - {0x000163ac, 0x00000000},
11469 - {0x000163b0, 0x00000000},
11470 - {0x000163b4, 0x00000000},
11471 - {0x000163b8, 0x00000000},
11472 - {0x000163bc, 0x00000000},
11473 - {0x000163c0, 0x000000a0},
11474 - {0x000163c4, 0x000c0000},
11475 - {0x000163c8, 0x14021402},
11476 - {0x000163cc, 0x00001402},
11477 - {0x000163d0, 0x00000000},
11478 - {0x000163d4, 0x00000000},
11479 - {0x00016400, 0x36db6db6},
11480 - {0x00016404, 0x6db6db40},
11481 - {0x00016408, 0x73f00000},
11482 - {0x0001640c, 0x00000000},
11483 - {0x00016440, 0x7f80fff8},
11484 - {0x0001644c, 0x76d005b5},
11485 - {0x00016450, 0x556cf031},
11486 - {0x00016454, 0x13449440},
11487 - {0x00016458, 0x0c51c92c},
11488 - {0x0001645c, 0x3db7fffc},
11489 - {0x00016460, 0xfffffffc},
11490 - {0x00016464, 0x000f0278},
11491 - {0x0001646c, 0x6db60000},
11492 - {0x00016500, 0x3fffbe01},
11493 - {0x00016504, 0xfff80000},
11494 - {0x00016508, 0x00080010},
11495 - {0x00016544, 0x02084080},
11496 - {0x00016548, 0x00000000},
11497 - {0x00016780, 0x00000000},
11498 - {0x00016784, 0x00000000},
11499 - {0x00016788, 0x00800700},
11500 - {0x0001678c, 0x00800700},
11501 - {0x00016790, 0x00800700},
11502 - {0x00016794, 0x00000000},
11503 - {0x00016798, 0x00000000},
11504 - {0x0001679c, 0x00000000},
11505 - {0x000167a0, 0x00000001},
11506 - {0x000167a4, 0x00000001},
11507 - {0x000167a8, 0x00000000},
11508 - {0x000167ac, 0x00000000},
11509 - {0x000167b0, 0x00000000},
11510 - {0x000167b4, 0x00000000},
11511 - {0x000167b8, 0x00000000},
11512 - {0x000167bc, 0x00000000},
11513 - {0x000167c0, 0x000000a0},
11514 - {0x000167c4, 0x000c0000},
11515 - {0x000167c8, 0x14021402},
11516 - {0x000167cc, 0x00001402},
11517 - {0x000167d0, 0x00000000},
11518 - {0x000167d4, 0x00000000},
11519 - {0x00016800, 0x36db6db6},
11520 - {0x00016804, 0x6db6db40},
11521 - {0x00016808, 0x73f00000},
11522 - {0x0001680c, 0x00000000},
11523 - {0x00016840, 0x7f80fff8},
11524 - {0x0001684c, 0x76d005b5},
11525 - {0x00016850, 0x556cf031},
11526 - {0x00016854, 0x13449440},
11527 - {0x00016858, 0x0c51c92c},
11528 - {0x0001685c, 0x3db7fffc},
11529 - {0x00016860, 0xfffffffc},
11530 - {0x00016864, 0x000f0278},
11531 - {0x0001686c, 0x6db60000},
11532 - {0x00016900, 0x3fffbe01},
11533 - {0x00016904, 0xfff80000},
11534 - {0x00016908, 0x00080010},
11535 - {0x00016944, 0x02084080},
11536 - {0x00016948, 0x00000000},
11537 - {0x00016b80, 0x00000000},
11538 - {0x00016b84, 0x00000000},
11539 - {0x00016b88, 0x00800700},
11540 - {0x00016b8c, 0x00800700},
11541 - {0x00016b90, 0x00800700},
11542 - {0x00016b94, 0x00000000},
11543 - {0x00016b98, 0x00000000},
11544 - {0x00016b9c, 0x00000000},
11545 - {0x00016ba0, 0x00000001},
11546 - {0x00016ba4, 0x00000001},
11547 - {0x00016ba8, 0x00000000},
11548 - {0x00016bac, 0x00000000},
11549 - {0x00016bb0, 0x00000000},
11550 - {0x00016bb4, 0x00000000},
11551 - {0x00016bb8, 0x00000000},
11552 - {0x00016bbc, 0x00000000},
11553 - {0x00016bc0, 0x000000a0},
11554 - {0x00016bc4, 0x000c0000},
11555 - {0x00016bc8, 0x14021402},
11556 - {0x00016bcc, 0x00001402},
11557 - {0x00016bd0, 0x00000000},
11558 - {0x00016bd4, 0x00000000},
11559 + {0x0000a000, 0x00010000},
11560 + {0x0000a004, 0x00030002},
11561 + {0x0000a008, 0x00050004},
11562 + {0x0000a00c, 0x00810080},
11563 + {0x0000a010, 0x00830082},
11564 + {0x0000a014, 0x01810180},
11565 + {0x0000a018, 0x01830182},
11566 + {0x0000a01c, 0x01850184},
11567 + {0x0000a020, 0x01890188},
11568 + {0x0000a024, 0x018b018a},
11569 + {0x0000a028, 0x018d018c},
11570 + {0x0000a02c, 0x01910190},
11571 + {0x0000a030, 0x01930192},
11572 + {0x0000a034, 0x01950194},
11573 + {0x0000a038, 0x038a0196},
11574 + {0x0000a03c, 0x038c038b},
11575 + {0x0000a040, 0x0390038d},
11576 + {0x0000a044, 0x03920391},
11577 + {0x0000a048, 0x03940393},
11578 + {0x0000a04c, 0x03960395},
11579 + {0x0000a050, 0x00000000},
11580 + {0x0000a054, 0x00000000},
11581 + {0x0000a058, 0x00000000},
11582 + {0x0000a05c, 0x00000000},
11583 + {0x0000a060, 0x00000000},
11584 + {0x0000a064, 0x00000000},
11585 + {0x0000a068, 0x00000000},
11586 + {0x0000a06c, 0x00000000},
11587 + {0x0000a070, 0x00000000},
11588 + {0x0000a074, 0x00000000},
11589 + {0x0000a078, 0x00000000},
11590 + {0x0000a07c, 0x00000000},
11591 + {0x0000a080, 0x22222229},
11592 + {0x0000a084, 0x1d1d1d1d},
11593 + {0x0000a088, 0x1d1d1d1d},
11594 + {0x0000a08c, 0x1d1d1d1d},
11595 + {0x0000a090, 0x171d1d1d},
11596 + {0x0000a094, 0x11111717},
11597 + {0x0000a098, 0x00030311},
11598 + {0x0000a09c, 0x00000000},
11599 + {0x0000a0a0, 0x00000000},
11600 + {0x0000a0a4, 0x00000000},
11601 + {0x0000a0a8, 0x00000000},
11602 + {0x0000a0ac, 0x00000000},
11603 + {0x0000a0b0, 0x00000000},
11604 + {0x0000a0b4, 0x00000000},
11605 + {0x0000a0b8, 0x00000000},
11606 + {0x0000a0bc, 0x00000000},
11607 + {0x0000a0c0, 0x001f0000},
11608 + {0x0000a0c4, 0x01000101},
11609 + {0x0000a0c8, 0x011e011f},
11610 + {0x0000a0cc, 0x011c011d},
11611 + {0x0000a0d0, 0x02030204},
11612 + {0x0000a0d4, 0x02010202},
11613 + {0x0000a0d8, 0x021f0200},
11614 + {0x0000a0dc, 0x0302021e},
11615 + {0x0000a0e0, 0x03000301},
11616 + {0x0000a0e4, 0x031e031f},
11617 + {0x0000a0e8, 0x0402031d},
11618 + {0x0000a0ec, 0x04000401},
11619 + {0x0000a0f0, 0x041e041f},
11620 + {0x0000a0f4, 0x0502041d},
11621 + {0x0000a0f8, 0x05000501},
11622 + {0x0000a0fc, 0x051e051f},
11623 + {0x0000a100, 0x06010602},
11624 + {0x0000a104, 0x061f0600},
11625 + {0x0000a108, 0x061d061e},
11626 + {0x0000a10c, 0x07020703},
11627 + {0x0000a110, 0x07000701},
11628 + {0x0000a114, 0x00000000},
11629 + {0x0000a118, 0x00000000},
11630 + {0x0000a11c, 0x00000000},
11631 + {0x0000a120, 0x00000000},
11632 + {0x0000a124, 0x00000000},
11633 + {0x0000a128, 0x00000000},
11634 + {0x0000a12c, 0x00000000},
11635 + {0x0000a130, 0x00000000},
11636 + {0x0000a134, 0x00000000},
11637 + {0x0000a138, 0x00000000},
11638 + {0x0000a13c, 0x00000000},
11639 + {0x0000a140, 0x001f0000},
11640 + {0x0000a144, 0x01000101},
11641 + {0x0000a148, 0x011e011f},
11642 + {0x0000a14c, 0x011c011d},
11643 + {0x0000a150, 0x02030204},
11644 + {0x0000a154, 0x02010202},
11645 + {0x0000a158, 0x021f0200},
11646 + {0x0000a15c, 0x0302021e},
11647 + {0x0000a160, 0x03000301},
11648 + {0x0000a164, 0x031e031f},
11649 + {0x0000a168, 0x0402031d},
11650 + {0x0000a16c, 0x04000401},
11651 + {0x0000a170, 0x041e041f},
11652 + {0x0000a174, 0x0502041d},
11653 + {0x0000a178, 0x05000501},
11654 + {0x0000a17c, 0x051e051f},
11655 + {0x0000a180, 0x06010602},
11656 + {0x0000a184, 0x061f0600},
11657 + {0x0000a188, 0x061d061e},
11658 + {0x0000a18c, 0x07020703},
11659 + {0x0000a190, 0x07000701},
11660 + {0x0000a194, 0x00000000},
11661 + {0x0000a198, 0x00000000},
11662 + {0x0000a19c, 0x00000000},
11663 + {0x0000a1a0, 0x00000000},
11664 + {0x0000a1a4, 0x00000000},
11665 + {0x0000a1a8, 0x00000000},
11666 + {0x0000a1ac, 0x00000000},
11667 + {0x0000a1b0, 0x00000000},
11668 + {0x0000a1b4, 0x00000000},
11669 + {0x0000a1b8, 0x00000000},
11670 + {0x0000a1bc, 0x00000000},
11671 + {0x0000a1c0, 0x00000000},
11672 + {0x0000a1c4, 0x00000000},
11673 + {0x0000a1c8, 0x00000000},
11674 + {0x0000a1cc, 0x00000000},
11675 + {0x0000a1d0, 0x00000000},
11676 + {0x0000a1d4, 0x00000000},
11677 + {0x0000a1d8, 0x00000000},
11678 + {0x0000a1dc, 0x00000000},
11679 + {0x0000a1e0, 0x00000000},
11680 + {0x0000a1e4, 0x00000000},
11681 + {0x0000a1e8, 0x00000000},
11682 + {0x0000a1ec, 0x00000000},
11683 + {0x0000a1f0, 0x00000396},
11684 + {0x0000a1f4, 0x00000396},
11685 + {0x0000a1f8, 0x00000396},
11686 + {0x0000a1fc, 0x00000196},
11687 + {0x0000b000, 0x00010000},
11688 + {0x0000b004, 0x00030002},
11689 + {0x0000b008, 0x00050004},
11690 + {0x0000b00c, 0x00810080},
11691 + {0x0000b010, 0x00830082},
11692 + {0x0000b014, 0x01810180},
11693 + {0x0000b018, 0x01830182},
11694 + {0x0000b01c, 0x01850184},
11695 + {0x0000b020, 0x02810280},
11696 + {0x0000b024, 0x02830282},
11697 + {0x0000b028, 0x02850284},
11698 + {0x0000b02c, 0x02890288},
11699 + {0x0000b030, 0x028b028a},
11700 + {0x0000b034, 0x0388028c},
11701 + {0x0000b038, 0x038a0389},
11702 + {0x0000b03c, 0x038c038b},
11703 + {0x0000b040, 0x0390038d},
11704 + {0x0000b044, 0x03920391},
11705 + {0x0000b048, 0x03940393},
11706 + {0x0000b04c, 0x03960395},
11707 + {0x0000b050, 0x00000000},
11708 + {0x0000b054, 0x00000000},
11709 + {0x0000b058, 0x00000000},
11710 + {0x0000b05c, 0x00000000},
11711 + {0x0000b060, 0x00000000},
11712 + {0x0000b064, 0x00000000},
11713 + {0x0000b068, 0x00000000},
11714 + {0x0000b06c, 0x00000000},
11715 + {0x0000b070, 0x00000000},
11716 + {0x0000b074, 0x00000000},
11717 + {0x0000b078, 0x00000000},
11718 + {0x0000b07c, 0x00000000},
11719 + {0x0000b080, 0x23232323},
11720 + {0x0000b084, 0x21232323},
11721 + {0x0000b088, 0x19191c1e},
11722 + {0x0000b08c, 0x12141417},
11723 + {0x0000b090, 0x07070e0e},
11724 + {0x0000b094, 0x03030305},
11725 + {0x0000b098, 0x00000003},
11726 + {0x0000b09c, 0x00000000},
11727 + {0x0000b0a0, 0x00000000},
11728 + {0x0000b0a4, 0x00000000},
11729 + {0x0000b0a8, 0x00000000},
11730 + {0x0000b0ac, 0x00000000},
11731 + {0x0000b0b0, 0x00000000},
11732 + {0x0000b0b4, 0x00000000},
11733 + {0x0000b0b8, 0x00000000},
11734 + {0x0000b0bc, 0x00000000},
11735 + {0x0000b0c0, 0x003f0020},
11736 + {0x0000b0c4, 0x00400041},
11737 + {0x0000b0c8, 0x0140005f},
11738 + {0x0000b0cc, 0x0160015f},
11739 + {0x0000b0d0, 0x017e017f},
11740 + {0x0000b0d4, 0x02410242},
11741 + {0x0000b0d8, 0x025f0240},
11742 + {0x0000b0dc, 0x027f0260},
11743 + {0x0000b0e0, 0x0341027e},
11744 + {0x0000b0e4, 0x035f0340},
11745 + {0x0000b0e8, 0x037f0360},
11746 + {0x0000b0ec, 0x04400441},
11747 + {0x0000b0f0, 0x0460045f},
11748 + {0x0000b0f4, 0x0541047f},
11749 + {0x0000b0f8, 0x055f0540},
11750 + {0x0000b0fc, 0x057f0560},
11751 + {0x0000b100, 0x06400641},
11752 + {0x0000b104, 0x0660065f},
11753 + {0x0000b108, 0x067e067f},
11754 + {0x0000b10c, 0x07410742},
11755 + {0x0000b110, 0x075f0740},
11756 + {0x0000b114, 0x077f0760},
11757 + {0x0000b118, 0x07800781},
11758 + {0x0000b11c, 0x07a0079f},
11759 + {0x0000b120, 0x07c107bf},
11760 + {0x0000b124, 0x000007c0},
11761 + {0x0000b128, 0x00000000},
11762 + {0x0000b12c, 0x00000000},
11763 + {0x0000b130, 0x00000000},
11764 + {0x0000b134, 0x00000000},
11765 + {0x0000b138, 0x00000000},
11766 + {0x0000b13c, 0x00000000},
11767 + {0x0000b140, 0x003f0020},
11768 + {0x0000b144, 0x00400041},
11769 + {0x0000b148, 0x0140005f},
11770 + {0x0000b14c, 0x0160015f},
11771 + {0x0000b150, 0x017e017f},
11772 + {0x0000b154, 0x02410242},
11773 + {0x0000b158, 0x025f0240},
11774 + {0x0000b15c, 0x027f0260},
11775 + {0x0000b160, 0x0341027e},
11776 + {0x0000b164, 0x035f0340},
11777 + {0x0000b168, 0x037f0360},
11778 + {0x0000b16c, 0x04400441},
11779 + {0x0000b170, 0x0460045f},
11780 + {0x0000b174, 0x0541047f},
11781 + {0x0000b178, 0x055f0540},
11782 + {0x0000b17c, 0x057f0560},
11783 + {0x0000b180, 0x06400641},
11784 + {0x0000b184, 0x0660065f},
11785 + {0x0000b188, 0x067e067f},
11786 + {0x0000b18c, 0x07410742},
11787 + {0x0000b190, 0x075f0740},
11788 + {0x0000b194, 0x077f0760},
11789 + {0x0000b198, 0x07800781},
11790 + {0x0000b19c, 0x07a0079f},
11791 + {0x0000b1a0, 0x07c107bf},
11792 + {0x0000b1a4, 0x000007c0},
11793 + {0x0000b1a8, 0x00000000},
11794 + {0x0000b1ac, 0x00000000},
11795 + {0x0000b1b0, 0x00000000},
11796 + {0x0000b1b4, 0x00000000},
11797 + {0x0000b1b8, 0x00000000},
11798 + {0x0000b1bc, 0x00000000},
11799 + {0x0000b1c0, 0x00000000},
11800 + {0x0000b1c4, 0x00000000},
11801 + {0x0000b1c8, 0x00000000},
11802 + {0x0000b1cc, 0x00000000},
11803 + {0x0000b1d0, 0x00000000},
11804 + {0x0000b1d4, 0x00000000},
11805 + {0x0000b1d8, 0x00000000},
11806 + {0x0000b1dc, 0x00000000},
11807 + {0x0000b1e0, 0x00000000},
11808 + {0x0000b1e4, 0x00000000},
11809 + {0x0000b1e8, 0x00000000},
11810 + {0x0000b1ec, 0x00000000},
11811 + {0x0000b1f0, 0x00000396},
11812 + {0x0000b1f4, 0x00000396},
11813 + {0x0000b1f8, 0x00000396},
11814 + {0x0000b1fc, 0x00000196},
11815 };
11816
11817 static const u32 ar9580_1p0_baseband_postamble[][5] = {
11818 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11819 {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011},
11820 + {0x00009814, 0x3280c00a, 0x3280c00a, 0x3280c00a, 0x3280c00a},
11821 + {0x00009818, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11822 {0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a012e},
11823 {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
11824 {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
11825 @@ -956,7 +1169,7 @@ static const u32 ar9580_1p0_baseband_pos
11826 {0x0000a288, 0x00000110, 0x00000110, 0x00000110, 0x00000110},
11827 {0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222},
11828 {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
11829 - {0x0000a2d0, 0x00041981, 0x00041981, 0x00041981, 0x00041982},
11830 + {0x0000a2d0, 0x00041983, 0x00041983, 0x00041981, 0x00041982},
11831 {0x0000a2d8, 0x7999a83b, 0x7999a83b, 0x7999a83b, 0x7999a83b},
11832 {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11833 {0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c},
11834 @@ -994,4 +1207,13 @@ static const u32 ar9580_1p0_pcie_phy_pll
11835 {0x00004044, 0x00000000},
11836 };
11837
11838 +static const u32 ar9580_1p0_baseband_postamble_dfs_channel[][3] = {
11839 + /* Addr 5G 2G */
11840 + {0x00009814, 0x3400c00f, 0x3400c00f},
11841 + {0x00009824, 0x5ac668d0, 0x5ac668d0},
11842 + {0x00009828, 0x06903080, 0x06903080},
11843 + {0x00009e0c, 0x6d4000e2, 0x6d4000e2},
11844 + {0x00009e14, 0x37b9625e, 0x37b9625e},
11845 +};
11846 +
11847 #endif /* INITVALS_9580_1P0_H */
11848 --- a/drivers/net/wireless/ath/ath9k/reg.h
11849 +++ b/drivers/net/wireless/ath/ath9k/reg.h
11850 @@ -809,6 +809,8 @@
11851 #define AR_SREV_REVISION_9462_21 3
11852 #define AR_SREV_VERSION_9565 0x2C0
11853 #define AR_SREV_REVISION_9565_10 0
11854 +#define AR_SREV_REVISION_9565_101 1
11855 +#define AR_SREV_REVISION_9565_11 2
11856 #define AR_SREV_VERSION_9550 0x400
11857
11858 #define AR_SREV_5416(_ah) \
11859 @@ -881,9 +883,6 @@
11860
11861 #define AR_SREV_9330(_ah) \
11862 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9330))
11863 -#define AR_SREV_9330_10(_ah) \
11864 - (AR_SREV_9330((_ah)) && \
11865 - ((_ah)->hw_version.macRev == AR_SREV_REVISION_9330_10))
11866 #define AR_SREV_9330_11(_ah) \
11867 (AR_SREV_9330((_ah)) && \
11868 ((_ah)->hw_version.macRev == AR_SREV_REVISION_9330_11))
11869 @@ -927,10 +926,18 @@
11870
11871 #define AR_SREV_9565(_ah) \
11872 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565))
11873 -
11874 #define AR_SREV_9565_10(_ah) \
11875 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
11876 ((_ah)->hw_version.macRev == AR_SREV_REVISION_9565_10))
11877 +#define AR_SREV_9565_101(_ah) \
11878 + (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
11879 + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9565_101))
11880 +#define AR_SREV_9565_11(_ah) \
11881 + (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
11882 + ((_ah)->hw_version.macRev == AR_SREV_REVISION_9565_11))
11883 +#define AR_SREV_9565_11_OR_LATER(_ah) \
11884 + (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9565) && \
11885 + ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9565_11))
11886
11887 #define AR_SREV_9550(_ah) \
11888 (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9550))
11889 --- a/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h
11890 +++ b/drivers/net/wireless/ath/ath9k/ar9330_1p1_initvals.h
11891 @@ -18,6 +18,10 @@
11892 #ifndef INITVALS_9330_1P1_H
11893 #define INITVALS_9330_1P1_H
11894
11895 +#define ar9331_1p1_baseband_core_txfir_coeff_japan_2484 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
11896 +
11897 +#define ar9331_modes_high_power_tx_gain_1p1 ar9331_modes_lowest_ob_db_tx_gain_1p1
11898 +
11899 static const u32 ar9331_1p1_baseband_postamble[][5] = {
11900 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11901 {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},
11902 @@ -55,7 +59,7 @@ static const u32 ar9331_1p1_baseband_pos
11903 {0x0000a284, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11904 {0x0000a288, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11905 {0x0000a28c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11906 - {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
11907 + {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00058d18, 0x00058d18},
11908 {0x0000a2d0, 0x00071982, 0x00071982, 0x00071982, 0x00071982},
11909 {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a},
11910 {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
11911 @@ -252,7 +256,7 @@ static const u32 ar9331_modes_low_ob_db_
11912 {0x0000a2e0, 0xffffcc84, 0xffffcc84, 0xffffcc84, 0xffffcc84},
11913 {0x0000a2e4, 0xfffff000, 0xfffff000, 0xfffff000, 0xfffff000},
11914 {0x0000a2e8, 0xfffe0000, 0xfffe0000, 0xfffe0000, 0xfffe0000},
11915 - {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d0, 0x000050d0},
11916 + {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d4, 0x000050d4},
11917 {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
11918 {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
11919 {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
11920 @@ -337,8 +341,6 @@ static const u32 ar9331_modes_low_ob_db_
11921 {0x00016284, 0x14d3f000, 0x14d3f000, 0x14d3f000, 0x14d3f000},
11922 };
11923
11924 -#define ar9331_1p1_baseband_core_txfir_coeff_japan_2484 ar9462_2p0_baseband_core_txfir_coeff_japan_2484
11925 -
11926 static const u32 ar9331_1p1_xtal_25M[][2] = {
11927 /* Addr allmodes */
11928 {0x00007038, 0x000002f8},
11929 @@ -373,17 +375,17 @@ static const u32 ar9331_1p1_radio_core[]
11930 {0x000160b4, 0x92480040},
11931 {0x000160c0, 0x006db6db},
11932 {0x000160c4, 0x0186db60},
11933 - {0x000160c8, 0x6db4db6c},
11934 + {0x000160c8, 0x6db6db6c},
11935 {0x000160cc, 0x6de6c300},
11936 {0x000160d0, 0x14500820},
11937 {0x00016100, 0x04cb0001},
11938 {0x00016104, 0xfff80015},
11939 {0x00016108, 0x00080010},
11940 {0x0001610c, 0x00170000},
11941 - {0x00016140, 0x10800000},
11942 + {0x00016140, 0x50804000},
11943 {0x00016144, 0x01884080},
11944 {0x00016148, 0x000080c0},
11945 - {0x00016280, 0x01000015},
11946 + {0x00016280, 0x01001015},
11947 {0x00016284, 0x14d20000},
11948 {0x00016288, 0x00318000},
11949 {0x0001628c, 0x50000000},
11950 @@ -622,12 +624,12 @@ static const u32 ar9331_1p1_baseband_cor
11951 {0x0000a370, 0x00000000},
11952 {0x0000a390, 0x00000001},
11953 {0x0000a394, 0x00000444},
11954 - {0x0000a398, 0x001f0e0f},
11955 - {0x0000a39c, 0x0075393f},
11956 - {0x0000a3a0, 0xb79f6427},
11957 - {0x0000a3a4, 0x00000000},
11958 - {0x0000a3a8, 0xaaaaaaaa},
11959 - {0x0000a3ac, 0x3c466478},
11960 + {0x0000a398, 0x00000000},
11961 + {0x0000a39c, 0x210d0401},
11962 + {0x0000a3a0, 0xab9a7144},
11963 + {0x0000a3a4, 0x00000011},
11964 + {0x0000a3a8, 0x3c3c003d},
11965 + {0x0000a3ac, 0x30310030},
11966 {0x0000a3c0, 0x20202020},
11967 {0x0000a3c4, 0x22222220},
11968 {0x0000a3c8, 0x20200020},
11969 @@ -686,100 +688,18 @@ static const u32 ar9331_1p1_baseband_cor
11970 {0x0000a7dc, 0x00000001},
11971 };
11972
11973 -static const u32 ar9331_modes_high_power_tx_gain_1p1[][5] = {
11974 +static const u32 ar9331_1p1_mac_postamble[][5] = {
11975 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
11976 - {0x0000a2d8, 0x7999a83a, 0x7999a83a, 0x7999a83a, 0x7999a83a},
11977 - {0x0000a2dc, 0xffff2a52, 0xffff2a52, 0xffff2a52, 0xffff2a52},
11978 - {0x0000a2e0, 0xffffcc84, 0xffffcc84, 0xffffcc84, 0xffffcc84},
11979 - {0x0000a2e4, 0xfffff000, 0xfffff000, 0xfffff000, 0xfffff000},
11980 - {0x0000a2e8, 0xfffe0000, 0xfffe0000, 0xfffe0000, 0xfffe0000},
11981 - {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d0, 0x000050d0},
11982 - {0x0000a500, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
11983 - {0x0000a504, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
11984 - {0x0000a508, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
11985 - {0x0000a50c, 0x11062202, 0x11062202, 0x0d000200, 0x0d000200},
11986 - {0x0000a510, 0x17022e00, 0x17022e00, 0x11000202, 0x11000202},
11987 - {0x0000a514, 0x1d000ec2, 0x1d000ec2, 0x15000400, 0x15000400},
11988 - {0x0000a518, 0x25020ec0, 0x25020ec0, 0x19000402, 0x19000402},
11989 - {0x0000a51c, 0x2b020ec3, 0x2b020ec3, 0x1d000404, 0x1d000404},
11990 - {0x0000a520, 0x2f001f04, 0x2f001f04, 0x23000a00, 0x23000a00},
11991 - {0x0000a524, 0x35001fc4, 0x35001fc4, 0x27000a02, 0x27000a02},
11992 - {0x0000a528, 0x3c022f04, 0x3c022f04, 0x2b000a04, 0x2b000a04},
11993 - {0x0000a52c, 0x41023e85, 0x41023e85, 0x2d000a20, 0x2d000a20},
11994 - {0x0000a530, 0x48023ec6, 0x48023ec6, 0x31000a22, 0x31000a22},
11995 - {0x0000a534, 0x4d023f01, 0x4d023f01, 0x35000a24, 0x35000a24},
11996 - {0x0000a538, 0x53023f4b, 0x53023f4b, 0x38000a43, 0x38000a43},
11997 - {0x0000a53c, 0x5a027f09, 0x5a027f09, 0x3b000e42, 0x3b000e42},
11998 - {0x0000a540, 0x5f027fc9, 0x5f027fc9, 0x3f000e44, 0x3f000e44},
11999 - {0x0000a544, 0x6502feca, 0x6502feca, 0x42000e64, 0x42000e64},
12000 - {0x0000a548, 0x6b02ff4a, 0x6b02ff4a, 0x46000e66, 0x46000e66},
12001 - {0x0000a54c, 0x7203feca, 0x7203feca, 0x4a000ea6, 0x4a000ea6},
12002 - {0x0000a550, 0x7703ff0b, 0x7703ff0b, 0x4a000ea6, 0x4a000ea6},
12003 - {0x0000a554, 0x7d06ffcb, 0x7d06ffcb, 0x4a000ea6, 0x4a000ea6},
12004 - {0x0000a558, 0x8407ff0b, 0x8407ff0b, 0x4a000ea6, 0x4a000ea6},
12005 - {0x0000a55c, 0x8907ffcb, 0x8907ffcb, 0x4a000ea6, 0x4a000ea6},
12006 - {0x0000a560, 0x900fff0b, 0x900fff0b, 0x4a000ea6, 0x4a000ea6},
12007 - {0x0000a564, 0x960fffcb, 0x960fffcb, 0x4a000ea6, 0x4a000ea6},
12008 - {0x0000a568, 0x9c1fff0b, 0x9c1fff0b, 0x4a000ea6, 0x4a000ea6},
12009 - {0x0000a56c, 0x9c1fff0b, 0x9c1fff0b, 0x4a000ea6, 0x4a000ea6},
12010 - {0x0000a570, 0x9c1fff0b, 0x9c1fff0b, 0x4a000ea6, 0x4a000ea6},
12011 - {0x0000a574, 0x9c1fff0b, 0x9c1fff0b, 0x4a000ea6, 0x4a000ea6},
12012 - {0x0000a578, 0x9c1fff0b, 0x9c1fff0b, 0x4a000ea6, 0x4a000ea6},
12013 - {0x0000a57c, 0x9c1fff0b, 0x9c1fff0b, 0x4a000ea6, 0x4a000ea6},
12014 - {0x0000a580, 0x00022200, 0x00022200, 0x00000000, 0x00000000},
12015 - {0x0000a584, 0x05062002, 0x05062002, 0x04000002, 0x04000002},
12016 - {0x0000a588, 0x0c002e00, 0x0c002e00, 0x08000004, 0x08000004},
12017 - {0x0000a58c, 0x11062202, 0x11062202, 0x0b000200, 0x0b000200},
12018 - {0x0000a590, 0x17022e00, 0x17022e00, 0x0f000202, 0x0f000202},
12019 - {0x0000a594, 0x1d000ec2, 0x1d000ec2, 0x11000400, 0x11000400},
12020 - {0x0000a598, 0x25020ec0, 0x25020ec0, 0x15000402, 0x15000402},
12021 - {0x0000a59c, 0x2b020ec3, 0x2b020ec3, 0x19000404, 0x19000404},
12022 - {0x0000a5a0, 0x2f001f04, 0x2f001f04, 0x1b000603, 0x1b000603},
12023 - {0x0000a5a4, 0x35001fc4, 0x35001fc4, 0x1f000a02, 0x1f000a02},
12024 - {0x0000a5a8, 0x3c022f04, 0x3c022f04, 0x23000a04, 0x23000a04},
12025 - {0x0000a5ac, 0x41023e85, 0x41023e85, 0x26000a20, 0x26000a20},
12026 - {0x0000a5b0, 0x48023ec6, 0x48023ec6, 0x2a000e20, 0x2a000e20},
12027 - {0x0000a5b4, 0x4d023f01, 0x4d023f01, 0x2e000e22, 0x2e000e22},
12028 - {0x0000a5b8, 0x53023f4b, 0x53023f4b, 0x31000e24, 0x31000e24},
12029 - {0x0000a5bc, 0x5a027f09, 0x5a027f09, 0x34001640, 0x34001640},
12030 - {0x0000a5c0, 0x5f027fc9, 0x5f027fc9, 0x38001660, 0x38001660},
12031 - {0x0000a5c4, 0x6502feca, 0x6502feca, 0x3b001861, 0x3b001861},
12032 - {0x0000a5c8, 0x6b02ff4a, 0x6b02ff4a, 0x3e001a81, 0x3e001a81},
12033 - {0x0000a5cc, 0x7203feca, 0x7203feca, 0x42001a83, 0x42001a83},
12034 - {0x0000a5d0, 0x7703ff0b, 0x7703ff0b, 0x44001c84, 0x44001c84},
12035 - {0x0000a5d4, 0x7d06ffcb, 0x7d06ffcb, 0x48001ce3, 0x48001ce3},
12036 - {0x0000a5d8, 0x8407ff0b, 0x8407ff0b, 0x4c001ce5, 0x4c001ce5},
12037 - {0x0000a5dc, 0x8907ffcb, 0x8907ffcb, 0x50001ce9, 0x50001ce9},
12038 - {0x0000a5e0, 0x900fff0b, 0x900fff0b, 0x54001ceb, 0x54001ceb},
12039 - {0x0000a5e4, 0x960fffcb, 0x960fffcb, 0x56001eec, 0x56001eec},
12040 - {0x0000a5e8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
12041 - {0x0000a5ec, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
12042 - {0x0000a5f0, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
12043 - {0x0000a5f4, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
12044 - {0x0000a5f8, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
12045 - {0x0000a5fc, 0x9c1fff0b, 0x9c1fff0b, 0x56001eec, 0x56001eec},
12046 - {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12047 - {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12048 - {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12049 - {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12050 - {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12051 - {0x0000a614, 0x01404000, 0x01404000, 0x01404000, 0x01404000},
12052 - {0x0000a618, 0x01404501, 0x01404501, 0x01404501, 0x01404501},
12053 - {0x0000a61c, 0x02008802, 0x02008802, 0x02008802, 0x02008802},
12054 - {0x0000a620, 0x0280c802, 0x0280c802, 0x0280c802, 0x0280c802},
12055 - {0x0000a624, 0x03010a03, 0x03010a03, 0x03010a03, 0x03010a03},
12056 - {0x0000a628, 0x03010c04, 0x03010c04, 0x03010c04, 0x03010c04},
12057 - {0x0000a62c, 0x03010c04, 0x03010c04, 0x03010c04, 0x03010c04},
12058 - {0x0000a630, 0x03010c04, 0x03010c04, 0x03010c04, 0x03010c04},
12059 - {0x0000a634, 0x03010c04, 0x03010c04, 0x03010c04, 0x03010c04},
12060 - {0x0000a638, 0x03010c04, 0x03010c04, 0x03010c04, 0x03010c04},
12061 - {0x0000a63c, 0x03010c04, 0x03010c04, 0x03010c04, 0x03010c04},
12062 - {0x00016044, 0x034922db, 0x034922db, 0x034922db, 0x034922db},
12063 - {0x00016284, 0x14d3f000, 0x14d3f000, 0x14d3f000, 0x14d3f000},
12064 + {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
12065 + {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
12066 + {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
12067 + {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
12068 + {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
12069 + {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
12070 + {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
12071 + {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
12072 };
12073
12074 -#define ar9331_1p1_mac_postamble ar9300_2p2_mac_postamble
12075 -
12076 static const u32 ar9331_1p1_soc_preamble[][2] = {
12077 /* Addr allmodes */
12078 {0x00007020, 0x00000000},
12079 --- a/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h
12080 +++ b/drivers/net/wireless/ath/ath9k/ar9330_1p2_initvals.h
12081 @@ -18,6 +18,28 @@
12082 #ifndef INITVALS_9330_1P2_H
12083 #define INITVALS_9330_1P2_H
12084
12085 +#define ar9331_modes_high_power_tx_gain_1p2 ar9331_modes_high_ob_db_tx_gain_1p2
12086 +
12087 +#define ar9331_modes_low_ob_db_tx_gain_1p2 ar9331_modes_high_ob_db_tx_gain_1p2
12088 +
12089 +#define ar9331_modes_lowest_ob_db_tx_gain_1p2 ar9331_modes_high_ob_db_tx_gain_1p2
12090 +
12091 +#define ar9331_1p2_baseband_core_txfir_coeff_japan_2484 ar9331_1p1_baseband_core_txfir_coeff_japan_2484
12092 +
12093 +#define ar9331_1p2_xtal_25M ar9331_1p1_xtal_25M
12094 +
12095 +#define ar9331_1p2_xtal_40M ar9331_1p1_xtal_40M
12096 +
12097 +#define ar9331_1p2_soc_postamble ar9331_1p1_soc_postamble
12098 +
12099 +#define ar9331_1p2_mac_postamble ar9331_1p1_mac_postamble
12100 +
12101 +#define ar9331_1p2_soc_preamble ar9331_1p1_soc_preamble
12102 +
12103 +#define ar9331_1p2_mac_core ar9331_1p1_mac_core
12104 +
12105 +#define ar9331_common_wo_xlna_rx_gain_1p2 ar9331_common_wo_xlna_rx_gain_1p1
12106 +
12107 static const u32 ar9331_modes_high_ob_db_tx_gain_1p2[][5] = {
12108 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
12109 {0x0000a410, 0x000050d7, 0x000050d7, 0x000050d7, 0x000050d7},
12110 @@ -103,57 +125,6 @@ static const u32 ar9331_modes_high_ob_db
12111 {0x0000a63c, 0x04011004, 0x04011004, 0x04011004, 0x04011004},
12112 };
12113
12114 -#define ar9331_modes_high_power_tx_gain_1p2 ar9331_modes_high_ob_db_tx_gain_1p2
12115 -
12116 -#define ar9331_modes_low_ob_db_tx_gain_1p2 ar9331_modes_high_power_tx_gain_1p2
12117 -
12118 -#define ar9331_modes_lowest_ob_db_tx_gain_1p2 ar9331_modes_low_ob_db_tx_gain_1p2
12119 -
12120 -static const u32 ar9331_1p2_baseband_postamble[][5] = {
12121 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
12122 - {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},
12123 - {0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e},
12124 - {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
12125 - {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
12126 - {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
12127 - {0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c},
12128 - {0x00009c00, 0x00000044, 0x00000044, 0x00000044, 0x00000044},
12129 - {0x00009e00, 0x0372161e, 0x0372161e, 0x037216a4, 0x037216a4},
12130 - {0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020},
12131 - {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
12132 - {0x00009e10, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e},
12133 - {0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e},
12134 - {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12135 - {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
12136 - {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
12137 - {0x00009e2c, 0x0000001c, 0x0000001c, 0x00003221, 0x00003221},
12138 - {0x00009e3c, 0xcf946222, 0xcf946222, 0xcf946222, 0xcf946222},
12139 - {0x00009e44, 0x02321e27, 0x02321e27, 0x02282324, 0x02282324},
12140 - {0x00009e48, 0x5030201a, 0x5030201a, 0x50302010, 0x50302010},
12141 - {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
12142 - {0x0000a204, 0x00003fc0, 0x00003fc4, 0x00003fc4, 0x00003fc0},
12143 - {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
12144 - {0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b},
12145 - {0x0000a234, 0x00000fff, 0x00000fff, 0x10000fff, 0x00000fff},
12146 - {0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018},
12147 - {0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},
12148 - {0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898},
12149 - {0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002},
12150 - {0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e},
12151 - {0x0000a260, 0x3a021501, 0x3a021501, 0x3a021501, 0x3a021501},
12152 - {0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e},
12153 - {0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b},
12154 - {0x0000a284, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12155 - {0x0000a288, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12156 - {0x0000a28c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12157 - {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
12158 - {0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071981},
12159 - {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a},
12160 - {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12161 - {0x0000ae04, 0x00802020, 0x00802020, 0x00802020, 0x00802020},
12162 - {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12163 -};
12164 -
12165 static const u32 ar9331_1p2_radio_core[][2] = {
12166 /* Addr allmodes */
12167 {0x00016000, 0x36db6db6},
12168 @@ -219,24 +190,318 @@ static const u32 ar9331_1p2_radio_core[]
12169 {0x000163d4, 0x00000000},
12170 };
12171
12172 -#define ar9331_1p2_baseband_core_txfir_coeff_japan_2484 ar9331_1p1_baseband_core_txfir_coeff_japan_2484
12173 -
12174 -#define ar9331_1p2_xtal_25M ar9331_1p1_xtal_25M
12175 -
12176 -#define ar9331_1p2_xtal_40M ar9331_1p1_xtal_40M
12177 -
12178 -#define ar9331_1p2_baseband_core ar9331_1p1_baseband_core
12179 -
12180 -#define ar9331_1p2_soc_postamble ar9331_1p1_soc_postamble
12181 -
12182 -#define ar9331_1p2_mac_postamble ar9331_1p1_mac_postamble
12183 -
12184 -#define ar9331_1p2_soc_preamble ar9331_1p1_soc_preamble
12185 -
12186 -#define ar9331_1p2_mac_core ar9331_1p1_mac_core
12187 +static const u32 ar9331_1p2_baseband_core[][2] = {
12188 + /* Addr allmodes */
12189 + {0x00009800, 0xafe68e30},
12190 + {0x00009804, 0xfd14e000},
12191 + {0x00009808, 0x9c0a8f6b},
12192 + {0x0000980c, 0x04800000},
12193 + {0x00009814, 0x9280c00a},
12194 + {0x00009818, 0x00000000},
12195 + {0x0000981c, 0x00020028},
12196 + {0x00009834, 0x5f3ca3de},
12197 + {0x00009838, 0x0108ecff},
12198 + {0x0000983c, 0x14750600},
12199 + {0x00009880, 0x201fff00},
12200 + {0x00009884, 0x00001042},
12201 + {0x000098a4, 0x00200400},
12202 + {0x000098b0, 0x32840bbe},
12203 + {0x000098d0, 0x004b6a8e},
12204 + {0x000098d4, 0x00000820},
12205 + {0x000098dc, 0x00000000},
12206 + {0x000098f0, 0x00000000},
12207 + {0x000098f4, 0x00000000},
12208 + {0x00009c04, 0x00000000},
12209 + {0x00009c08, 0x03200000},
12210 + {0x00009c0c, 0x00000000},
12211 + {0x00009c10, 0x00000000},
12212 + {0x00009c14, 0x00046384},
12213 + {0x00009c18, 0x05b6b440},
12214 + {0x00009c1c, 0x00b6b440},
12215 + {0x00009d00, 0xc080a333},
12216 + {0x00009d04, 0x40206c10},
12217 + {0x00009d08, 0x009c4060},
12218 + {0x00009d0c, 0x1883800a},
12219 + {0x00009d10, 0x01834061},
12220 + {0x00009d14, 0x00c00400},
12221 + {0x00009d18, 0x00000000},
12222 + {0x00009e08, 0x0038233c},
12223 + {0x00009e24, 0x9927b515},
12224 + {0x00009e28, 0x12ef0200},
12225 + {0x00009e30, 0x06336f77},
12226 + {0x00009e34, 0x6af6532f},
12227 + {0x00009e38, 0x0cc80c00},
12228 + {0x00009e40, 0x0d261820},
12229 + {0x00009e4c, 0x00001004},
12230 + {0x00009e50, 0x00ff03f1},
12231 + {0x00009fc0, 0x803e4788},
12232 + {0x00009fc4, 0x0001efb5},
12233 + {0x00009fcc, 0x40000014},
12234 + {0x0000a20c, 0x00000000},
12235 + {0x0000a220, 0x00000000},
12236 + {0x0000a224, 0x00000000},
12237 + {0x0000a228, 0x10002310},
12238 + {0x0000a23c, 0x00000000},
12239 + {0x0000a244, 0x0c000000},
12240 + {0x0000a2a0, 0x00000001},
12241 + {0x0000a2c0, 0x00000001},
12242 + {0x0000a2c8, 0x00000000},
12243 + {0x0000a2cc, 0x18c43433},
12244 + {0x0000a2d4, 0x00000000},
12245 + {0x0000a2dc, 0x00000000},
12246 + {0x0000a2e0, 0x00000000},
12247 + {0x0000a2e4, 0x00000000},
12248 + {0x0000a2e8, 0x00000000},
12249 + {0x0000a2ec, 0x00000000},
12250 + {0x0000a2f0, 0x00000000},
12251 + {0x0000a2f4, 0x00000000},
12252 + {0x0000a2f8, 0x00000000},
12253 + {0x0000a344, 0x00000000},
12254 + {0x0000a34c, 0x00000000},
12255 + {0x0000a350, 0x0000a000},
12256 + {0x0000a364, 0x00000000},
12257 + {0x0000a370, 0x00000000},
12258 + {0x0000a390, 0x00000001},
12259 + {0x0000a394, 0x00000444},
12260 + {0x0000a398, 0x001f0e0f},
12261 + {0x0000a39c, 0x0075393f},
12262 + {0x0000a3a0, 0xb79f6427},
12263 + {0x0000a3a4, 0x00000000},
12264 + {0x0000a3a8, 0xaaaaaaaa},
12265 + {0x0000a3ac, 0x3c466478},
12266 + {0x0000a3c0, 0x20202020},
12267 + {0x0000a3c4, 0x22222220},
12268 + {0x0000a3c8, 0x20200020},
12269 + {0x0000a3cc, 0x20202020},
12270 + {0x0000a3d0, 0x20202020},
12271 + {0x0000a3d4, 0x20202020},
12272 + {0x0000a3d8, 0x20202020},
12273 + {0x0000a3dc, 0x20202020},
12274 + {0x0000a3e0, 0x20202020},
12275 + {0x0000a3e4, 0x20202020},
12276 + {0x0000a3e8, 0x20202020},
12277 + {0x0000a3ec, 0x20202020},
12278 + {0x0000a3f0, 0x00000000},
12279 + {0x0000a3f4, 0x00000006},
12280 + {0x0000a3f8, 0x0cdbd380},
12281 + {0x0000a3fc, 0x000f0f01},
12282 + {0x0000a400, 0x8fa91f01},
12283 + {0x0000a404, 0x00000000},
12284 + {0x0000a408, 0x0e79e5c6},
12285 + {0x0000a40c, 0x00820820},
12286 + {0x0000a414, 0x1ce739ce},
12287 + {0x0000a418, 0x2d001dce},
12288 + {0x0000a41c, 0x1ce739ce},
12289 + {0x0000a420, 0x000001ce},
12290 + {0x0000a424, 0x1ce739ce},
12291 + {0x0000a428, 0x000001ce},
12292 + {0x0000a42c, 0x1ce739ce},
12293 + {0x0000a430, 0x1ce739ce},
12294 + {0x0000a434, 0x00000000},
12295 + {0x0000a438, 0x00001801},
12296 + {0x0000a43c, 0x00000000},
12297 + {0x0000a440, 0x00000000},
12298 + {0x0000a444, 0x00000000},
12299 + {0x0000a448, 0x04000000},
12300 + {0x0000a44c, 0x00000001},
12301 + {0x0000a450, 0x00010000},
12302 + {0x0000a458, 0x00000000},
12303 + {0x0000a640, 0x00000000},
12304 + {0x0000a644, 0x3fad9d74},
12305 + {0x0000a648, 0x0048060a},
12306 + {0x0000a64c, 0x00003c37},
12307 + {0x0000a670, 0x03020100},
12308 + {0x0000a674, 0x09080504},
12309 + {0x0000a678, 0x0d0c0b0a},
12310 + {0x0000a67c, 0x13121110},
12311 + {0x0000a680, 0x31301514},
12312 + {0x0000a684, 0x35343332},
12313 + {0x0000a688, 0x00000036},
12314 + {0x0000a690, 0x00000838},
12315 + {0x0000a7c0, 0x00000000},
12316 + {0x0000a7c4, 0xfffffffc},
12317 + {0x0000a7c8, 0x00000000},
12318 + {0x0000a7cc, 0x00000000},
12319 + {0x0000a7d0, 0x00000000},
12320 + {0x0000a7d4, 0x00000004},
12321 + {0x0000a7dc, 0x00000001},
12322 +};
12323
12324 -#define ar9331_common_wo_xlna_rx_gain_1p2 ar9331_common_wo_xlna_rx_gain_1p1
12325 +static const u32 ar9331_1p2_baseband_postamble[][5] = {
12326 + /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
12327 + {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005},
12328 + {0x00009820, 0x206a002e, 0x206a002e, 0x206a002e, 0x206a002e},
12329 + {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0},
12330 + {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881},
12331 + {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4},
12332 + {0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c},
12333 + {0x00009c00, 0x00000044, 0x00000044, 0x00000044, 0x00000044},
12334 + {0x00009e00, 0x0372161e, 0x0372161e, 0x037216a4, 0x037216a4},
12335 + {0x00009e04, 0x00182020, 0x00182020, 0x00182020, 0x00182020},
12336 + {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2},
12337 + {0x00009e10, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e, 0x7ec80d2e},
12338 + {0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e},
12339 + {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12340 + {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c},
12341 + {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce},
12342 + {0x00009e2c, 0x0000001c, 0x0000001c, 0x00003221, 0x00003221},
12343 + {0x00009e3c, 0xcf946222, 0xcf946222, 0xcf946222, 0xcf946222},
12344 + {0x00009e44, 0x02321e27, 0x02321e27, 0x02282324, 0x02282324},
12345 + {0x00009e48, 0x5030201a, 0x5030201a, 0x50302010, 0x50302010},
12346 + {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000},
12347 + {0x0000a204, 0x00003fc0, 0x00003fc4, 0x00003fc4, 0x00003fc0},
12348 + {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004},
12349 + {0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b},
12350 + {0x0000a234, 0x00000fff, 0x00000fff, 0x10000fff, 0x00000fff},
12351 + {0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018},
12352 + {0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108},
12353 + {0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898},
12354 + {0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002},
12355 + {0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e},
12356 + {0x0000a260, 0x3a021501, 0x3a021501, 0x3a021501, 0x3a021501},
12357 + {0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e},
12358 + {0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b},
12359 + {0x0000a284, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12360 + {0x0000a288, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12361 + {0x0000a28c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12362 + {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18},
12363 + {0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071981},
12364 + {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a},
12365 + {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12366 + {0x0000ae04, 0x00802020, 0x00802020, 0x00802020, 0x00802020},
12367 + {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
12368 +};
12369
12370 -#define ar9331_common_rx_gain_1p2 ar9485_common_rx_gain_1_1
12371 +static const u32 ar9331_common_rx_gain_1p2[][2] = {
12372 + /* Addr allmodes */
12373 + {0x0000a000, 0x00010000},
12374 + {0x0000a004, 0x00030002},
12375 + {0x0000a008, 0x00050004},
12376 + {0x0000a00c, 0x00810080},
12377 + {0x0000a010, 0x01800082},
12378 + {0x0000a014, 0x01820181},
12379 + {0x0000a018, 0x01840183},
12380 + {0x0000a01c, 0x01880185},
12381 + {0x0000a020, 0x018a0189},
12382 + {0x0000a024, 0x02850284},
12383 + {0x0000a028, 0x02890288},
12384 + {0x0000a02c, 0x03850384},
12385 + {0x0000a030, 0x03890388},
12386 + {0x0000a034, 0x038b038a},
12387 + {0x0000a038, 0x038d038c},
12388 + {0x0000a03c, 0x03910390},
12389 + {0x0000a040, 0x03930392},
12390 + {0x0000a044, 0x03950394},
12391 + {0x0000a048, 0x00000396},
12392 + {0x0000a04c, 0x00000000},
12393 + {0x0000a050, 0x00000000},
12394 + {0x0000a054, 0x00000000},
12395 + {0x0000a058, 0x00000000},
12396 + {0x0000a05c, 0x00000000},
12397 + {0x0000a060, 0x00000000},
12398 + {0x0000a064, 0x00000000},
12399 + {0x0000a068, 0x00000000},
12400 + {0x0000a06c, 0x00000000},
12401 + {0x0000a070, 0x00000000},
12402 + {0x0000a074, 0x00000000},
12403 + {0x0000a078, 0x00000000},
12404 + {0x0000a07c, 0x00000000},
12405 + {0x0000a080, 0x28282828},
12406 + {0x0000a084, 0x28282828},
12407 + {0x0000a088, 0x28282828},
12408 + {0x0000a08c, 0x28282828},
12409 + {0x0000a090, 0x28282828},
12410 + {0x0000a094, 0x21212128},
12411 + {0x0000a098, 0x171c1c1c},
12412 + {0x0000a09c, 0x02020212},
12413 + {0x0000a0a0, 0x00000202},
12414 + {0x0000a0a4, 0x00000000},
12415 + {0x0000a0a8, 0x00000000},
12416 + {0x0000a0ac, 0x00000000},
12417 + {0x0000a0b0, 0x00000000},
12418 + {0x0000a0b4, 0x00000000},
12419 + {0x0000a0b8, 0x00000000},
12420 + {0x0000a0bc, 0x00000000},
12421 + {0x0000a0c0, 0x001f0000},
12422 + {0x0000a0c4, 0x111f1100},
12423 + {0x0000a0c8, 0x111d111e},
12424 + {0x0000a0cc, 0x111b111c},
12425 + {0x0000a0d0, 0x22032204},
12426 + {0x0000a0d4, 0x22012202},
12427 + {0x0000a0d8, 0x221f2200},
12428 + {0x0000a0dc, 0x221d221e},
12429 + {0x0000a0e0, 0x33013302},
12430 + {0x0000a0e4, 0x331f3300},
12431 + {0x0000a0e8, 0x4402331e},
12432 + {0x0000a0ec, 0x44004401},
12433 + {0x0000a0f0, 0x441e441f},
12434 + {0x0000a0f4, 0x55015502},
12435 + {0x0000a0f8, 0x551f5500},
12436 + {0x0000a0fc, 0x6602551e},
12437 + {0x0000a100, 0x66006601},
12438 + {0x0000a104, 0x661e661f},
12439 + {0x0000a108, 0x7703661d},
12440 + {0x0000a10c, 0x77017702},
12441 + {0x0000a110, 0x00007700},
12442 + {0x0000a114, 0x00000000},
12443 + {0x0000a118, 0x00000000},
12444 + {0x0000a11c, 0x00000000},
12445 + {0x0000a120, 0x00000000},
12446 + {0x0000a124, 0x00000000},
12447 + {0x0000a128, 0x00000000},
12448 + {0x0000a12c, 0x00000000},
12449 + {0x0000a130, 0x00000000},
12450 + {0x0000a134, 0x00000000},
12451 + {0x0000a138, 0x00000000},
12452 + {0x0000a13c, 0x00000000},
12453 + {0x0000a140, 0x001f0000},
12454 + {0x0000a144, 0x111f1100},
12455 + {0x0000a148, 0x111d111e},
12456 + {0x0000a14c, 0x111b111c},
12457 + {0x0000a150, 0x22032204},
12458 + {0x0000a154, 0x22012202},
12459 + {0x0000a158, 0x221f2200},
12460 + {0x0000a15c, 0x221d221e},
12461 + {0x0000a160, 0x33013302},
12462 + {0x0000a164, 0x331f3300},
12463 + {0x0000a168, 0x4402331e},
12464 + {0x0000a16c, 0x44004401},
12465 + {0x0000a170, 0x441e441f},
12466 + {0x0000a174, 0x55015502},
12467 + {0x0000a178, 0x551f5500},
12468 + {0x0000a17c, 0x6602551e},
12469 + {0x0000a180, 0x66006601},
12470 + {0x0000a184, 0x661e661f},
12471 + {0x0000a188, 0x7703661d},
12472 + {0x0000a18c, 0x77017702},
12473 + {0x0000a190, 0x00007700},
12474 + {0x0000a194, 0x00000000},
12475 + {0x0000a198, 0x00000000},
12476 + {0x0000a19c, 0x00000000},
12477 + {0x0000a1a0, 0x00000000},
12478 + {0x0000a1a4, 0x00000000},
12479 + {0x0000a1a8, 0x00000000},
12480 + {0x0000a1ac, 0x00000000},
12481 + {0x0000a1b0, 0x00000000},
12482 + {0x0000a1b4, 0x00000000},
12483 + {0x0000a1b8, 0x00000000},
12484 + {0x0000a1bc, 0x00000000},
12485 + {0x0000a1c0, 0x00000000},
12486 + {0x0000a1c4, 0x00000000},
12487 + {0x0000a1c8, 0x00000000},
12488 + {0x0000a1cc, 0x00000000},
12489 + {0x0000a1d0, 0x00000000},
12490 + {0x0000a1d4, 0x00000000},
12491 + {0x0000a1d8, 0x00000000},
12492 + {0x0000a1dc, 0x00000000},
12493 + {0x0000a1e0, 0x00000000},
12494 + {0x0000a1e4, 0x00000000},
12495 + {0x0000a1e8, 0x00000000},
12496 + {0x0000a1ec, 0x00000000},
12497 + {0x0000a1f0, 0x00000396},
12498 + {0x0000a1f4, 0x00000396},
12499 + {0x0000a1f8, 0x00000396},
12500 + {0x0000a1fc, 0x00000296},
12501 +};
12502
12503 #endif /* INITVALS_9330_1P2_H */
12504 --- a/drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h
12505 +++ b/drivers/net/wireless/ath/ath9k/ar955x_1p0_initvals.h
12506 @@ -20,6 +20,14 @@
12507
12508 /* AR955X 1.0 */
12509
12510 +#define ar955x_1p0_soc_postamble ar9300_2p2_soc_postamble
12511 +
12512 +#define ar955x_1p0_common_rx_gain_table ar9300Common_rx_gain_table_2p2
12513 +
12514 +#define ar955x_1p0_common_wo_xlna_rx_gain_table ar9300Common_wo_xlna_rx_gain_table_2p2
12515 +
12516 +#define ar955x_1p0_baseband_core_txfir_coeff_japan_2484 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
12517 +
12518 static const u32 ar955x_1p0_radio_postamble[][5] = {
12519 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
12520 {0x00016098, 0xd2dd5554, 0xd2dd5554, 0xd28b3330, 0xd28b3330},
12521 @@ -37,13 +45,6 @@ static const u32 ar955x_1p0_radio_postam
12522 {0x00016940, 0x10804008, 0x10804008, 0x10804008, 0x10804008},
12523 };
12524
12525 -static const u32 ar955x_1p0_baseband_core_txfir_coeff_japan_2484[][2] = {
12526 - /* Addr allmodes */
12527 - {0x0000a398, 0x00000000},
12528 - {0x0000a39c, 0x6f7f0301},
12529 - {0x0000a3a0, 0xca9228ee},
12530 -};
12531 -
12532 static const u32 ar955x_1p0_baseband_postamble[][5] = {
12533 /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
12534 {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8011, 0xd00a8011},
12535 @@ -473,266 +474,6 @@ static const u32 ar955x_1p0_mac_core[][2
12536 {0x000083d0, 0x8c7901ff},
12537 };
12538
12539 -static const u32 ar955x_1p0_common_rx_gain_table[][2] = {
12540 - /* Addr allmodes */
12541 - {0x0000a000, 0x00010000},
12542 - {0x0000a004, 0x00030002},
12543 - {0x0000a008, 0x00050004},
12544 - {0x0000a00c, 0x00810080},
12545 - {0x0000a010, 0x00830082},
12546 - {0x0000a014, 0x01810180},
12547 - {0x0000a018, 0x01830182},
12548 - {0x0000a01c, 0x01850184},
12549 - {0x0000a020, 0x01890188},
12550 - {0x0000a024, 0x018b018a},
12551 - {0x0000a028, 0x018d018c},
12552 - {0x0000a02c, 0x01910190},
12553 - {0x0000a030, 0x01930192},
12554 - {0x0000a034, 0x01950194},
12555 - {0x0000a038, 0x038a0196},
12556 - {0x0000a03c, 0x038c038b},
12557 - {0x0000a040, 0x0390038d},
12558 - {0x0000a044, 0x03920391},
12559 - {0x0000a048, 0x03940393},
12560 - {0x0000a04c, 0x03960395},
12561 - {0x0000a050, 0x00000000},
12562 - {0x0000a054, 0x00000000},
12563 - {0x0000a058, 0x00000000},
12564 - {0x0000a05c, 0x00000000},
12565 - {0x0000a060, 0x00000000},
12566 - {0x0000a064, 0x00000000},
12567 - {0x0000a068, 0x00000000},
12568 - {0x0000a06c, 0x00000000},
12569 - {0x0000a070, 0x00000000},
12570 - {0x0000a074, 0x00000000},
12571 - {0x0000a078, 0x00000000},
12572 - {0x0000a07c, 0x00000000},
12573 - {0x0000a080, 0x22222229},
12574 - {0x0000a084, 0x1d1d1d1d},
12575 - {0x0000a088, 0x1d1d1d1d},
12576 - {0x0000a08c, 0x1d1d1d1d},
12577 - {0x0000a090, 0x171d1d1d},
12578 - {0x0000a094, 0x11111717},
12579 - {0x0000a098, 0x00030311},
12580 - {0x0000a09c, 0x00000000},
12581 - {0x0000a0a0, 0x00000000},
12582 - {0x0000a0a4, 0x00000000},
12583 - {0x0000a0a8, 0x00000000},
12584 - {0x0000a0ac, 0x00000000},
12585 - {0x0000a0b0, 0x00000000},
12586 - {0x0000a0b4, 0x00000000},
12587 - {0x0000a0b8, 0x00000000},
12588 - {0x0000a0bc, 0x00000000},
12589 - {0x0000a0c0, 0x001f0000},
12590 - {0x0000a0c4, 0x01000101},
12591 - {0x0000a0c8, 0x011e011f},
12592 - {0x0000a0cc, 0x011c011d},
12593 - {0x0000a0d0, 0x02030204},
12594 - {0x0000a0d4, 0x02010202},
12595 - {0x0000a0d8, 0x021f0200},
12596 - {0x0000a0dc, 0x0302021e},
12597 - {0x0000a0e0, 0x03000301},
12598 - {0x0000a0e4, 0x031e031f},
12599 - {0x0000a0e8, 0x0402031d},
12600 - {0x0000a0ec, 0x04000401},
12601 - {0x0000a0f0, 0x041e041f},
12602 - {0x0000a0f4, 0x0502041d},
12603 - {0x0000a0f8, 0x05000501},
12604 - {0x0000a0fc, 0x051e051f},
12605 - {0x0000a100, 0x06010602},
12606 - {0x0000a104, 0x061f0600},
12607 - {0x0000a108, 0x061d061e},
12608 - {0x0000a10c, 0x07020703},
12609 - {0x0000a110, 0x07000701},
12610 - {0x0000a114, 0x00000000},
12611 - {0x0000a118, 0x00000000},
12612 - {0x0000a11c, 0x00000000},
12613 - {0x0000a120, 0x00000000},
12614 - {0x0000a124, 0x00000000},
12615 - {0x0000a128, 0x00000000},
12616 - {0x0000a12c, 0x00000000},
12617 - {0x0000a130, 0x00000000},
12618 - {0x0000a134, 0x00000000},
12619 - {0x0000a138, 0x00000000},
12620 - {0x0000a13c, 0x00000000},
12621 - {0x0000a140, 0x001f0000},
12622 - {0x0000a144, 0x01000101},
12623 - {0x0000a148, 0x011e011f},
12624 - {0x0000a14c, 0x011c011d},
12625 - {0x0000a150, 0x02030204},
12626 - {0x0000a154, 0x02010202},
12627 - {0x0000a158, 0x021f0200},
12628 - {0x0000a15c, 0x0302021e},
12629 - {0x0000a160, 0x03000301},
12630 - {0x0000a164, 0x031e031f},
12631 - {0x0000a168, 0x0402031d},
12632 - {0x0000a16c, 0x04000401},
12633 - {0x0000a170, 0x041e041f},
12634 - {0x0000a174, 0x0502041d},
12635 - {0x0000a178, 0x05000501},
12636 - {0x0000a17c, 0x051e051f},
12637 - {0x0000a180, 0x06010602},
12638 - {0x0000a184, 0x061f0600},
12639 - {0x0000a188, 0x061d061e},
12640 - {0x0000a18c, 0x07020703},
12641 - {0x0000a190, 0x07000701},
12642 - {0x0000a194, 0x00000000},
12643 - {0x0000a198, 0x00000000},
12644 - {0x0000a19c, 0x00000000},
12645 - {0x0000a1a0, 0x00000000},
12646 - {0x0000a1a4, 0x00000000},
12647 - {0x0000a1a8, 0x00000000},
12648 - {0x0000a1ac, 0x00000000},
12649 - {0x0000a1b0, 0x00000000},
12650 - {0x0000a1b4, 0x00000000},
12651 - {0x0000a1b8, 0x00000000},
12652 - {0x0000a1bc, 0x00000000},
12653 - {0x0000a1c0, 0x00000000},
12654 - {0x0000a1c4, 0x00000000},
12655 - {0x0000a1c8, 0x00000000},
12656 - {0x0000a1cc, 0x00000000},
12657 - {0x0000a1d0, 0x00000000},
12658 - {0x0000a1d4, 0x00000000},
12659 - {0x0000a1d8, 0x00000000},
12660 - {0x0000a1dc, 0x00000000},
12661 - {0x0000a1e0, 0x00000000},
12662 - {0x0000a1e4, 0x00000000},
12663 - {0x0000a1e8, 0x00000000},
12664 - {0x0000a1ec, 0x00000000},
12665 - {0x0000a1f0, 0x00000396},
12666 - {0x0000a1f4, 0x00000396},
12667 - {0x0000a1f8, 0x00000396},
12668 - {0x0000a1fc, 0x00000196},
12669 - {0x0000b000, 0x00010000},
12670 - {0x0000b004, 0x00030002},
12671 - {0x0000b008, 0x00050004},
12672 - {0x0000b00c, 0x00810080},
12673 - {0x0000b010, 0x00830082},
12674 - {0x0000b014, 0x01810180},
12675 - {0x0000b018, 0x01830182},
12676 - {0x0000b01c, 0x01850184},
12677 - {0x0000b020, 0x02810280},
12678 - {0x0000b024, 0x02830282},
12679 - {0x0000b028, 0x02850284},
12680 - {0x0000b02c, 0x02890288},
12681 - {0x0000b030, 0x028b028a},
12682 - {0x0000b034, 0x0388028c},
12683 - {0x0000b038, 0x038a0389},
12684 - {0x0000b03c, 0x038c038b},
12685 - {0x0000b040, 0x0390038d},
12686 - {0x0000b044, 0x03920391},
12687 - {0x0000b048, 0x03940393},
12688 - {0x0000b04c, 0x03960395},
12689 - {0x0000b050, 0x00000000},
12690 - {0x0000b054, 0x00000000},
12691 - {0x0000b058, 0x00000000},
12692 - {0x0000b05c, 0x00000000},
12693 - {0x0000b060, 0x00000000},
12694 - {0x0000b064, 0x00000000},
12695 - {0x0000b068, 0x00000000},
12696 - {0x0000b06c, 0x00000000},
12697 - {0x0000b070, 0x00000000},
12698 - {0x0000b074, 0x00000000},
12699 - {0x0000b078, 0x00000000},
12700 - {0x0000b07c, 0x00000000},
12701 - {0x0000b080, 0x23232323},
12702 - {0x0000b084, 0x21232323},
12703 - {0x0000b088, 0x19191c1e},
12704 - {0x0000b08c, 0x12141417},
12705 - {0x0000b090, 0x07070e0e},
12706 - {0x0000b094, 0x03030305},
12707 - {0x0000b098, 0x00000003},
12708 - {0x0000b09c, 0x00000000},
12709 - {0x0000b0a0, 0x00000000},
12710 - {0x0000b0a4, 0x00000000},
12711 - {0x0000b0a8, 0x00000000},
12712 - {0x0000b0ac, 0x00000000},
12713 - {0x0000b0b0, 0x00000000},
12714 - {0x0000b0b4, 0x00000000},
12715 - {0x0000b0b8, 0x00000000},
12716 - {0x0000b0bc, 0x00000000},
12717 - {0x0000b0c0, 0x003f0020},
12718 - {0x0000b0c4, 0x00400041},
12719 - {0x0000b0c8, 0x0140005f},
12720 - {0x0000b0cc, 0x0160015f},
12721 - {0x0000b0d0, 0x017e017f},
12722 - {0x0000b0d4, 0x02410242},
12723 - {0x0000b0d8, 0x025f0240},
12724 - {0x0000b0dc, 0x027f0260},
12725 - {0x0000b0e0, 0x0341027e},
12726 - {0x0000b0e4, 0x035f0340},
12727 - {0x0000b0e8, 0x037f0360},
12728 - {0x0000b0ec, 0x04400441},
12729 - {0x0000b0f0, 0x0460045f},
12730 - {0x0000b0f4, 0x0541047f},
12731 - {0x0000b0f8, 0x055f0540},
12732 - {0x0000b0fc, 0x057f0560},
12733 - {0x0000b100, 0x06400641},
12734 - {0x0000b104, 0x0660065f},
12735 - {0x0000b108, 0x067e067f},
12736 - {0x0000b10c, 0x07410742},
12737 - {0x0000b110, 0x075f0740},
12738 - {0x0000b114, 0x077f0760},
12739 - {0x0000b118, 0x07800781},
12740 - {0x0000b11c, 0x07a0079f},
12741 - {0x0000b120, 0x07c107bf},
12742 - {0x0000b124, 0x000007c0},
12743 - {0x0000b128, 0x00000000},
12744 - {0x0000b12c, 0x00000000},
12745 - {0x0000b130, 0x00000000},
12746 - {0x0000b134, 0x00000000},
12747 - {0x0000b138, 0x00000000},
12748 - {0x0000b13c, 0x00000000},
12749 - {0x0000b140, 0x003f0020},
12750 - {0x0000b144, 0x00400041},
12751 - {0x0000b148, 0x0140005f},
12752 - {0x0000b14c, 0x0160015f},
12753 - {0x0000b150, 0x017e017f},
12754 - {0x0000b154, 0x02410242},
12755 - {0x0000b158, 0x025f0240},
12756 - {0x0000b15c, 0x027f0260},
12757 - {0x0000b160, 0x0341027e},
12758 - {0x0000b164, 0x035f0340},
12759 - {0x0000b168, 0x037f0360},
12760 - {0x0000b16c, 0x04400441},
12761 - {0x0000b170, 0x0460045f},
12762 - {0x0000b174, 0x0541047f},
12763 - {0x0000b178, 0x055f0540},
12764 - {0x0000b17c, 0x057f0560},
12765 - {0x0000b180, 0x06400641},
12766 - {0x0000b184, 0x0660065f},
12767 - {0x0000b188, 0x067e067f},
12768 - {0x0000b18c, 0x07410742},
12769 - {0x0000b190, 0x075f0740},
12770 - {0x0000b194, 0x077f0760},
12771 - {0x0000b198, 0x07800781},
12772 - {0x0000b19c, 0x07a0079f},
12773 - {0x0000b1a0, 0x07c107bf},
12774 - {0x0000b1a4, 0x000007c0},
12775 - {0x0000b1a8, 0x00000000},
12776 - {0x0000b1ac, 0x00000000},
12777 - {0x0000b1b0, 0x00000000},
12778 - {0x0000b1b4, 0x00000000},
12779 - {0x0000b1b8, 0x00000000},
12780 - {0x0000b1bc, 0x00000000},
12781 - {0x0000b1c0, 0x00000000},
12782 - {0x0000b1c4, 0x00000000},
12783 - {0x0000b1c8, 0x00000000},
12784 - {0x0000b1cc, 0x00000000},
12785 - {0x0000b1d0, 0x00000000},
12786 - {0x0000b1d4, 0x00000000},
12787 - {0x0000b1d8, 0x00000000},
12788 - {0x0000b1dc, 0x00000000},
12789 - {0x0000b1e0, 0x00000000},
12790 - {0x0000b1e4, 0x00000000},
12791 - {0x0000b1e8, 0x00000000},
12792 - {0x0000b1ec, 0x00000000},
12793 - {0x0000b1f0, 0x00000396},
12794 - {0x0000b1f4, 0x00000396},
12795 - {0x0000b1f8, 0x00000396},
12796 - {0x0000b1fc, 0x00000196},
12797 -};
12798 -
12799 static const u32 ar955x_1p0_baseband_core[][2] = {
12800 /* Addr allmodes */
12801 {0x00009800, 0xafe68e30},
12802 @@ -891,266 +632,6 @@ static const u32 ar955x_1p0_baseband_cor
12803 {0x0000c420, 0x00000000},
12804 };
12805
12806 -static const u32 ar955x_1p0_common_wo_xlna_rx_gain_table[][2] = {
12807 - /* Addr allmodes */
12808 - {0x0000a000, 0x00010000},
12809 - {0x0000a004, 0x00030002},
12810 - {0x0000a008, 0x00050004},
12811 - {0x0000a00c, 0x00810080},
12812 - {0x0000a010, 0x00830082},
12813 - {0x0000a014, 0x01810180},
12814 - {0x0000a018, 0x01830182},
12815 - {0x0000a01c, 0x01850184},
12816 - {0x0000a020, 0x01890188},
12817 - {0x0000a024, 0x018b018a},
12818 - {0x0000a028, 0x018d018c},
12819 - {0x0000a02c, 0x03820190},
12820 - {0x0000a030, 0x03840383},
12821 - {0x0000a034, 0x03880385},
12822 - {0x0000a038, 0x038a0389},
12823 - {0x0000a03c, 0x038c038b},
12824 - {0x0000a040, 0x0390038d},
12825 - {0x0000a044, 0x03920391},
12826 - {0x0000a048, 0x03940393},
12827 - {0x0000a04c, 0x03960395},
12828 - {0x0000a050, 0x00000000},
12829 - {0x0000a054, 0x00000000},
12830 - {0x0000a058, 0x00000000},
12831 - {0x0000a05c, 0x00000000},
12832 - {0x0000a060, 0x00000000},
12833 - {0x0000a064, 0x00000000},
12834 - {0x0000a068, 0x00000000},
12835 - {0x0000a06c, 0x00000000},
12836 - {0x0000a070, 0x00000000},
12837 - {0x0000a074, 0x00000000},
12838 - {0x0000a078, 0x00000000},
12839 - {0x0000a07c, 0x00000000},
12840 - {0x0000a080, 0x29292929},
12841 - {0x0000a084, 0x29292929},
12842 - {0x0000a088, 0x29292929},
12843 - {0x0000a08c, 0x29292929},
12844 - {0x0000a090, 0x22292929},
12845 - {0x0000a094, 0x1d1d2222},
12846 - {0x0000a098, 0x0c111117},
12847 - {0x0000a09c, 0x00030303},
12848 - {0x0000a0a0, 0x00000000},
12849 - {0x0000a0a4, 0x00000000},
12850 - {0x0000a0a8, 0x00000000},
12851 - {0x0000a0ac, 0x00000000},
12852 - {0x0000a0b0, 0x00000000},
12853 - {0x0000a0b4, 0x00000000},
12854 - {0x0000a0b8, 0x00000000},
12855 - {0x0000a0bc, 0x00000000},
12856 - {0x0000a0c0, 0x001f0000},
12857 - {0x0000a0c4, 0x01000101},
12858 - {0x0000a0c8, 0x011e011f},
12859 - {0x0000a0cc, 0x011c011d},
12860 - {0x0000a0d0, 0x02030204},
12861 - {0x0000a0d4, 0x02010202},
12862 - {0x0000a0d8, 0x021f0200},
12863 - {0x0000a0dc, 0x0302021e},
12864 - {0x0000a0e0, 0x03000301},
12865 - {0x0000a0e4, 0x031e031f},
12866 - {0x0000a0e8, 0x0402031d},
12867 - {0x0000a0ec, 0x04000401},
12868 - {0x0000a0f0, 0x041e041f},
12869 - {0x0000a0f4, 0x0502041d},
12870 - {0x0000a0f8, 0x05000501},
12871 - {0x0000a0fc, 0x051e051f},
12872 - {0x0000a100, 0x06010602},
12873 - {0x0000a104, 0x061f0600},
12874 - {0x0000a108, 0x061d061e},
12875 - {0x0000a10c, 0x07020703},
12876 - {0x0000a110, 0x07000701},
12877 - {0x0000a114, 0x00000000},
12878 - {0x0000a118, 0x00000000},
12879 - {0x0000a11c, 0x00000000},
12880 - {0x0000a120, 0x00000000},
12881 - {0x0000a124, 0x00000000},
12882 - {0x0000a128, 0x00000000},
12883 - {0x0000a12c, 0x00000000},
12884 - {0x0000a130, 0x00000000},
12885 - {0x0000a134, 0x00000000},
12886 - {0x0000a138, 0x00000000},
12887 - {0x0000a13c, 0x00000000},
12888 - {0x0000a140, 0x001f0000},
12889 - {0x0000a144, 0x01000101},
12890 - {0x0000a148, 0x011e011f},
12891 - {0x0000a14c, 0x011c011d},
12892 - {0x0000a150, 0x02030204},
12893 - {0x0000a154, 0x02010202},
12894 - {0x0000a158, 0x021f0200},
12895 - {0x0000a15c, 0x0302021e},
12896 - {0x0000a160, 0x03000301},
12897 - {0x0000a164, 0x031e031f},
12898 - {0x0000a168, 0x0402031d},
12899 - {0x0000a16c, 0x04000401},
12900 - {0x0000a170, 0x041e041f},
12901 - {0x0000a174, 0x0502041d},
12902 - {0x0000a178, 0x05000501},
12903 - {0x0000a17c, 0x051e051f},
12904 - {0x0000a180, 0x06010602},
12905 - {0x0000a184, 0x061f0600},
12906 - {0x0000a188, 0x061d061e},
12907 - {0x0000a18c, 0x07020703},
12908 - {0x0000a190, 0x07000701},
12909 - {0x0000a194, 0x00000000},
12910 - {0x0000a198, 0x00000000},
12911 - {0x0000a19c, 0x00000000},
12912 - {0x0000a1a0, 0x00000000},
12913 - {0x0000a1a4, 0x00000000},
12914 - {0x0000a1a8, 0x00000000},
12915 - {0x0000a1ac, 0x00000000},
12916 - {0x0000a1b0, 0x00000000},
12917 - {0x0000a1b4, 0x00000000},
12918 - {0x0000a1b8, 0x00000000},
12919 - {0x0000a1bc, 0x00000000},
12920 - {0x0000a1c0, 0x00000000},
12921 - {0x0000a1c4, 0x00000000},
12922 - {0x0000a1c8, 0x00000000},
12923 - {0x0000a1cc, 0x00000000},
12924 - {0x0000a1d0, 0x00000000},
12925 - {0x0000a1d4, 0x00000000},
12926 - {0x0000a1d8, 0x00000000},
12927 - {0x0000a1dc, 0x00000000},
12928 - {0x0000a1e0, 0x00000000},
12929 - {0x0000a1e4, 0x00000000},
12930 - {0x0000a1e8, 0x00000000},
12931 - {0x0000a1ec, 0x00000000},
12932 - {0x0000a1f0, 0x00000396},
12933 - {0x0000a1f4, 0x00000396},
12934 - {0x0000a1f8, 0x00000396},
12935 - {0x0000a1fc, 0x00000196},
12936 - {0x0000b000, 0x00010000},
12937 - {0x0000b004, 0x00030002},
12938 - {0x0000b008, 0x00050004},
12939 - {0x0000b00c, 0x00810080},
12940 - {0x0000b010, 0x00830082},
12941 - {0x0000b014, 0x01810180},
12942 - {0x0000b018, 0x01830182},
12943 - {0x0000b01c, 0x01850184},
12944 - {0x0000b020, 0x02810280},
12945 - {0x0000b024, 0x02830282},
12946 - {0x0000b028, 0x02850284},
12947 - {0x0000b02c, 0x02890288},
12948 - {0x0000b030, 0x028b028a},
12949 - {0x0000b034, 0x0388028c},
12950 - {0x0000b038, 0x038a0389},
12951 - {0x0000b03c, 0x038c038b},
12952 - {0x0000b040, 0x0390038d},
12953 - {0x0000b044, 0x03920391},
12954 - {0x0000b048, 0x03940393},
12955 - {0x0000b04c, 0x03960395},
12956 - {0x0000b050, 0x00000000},
12957 - {0x0000b054, 0x00000000},
12958 - {0x0000b058, 0x00000000},
12959 - {0x0000b05c, 0x00000000},
12960 - {0x0000b060, 0x00000000},
12961 - {0x0000b064, 0x00000000},
12962 - {0x0000b068, 0x00000000},
12963 - {0x0000b06c, 0x00000000},
12964 - {0x0000b070, 0x00000000},
12965 - {0x0000b074, 0x00000000},
12966 - {0x0000b078, 0x00000000},
12967 - {0x0000b07c, 0x00000000},
12968 - {0x0000b080, 0x32323232},
12969 - {0x0000b084, 0x2f2f3232},
12970 - {0x0000b088, 0x23282a2d},
12971 - {0x0000b08c, 0x1c1e2123},
12972 - {0x0000b090, 0x14171919},
12973 - {0x0000b094, 0x0e0e1214},
12974 - {0x0000b098, 0x03050707},
12975 - {0x0000b09c, 0x00030303},
12976 - {0x0000b0a0, 0x00000000},
12977 - {0x0000b0a4, 0x00000000},
12978 - {0x0000b0a8, 0x00000000},
12979 - {0x0000b0ac, 0x00000000},
12980 - {0x0000b0b0, 0x00000000},
12981 - {0x0000b0b4, 0x00000000},
12982 - {0x0000b0b8, 0x00000000},
12983 - {0x0000b0bc, 0x00000000},
12984 - {0x0000b0c0, 0x003f0020},
12985 - {0x0000b0c4, 0x00400041},
12986 - {0x0000b0c8, 0x0140005f},
12987 - {0x0000b0cc, 0x0160015f},
12988 - {0x0000b0d0, 0x017e017f},
12989 - {0x0000b0d4, 0x02410242},
12990 - {0x0000b0d8, 0x025f0240},
12991 - {0x0000b0dc, 0x027f0260},
12992 - {0x0000b0e0, 0x0341027e},
12993 - {0x0000b0e4, 0x035f0340},
12994 - {0x0000b0e8, 0x037f0360},
12995 - {0x0000b0ec, 0x04400441},
12996 - {0x0000b0f0, 0x0460045f},
12997 - {0x0000b0f4, 0x0541047f},
12998 - {0x0000b0f8, 0x055f0540},
12999 - {0x0000b0fc, 0x057f0560},
13000 - {0x0000b100, 0x06400641},
13001 - {0x0000b104, 0x0660065f},
13002 - {0x0000b108, 0x067e067f},
13003 - {0x0000b10c, 0x07410742},
13004 - {0x0000b110, 0x075f0740},
13005 - {0x0000b114, 0x077f0760},
13006 - {0x0000b118, 0x07800781},
13007 - {0x0000b11c, 0x07a0079f},
13008 - {0x0000b120, 0x07c107bf},
13009 - {0x0000b124, 0x000007c0},
13010 - {0x0000b128, 0x00000000},
13011 - {0x0000b12c, 0x00000000},
13012 - {0x0000b130, 0x00000000},
13013 - {0x0000b134, 0x00000000},
13014 - {0x0000b138, 0x00000000},
13015 - {0x0000b13c, 0x00000000},
13016 - {0x0000b140, 0x003f0020},
13017 - {0x0000b144, 0x00400041},
13018 - {0x0000b148, 0x0140005f},
13019 - {0x0000b14c, 0x0160015f},
13020 - {0x0000b150, 0x017e017f},
13021 - {0x0000b154, 0x02410242},
13022 - {0x0000b158, 0x025f0240},
13023 - {0x0000b15c, 0x027f0260},
13024 - {0x0000b160, 0x0341027e},
13025 - {0x0000b164, 0x035f0340},
13026 - {0x0000b168, 0x037f0360},
13027 - {0x0000b16c, 0x04400441},
13028 - {0x0000b170, 0x0460045f},
13029 - {0x0000b174, 0x0541047f},
13030 - {0x0000b178, 0x055f0540},
13031 - {0x0000b17c, 0x057f0560},
13032 - {0x0000b180, 0x06400641},
13033 - {0x0000b184, 0x0660065f},
13034 - {0x0000b188, 0x067e067f},
13035 - {0x0000b18c, 0x07410742},
13036 - {0x0000b190, 0x075f0740},
13037 - {0x0000b194, 0x077f0760},
13038 - {0x0000b198, 0x07800781},
13039 - {0x0000b19c, 0x07a0079f},
13040 - {0x0000b1a0, 0x07c107bf},
13041 - {0x0000b1a4, 0x000007c0},
13042 - {0x0000b1a8, 0x00000000},
13043 - {0x0000b1ac, 0x00000000},
13044 - {0x0000b1b0, 0x00000000},
13045 - {0x0000b1b4, 0x00000000},
13046 - {0x0000b1b8, 0x00000000},
13047 - {0x0000b1bc, 0x00000000},
13048 - {0x0000b1c0, 0x00000000},
13049 - {0x0000b1c4, 0x00000000},
13050 - {0x0000b1c8, 0x00000000},
13051 - {0x0000b1cc, 0x00000000},
13052 - {0x0000b1d0, 0x00000000},
13053 - {0x0000b1d4, 0x00000000},
13054 - {0x0000b1d8, 0x00000000},
13055 - {0x0000b1dc, 0x00000000},
13056 - {0x0000b1e0, 0x00000000},
13057 - {0x0000b1e4, 0x00000000},
13058 - {0x0000b1e8, 0x00000000},
13059 - {0x0000b1ec, 0x00000000},
13060 - {0x0000b1f0, 0x00000396},
13061 - {0x0000b1f4, 0x00000396},
13062 - {0x0000b1f8, 0x00000396},
13063 - {0x0000b1fc, 0x00000196},
13064 -};
13065 -
13066 static const u32 ar955x_1p0_soc_preamble[][2] = {
13067 /* Addr allmodes */
13068 {0x00007000, 0x00000000},
13069 @@ -1263,11 +744,6 @@ static const u32 ar955x_1p0_modes_no_xpa
13070 {0x00016848, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401, 0x66482401},
13071 };
13072
13073 -static const u32 ar955x_1p0_soc_postamble[][5] = {
13074 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
13075 - {0x00007010, 0x00000023, 0x00000023, 0x00000023, 0x00000023},
13076 -};
13077 -
13078 static const u32 ar955x_1p0_modes_fast_clock[][3] = {
13079 /* Addr 5G_HT20 5G_HT40 */
13080 {0x00001030, 0x00000268, 0x000004d0},
13081 --- a/drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h
13082 +++ b/drivers/net/wireless/ath/ath9k/ar9565_1p0_initvals.h
13083 @@ -20,6 +20,12 @@
13084
13085 /* AR9565 1.0 */
13086
13087 +#define ar9565_1p0_mac_postamble ar9331_1p1_mac_postamble
13088 +
13089 +#define ar9565_1p0_Modes_lowest_ob_db_tx_gain_table ar9565_1p0_modes_low_ob_db_tx_gain_table
13090 +
13091 +#define ar9565_1p0_baseband_core_txfir_coeff_japan_2484 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
13092 +
13093 static const u32 ar9565_1p0_mac_core[][2] = {
13094 /* Addr allmodes */
13095 {0x00000008, 0x00000000},
13096 @@ -182,18 +188,6 @@ static const u32 ar9565_1p0_mac_core[][2
13097 {0x000083d0, 0x800301ff},
13098 };
13099
13100 -static const u32 ar9565_1p0_mac_postamble[][5] = {
13101 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
13102 - {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160},
13103 - {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c},
13104 - {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38},
13105 - {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00},
13106 - {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b},
13107 - {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810},
13108 - {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a},
13109 - {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440},
13110 -};
13111 -
13112 static const u32 ar9565_1p0_baseband_core[][2] = {
13113 /* Addr allmodes */
13114 {0x00009800, 0xafe68e30},
13115 @@ -711,66 +705,6 @@ static const u32 ar9565_1p0_Common_rx_ga
13116 {0x0000b1fc, 0x00000196},
13117 };
13118
13119 -static const u32 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table[][5] = {
13120 - /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
13121 - {0x0000a2dc, 0xfc0a9380, 0xfc0a9380, 0xfdab5b52, 0xfdab5b52},
13122 - {0x0000a2e0, 0xffecec00, 0xffecec00, 0xfd339c84, 0xfd339c84},
13123 - {0x0000a2e4, 0xfc0f0000, 0xfc0f0000, 0xfec3e000, 0xfec3e000},
13124 - {0x0000a2e8, 0xfc100000, 0xfc100000, 0xfffc0000, 0xfffc0000},
13125 - {0x0000a410, 0x000050d9, 0x000050d9, 0x000050d9, 0x000050d9},
13126 - {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13127 - {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002},
13128 - {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004},
13129 - {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200},
13130 - {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202},
13131 - {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400},
13132 - {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402},
13133 - {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404},
13134 - {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603},
13135 - {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02},
13136 - {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04},
13137 - {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20},
13138 - {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20},
13139 - {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22},
13140 - {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24},
13141 - {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640},
13142 - {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660},
13143 - {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861},
13144 - {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81},
13145 - {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83},
13146 - {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84},
13147 - {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3},
13148 - {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5},
13149 - {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9},
13150 - {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb},
13151 - {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
13152 - {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
13153 - {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
13154 - {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
13155 - {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
13156 - {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
13157 - {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec},
13158 - {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13159 - {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13160 - {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13161 - {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13162 - {0x0000a610, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13163 - {0x0000a614, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13164 - {0x0000a618, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13165 - {0x0000a61c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13166 - {0x0000a620, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13167 - {0x0000a624, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13168 - {0x0000a628, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13169 - {0x0000a62c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13170 - {0x0000a630, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13171 - {0x0000a634, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13172 - {0x0000a638, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13173 - {0x0000a63c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13174 - {0x00016044, 0x012482d4, 0x012482d4, 0x012482d4, 0x012482d4},
13175 - {0x00016048, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13176 - {0x00016054, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13177 -};
13178 -
13179 static const u32 ar9565_1p0_pciephy_clkreq_disable_L1[][2] = {
13180 /* Addr allmodes */
13181 {0x00018c00, 0x18212ede},
13182 @@ -1231,11 +1165,4 @@ static const u32 ar9565_1p0_modes_high_p
13183 {0x00016054, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13184 };
13185
13186 -static const u32 ar9565_1p0_baseband_core_txfir_coeff_japan_2484[][2] = {
13187 - /* Addr allmodes */
13188 - {0x0000a398, 0x00000000},
13189 - {0x0000a39c, 0x6f7f0301},
13190 - {0x0000a3a0, 0xca9228ee},
13191 -};
13192 -
13193 #endif /* INITVALS_9565_1P0_H */
13194 --- a/include/linux/ath9k_platform.h
13195 +++ b/include/linux/ath9k_platform.h
13196 @@ -32,6 +32,8 @@ struct ath9k_platform_data {
13197 u32 gpio_val;
13198
13199 bool is_clk_25mhz;
13200 + bool tx_gain_buffalo;
13201 +
13202 int (*get_mac_revision)(void);
13203 int (*external_reset)(void);
13204 };
13205 --- /dev/null
13206 +++ b/drivers/net/wireless/ath/ath9k/ar9003_buffalo_initvals.h
13207 @@ -0,0 +1,126 @@
13208 +/*
13209 + * Copyright (c) 2013 Qualcomm Atheros Inc.
13210 + *
13211 + * Permission to use, copy, modify, and/or distribute this software for any
13212 + * purpose with or without fee is hereby granted, provided that the above
13213 + * copyright notice and this permission notice appear in all copies.
13214 + *
13215 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13216 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13217 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13218 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13219 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13220 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13221 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
13222 + */
13223 +
13224 +#ifndef INITVALS_9003_BUFFALO_H
13225 +#define INITVALS_9003_BUFFALO_H
13226 +
13227 +static const u32 ar9300Modes_high_power_tx_gain_table_buffalo[][5] = {
13228 + /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */
13229 + {0x0000a2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
13230 + {0x0000a2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
13231 + {0x0000a2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
13232 + {0x0000a2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
13233 + {0x0000a410, 0x000050d8, 0x000050d8, 0x000050d9, 0x000050d9},
13234 + {0x0000a500, 0x00002220, 0x00002220, 0x00000000, 0x00000000},
13235 + {0x0000a504, 0x04002222, 0x04002222, 0x04000002, 0x04000002},
13236 + {0x0000a508, 0x09002421, 0x09002421, 0x08000004, 0x08000004},
13237 + {0x0000a50c, 0x0d002621, 0x0d002621, 0x0b000200, 0x0b000200},
13238 + {0x0000a510, 0x13004620, 0x13004620, 0x0f000202, 0x0f000202},
13239 + {0x0000a514, 0x19004a20, 0x19004a20, 0x11000400, 0x11000400},
13240 + {0x0000a518, 0x1d004e20, 0x1d004e20, 0x15000402, 0x15000402},
13241 + {0x0000a51c, 0x21005420, 0x21005420, 0x19000404, 0x19000404},
13242 + {0x0000a520, 0x26005e20, 0x26005e20, 0x1b000603, 0x1b000603},
13243 + {0x0000a524, 0x2b005e40, 0x2b005e40, 0x1f000a02, 0x1f000a02},
13244 + {0x0000a528, 0x2f005e42, 0x2f005e42, 0x23000a04, 0x23000a04},
13245 + {0x0000a52c, 0x33005e44, 0x33005e44, 0x26000a20, 0x26000a20},
13246 + {0x0000a530, 0x38005e65, 0x38005e65, 0x2a000e20, 0x2a000e20},
13247 + {0x0000a534, 0x3c005e69, 0x3c005e69, 0x2e000e22, 0x2e000e22},
13248 + {0x0000a538, 0x40005e6b, 0x40005e6b, 0x31000e24, 0x31000e24},
13249 + {0x0000a53c, 0x44005e6d, 0x44005e6d, 0x34001640, 0x34001640},
13250 + {0x0000a540, 0x49005e72, 0x49005e72, 0x38001660, 0x38001660},
13251 + {0x0000a544, 0x4e005eb2, 0x4e005eb2, 0x3b001861, 0x3b001861},
13252 + {0x0000a548, 0x53005f12, 0x53005f12, 0x3e001a81, 0x3e001a81},
13253 + {0x0000a54c, 0x59025eb2, 0x59025eb2, 0x42001a83, 0x42001a83},
13254 + {0x0000a550, 0x5e025f12, 0x5e025f12, 0x44001c84, 0x44001c84},
13255 + {0x0000a554, 0x61027f12, 0x61027f12, 0x48001ce3, 0x48001ce3},
13256 + {0x0000a558, 0x6702bf12, 0x6702bf12, 0x4c001ce5, 0x4c001ce5},
13257 + {0x0000a55c, 0x6b02bf14, 0x6b02bf14, 0x50001ce9, 0x50001ce9},
13258 + {0x0000a560, 0x6f02bf16, 0x6f02bf16, 0x54001ceb, 0x54001ceb},
13259 + {0x0000a564, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
13260 + {0x0000a568, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
13261 + {0x0000a56c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
13262 + {0x0000a570, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
13263 + {0x0000a574, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
13264 + {0x0000a578, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
13265 + {0x0000a57c, 0x6f02bf16, 0x6f02bf16, 0x56001eec, 0x56001eec},
13266 + {0x0000a580, 0x00802220, 0x00802220, 0x00800000, 0x00800000},
13267 + {0x0000a584, 0x04802222, 0x04802222, 0x04800002, 0x04800002},
13268 + {0x0000a588, 0x09802421, 0x09802421, 0x08800004, 0x08800004},
13269 + {0x0000a58c, 0x0d802621, 0x0d802621, 0x0b800200, 0x0b800200},
13270 + {0x0000a590, 0x13804620, 0x13804620, 0x0f800202, 0x0f800202},
13271 + {0x0000a594, 0x19804a20, 0x19804a20, 0x11800400, 0x11800400},
13272 + {0x0000a598, 0x1d804e20, 0x1d804e20, 0x15800402, 0x15800402},
13273 + {0x0000a59c, 0x21805420, 0x21805420, 0x19800404, 0x19800404},
13274 + {0x0000a5a0, 0x26805e20, 0x26805e20, 0x1b800603, 0x1b800603},
13275 + {0x0000a5a4, 0x2b805e40, 0x2b805e40, 0x1f800a02, 0x1f800a02},
13276 + {0x0000a5a8, 0x2f805e42, 0x2f805e42, 0x23800a04, 0x23800a04},
13277 + {0x0000a5ac, 0x33805e44, 0x33805e44, 0x26800a20, 0x26800a20},
13278 + {0x0000a5b0, 0x38805e65, 0x38805e65, 0x2a800e20, 0x2a800e20},
13279 + {0x0000a5b4, 0x3c805e69, 0x3c805e69, 0x2e800e22, 0x2e800e22},
13280 + {0x0000a5b8, 0x40805e6b, 0x40805e6b, 0x31800e24, 0x31800e24},
13281 + {0x0000a5bc, 0x44805e6d, 0x44805e6d, 0x34801640, 0x34801640},
13282 + {0x0000a5c0, 0x49805e72, 0x49805e72, 0x38801660, 0x38801660},
13283 + {0x0000a5c4, 0x4e805eb2, 0x4e805eb2, 0x3b801861, 0x3b801861},
13284 + {0x0000a5c8, 0x53805f12, 0x53805f12, 0x3e801a81, 0x3e801a81},
13285 + {0x0000a5cc, 0x59825eb2, 0x59825eb2, 0x42801a83, 0x42801a83},
13286 + {0x0000a5d0, 0x5e825f12, 0x5e825f12, 0x44801c84, 0x44801c84},
13287 + {0x0000a5d4, 0x61827f12, 0x61827f12, 0x48801ce3, 0x48801ce3},
13288 + {0x0000a5d8, 0x6782bf12, 0x6782bf12, 0x4c801ce5, 0x4c801ce5},
13289 + {0x0000a5dc, 0x6b82bf14, 0x6b82bf14, 0x50801ce9, 0x50801ce9},
13290 + {0x0000a5e0, 0x6f82bf16, 0x6f82bf16, 0x54801ceb, 0x54801ceb},
13291 + {0x0000a5e4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
13292 + {0x0000a5e8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
13293 + {0x0000a5ec, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
13294 + {0x0000a5f0, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
13295 + {0x0000a5f4, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
13296 + {0x0000a5f8, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
13297 + {0x0000a5fc, 0x6f82bf16, 0x6f82bf16, 0x56801eec, 0x56801eec},
13298 + {0x0000a600, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13299 + {0x0000a604, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13300 + {0x0000a608, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13301 + {0x0000a60c, 0x00000000, 0x00000000, 0x00000000, 0x00000000},
13302 + {0x0000a610, 0x00804000, 0x00804000, 0x00000000, 0x00000000},
13303 + {0x0000a614, 0x00804201, 0x00804201, 0x01404000, 0x01404000},
13304 + {0x0000a618, 0x0280c802, 0x0280c802, 0x01404501, 0x01404501},
13305 + {0x0000a61c, 0x0280ca03, 0x0280ca03, 0x02008501, 0x02008501},
13306 + {0x0000a620, 0x04c15104, 0x04c15104, 0x0280ca03, 0x0280ca03},
13307 + {0x0000a624, 0x04c15305, 0x04c15305, 0x03010c04, 0x03010c04},
13308 + {0x0000a628, 0x04c15305, 0x04c15305, 0x04014c04, 0x04014c04},
13309 + {0x0000a62c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
13310 + {0x0000a630, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
13311 + {0x0000a634, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
13312 + {0x0000a638, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
13313 + {0x0000a63c, 0x04c15305, 0x04c15305, 0x04015005, 0x04015005},
13314 + {0x0000b2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
13315 + {0x0000b2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
13316 + {0x0000b2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
13317 + {0x0000b2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
13318 + {0x0000c2dc, 0x0380c7fc, 0x0380c7fc, 0x03aaa352, 0x03aaa352},
13319 + {0x0000c2e0, 0x0000f800, 0x0000f800, 0x03ccc584, 0x03ccc584},
13320 + {0x0000c2e4, 0x03ff0000, 0x03ff0000, 0x03f0f800, 0x03f0f800},
13321 + {0x0000c2e8, 0x00000000, 0x00000000, 0x03ff0000, 0x03ff0000},
13322 + {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
13323 + {0x00016048, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
13324 + {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
13325 + {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
13326 + {0x00016448, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
13327 + {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
13328 + {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4},
13329 + {0x00016848, 0x66480001, 0x66480001, 0x66480001, 0x66480001},
13330 + {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c},
13331 +};
13332 +
13333 +#endif /* INITVALS_9003_BUFFALO_H */
13334 --- a/drivers/net/wireless/ath/ath9k/ar9002_mac.c
13335 +++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c
13336 @@ -29,7 +29,8 @@ static void ar9002_hw_set_desc_link(void
13337 ((struct ath_desc*) ds)->ds_link = ds_link;
13338 }
13339
13340 -static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
13341 +static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked,
13342 + u32 *sync_cause_p)
13343 {
13344 u32 isr = 0;
13345 u32 mask2 = 0;
13346 @@ -76,9 +77,16 @@ static bool ar9002_hw_get_isr(struct ath
13347 mask2 |= ATH9K_INT_CST;
13348 if (isr2 & AR_ISR_S2_TSFOOR)
13349 mask2 |= ATH9K_INT_TSFOOR;
13350 +
13351 + if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
13352 + REG_WRITE(ah, AR_ISR_S2, isr2);
13353 + isr &= ~AR_ISR_BCNMISC;
13354 + }
13355 }
13356
13357 - isr = REG_READ(ah, AR_ISR_RAC);
13358 + if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)
13359 + isr = REG_READ(ah, AR_ISR_RAC);
13360 +
13361 if (isr == 0xffffffff) {
13362 *masked = 0;
13363 return false;
13364 @@ -97,11 +105,23 @@ static bool ar9002_hw_get_isr(struct ath
13365
13366 *masked |= ATH9K_INT_TX;
13367
13368 - s0_s = REG_READ(ah, AR_ISR_S0_S);
13369 + if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) {
13370 + s0_s = REG_READ(ah, AR_ISR_S0_S);
13371 + s1_s = REG_READ(ah, AR_ISR_S1_S);
13372 + } else {
13373 + s0_s = REG_READ(ah, AR_ISR_S0);
13374 + REG_WRITE(ah, AR_ISR_S0, s0_s);
13375 + s1_s = REG_READ(ah, AR_ISR_S1);
13376 + REG_WRITE(ah, AR_ISR_S1, s1_s);
13377 +
13378 + isr &= ~(AR_ISR_TXOK |
13379 + AR_ISR_TXDESC |
13380 + AR_ISR_TXERR |
13381 + AR_ISR_TXEOL);
13382 + }
13383 +
13384 ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK);
13385 ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC);
13386 -
13387 - s1_s = REG_READ(ah, AR_ISR_S1_S);
13388 ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR);
13389 ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL);
13390 }
13391 @@ -114,13 +134,23 @@ static bool ar9002_hw_get_isr(struct ath
13392 *masked |= mask2;
13393 }
13394
13395 + if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
13396 + REG_WRITE(ah, AR_ISR, isr);
13397 + REG_READ(ah, AR_ISR);
13398 + }
13399 +
13400 if (AR_SREV_9100(ah))
13401 return true;
13402
13403 if (isr & AR_ISR_GENTMR) {
13404 u32 s5_s;
13405
13406 - s5_s = REG_READ(ah, AR_ISR_S5_S);
13407 + if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) {
13408 + s5_s = REG_READ(ah, AR_ISR_S5_S);
13409 + } else {
13410 + s5_s = REG_READ(ah, AR_ISR_S5);
13411 + }
13412 +
13413 ah->intr_gen_timer_trigger =
13414 MS(s5_s, AR_ISR_S5_GENTIMER_TRIG);
13415
13416 @@ -133,10 +163,16 @@ static bool ar9002_hw_get_isr(struct ath
13417 if ((s5_s & AR_ISR_S5_TIM_TIMER) &&
13418 !(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
13419 *masked |= ATH9K_INT_TIM_TIMER;
13420 +
13421 + if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) {
13422 + REG_WRITE(ah, AR_ISR_S5, s5_s);
13423 + isr &= ~AR_ISR_GENTMR;
13424 + }
13425 }
13426
13427 if (sync_cause) {
13428 - ath9k_debug_sync_cause(common, sync_cause);
13429 + if (sync_cause_p)
13430 + *sync_cause_p = sync_cause;
13431 fatal_int =
13432 (sync_cause &
13433 (AR_INTR_SYNC_HOST1_FATAL | AR_INTR_SYNC_HOST1_PERR))
13434 --- a/drivers/net/wireless/ath/ath9k/antenna.c
13435 +++ b/drivers/net/wireless/ath/ath9k/antenna.c
13436 @@ -724,14 +724,14 @@ void ath_ant_comb_scan(struct ath_softc
13437 struct ath_ant_comb *antcomb = &sc->ant_comb;
13438 int alt_ratio = 0, alt_rssi_avg = 0, main_rssi_avg = 0, curr_alt_set;
13439 int curr_main_set;
13440 - int main_rssi = rs->rs_rssi_ctl0;
13441 - int alt_rssi = rs->rs_rssi_ctl1;
13442 + int main_rssi = rs->rs_rssi_ctl[0];
13443 + int alt_rssi = rs->rs_rssi_ctl[1];
13444 int rx_ant_conf, main_ant_conf;
13445 bool short_scan = false, ret;
13446
13447 - rx_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_CURRENT_SHIFT) &
13448 + rx_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_CURRENT_SHIFT) &
13449 ATH_ANT_RX_MASK;
13450 - main_ant_conf = (rs->rs_rssi_ctl2 >> ATH_ANT_RX_MAIN_SHIFT) &
13451 + main_ant_conf = (rs->rs_rssi_ctl[2] >> ATH_ANT_RX_MAIN_SHIFT) &
13452 ATH_ANT_RX_MASK;
13453
13454 if (alt_rssi >= antcomb->low_rssi_thresh) {
13455 --- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
13456 +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
13457 @@ -32,12 +32,8 @@ static int ar9002_hw_init_mode_regs(stru
13458 return 0;
13459 }
13460
13461 - if (ah->config.pcie_clock_req)
13462 - INIT_INI_ARRAY(&ah->iniPcieSerdes,
13463 - ar9280PciePhy_clkreq_off_L1_9280);
13464 - else
13465 - INIT_INI_ARRAY(&ah->iniPcieSerdes,
13466 - ar9280PciePhy_clkreq_always_on_L1_9280);
13467 + INIT_INI_ARRAY(&ah->iniPcieSerdes,
13468 + ar9280PciePhy_clkreq_always_on_L1_9280);
13469
13470 if (AR_SREV_9287_11_OR_LATER(ah)) {
13471 INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_1);
13472 --- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c
13473 +++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c
13474 @@ -201,7 +201,6 @@ static void ar9002_hw_spur_mitigate(stru
13475 ath9k_hw_get_channel_centers(ah, chan, &centers);
13476 freq = centers.synth_center;
13477
13478 - ah->config.spurmode = SPUR_ENABLE_EEPROM;
13479 for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
13480 cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz);
13481
13482 --- a/drivers/net/wireless/ath/ath9k/ar9003_mac.c
13483 +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c
13484 @@ -175,7 +175,8 @@ static void ar9003_hw_set_desc_link(void
13485 ads->ctl10 |= ar9003_calc_ptr_chksum(ads);
13486 }
13487
13488 -static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked)
13489 +static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked,
13490 + u32 *sync_cause_p)
13491 {
13492 u32 isr = 0;
13493 u32 mask2 = 0;
13494 @@ -310,7 +311,8 @@ static bool ar9003_hw_get_isr(struct ath
13495 ar9003_mci_get_isr(ah, masked);
13496
13497 if (sync_cause) {
13498 - ath9k_debug_sync_cause(common, sync_cause);
13499 + if (sync_cause_p)
13500 + *sync_cause_p = sync_cause;
13501 fatal_int =
13502 (sync_cause &
13503 (AR_INTR_SYNC_HOST1_FATAL | AR_INTR_SYNC_HOST1_PERR))
13504 @@ -476,12 +478,12 @@ int ath9k_hw_process_rxdesc_edma(struct
13505
13506 /* XXX: Keycache */
13507 rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined);
13508 - rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00);
13509 - rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01);
13510 - rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02);
13511 - rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10);
13512 - rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11);
13513 - rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12);
13514 + rxs->rs_rssi_ctl[0] = MS(rxsp->status1, AR_RxRSSIAnt00);
13515 + rxs->rs_rssi_ctl[1] = MS(rxsp->status1, AR_RxRSSIAnt01);
13516 + rxs->rs_rssi_ctl[2] = MS(rxsp->status1, AR_RxRSSIAnt02);
13517 + rxs->rs_rssi_ext[0] = MS(rxsp->status5, AR_RxRSSIAnt10);
13518 + rxs->rs_rssi_ext[1] = MS(rxsp->status5, AR_RxRSSIAnt11);
13519 + rxs->rs_rssi_ext[2] = MS(rxsp->status5, AR_RxRSSIAnt12);
13520
13521 if (rxsp->status11 & AR_RxKeyIdxValid)
13522 rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx);
13523 --- a/drivers/net/wireless/ath/ath9k/beacon.c
13524 +++ b/drivers/net/wireless/ath/ath9k/beacon.c
13525 @@ -274,18 +274,19 @@ static int ath9k_beacon_choose_slot(stru
13526 return slot;
13527 }
13528
13529 -void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif)
13530 +static void ath9k_set_tsfadjust(struct ath_softc *sc, struct ieee80211_vif *vif)
13531 {
13532 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
13533 struct ath_beacon_config *cur_conf = &sc->cur_beacon_conf;
13534 struct ath_vif *avp = (void *)vif->drv_priv;
13535 - u64 tsfadjust;
13536 + u32 tsfadjust;
13537
13538 if (avp->av_bslot == 0)
13539 return;
13540
13541 - tsfadjust = cur_conf->beacon_interval * avp->av_bslot / ATH_BCBUF;
13542 - avp->tsf_adjust = cpu_to_le64(TU_TO_USEC(tsfadjust));
13543 + tsfadjust = cur_conf->beacon_interval * avp->av_bslot;
13544 + tsfadjust = TU_TO_USEC(tsfadjust) / ATH_BCBUF;
13545 + avp->tsf_adjust = cpu_to_le64(tsfadjust);
13546
13547 ath_dbg(common, CONFIG, "tsfadjust is: %llu for bslot: %d\n",
13548 (unsigned long long)tsfadjust, avp->av_bslot);
13549 @@ -431,6 +432,33 @@ static void ath9k_beacon_init(struct ath
13550 ath9k_hw_enable_interrupts(ah);
13551 }
13552
13553 +/* Calculate the modulo of a 64 bit TSF snapshot with a TU divisor */
13554 +static u32 ath9k_mod_tsf64_tu(u64 tsf, u32 div_tu)
13555 +{
13556 + u32 tsf_mod, tsf_hi, tsf_lo, mod_hi, mod_lo;
13557 +
13558 + tsf_mod = tsf & (BIT(10) - 1);
13559 + tsf_hi = tsf >> 32;
13560 + tsf_lo = ((u32) tsf) >> 10;
13561 +
13562 + mod_hi = tsf_hi % div_tu;
13563 + mod_lo = ((mod_hi << 22) + tsf_lo) % div_tu;
13564 +
13565 + return (mod_lo << 10) | tsf_mod;
13566 +}
13567 +
13568 +static u32 ath9k_get_next_tbtt(struct ath_softc *sc, u64 tsf,
13569 + unsigned int interval)
13570 +{
13571 + struct ath_hw *ah = sc->sc_ah;
13572 + unsigned int offset;
13573 +
13574 + tsf += TU_TO_USEC(FUDGE + ah->config.sw_beacon_response_time);
13575 + offset = ath9k_mod_tsf64_tu(tsf, interval);
13576 +
13577 + return (u32) tsf + TU_TO_USEC(interval) - offset;
13578 +}
13579 +
13580 /*
13581 * For multi-bss ap support beacons are either staggered evenly over N slots or
13582 * burst together. For the former arrange for the SWBA to be delivered for each
13583 @@ -446,7 +474,8 @@ static void ath9k_beacon_config_ap(struc
13584 /* NB: the beacon interval is kept internally in TU's */
13585 intval = TU_TO_USEC(conf->beacon_interval);
13586 intval /= ATH_BCBUF;
13587 - nexttbtt = intval;
13588 + nexttbtt = ath9k_get_next_tbtt(sc, ath9k_hw_gettsf64(ah),
13589 + conf->beacon_interval);
13590
13591 if (conf->enable_beacon)
13592 ah->imask |= ATH9K_INT_SWBA;
13593 @@ -458,7 +487,7 @@ static void ath9k_beacon_config_ap(struc
13594 (conf->enable_beacon) ? "Enable" : "Disable",
13595 nexttbtt, intval, conf->beacon_interval);
13596
13597 - ath9k_beacon_init(sc, nexttbtt, intval, true);
13598 + ath9k_beacon_init(sc, nexttbtt, intval, false);
13599 }
13600
13601 /*
13602 @@ -475,11 +504,9 @@ static void ath9k_beacon_config_sta(stru
13603 struct ath_hw *ah = sc->sc_ah;
13604 struct ath_common *common = ath9k_hw_common(ah);
13605 struct ath9k_beacon_state bs;
13606 - int dtimperiod, dtimcount, sleepduration;
13607 - int cfpperiod, cfpcount;
13608 - u32 nexttbtt = 0, intval, tsftu;
13609 + int dtim_intval, sleepduration;
13610 + u32 nexttbtt = 0, intval;
13611 u64 tsf;
13612 - int num_beacons, offset, dtim_dec_count, cfp_dec_count;
13613
13614 /* No need to configure beacon if we are not associated */
13615 if (!test_bit(SC_OP_PRIM_STA_VIF, &sc->sc_flags)) {
13616 @@ -492,53 +519,25 @@ static void ath9k_beacon_config_sta(stru
13617 intval = conf->beacon_interval;
13618
13619 /*
13620 - * Setup dtim and cfp parameters according to
13621 + * Setup dtim parameters according to
13622 * last beacon we received (which may be none).
13623 */
13624 - dtimperiod = conf->dtim_period;
13625 - dtimcount = conf->dtim_count;
13626 - if (dtimcount >= dtimperiod) /* NB: sanity check */
13627 - dtimcount = 0;
13628 - cfpperiod = 1; /* NB: no PCF support yet */
13629 - cfpcount = 0;
13630 -
13631 + dtim_intval = intval * conf->dtim_period;
13632 sleepduration = conf->listen_interval * intval;
13633
13634 /*
13635 * Pull nexttbtt forward to reflect the current
13636 - * TSF and calculate dtim+cfp state for the result.
13637 + * TSF and calculate dtim state for the result.
13638 */
13639 tsf = ath9k_hw_gettsf64(ah);
13640 - tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE;
13641 + nexttbtt = ath9k_get_next_tbtt(sc, tsf, intval);
13642
13643 - num_beacons = tsftu / intval + 1;
13644 - offset = tsftu % intval;
13645 - nexttbtt = tsftu - offset;
13646 - if (offset)
13647 - nexttbtt += intval;
13648 -
13649 - /* DTIM Beacon every dtimperiod Beacon */
13650 - dtim_dec_count = num_beacons % dtimperiod;
13651 - /* CFP every cfpperiod DTIM Beacon */
13652 - cfp_dec_count = (num_beacons / dtimperiod) % cfpperiod;
13653 - if (dtim_dec_count)
13654 - cfp_dec_count++;
13655 -
13656 - dtimcount -= dtim_dec_count;
13657 - if (dtimcount < 0)
13658 - dtimcount += dtimperiod;
13659 -
13660 - cfpcount -= cfp_dec_count;
13661 - if (cfpcount < 0)
13662 - cfpcount += cfpperiod;
13663 -
13664 - bs.bs_intval = intval;
13665 + bs.bs_intval = TU_TO_USEC(intval);
13666 + bs.bs_dtimperiod = conf->dtim_period * bs.bs_intval;
13667 bs.bs_nexttbtt = nexttbtt;
13668 - bs.bs_dtimperiod = dtimperiod*intval;
13669 - bs.bs_nextdtim = bs.bs_nexttbtt + dtimcount*intval;
13670 - bs.bs_cfpperiod = cfpperiod*bs.bs_dtimperiod;
13671 - bs.bs_cfpnext = bs.bs_nextdtim + cfpcount*bs.bs_dtimperiod;
13672 - bs.bs_cfpmaxduration = 0;
13673 + bs.bs_nextdtim = nexttbtt;
13674 + if (conf->dtim_period > 1)
13675 + bs.bs_nextdtim = ath9k_get_next_tbtt(sc, tsf, dtim_intval);
13676
13677 /*
13678 * Calculate the number of consecutive beacons to miss* before taking
13679 @@ -566,18 +565,16 @@ static void ath9k_beacon_config_sta(stru
13680 * XXX fixed at 100ms
13681 */
13682
13683 - bs.bs_sleepduration = roundup(IEEE80211_MS_TO_TU(100), sleepduration);
13684 + bs.bs_sleepduration = TU_TO_USEC(roundup(IEEE80211_MS_TO_TU(100),
13685 + sleepduration));
13686 if (bs.bs_sleepduration > bs.bs_dtimperiod)
13687 bs.bs_sleepduration = bs.bs_dtimperiod;
13688
13689 /* TSF out of range threshold fixed at 1 second */
13690 bs.bs_tsfoor_threshold = ATH9K_TSFOOR_THRESHOLD;
13691
13692 - ath_dbg(common, BEACON, "tsf: %llu tsftu: %u\n", tsf, tsftu);
13693 - ath_dbg(common, BEACON,
13694 - "bmiss: %u sleep: %u cfp-period: %u maxdur: %u next: %u\n",
13695 - bs.bs_bmissthreshold, bs.bs_sleepduration,
13696 - bs.bs_cfpperiod, bs.bs_cfpmaxduration, bs.bs_cfpnext);
13697 + ath_dbg(common, BEACON, "bmiss: %u sleep: %u\n",
13698 + bs.bs_bmissthreshold, bs.bs_sleepduration);
13699
13700 /* Set the computed STA beacon timers */
13701
13702 @@ -600,25 +597,11 @@ static void ath9k_beacon_config_adhoc(st
13703
13704 intval = TU_TO_USEC(conf->beacon_interval);
13705
13706 - if (conf->ibss_creator) {
13707 + if (conf->ibss_creator)
13708 nexttbtt = intval;
13709 - } else {
13710 - u32 tbtt, offset, tsftu;
13711 - u64 tsf;
13712 -
13713 - /*
13714 - * Pull nexttbtt forward to reflect the current
13715 - * sync'd TSF.
13716 - */
13717 - tsf = ath9k_hw_gettsf64(ah);
13718 - tsftu = TSF_TO_TU(tsf >> 32, tsf) + FUDGE;
13719 - offset = tsftu % conf->beacon_interval;
13720 - tbtt = tsftu - offset;
13721 - if (offset)
13722 - tbtt += conf->beacon_interval;
13723 -
13724 - nexttbtt = TU_TO_USEC(tbtt);
13725 - }
13726 + else
13727 + nexttbtt = ath9k_get_next_tbtt(sc, ath9k_hw_gettsf64(ah),
13728 + conf->beacon_interval);
13729
13730 if (conf->enable_beacon)
13731 ah->imask |= ATH9K_INT_SWBA;
13732 @@ -640,7 +623,8 @@ static void ath9k_beacon_config_adhoc(st
13733 set_bit(SC_OP_BEACONS, &sc->sc_flags);
13734 }
13735
13736 -bool ath9k_allow_beacon_config(struct ath_softc *sc, struct ieee80211_vif *vif)
13737 +static bool ath9k_allow_beacon_config(struct ath_softc *sc,
13738 + struct ieee80211_vif *vif)
13739 {
13740 struct ath_common *common = ath9k_hw_common(sc->sc_ah);
13741 struct ath_vif *avp = (void *)vif->drv_priv;
13742 @@ -711,12 +695,17 @@ void ath9k_beacon_config(struct ath_soft
13743 unsigned long flags;
13744 bool skip_beacon = false;
13745
13746 + if (vif->type == NL80211_IFTYPE_AP)
13747 + ath9k_set_tsfadjust(sc, vif);
13748 +
13749 + if (!ath9k_allow_beacon_config(sc, vif))
13750 + return;
13751 +
13752 if (sc->sc_ah->opmode == NL80211_IFTYPE_STATION) {
13753 ath9k_cache_beacon_config(sc, bss_conf);
13754 ath9k_set_beacon(sc);
13755 set_bit(SC_OP_BEACONS, &sc->sc_flags);
13756 return;
13757 -
13758 }
13759
13760 /*
13761 --- a/drivers/net/wireless/ath/ath9k/btcoex.c
13762 +++ b/drivers/net/wireless/ath/ath9k/btcoex.c
13763 @@ -66,7 +66,6 @@ void ath9k_hw_init_btcoex_hw(struct ath_
13764 .bt_first_slot_time = 5,
13765 .bt_hold_rx_clear = true,
13766 };
13767 - u32 i, idx;
13768 bool rxclear_polarity = ath_bt_config.bt_rxclear_polarity;
13769
13770 if (AR_SREV_9300_20_OR_LATER(ah))
13771 @@ -88,11 +87,6 @@ void ath9k_hw_init_btcoex_hw(struct ath_
13772 SM(ath_bt_config.bt_hold_rx_clear, AR_BT_HOLD_RX_CLEAR) |
13773 SM(ATH_BTCOEX_BMISS_THRESH, AR_BT_BCN_MISS_THRESH) |
13774 AR_BT_DISABLE_BT_ANT;
13775 -
13776 - for (i = 0; i < 32; i++) {
13777 - idx = (debruijn32 << i) >> 27;
13778 - ah->hw_gen_timers.gen_timer_index[idx] = i;
13779 - }
13780 }
13781 EXPORT_SYMBOL(ath9k_hw_init_btcoex_hw);
13782
13783 --- a/drivers/net/wireless/ath/ath9k/dfs.c
13784 +++ b/drivers/net/wireless/ath/ath9k/dfs.c
13785 @@ -158,8 +158,8 @@ void ath9k_dfs_process_phyerr(struct ath
13786 return;
13787 }
13788
13789 - ard.rssi = rs->rs_rssi_ctl0;
13790 - ard.ext_rssi = rs->rs_rssi_ext0;
13791 + ard.rssi = rs->rs_rssi_ctl[0];
13792 + ard.ext_rssi = rs->rs_rssi_ext[0];
13793
13794 /*
13795 * hardware stores this as 8 bit signed value.
13796 --- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
13797 +++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
13798 @@ -1085,31 +1085,7 @@ static void ath9k_hw_4k_set_board_values
13799
13800 static u16 ath9k_hw_4k_get_spur_channel(struct ath_hw *ah, u16 i, bool is2GHz)
13801 {
13802 -#define EEP_MAP4K_SPURCHAN \
13803 - (ah->eeprom.map4k.modalHeader.spurChans[i].spurChan)
13804 - struct ath_common *common = ath9k_hw_common(ah);
13805 -
13806 - u16 spur_val = AR_NO_SPUR;
13807 -
13808 - ath_dbg(common, ANI, "Getting spur idx:%d is2Ghz:%d val:%x\n",
13809 - i, is2GHz, ah->config.spurchans[i][is2GHz]);
13810 -
13811 - switch (ah->config.spurmode) {
13812 - case SPUR_DISABLE:
13813 - break;
13814 - case SPUR_ENABLE_IOCTL:
13815 - spur_val = ah->config.spurchans[i][is2GHz];
13816 - ath_dbg(common, ANI, "Getting spur val from new loc. %d\n",
13817 - spur_val);
13818 - break;
13819 - case SPUR_ENABLE_EEPROM:
13820 - spur_val = EEP_MAP4K_SPURCHAN;
13821 - break;
13822 - }
13823 -
13824 - return spur_val;
13825 -
13826 -#undef EEP_MAP4K_SPURCHAN
13827 + return ah->eeprom.map4k.modalHeader.spurChans[i].spurChan;
13828 }
13829
13830 const struct eeprom_ops eep_4k_ops = {
13831 --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c
13832 +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c
13833 @@ -1004,31 +1004,7 @@ static void ath9k_hw_ar9287_set_board_va
13834 static u16 ath9k_hw_ar9287_get_spur_channel(struct ath_hw *ah,
13835 u16 i, bool is2GHz)
13836 {
13837 -#define EEP_MAP9287_SPURCHAN \
13838 - (ah->eeprom.map9287.modalHeader.spurChans[i].spurChan)
13839 -
13840 - struct ath_common *common = ath9k_hw_common(ah);
13841 - u16 spur_val = AR_NO_SPUR;
13842 -
13843 - ath_dbg(common, ANI, "Getting spur idx:%d is2Ghz:%d val:%x\n",
13844 - i, is2GHz, ah->config.spurchans[i][is2GHz]);
13845 -
13846 - switch (ah->config.spurmode) {
13847 - case SPUR_DISABLE:
13848 - break;
13849 - case SPUR_ENABLE_IOCTL:
13850 - spur_val = ah->config.spurchans[i][is2GHz];
13851 - ath_dbg(common, ANI, "Getting spur val from new loc. %d\n",
13852 - spur_val);
13853 - break;
13854 - case SPUR_ENABLE_EEPROM:
13855 - spur_val = EEP_MAP9287_SPURCHAN;
13856 - break;
13857 - }
13858 -
13859 - return spur_val;
13860 -
13861 -#undef EEP_MAP9287_SPURCHAN
13862 + return ah->eeprom.map9287.modalHeader.spurChans[i].spurChan;
13863 }
13864
13865 const struct eeprom_ops eep_ar9287_ops = {
13866 --- a/drivers/net/wireless/ath/ath9k/eeprom_def.c
13867 +++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c
13868 @@ -1348,31 +1348,7 @@ static void ath9k_hw_def_set_txpower(str
13869
13870 static u16 ath9k_hw_def_get_spur_channel(struct ath_hw *ah, u16 i, bool is2GHz)
13871 {
13872 -#define EEP_DEF_SPURCHAN \
13873 - (ah->eeprom.def.modalHeader[is2GHz].spurChans[i].spurChan)
13874 - struct ath_common *common = ath9k_hw_common(ah);
13875 -
13876 - u16 spur_val = AR_NO_SPUR;
13877 -
13878 - ath_dbg(common, ANI, "Getting spur idx:%d is2Ghz:%d val:%x\n",
13879 - i, is2GHz, ah->config.spurchans[i][is2GHz]);
13880 -
13881 - switch (ah->config.spurmode) {
13882 - case SPUR_DISABLE:
13883 - break;
13884 - case SPUR_ENABLE_IOCTL:
13885 - spur_val = ah->config.spurchans[i][is2GHz];
13886 - ath_dbg(common, ANI, "Getting spur val from new loc. %d\n",
13887 - spur_val);
13888 - break;
13889 - case SPUR_ENABLE_EEPROM:
13890 - spur_val = EEP_DEF_SPURCHAN;
13891 - break;
13892 - }
13893 -
13894 - return spur_val;
13895 -
13896 -#undef EEP_DEF_SPURCHAN
13897 + return ah->eeprom.def.modalHeader[is2GHz].spurChans[i].spurChan;
13898 }
13899
13900 const struct eeprom_ops eep_def_ops = {
13901 --- a/drivers/net/wireless/ath/ath9k/gpio.c
13902 +++ b/drivers/net/wireless/ath/ath9k/gpio.c
13903 @@ -157,36 +157,6 @@ static void ath_detect_bt_priority(struc
13904 }
13905 }
13906
13907 -static void ath9k_gen_timer_start(struct ath_hw *ah,
13908 - struct ath_gen_timer *timer,
13909 - u32 trig_timeout,
13910 - u32 timer_period)
13911 -{
13912 - ath9k_hw_gen_timer_start(ah, timer, trig_timeout, timer_period);
13913 -
13914 - if ((ah->imask & ATH9K_INT_GENTIMER) == 0) {
13915 - ath9k_hw_disable_interrupts(ah);
13916 - ah->imask |= ATH9K_INT_GENTIMER;
13917 - ath9k_hw_set_interrupts(ah);
13918 - ath9k_hw_enable_interrupts(ah);
13919 - }
13920 -}
13921 -
13922 -static void ath9k_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
13923 -{
13924 - struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
13925 -
13926 - ath9k_hw_gen_timer_stop(ah, timer);
13927 -
13928 - /* if no timer is enabled, turn off interrupt mask */
13929 - if (timer_table->timer_mask.val == 0) {
13930 - ath9k_hw_disable_interrupts(ah);
13931 - ah->imask &= ~ATH9K_INT_GENTIMER;
13932 - ath9k_hw_set_interrupts(ah);
13933 - ath9k_hw_enable_interrupts(ah);
13934 - }
13935 -}
13936 -
13937 static void ath_mci_ftp_adjust(struct ath_softc *sc)
13938 {
13939 struct ath_btcoex *btcoex = &sc->btcoex;
13940 @@ -257,19 +227,9 @@ static void ath_btcoex_period_timer(unsi
13941
13942 spin_unlock_bh(&btcoex->btcoex_lock);
13943
13944 - /*
13945 - * btcoex_period is in msec while (btocex/btscan_)no_stomp are in usec,
13946 - * ensure that we properly convert btcoex_period to usec
13947 - * for any comparision with (btcoex/btscan_)no_stomp.
13948 - */
13949 - if (btcoex->btcoex_period * 1000 != btcoex->btcoex_no_stomp) {
13950 - if (btcoex->hw_timer_enabled)
13951 - ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer);
13952 -
13953 - ath9k_gen_timer_start(ah, btcoex->no_stomp_timer, timer_period,
13954 - timer_period * 10);
13955 - btcoex->hw_timer_enabled = true;
13956 - }
13957 + if (btcoex->btcoex_period != btcoex->btcoex_no_stomp)
13958 + mod_timer(&btcoex->no_stomp_timer,
13959 + jiffies + msecs_to_jiffies(timer_period));
13960
13961 ath9k_ps_restore(sc);
13962
13963 @@ -282,7 +242,7 @@ skip_hw_wakeup:
13964 * Generic tsf based hw timer which configures weight
13965 * registers to time slice between wlan and bt traffic
13966 */
13967 -static void ath_btcoex_no_stomp_timer(void *arg)
13968 +static void ath_btcoex_no_stomp_timer(unsigned long arg)
13969 {
13970 struct ath_softc *sc = (struct ath_softc *)arg;
13971 struct ath_hw *ah = sc->sc_ah;
13972 @@ -311,24 +271,18 @@ static int ath_init_btcoex_timer(struct
13973 struct ath_btcoex *btcoex = &sc->btcoex;
13974
13975 btcoex->btcoex_period = ATH_BTCOEX_DEF_BT_PERIOD;
13976 - btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) * 1000 *
13977 + btcoex->btcoex_no_stomp = (100 - ATH_BTCOEX_DEF_DUTY_CYCLE) *
13978 btcoex->btcoex_period / 100;
13979 - btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) * 1000 *
13980 + btcoex->btscan_no_stomp = (100 - ATH_BTCOEX_BTSCAN_DUTY_CYCLE) *
13981 btcoex->btcoex_period / 100;
13982
13983 setup_timer(&btcoex->period_timer, ath_btcoex_period_timer,
13984 (unsigned long) sc);
13985 + setup_timer(&btcoex->no_stomp_timer, ath_btcoex_no_stomp_timer,
13986 + (unsigned long) sc);
13987
13988 spin_lock_init(&btcoex->btcoex_lock);
13989
13990 - btcoex->no_stomp_timer = ath_gen_timer_alloc(sc->sc_ah,
13991 - ath_btcoex_no_stomp_timer,
13992 - ath_btcoex_no_stomp_timer,
13993 - (void *) sc, AR_FIRST_NDP_TIMER);
13994 -
13995 - if (!btcoex->no_stomp_timer)
13996 - return -ENOMEM;
13997 -
13998 return 0;
13999 }
14000
14001 @@ -343,10 +297,7 @@ void ath9k_btcoex_timer_resume(struct at
14002 ath_dbg(ath9k_hw_common(ah), BTCOEX, "Starting btcoex timers\n");
14003
14004 /* make sure duty cycle timer is also stopped when resuming */
14005 - if (btcoex->hw_timer_enabled) {
14006 - ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
14007 - btcoex->hw_timer_enabled = false;
14008 - }
14009 + del_timer_sync(&btcoex->no_stomp_timer);
14010
14011 btcoex->bt_priority_cnt = 0;
14012 btcoex->bt_priority_time = jiffies;
14013 @@ -363,24 +314,16 @@ void ath9k_btcoex_timer_resume(struct at
14014 void ath9k_btcoex_timer_pause(struct ath_softc *sc)
14015 {
14016 struct ath_btcoex *btcoex = &sc->btcoex;
14017 - struct ath_hw *ah = sc->sc_ah;
14018
14019 del_timer_sync(&btcoex->period_timer);
14020 -
14021 - if (btcoex->hw_timer_enabled) {
14022 - ath9k_gen_timer_stop(ah, btcoex->no_stomp_timer);
14023 - btcoex->hw_timer_enabled = false;
14024 - }
14025 + del_timer_sync(&btcoex->no_stomp_timer);
14026 }
14027
14028 void ath9k_btcoex_stop_gen_timer(struct ath_softc *sc)
14029 {
14030 struct ath_btcoex *btcoex = &sc->btcoex;
14031
14032 - if (btcoex->hw_timer_enabled) {
14033 - ath9k_gen_timer_stop(sc->sc_ah, btcoex->no_stomp_timer);
14034 - btcoex->hw_timer_enabled = false;
14035 - }
14036 + del_timer_sync(&btcoex->no_stomp_timer);
14037 }
14038
14039 u16 ath9k_btcoex_aggr_limit(struct ath_softc *sc, u32 max_4ms_framelen)
14040 @@ -400,12 +343,6 @@ u16 ath9k_btcoex_aggr_limit(struct ath_s
14041
14042 void ath9k_btcoex_handle_interrupt(struct ath_softc *sc, u32 status)
14043 {
14044 - struct ath_hw *ah = sc->sc_ah;
14045 -
14046 - if (ath9k_hw_get_btcoex_scheme(ah) == ATH_BTCOEX_CFG_3WIRE)
14047 - if (status & ATH9K_INT_GENTIMER)
14048 - ath_gen_timer_isr(sc->sc_ah);
14049 -
14050 if (status & ATH9K_INT_MCI)
14051 ath_mci_intr(sc);
14052 }
14053 @@ -447,10 +384,6 @@ void ath9k_deinit_btcoex(struct ath_soft
14054 {
14055 struct ath_hw *ah = sc->sc_ah;
14056
14057 - if ((sc->btcoex.no_stomp_timer) &&
14058 - ath9k_hw_get_btcoex_scheme(sc->sc_ah) == ATH_BTCOEX_CFG_3WIRE)
14059 - ath_gen_timer_free(sc->sc_ah, sc->btcoex.no_stomp_timer);
14060 -
14061 if (ath9k_hw_mci_is_enabled(ah))
14062 ath_mci_cleanup(sc);
14063 }
14064 --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c
14065 +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c
14066 @@ -70,11 +70,11 @@ static void ath9k_htc_beacon_config_sta(
14067 struct ath9k_beacon_state bs;
14068 enum ath9k_int imask = 0;
14069 int dtimperiod, dtimcount, sleepduration;
14070 - int cfpperiod, cfpcount, bmiss_timeout;
14071 + int bmiss_timeout;
14072 u32 nexttbtt = 0, intval, tsftu;
14073 __be32 htc_imask = 0;
14074 u64 tsf;
14075 - int num_beacons, offset, dtim_dec_count, cfp_dec_count;
14076 + int num_beacons, offset, dtim_dec_count;
14077 int ret __attribute__ ((unused));
14078 u8 cmd_rsp;
14079
14080 @@ -84,7 +84,7 @@ static void ath9k_htc_beacon_config_sta(
14081 bmiss_timeout = (ATH_DEFAULT_BMISS_LIMIT * bss_conf->beacon_interval);
14082
14083 /*
14084 - * Setup dtim and cfp parameters according to
14085 + * Setup dtim parameters according to
14086 * last beacon we received (which may be none).
14087 */
14088 dtimperiod = bss_conf->dtim_period;
14089 @@ -93,8 +93,6 @@ static void ath9k_htc_beacon_config_sta(
14090 dtimcount = 1;
14091 if (dtimcount >= dtimperiod) /* NB: sanity check */
14092 dtimcount = 0;
14093 - cfpperiod = 1; /* NB: no PCF support yet */
14094 - cfpcount = 0;
14095
14096 sleepduration = intval;
14097 if (sleepduration <= 0)
14098 @@ -102,7 +100,7 @@ static void ath9k_htc_beacon_config_sta(
14099
14100 /*
14101 * Pull nexttbtt forward to reflect the current
14102 - * TSF and calculate dtim+cfp state for the result.
14103 + * TSF and calculate dtim state for the result.
14104 */
14105 tsf = ath9k_hw_gettsf64(priv->ah);
14106 tsftu = TSF_TO_TU(tsf>>32, tsf) + FUDGE;
14107 @@ -115,26 +113,14 @@ static void ath9k_htc_beacon_config_sta(
14108
14109 /* DTIM Beacon every dtimperiod Beacon */
14110 dtim_dec_count = num_beacons % dtimperiod;
14111 - /* CFP every cfpperiod DTIM Beacon */
14112 - cfp_dec_count = (num_beacons / dtimperiod) % cfpperiod;
14113 - if (dtim_dec_count)
14114 - cfp_dec_count++;
14115 -
14116 dtimcount -= dtim_dec_count;
14117 if (dtimcount < 0)
14118 dtimcount += dtimperiod;
14119
14120 - cfpcount -= cfp_dec_count;
14121 - if (cfpcount < 0)
14122 - cfpcount += cfpperiod;
14123 -
14124 - bs.bs_intval = intval;
14125 - bs.bs_nexttbtt = nexttbtt;
14126 - bs.bs_dtimperiod = dtimperiod*intval;
14127 - bs.bs_nextdtim = bs.bs_nexttbtt + dtimcount*intval;
14128 - bs.bs_cfpperiod = cfpperiod*bs.bs_dtimperiod;
14129 - bs.bs_cfpnext = bs.bs_nextdtim + cfpcount*bs.bs_dtimperiod;
14130 - bs.bs_cfpmaxduration = 0;
14131 + bs.bs_intval = TU_TO_USEC(intval);
14132 + bs.bs_nexttbtt = TU_TO_USEC(nexttbtt);
14133 + bs.bs_dtimperiod = dtimperiod * bs.bs_intval;
14134 + bs.bs_nextdtim = bs.bs_nexttbtt + dtimcount * bs.bs_intval;
14135
14136 /*
14137 * Calculate the number of consecutive beacons to miss* before taking
14138 @@ -161,7 +147,8 @@ static void ath9k_htc_beacon_config_sta(
14139 * XXX fixed at 100ms
14140 */
14141
14142 - bs.bs_sleepduration = roundup(IEEE80211_MS_TO_TU(100), sleepduration);
14143 + bs.bs_sleepduration = TU_TO_USEC(roundup(IEEE80211_MS_TO_TU(100),
14144 + sleepduration));
14145 if (bs.bs_sleepduration > bs.bs_dtimperiod)
14146 bs.bs_sleepduration = bs.bs_dtimperiod;
14147
14148 @@ -170,10 +157,8 @@ static void ath9k_htc_beacon_config_sta(
14149
14150 ath_dbg(common, CONFIG, "intval: %u tsf: %llu tsftu: %u\n",
14151 intval, tsf, tsftu);
14152 - ath_dbg(common, CONFIG,
14153 - "bmiss: %u sleep: %u cfp-period: %u maxdur: %u next: %u\n",
14154 - bs.bs_bmissthreshold, bs.bs_sleepduration,
14155 - bs.bs_cfpperiod, bs.bs_cfpmaxduration, bs.bs_cfpnext);
14156 + ath_dbg(common, CONFIG, "bmiss: %u sleep: %u\n",
14157 + bs.bs_bmissthreshold, bs.bs_sleepduration);
14158
14159 /* Set the computed STA beacon timers */
14160
14161 --- a/drivers/net/wireless/ath/ath9k/mac.c
14162 +++ b/drivers/net/wireless/ath/ath9k/mac.c
14163 @@ -481,8 +481,7 @@ bool ath9k_hw_resettxqueue(struct ath_hw
14164 | AR_Q_MISC_CBR_INCR_DIS0);
14165 value = (qi->tqi_readyTime -
14166 (ah->config.sw_beacon_response_time -
14167 - ah->config.dma_beacon_response_time) -
14168 - ah->config.additional_swba_backoff) * 1024;
14169 + ah->config.dma_beacon_response_time)) * 1024;
14170 REG_WRITE(ah, AR_QRDYTIMECFG(q),
14171 value | AR_Q_RDYTIMECFG_EN);
14172 REG_SET_BIT(ah, AR_DMISC(q),
14173 @@ -550,25 +549,25 @@ int ath9k_hw_rxprocdesc(struct ath_hw *a
14174
14175 if (ads.ds_rxstatus8 & AR_PostDelimCRCErr) {
14176 rs->rs_rssi = ATH9K_RSSI_BAD;
14177 - rs->rs_rssi_ctl0 = ATH9K_RSSI_BAD;
14178 - rs->rs_rssi_ctl1 = ATH9K_RSSI_BAD;
14179 - rs->rs_rssi_ctl2 = ATH9K_RSSI_BAD;
14180 - rs->rs_rssi_ext0 = ATH9K_RSSI_BAD;
14181 - rs->rs_rssi_ext1 = ATH9K_RSSI_BAD;
14182 - rs->rs_rssi_ext2 = ATH9K_RSSI_BAD;
14183 + rs->rs_rssi_ctl[0] = ATH9K_RSSI_BAD;
14184 + rs->rs_rssi_ctl[1] = ATH9K_RSSI_BAD;
14185 + rs->rs_rssi_ctl[2] = ATH9K_RSSI_BAD;
14186 + rs->rs_rssi_ext[0] = ATH9K_RSSI_BAD;
14187 + rs->rs_rssi_ext[1] = ATH9K_RSSI_BAD;
14188 + rs->rs_rssi_ext[2] = ATH9K_RSSI_BAD;
14189 } else {
14190 rs->rs_rssi = MS(ads.ds_rxstatus4, AR_RxRSSICombined);
14191 - rs->rs_rssi_ctl0 = MS(ads.ds_rxstatus0,
14192 + rs->rs_rssi_ctl[0] = MS(ads.ds_rxstatus0,
14193 AR_RxRSSIAnt00);
14194 - rs->rs_rssi_ctl1 = MS(ads.ds_rxstatus0,
14195 + rs->rs_rssi_ctl[1] = MS(ads.ds_rxstatus0,
14196 AR_RxRSSIAnt01);
14197 - rs->rs_rssi_ctl2 = MS(ads.ds_rxstatus0,
14198 + rs->rs_rssi_ctl[2] = MS(ads.ds_rxstatus0,
14199 AR_RxRSSIAnt02);
14200 - rs->rs_rssi_ext0 = MS(ads.ds_rxstatus4,
14201 + rs->rs_rssi_ext[0] = MS(ads.ds_rxstatus4,
14202 AR_RxRSSIAnt10);
14203 - rs->rs_rssi_ext1 = MS(ads.ds_rxstatus4,
14204 + rs->rs_rssi_ext[1] = MS(ads.ds_rxstatus4,
14205 AR_RxRSSIAnt11);
14206 - rs->rs_rssi_ext2 = MS(ads.ds_rxstatus4,
14207 + rs->rs_rssi_ext[2] = MS(ads.ds_rxstatus4,
14208 AR_RxRSSIAnt12);
14209 }
14210 if (ads.ds_rxstatus8 & AR_RxKeyIdxValid)
14211 --- a/drivers/net/wireless/ath/ath9k/mac.h
14212 +++ b/drivers/net/wireless/ath/ath9k/mac.h
14213 @@ -133,12 +133,8 @@ struct ath_rx_status {
14214 u8 rs_rate;
14215 u8 rs_antenna;
14216 u8 rs_more;
14217 - int8_t rs_rssi_ctl0;
14218 - int8_t rs_rssi_ctl1;
14219 - int8_t rs_rssi_ctl2;
14220 - int8_t rs_rssi_ext0;
14221 - int8_t rs_rssi_ext1;
14222 - int8_t rs_rssi_ext2;
14223 + int8_t rs_rssi_ctl[3];
14224 + int8_t rs_rssi_ext[3];
14225 u8 rs_isaggr;
14226 u8 rs_firstaggr;
14227 u8 rs_moreaggr;
14228 --- a/drivers/net/wireless/ath/ath9k/mci.c
14229 +++ b/drivers/net/wireless/ath/ath9k/mci.c
14230 @@ -200,7 +200,7 @@ skip_tuning:
14231 if (btcoex->duty_cycle > ATH_MCI_MAX_DUTY_CYCLE)
14232 btcoex->duty_cycle = ATH_MCI_MAX_DUTY_CYCLE;
14233
14234 - btcoex->btcoex_no_stomp = btcoex->btcoex_period * 1000 *
14235 + btcoex->btcoex_no_stomp = btcoex->btcoex_period *
14236 (100 - btcoex->duty_cycle) / 100;
14237
14238 ath9k_hw_btcoex_enable(sc->sc_ah);
14239 --- a/drivers/net/wireless/ath/ath9k/recv.c
14240 +++ b/drivers/net/wireless/ath/ath9k/recv.c
14241 @@ -15,7 +15,6 @@
14242 */
14243
14244 #include <linux/dma-mapping.h>
14245 -#include <linux/relay.h>
14246 #include "ath9k.h"
14247 #include "ar9003_mac.h"
14248
14249 @@ -906,6 +905,7 @@ static void ath9k_process_rssi(struct at
14250 struct ath_hw *ah = common->ah;
14251 int last_rssi;
14252 int rssi = rx_stats->rs_rssi;
14253 + int i, j;
14254
14255 /*
14256 * RSSI is not available for subframes in an A-MPDU.
14257 @@ -924,6 +924,20 @@ static void ath9k_process_rssi(struct at
14258 return;
14259 }
14260
14261 + for (i = 0, j = 0; i < ARRAY_SIZE(rx_stats->rs_rssi_ctl); i++) {
14262 + s8 rssi;
14263 +
14264 + if (!(ah->rxchainmask & BIT(i)))
14265 + continue;
14266 +
14267 + rssi = rx_stats->rs_rssi_ctl[i];
14268 + if (rssi != ATH9K_RSSI_BAD) {
14269 + rxs->chains |= BIT(j);
14270 + rxs->chain_signal[j] = ah->noise + rssi;
14271 + }
14272 + j++;
14273 + }
14274 +
14275 /*
14276 * Update Beacon RSSI, this is used by ANI.
14277 */
14278 @@ -960,186 +974,6 @@ static void ath9k_process_tsf(struct ath
14279 rxs->mactime += 0x100000000ULL;
14280 }
14281
14282 -#ifdef CPTCFG_ATH9K_DEBUGFS
14283 -static s8 fix_rssi_inv_only(u8 rssi_val)
14284 -{
14285 - if (rssi_val == 128)
14286 - rssi_val = 0;
14287 - return (s8) rssi_val;
14288 -}
14289 -#endif
14290 -
14291 -/* returns 1 if this was a spectral frame, even if not handled. */
14292 -static int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr,
14293 - struct ath_rx_status *rs, u64 tsf)
14294 -{
14295 -#ifdef CPTCFG_ATH9K_DEBUGFS
14296 - struct ath_hw *ah = sc->sc_ah;
14297 - u8 num_bins, *bins, *vdata = (u8 *)hdr;
14298 - struct fft_sample_ht20 fft_sample_20;
14299 - struct fft_sample_ht20_40 fft_sample_40;
14300 - struct fft_sample_tlv *tlv;
14301 - struct ath_radar_info *radar_info;
14302 - int len = rs->rs_datalen;
14303 - int dc_pos;
14304 - u16 fft_len, length, freq = ah->curchan->chan->center_freq;
14305 - enum nl80211_channel_type chan_type;
14306 -
14307 - /* AR9280 and before report via ATH9K_PHYERR_RADAR, AR93xx and newer
14308 - * via ATH9K_PHYERR_SPECTRAL. Haven't seen ATH9K_PHYERR_FALSE_RADAR_EXT
14309 - * yet, but this is supposed to be possible as well.
14310 - */
14311 - if (rs->rs_phyerr != ATH9K_PHYERR_RADAR &&
14312 - rs->rs_phyerr != ATH9K_PHYERR_FALSE_RADAR_EXT &&
14313 - rs->rs_phyerr != ATH9K_PHYERR_SPECTRAL)
14314 - return 0;
14315 -
14316 - /* check if spectral scan bit is set. This does not have to be checked
14317 - * if received through a SPECTRAL phy error, but shouldn't hurt.
14318 - */
14319 - radar_info = ((struct ath_radar_info *)&vdata[len]) - 1;
14320 - if (!(radar_info->pulse_bw_info & SPECTRAL_SCAN_BITMASK))
14321 - return 0;
14322 -
14323 - chan_type = cfg80211_get_chandef_type(&sc->hw->conf.chandef);
14324 - if ((chan_type == NL80211_CHAN_HT40MINUS) ||
14325 - (chan_type == NL80211_CHAN_HT40PLUS)) {
14326 - fft_len = SPECTRAL_HT20_40_TOTAL_DATA_LEN;
14327 - num_bins = SPECTRAL_HT20_40_NUM_BINS;
14328 - bins = (u8 *)fft_sample_40.data;
14329 - } else {
14330 - fft_len = SPECTRAL_HT20_TOTAL_DATA_LEN;
14331 - num_bins = SPECTRAL_HT20_NUM_BINS;
14332 - bins = (u8 *)fft_sample_20.data;
14333 - }
14334 -
14335 - /* Variation in the data length is possible and will be fixed later */
14336 - if ((len > fft_len + 2) || (len < fft_len - 1))
14337 - return 1;
14338 -
14339 - switch (len - fft_len) {
14340 - case 0:
14341 - /* length correct, nothing to do. */
14342 - memcpy(bins, vdata, num_bins);
14343 - break;
14344 - case -1:
14345 - /* first byte missing, duplicate it. */
14346 - memcpy(&bins[1], vdata, num_bins - 1);
14347 - bins[0] = vdata[0];
14348 - break;
14349 - case 2:
14350 - /* MAC added 2 extra bytes at bin 30 and 32, remove them. */
14351 - memcpy(bins, vdata, 30);
14352 - bins[30] = vdata[31];
14353 - memcpy(&bins[31], &vdata[33], num_bins - 31);
14354 - break;
14355 - case 1:
14356 - /* MAC added 2 extra bytes AND first byte is missing. */
14357 - bins[0] = vdata[0];
14358 - memcpy(&bins[1], vdata, 30);
14359 - bins[31] = vdata[31];
14360 - memcpy(&bins[32], &vdata[33], num_bins - 32);
14361 - break;
14362 - default:
14363 - return 1;
14364 - }
14365 -
14366 - /* DC value (value in the middle) is the blind spot of the spectral
14367 - * sample and invalid, interpolate it.
14368 - */
14369 - dc_pos = num_bins / 2;
14370 - bins[dc_pos] = (bins[dc_pos + 1] + bins[dc_pos - 1]) / 2;
14371 -
14372 - if ((chan_type == NL80211_CHAN_HT40MINUS) ||
14373 - (chan_type == NL80211_CHAN_HT40PLUS)) {
14374 - s8 lower_rssi, upper_rssi;
14375 - s16 ext_nf;
14376 - u8 lower_max_index, upper_max_index;
14377 - u8 lower_bitmap_w, upper_bitmap_w;
14378 - u16 lower_mag, upper_mag;
14379 - struct ath9k_hw_cal_data *caldata = ah->caldata;
14380 - struct ath_ht20_40_mag_info *mag_info;
14381 -
14382 - if (caldata)
14383 - ext_nf = ath9k_hw_getchan_noise(ah, ah->curchan,
14384 - caldata->nfCalHist[3].privNF);
14385 - else
14386 - ext_nf = ATH_DEFAULT_NOISE_FLOOR;
14387 -
14388 - length = sizeof(fft_sample_40) - sizeof(struct fft_sample_tlv);
14389 - fft_sample_40.tlv.type = ATH_FFT_SAMPLE_HT20_40;
14390 - fft_sample_40.tlv.length = __cpu_to_be16(length);
14391 - fft_sample_40.freq = __cpu_to_be16(freq);
14392 - fft_sample_40.channel_type = chan_type;
14393 -
14394 - if (chan_type == NL80211_CHAN_HT40PLUS) {
14395 - lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
14396 - upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0);
14397 -
14398 - fft_sample_40.lower_noise = ah->noise;
14399 - fft_sample_40.upper_noise = ext_nf;
14400 - } else {
14401 - lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext0);
14402 - upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
14403 -
14404 - fft_sample_40.lower_noise = ext_nf;
14405 - fft_sample_40.upper_noise = ah->noise;
14406 - }
14407 - fft_sample_40.lower_rssi = lower_rssi;
14408 - fft_sample_40.upper_rssi = upper_rssi;
14409 -
14410 - mag_info = ((struct ath_ht20_40_mag_info *)radar_info) - 1;
14411 - lower_mag = spectral_max_magnitude(mag_info->lower_bins);
14412 - upper_mag = spectral_max_magnitude(mag_info->upper_bins);
14413 - fft_sample_40.lower_max_magnitude = __cpu_to_be16(lower_mag);
14414 - fft_sample_40.upper_max_magnitude = __cpu_to_be16(upper_mag);
14415 - lower_max_index = spectral_max_index(mag_info->lower_bins);
14416 - upper_max_index = spectral_max_index(mag_info->upper_bins);
14417 - fft_sample_40.lower_max_index = lower_max_index;
14418 - fft_sample_40.upper_max_index = upper_max_index;
14419 - lower_bitmap_w = spectral_bitmap_weight(mag_info->lower_bins);
14420 - upper_bitmap_w = spectral_bitmap_weight(mag_info->upper_bins);
14421 - fft_sample_40.lower_bitmap_weight = lower_bitmap_w;
14422 - fft_sample_40.upper_bitmap_weight = upper_bitmap_w;
14423 - fft_sample_40.max_exp = mag_info->max_exp & 0xf;
14424 -
14425 - fft_sample_40.tsf = __cpu_to_be64(tsf);
14426 -
14427 - tlv = (struct fft_sample_tlv *)&fft_sample_40;
14428 - } else {
14429 - u8 max_index, bitmap_w;
14430 - u16 magnitude;
14431 - struct ath_ht20_mag_info *mag_info;
14432 -
14433 - length = sizeof(fft_sample_20) - sizeof(struct fft_sample_tlv);
14434 - fft_sample_20.tlv.type = ATH_FFT_SAMPLE_HT20;
14435 - fft_sample_20.tlv.length = __cpu_to_be16(length);
14436 - fft_sample_20.freq = __cpu_to_be16(freq);
14437 -
14438 - fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl0);
14439 - fft_sample_20.noise = ah->noise;
14440 -
14441 - mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1;
14442 - magnitude = spectral_max_magnitude(mag_info->all_bins);
14443 - fft_sample_20.max_magnitude = __cpu_to_be16(magnitude);
14444 - max_index = spectral_max_index(mag_info->all_bins);
14445 - fft_sample_20.max_index = max_index;
14446 - bitmap_w = spectral_bitmap_weight(mag_info->all_bins);
14447 - fft_sample_20.bitmap_weight = bitmap_w;
14448 - fft_sample_20.max_exp = mag_info->max_exp & 0xf;
14449 -
14450 - fft_sample_20.tsf = __cpu_to_be64(tsf);
14451 -
14452 - tlv = (struct fft_sample_tlv *)&fft_sample_20;
14453 - }
14454 -
14455 - ath_debug_send_fft_sample(sc, tlv);
14456 - return 1;
14457 -#else
14458 - return 0;
14459 -#endif
14460 -}
14461 -
14462 static bool ath9k_is_mybeacon(struct ath_softc *sc, struct ieee80211_hdr *hdr)
14463 {
14464 struct ath_hw *ah = sc->sc_ah;
14465 --- a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
14466 +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h
14467 @@ -270,10 +270,20 @@ struct cal_ctl_data_5g {
14468 u8 ctlEdges[AR9300_NUM_BAND_EDGES_5G];
14469 } __packed;
14470
14471 +#define MAX_BASE_EXTENSION_FUTURE 2
14472 +
14473 struct ar9300_BaseExtension_1 {
14474 u8 ant_div_control;
14475 - u8 future[3];
14476 - u8 tempslopextension[8];
14477 + u8 future[MAX_BASE_EXTENSION_FUTURE];
14478 + /*
14479 + * misc_enable:
14480 + *
14481 + * BIT 0 - TX Gain Cap enable.
14482 + * BIT 1 - Uncompressed Checksum enable.
14483 + * BIT 2/3 - MinCCApwr enable 2g/5g.
14484 + */
14485 + u8 misc_enable;
14486 + int8_t tempslopextension[8];
14487 int8_t quick_drop_low;
14488 int8_t quick_drop_high;
14489 } __packed;
14490 --- a/drivers/net/wireless/ath/ath9k/debug.h
14491 +++ b/drivers/net/wireless/ath/ath9k/debug.h
14492 @@ -292,11 +292,11 @@ void ath9k_sta_add_debugfs(struct ieee80
14493 struct ieee80211_vif *vif,
14494 struct ieee80211_sta *sta,
14495 struct dentry *dir);
14496 -void ath_debug_send_fft_sample(struct ath_softc *sc,
14497 - struct fft_sample_tlv *fft_sample);
14498 void ath9k_debug_stat_ant(struct ath_softc *sc,
14499 struct ath_hw_antcomb_conf *div_ant_conf,
14500 int main_rssi_avg, int alt_rssi_avg);
14501 +void ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause);
14502 +
14503 #else
14504
14505 #define RX_STAT_INC(c) /* NOP */
14506 @@ -331,6 +331,11 @@ static inline void ath9k_debug_stat_ant(
14507
14508 }
14509
14510 +static inline void
14511 +ath9k_debug_sync_cause(struct ath_softc *sc, u32 sync_cause)
14512 +{
14513 +}
14514 +
14515 #endif /* CPTCFG_ATH9K_DEBUGFS */
14516
14517 #endif /* DEBUG_H */
14518 --- /dev/null
14519 +++ b/drivers/net/wireless/ath/ath9k/spectral.c
14520 @@ -0,0 +1,543 @@
14521 +/*
14522 + * Copyright (c) 2013 Qualcomm Atheros, Inc.
14523 + *
14524 + * Permission to use, copy, modify, and/or distribute this software for any
14525 + * purpose with or without fee is hereby granted, provided that the above
14526 + * copyright notice and this permission notice appear in all copies.
14527 + *
14528 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14529 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14530 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14531 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14532 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14533 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14534 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14535 + */
14536 +
14537 +#include <linux/relay.h>
14538 +#include "ath9k.h"
14539 +
14540 +static s8 fix_rssi_inv_only(u8 rssi_val)
14541 +{
14542 + if (rssi_val == 128)
14543 + rssi_val = 0;
14544 + return (s8) rssi_val;
14545 +}
14546 +
14547 +static void ath_debug_send_fft_sample(struct ath_softc *sc,
14548 + struct fft_sample_tlv *fft_sample_tlv)
14549 +{
14550 + int length;
14551 + if (!sc->rfs_chan_spec_scan)
14552 + return;
14553 +
14554 + length = __be16_to_cpu(fft_sample_tlv->length) +
14555 + sizeof(*fft_sample_tlv);
14556 + relay_write(sc->rfs_chan_spec_scan, fft_sample_tlv, length);
14557 +}
14558 +
14559 +/* returns 1 if this was a spectral frame, even if not handled. */
14560 +int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr,
14561 + struct ath_rx_status *rs, u64 tsf)
14562 +{
14563 + struct ath_hw *ah = sc->sc_ah;
14564 + u8 num_bins, *bins, *vdata = (u8 *)hdr;
14565 + struct fft_sample_ht20 fft_sample_20;
14566 + struct fft_sample_ht20_40 fft_sample_40;
14567 + struct fft_sample_tlv *tlv;
14568 + struct ath_radar_info *radar_info;
14569 + int len = rs->rs_datalen;
14570 + int dc_pos;
14571 + u16 fft_len, length, freq = ah->curchan->chan->center_freq;
14572 + enum nl80211_channel_type chan_type;
14573 +
14574 + /* AR9280 and before report via ATH9K_PHYERR_RADAR, AR93xx and newer
14575 + * via ATH9K_PHYERR_SPECTRAL. Haven't seen ATH9K_PHYERR_FALSE_RADAR_EXT
14576 + * yet, but this is supposed to be possible as well.
14577 + */
14578 + if (rs->rs_phyerr != ATH9K_PHYERR_RADAR &&
14579 + rs->rs_phyerr != ATH9K_PHYERR_FALSE_RADAR_EXT &&
14580 + rs->rs_phyerr != ATH9K_PHYERR_SPECTRAL)
14581 + return 0;
14582 +
14583 + /* check if spectral scan bit is set. This does not have to be checked
14584 + * if received through a SPECTRAL phy error, but shouldn't hurt.
14585 + */
14586 + radar_info = ((struct ath_radar_info *)&vdata[len]) - 1;
14587 + if (!(radar_info->pulse_bw_info & SPECTRAL_SCAN_BITMASK))
14588 + return 0;
14589 +
14590 + chan_type = cfg80211_get_chandef_type(&sc->hw->conf.chandef);
14591 + if ((chan_type == NL80211_CHAN_HT40MINUS) ||
14592 + (chan_type == NL80211_CHAN_HT40PLUS)) {
14593 + fft_len = SPECTRAL_HT20_40_TOTAL_DATA_LEN;
14594 + num_bins = SPECTRAL_HT20_40_NUM_BINS;
14595 + bins = (u8 *)fft_sample_40.data;
14596 + } else {
14597 + fft_len = SPECTRAL_HT20_TOTAL_DATA_LEN;
14598 + num_bins = SPECTRAL_HT20_NUM_BINS;
14599 + bins = (u8 *)fft_sample_20.data;
14600 + }
14601 +
14602 + /* Variation in the data length is possible and will be fixed later */
14603 + if ((len > fft_len + 2) || (len < fft_len - 1))
14604 + return 1;
14605 +
14606 + switch (len - fft_len) {
14607 + case 0:
14608 + /* length correct, nothing to do. */
14609 + memcpy(bins, vdata, num_bins);
14610 + break;
14611 + case -1:
14612 + /* first byte missing, duplicate it. */
14613 + memcpy(&bins[1], vdata, num_bins - 1);
14614 + bins[0] = vdata[0];
14615 + break;
14616 + case 2:
14617 + /* MAC added 2 extra bytes at bin 30 and 32, remove them. */
14618 + memcpy(bins, vdata, 30);
14619 + bins[30] = vdata[31];
14620 + memcpy(&bins[31], &vdata[33], num_bins - 31);
14621 + break;
14622 + case 1:
14623 + /* MAC added 2 extra bytes AND first byte is missing. */
14624 + bins[0] = vdata[0];
14625 + memcpy(&bins[1], vdata, 30);
14626 + bins[31] = vdata[31];
14627 + memcpy(&bins[32], &vdata[33], num_bins - 32);
14628 + break;
14629 + default:
14630 + return 1;
14631 + }
14632 +
14633 + /* DC value (value in the middle) is the blind spot of the spectral
14634 + * sample and invalid, interpolate it.
14635 + */
14636 + dc_pos = num_bins / 2;
14637 + bins[dc_pos] = (bins[dc_pos + 1] + bins[dc_pos - 1]) / 2;
14638 +
14639 + if ((chan_type == NL80211_CHAN_HT40MINUS) ||
14640 + (chan_type == NL80211_CHAN_HT40PLUS)) {
14641 + s8 lower_rssi, upper_rssi;
14642 + s16 ext_nf;
14643 + u8 lower_max_index, upper_max_index;
14644 + u8 lower_bitmap_w, upper_bitmap_w;
14645 + u16 lower_mag, upper_mag;
14646 + struct ath9k_hw_cal_data *caldata = ah->caldata;
14647 + struct ath_ht20_40_mag_info *mag_info;
14648 +
14649 + if (caldata)
14650 + ext_nf = ath9k_hw_getchan_noise(ah, ah->curchan,
14651 + caldata->nfCalHist[3].privNF);
14652 + else
14653 + ext_nf = ATH_DEFAULT_NOISE_FLOOR;
14654 +
14655 + length = sizeof(fft_sample_40) - sizeof(struct fft_sample_tlv);
14656 + fft_sample_40.tlv.type = ATH_FFT_SAMPLE_HT20_40;
14657 + fft_sample_40.tlv.length = __cpu_to_be16(length);
14658 + fft_sample_40.freq = __cpu_to_be16(freq);
14659 + fft_sample_40.channel_type = chan_type;
14660 +
14661 + if (chan_type == NL80211_CHAN_HT40PLUS) {
14662 + lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
14663 + upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
14664 +
14665 + fft_sample_40.lower_noise = ah->noise;
14666 + fft_sample_40.upper_noise = ext_nf;
14667 + } else {
14668 + lower_rssi = fix_rssi_inv_only(rs->rs_rssi_ext[0]);
14669 + upper_rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
14670 +
14671 + fft_sample_40.lower_noise = ext_nf;
14672 + fft_sample_40.upper_noise = ah->noise;
14673 + }
14674 + fft_sample_40.lower_rssi = lower_rssi;
14675 + fft_sample_40.upper_rssi = upper_rssi;
14676 +
14677 + mag_info = ((struct ath_ht20_40_mag_info *)radar_info) - 1;
14678 + lower_mag = spectral_max_magnitude(mag_info->lower_bins);
14679 + upper_mag = spectral_max_magnitude(mag_info->upper_bins);
14680 + fft_sample_40.lower_max_magnitude = __cpu_to_be16(lower_mag);
14681 + fft_sample_40.upper_max_magnitude = __cpu_to_be16(upper_mag);
14682 + lower_max_index = spectral_max_index(mag_info->lower_bins);
14683 + upper_max_index = spectral_max_index(mag_info->upper_bins);
14684 + fft_sample_40.lower_max_index = lower_max_index;
14685 + fft_sample_40.upper_max_index = upper_max_index;
14686 + lower_bitmap_w = spectral_bitmap_weight(mag_info->lower_bins);
14687 + upper_bitmap_w = spectral_bitmap_weight(mag_info->upper_bins);
14688 + fft_sample_40.lower_bitmap_weight = lower_bitmap_w;
14689 + fft_sample_40.upper_bitmap_weight = upper_bitmap_w;
14690 + fft_sample_40.max_exp = mag_info->max_exp & 0xf;
14691 +
14692 + fft_sample_40.tsf = __cpu_to_be64(tsf);
14693 +
14694 + tlv = (struct fft_sample_tlv *)&fft_sample_40;
14695 + } else {
14696 + u8 max_index, bitmap_w;
14697 + u16 magnitude;
14698 + struct ath_ht20_mag_info *mag_info;
14699 +
14700 + length = sizeof(fft_sample_20) - sizeof(struct fft_sample_tlv);
14701 + fft_sample_20.tlv.type = ATH_FFT_SAMPLE_HT20;
14702 + fft_sample_20.tlv.length = __cpu_to_be16(length);
14703 + fft_sample_20.freq = __cpu_to_be16(freq);
14704 +
14705 + fft_sample_20.rssi = fix_rssi_inv_only(rs->rs_rssi_ctl[0]);
14706 + fft_sample_20.noise = ah->noise;
14707 +
14708 + mag_info = ((struct ath_ht20_mag_info *)radar_info) - 1;
14709 + magnitude = spectral_max_magnitude(mag_info->all_bins);
14710 + fft_sample_20.max_magnitude = __cpu_to_be16(magnitude);
14711 + max_index = spectral_max_index(mag_info->all_bins);
14712 + fft_sample_20.max_index = max_index;
14713 + bitmap_w = spectral_bitmap_weight(mag_info->all_bins);
14714 + fft_sample_20.bitmap_weight = bitmap_w;
14715 + fft_sample_20.max_exp = mag_info->max_exp & 0xf;
14716 +
14717 + fft_sample_20.tsf = __cpu_to_be64(tsf);
14718 +
14719 + tlv = (struct fft_sample_tlv *)&fft_sample_20;
14720 + }
14721 +
14722 + ath_debug_send_fft_sample(sc, tlv);
14723 +
14724 + return 1;
14725 +}
14726 +
14727 +/*********************/
14728 +/* spectral_scan_ctl */
14729 +/*********************/
14730 +
14731 +static ssize_t read_file_spec_scan_ctl(struct file *file, char __user *user_buf,
14732 + size_t count, loff_t *ppos)
14733 +{
14734 + struct ath_softc *sc = file->private_data;
14735 + char *mode = "";
14736 + unsigned int len;
14737 +
14738 + switch (sc->spectral_mode) {
14739 + case SPECTRAL_DISABLED:
14740 + mode = "disable";
14741 + break;
14742 + case SPECTRAL_BACKGROUND:
14743 + mode = "background";
14744 + break;
14745 + case SPECTRAL_CHANSCAN:
14746 + mode = "chanscan";
14747 + break;
14748 + case SPECTRAL_MANUAL:
14749 + mode = "manual";
14750 + break;
14751 + }
14752 + len = strlen(mode);
14753 + return simple_read_from_buffer(user_buf, count, ppos, mode, len);
14754 +}
14755 +
14756 +static ssize_t write_file_spec_scan_ctl(struct file *file,
14757 + const char __user *user_buf,
14758 + size_t count, loff_t *ppos)
14759 +{
14760 + struct ath_softc *sc = file->private_data;
14761 + struct ath_common *common = ath9k_hw_common(sc->sc_ah);
14762 + char buf[32];
14763 + ssize_t len;
14764 +
14765 + if (config_enabled(CPTCFG_ATH9K_TX99))
14766 + return -EOPNOTSUPP;
14767 +
14768 + len = min(count, sizeof(buf) - 1);
14769 + if (copy_from_user(buf, user_buf, len))
14770 + return -EFAULT;
14771 +
14772 + buf[len] = '\0';
14773 +
14774 + if (strncmp("trigger", buf, 7) == 0) {
14775 + ath9k_spectral_scan_trigger(sc->hw);
14776 + } else if (strncmp("background", buf, 9) == 0) {
14777 + ath9k_spectral_scan_config(sc->hw, SPECTRAL_BACKGROUND);
14778 + ath_dbg(common, CONFIG, "spectral scan: background mode enabled\n");
14779 + } else if (strncmp("chanscan", buf, 8) == 0) {
14780 + ath9k_spectral_scan_config(sc->hw, SPECTRAL_CHANSCAN);
14781 + ath_dbg(common, CONFIG, "spectral scan: channel scan mode enabled\n");
14782 + } else if (strncmp("manual", buf, 6) == 0) {
14783 + ath9k_spectral_scan_config(sc->hw, SPECTRAL_MANUAL);
14784 + ath_dbg(common, CONFIG, "spectral scan: manual mode enabled\n");
14785 + } else if (strncmp("disable", buf, 7) == 0) {
14786 + ath9k_spectral_scan_config(sc->hw, SPECTRAL_DISABLED);
14787 + ath_dbg(common, CONFIG, "spectral scan: disabled\n");
14788 + } else {
14789 + return -EINVAL;
14790 + }
14791 +
14792 + return count;
14793 +}
14794 +
14795 +static const struct file_operations fops_spec_scan_ctl = {
14796 + .read = read_file_spec_scan_ctl,
14797 + .write = write_file_spec_scan_ctl,
14798 + .open = simple_open,
14799 + .owner = THIS_MODULE,
14800 + .llseek = default_llseek,
14801 +};
14802 +
14803 +/*************************/
14804 +/* spectral_short_repeat */
14805 +/*************************/
14806 +
14807 +static ssize_t read_file_spectral_short_repeat(struct file *file,
14808 + char __user *user_buf,
14809 + size_t count, loff_t *ppos)
14810 +{
14811 + struct ath_softc *sc = file->private_data;
14812 + char buf[32];
14813 + unsigned int len;
14814 +
14815 + len = sprintf(buf, "%d\n", sc->spec_config.short_repeat);
14816 + return simple_read_from_buffer(user_buf, count, ppos, buf, len);
14817 +}
14818 +
14819 +static ssize_t write_file_spectral_short_repeat(struct file *file,
14820 + const char __user *user_buf,
14821 + size_t count, loff_t *ppos)
14822 +{
14823 + struct ath_softc *sc = file->private_data;
14824 + unsigned long val;
14825 + char buf[32];
14826 + ssize_t len;
14827 +
14828 + len = min(count, sizeof(buf) - 1);
14829 + if (copy_from_user(buf, user_buf, len))
14830 + return -EFAULT;
14831 +
14832 + buf[len] = '\0';
14833 + if (kstrtoul(buf, 0, &val))
14834 + return -EINVAL;
14835 +
14836 + if (val < 0 || val > 1)
14837 + return -EINVAL;
14838 +
14839 + sc->spec_config.short_repeat = val;
14840 + return count;
14841 +}
14842 +
14843 +static const struct file_operations fops_spectral_short_repeat = {
14844 + .read = read_file_spectral_short_repeat,
14845 + .write = write_file_spectral_short_repeat,
14846 + .open = simple_open,
14847 + .owner = THIS_MODULE,
14848 + .llseek = default_llseek,
14849 +};
14850 +
14851 +/******************/
14852 +/* spectral_count */
14853 +/******************/
14854 +
14855 +static ssize_t read_file_spectral_count(struct file *file,
14856 + char __user *user_buf,
14857 + size_t count, loff_t *ppos)
14858 +{
14859 + struct ath_softc *sc = file->private_data;
14860 + char buf[32];
14861 + unsigned int len;
14862 +
14863 + len = sprintf(buf, "%d\n", sc->spec_config.count);
14864 + return simple_read_from_buffer(user_buf, count, ppos, buf, len);
14865 +}
14866 +
14867 +static ssize_t write_file_spectral_count(struct file *file,
14868 + const char __user *user_buf,
14869 + size_t count, loff_t *ppos)
14870 +{
14871 + struct ath_softc *sc = file->private_data;
14872 + unsigned long val;
14873 + char buf[32];
14874 + ssize_t len;
14875 +
14876 + len = min(count, sizeof(buf) - 1);
14877 + if (copy_from_user(buf, user_buf, len))
14878 + return -EFAULT;
14879 +
14880 + buf[len] = '\0';
14881 + if (kstrtoul(buf, 0, &val))
14882 + return -EINVAL;
14883 +
14884 + if (val < 0 || val > 255)
14885 + return -EINVAL;
14886 +
14887 + sc->spec_config.count = val;
14888 + return count;
14889 +}
14890 +
14891 +static const struct file_operations fops_spectral_count = {
14892 + .read = read_file_spectral_count,
14893 + .write = write_file_spectral_count,
14894 + .open = simple_open,
14895 + .owner = THIS_MODULE,
14896 + .llseek = default_llseek,
14897 +};
14898 +
14899 +/*******************/
14900 +/* spectral_period */
14901 +/*******************/
14902 +
14903 +static ssize_t read_file_spectral_period(struct file *file,
14904 + char __user *user_buf,
14905 + size_t count, loff_t *ppos)
14906 +{
14907 + struct ath_softc *sc = file->private_data;
14908 + char buf[32];
14909 + unsigned int len;
14910 +
14911 + len = sprintf(buf, "%d\n", sc->spec_config.period);
14912 + return simple_read_from_buffer(user_buf, count, ppos, buf, len);
14913 +}
14914 +
14915 +static ssize_t write_file_spectral_period(struct file *file,
14916 + const char __user *user_buf,
14917 + size_t count, loff_t *ppos)
14918 +{
14919 + struct ath_softc *sc = file->private_data;
14920 + unsigned long val;
14921 + char buf[32];
14922 + ssize_t len;
14923 +
14924 + len = min(count, sizeof(buf) - 1);
14925 + if (copy_from_user(buf, user_buf, len))
14926 + return -EFAULT;
14927 +
14928 + buf[len] = '\0';
14929 + if (kstrtoul(buf, 0, &val))
14930 + return -EINVAL;
14931 +
14932 + if (val < 0 || val > 255)
14933 + return -EINVAL;
14934 +
14935 + sc->spec_config.period = val;
14936 + return count;
14937 +}
14938 +
14939 +static const struct file_operations fops_spectral_period = {
14940 + .read = read_file_spectral_period,
14941 + .write = write_file_spectral_period,
14942 + .open = simple_open,
14943 + .owner = THIS_MODULE,
14944 + .llseek = default_llseek,
14945 +};
14946 +
14947 +/***********************/
14948 +/* spectral_fft_period */
14949 +/***********************/
14950 +
14951 +static ssize_t read_file_spectral_fft_period(struct file *file,
14952 + char __user *user_buf,
14953 + size_t count, loff_t *ppos)
14954 +{
14955 + struct ath_softc *sc = file->private_data;
14956 + char buf[32];
14957 + unsigned int len;
14958 +
14959 + len = sprintf(buf, "%d\n", sc->spec_config.fft_period);
14960 + return simple_read_from_buffer(user_buf, count, ppos, buf, len);
14961 +}
14962 +
14963 +static ssize_t write_file_spectral_fft_period(struct file *file,
14964 + const char __user *user_buf,
14965 + size_t count, loff_t *ppos)
14966 +{
14967 + struct ath_softc *sc = file->private_data;
14968 + unsigned long val;
14969 + char buf[32];
14970 + ssize_t len;
14971 +
14972 + len = min(count, sizeof(buf) - 1);
14973 + if (copy_from_user(buf, user_buf, len))
14974 + return -EFAULT;
14975 +
14976 + buf[len] = '\0';
14977 + if (kstrtoul(buf, 0, &val))
14978 + return -EINVAL;
14979 +
14980 + if (val < 0 || val > 15)
14981 + return -EINVAL;
14982 +
14983 + sc->spec_config.fft_period = val;
14984 + return count;
14985 +}
14986 +
14987 +static const struct file_operations fops_spectral_fft_period = {
14988 + .read = read_file_spectral_fft_period,
14989 + .write = write_file_spectral_fft_period,
14990 + .open = simple_open,
14991 + .owner = THIS_MODULE,
14992 + .llseek = default_llseek,
14993 +};
14994 +
14995 +/*******************/
14996 +/* Relay interface */
14997 +/*******************/
14998 +
14999 +static struct dentry *create_buf_file_handler(const char *filename,
15000 + struct dentry *parent,
15001 + umode_t mode,
15002 + struct rchan_buf *buf,
15003 + int *is_global)
15004 +{
15005 + struct dentry *buf_file;
15006 +
15007 + buf_file = debugfs_create_file(filename, mode, parent, buf,
15008 + &relay_file_operations);
15009 + *is_global = 1;
15010 + return buf_file;
15011 +}
15012 +
15013 +static int remove_buf_file_handler(struct dentry *dentry)
15014 +{
15015 + debugfs_remove(dentry);
15016 +
15017 + return 0;
15018 +}
15019 +
15020 +struct rchan_callbacks rfs_spec_scan_cb = {
15021 + .create_buf_file = create_buf_file_handler,
15022 + .remove_buf_file = remove_buf_file_handler,
15023 +};
15024 +
15025 +/*********************/
15026 +/* Debug Init/Deinit */
15027 +/*********************/
15028 +
15029 +void ath9k_spectral_deinit_debug(struct ath_softc *sc)
15030 +{
15031 + if (config_enabled(CPTCFG_ATH9K_DEBUGFS) && sc->rfs_chan_spec_scan) {
15032 + relay_close(sc->rfs_chan_spec_scan);
15033 + sc->rfs_chan_spec_scan = NULL;
15034 + }
15035 +}
15036 +
15037 +void ath9k_spectral_init_debug(struct ath_softc *sc)
15038 +{
15039 + sc->rfs_chan_spec_scan = relay_open("spectral_scan",
15040 + sc->debug.debugfs_phy,
15041 + 1024, 256, &rfs_spec_scan_cb,
15042 + NULL);
15043 + debugfs_create_file("spectral_scan_ctl",
15044 + S_IRUSR | S_IWUSR,
15045 + sc->debug.debugfs_phy, sc,
15046 + &fops_spec_scan_ctl);
15047 + debugfs_create_file("spectral_short_repeat",
15048 + S_IRUSR | S_IWUSR,
15049 + sc->debug.debugfs_phy, sc,
15050 + &fops_spectral_short_repeat);
15051 + debugfs_create_file("spectral_count",
15052 + S_IRUSR | S_IWUSR,
15053 + sc->debug.debugfs_phy, sc,
15054 + &fops_spectral_count);
15055 + debugfs_create_file("spectral_period",
15056 + S_IRUSR | S_IWUSR,
15057 + sc->debug.debugfs_phy, sc,
15058 + &fops_spectral_period);
15059 + debugfs_create_file("spectral_fft_period",
15060 + S_IRUSR | S_IWUSR,
15061 + sc->debug.debugfs_phy, sc,
15062 + &fops_spectral_fft_period);
15063 +}
15064 --- /dev/null
15065 +++ b/drivers/net/wireless/ath/ath9k/spectral.h
15066 @@ -0,0 +1,212 @@
15067 +/*
15068 + * Copyright (c) 2013 Qualcomm Atheros, Inc.
15069 + *
15070 + * Permission to use, copy, modify, and/or distribute this software for any
15071 + * purpose with or without fee is hereby granted, provided that the above
15072 + * copyright notice and this permission notice appear in all copies.
15073 + *
15074 + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15075 + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15076 + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15077 + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15078 + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15079 + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15080 + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15081 + */
15082 +
15083 +#ifndef SPECTRAL_H
15084 +#define SPECTRAL_H
15085 +
15086 +/* enum spectral_mode:
15087 + *
15088 + * @SPECTRAL_DISABLED: spectral mode is disabled
15089 + * @SPECTRAL_BACKGROUND: hardware sends samples when it is not busy with
15090 + * something else.
15091 + * @SPECTRAL_MANUAL: spectral scan is enabled, triggering for samples
15092 + * is performed manually.
15093 + * @SPECTRAL_CHANSCAN: Like manual, but also triggered when changing channels
15094 + * during a channel scan.
15095 + */
15096 +enum spectral_mode {
15097 + SPECTRAL_DISABLED = 0,
15098 + SPECTRAL_BACKGROUND,
15099 + SPECTRAL_MANUAL,
15100 + SPECTRAL_CHANSCAN,
15101 +};
15102 +
15103 +#define SPECTRAL_SCAN_BITMASK 0x10
15104 +/* Radar info packet format, used for DFS and spectral formats. */
15105 +struct ath_radar_info {
15106 + u8 pulse_length_pri;
15107 + u8 pulse_length_ext;
15108 + u8 pulse_bw_info;
15109 +} __packed;
15110 +
15111 +/* The HT20 spectral data has 4 bytes of additional information at it's end.
15112 + *
15113 + * [7:0]: all bins {max_magnitude[1:0], bitmap_weight[5:0]}
15114 + * [7:0]: all bins max_magnitude[9:2]
15115 + * [7:0]: all bins {max_index[5:0], max_magnitude[11:10]}
15116 + * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
15117 + */
15118 +struct ath_ht20_mag_info {
15119 + u8 all_bins[3];
15120 + u8 max_exp;
15121 +} __packed;
15122 +
15123 +#define SPECTRAL_HT20_NUM_BINS 56
15124 +
15125 +/* WARNING: don't actually use this struct! MAC may vary the amount of
15126 + * data by -1/+2. This struct is for reference only.
15127 + */
15128 +struct ath_ht20_fft_packet {
15129 + u8 data[SPECTRAL_HT20_NUM_BINS];
15130 + struct ath_ht20_mag_info mag_info;
15131 + struct ath_radar_info radar_info;
15132 +} __packed;
15133 +
15134 +#define SPECTRAL_HT20_TOTAL_DATA_LEN (sizeof(struct ath_ht20_fft_packet))
15135 +
15136 +/* Dynamic 20/40 mode:
15137 + *
15138 + * [7:0]: lower bins {max_magnitude[1:0], bitmap_weight[5:0]}
15139 + * [7:0]: lower bins max_magnitude[9:2]
15140 + * [7:0]: lower bins {max_index[5:0], max_magnitude[11:10]}
15141 + * [7:0]: upper bins {max_magnitude[1:0], bitmap_weight[5:0]}
15142 + * [7:0]: upper bins max_magnitude[9:2]
15143 + * [7:0]: upper bins {max_index[5:0], max_magnitude[11:10]}
15144 + * [3:0]: max_exp (shift amount to size max bin to 8-bit unsigned)
15145 + */
15146 +struct ath_ht20_40_mag_info {
15147 + u8 lower_bins[3];
15148 + u8 upper_bins[3];
15149 + u8 max_exp;
15150 +} __packed;
15151 +
15152 +#define SPECTRAL_HT20_40_NUM_BINS 128
15153 +
15154 +/* WARNING: don't actually use this struct! MAC may vary the amount of
15155 + * data. This struct is for reference only.
15156 + */
15157 +struct ath_ht20_40_fft_packet {
15158 + u8 data[SPECTRAL_HT20_40_NUM_BINS];
15159 + struct ath_ht20_40_mag_info mag_info;
15160 + struct ath_radar_info radar_info;
15161 +} __packed;
15162 +
15163 +
15164 +#define SPECTRAL_HT20_40_TOTAL_DATA_LEN (sizeof(struct ath_ht20_40_fft_packet))
15165 +
15166 +/* grabs the max magnitude from the all/upper/lower bins */
15167 +static inline u16 spectral_max_magnitude(u8 *bins)
15168 +{
15169 + return (bins[0] & 0xc0) >> 6 |
15170 + (bins[1] & 0xff) << 2 |
15171 + (bins[2] & 0x03) << 10;
15172 +}
15173 +
15174 +/* return the max magnitude from the all/upper/lower bins */
15175 +static inline u8 spectral_max_index(u8 *bins)
15176 +{
15177 + s8 m = (bins[2] & 0xfc) >> 2;
15178 +
15179 + /* TODO: this still doesn't always report the right values ... */
15180 + if (m > 32)
15181 + m |= 0xe0;
15182 + else
15183 + m &= ~0xe0;
15184 +
15185 + return m + 29;
15186 +}
15187 +
15188 +/* return the bitmap weight from the all/upper/lower bins */
15189 +static inline u8 spectral_bitmap_weight(u8 *bins)
15190 +{
15191 + return bins[0] & 0x3f;
15192 +}
15193 +
15194 +/* FFT sample format given to userspace via debugfs.
15195 + *
15196 + * Please keep the type/length at the front position and change
15197 + * other fields after adding another sample type
15198 + *
15199 + * TODO: this might need rework when switching to nl80211-based
15200 + * interface.
15201 + */
15202 +enum ath_fft_sample_type {
15203 + ATH_FFT_SAMPLE_HT20 = 1,
15204 + ATH_FFT_SAMPLE_HT20_40,
15205 +};
15206 +
15207 +struct fft_sample_tlv {
15208 + u8 type; /* see ath_fft_sample */
15209 + __be16 length;
15210 + /* type dependent data follows */
15211 +} __packed;
15212 +
15213 +struct fft_sample_ht20 {
15214 + struct fft_sample_tlv tlv;
15215 +
15216 + u8 max_exp;
15217 +
15218 + __be16 freq;
15219 + s8 rssi;
15220 + s8 noise;
15221 +
15222 + __be16 max_magnitude;
15223 + u8 max_index;
15224 + u8 bitmap_weight;
15225 +
15226 + __be64 tsf;
15227 +
15228 + u8 data[SPECTRAL_HT20_NUM_BINS];
15229 +} __packed;
15230 +
15231 +struct fft_sample_ht20_40 {
15232 + struct fft_sample_tlv tlv;
15233 +
15234 + u8 channel_type;
15235 + __be16 freq;
15236 +
15237 + s8 lower_rssi;
15238 + s8 upper_rssi;
15239 +
15240 + __be64 tsf;
15241 +
15242 + s8 lower_noise;
15243 + s8 upper_noise;
15244 +
15245 + __be16 lower_max_magnitude;
15246 + __be16 upper_max_magnitude;
15247 +
15248 + u8 lower_max_index;
15249 + u8 upper_max_index;
15250 +
15251 + u8 lower_bitmap_weight;
15252 + u8 upper_bitmap_weight;
15253 +
15254 + u8 max_exp;
15255 +
15256 + u8 data[SPECTRAL_HT20_40_NUM_BINS];
15257 +} __packed;
15258 +
15259 +void ath9k_spectral_init_debug(struct ath_softc *sc);
15260 +void ath9k_spectral_deinit_debug(struct ath_softc *sc);
15261 +
15262 +void ath9k_spectral_scan_trigger(struct ieee80211_hw *hw);
15263 +int ath9k_spectral_scan_config(struct ieee80211_hw *hw,
15264 + enum spectral_mode spectral_mode);
15265 +
15266 +#ifdef CPTCFG_ATH9K_DEBUGFS
15267 +int ath_process_fft(struct ath_softc *sc, struct ieee80211_hdr *hdr,
15268 + struct ath_rx_status *rs, u64 tsf);
15269 +#else
15270 +static inline int ath_process_fft(struct ath_softc *sc,
15271 + struct ieee80211_hdr *hdr,
15272 + struct ath_rx_status *rs, u64 tsf)
15273 +{
15274 + return 0;
15275 +}
15276 +#endif /* CPTCFG_ATH9K_DEBUGFS */
15277 +
15278 +#endif /* SPECTRAL_H */
15279 --- a/include/net/mac80211.h
15280 +++ b/include/net/mac80211.h
15281 @@ -1566,6 +1566,9 @@ enum ieee80211_hw_flags {
15282 * @extra_tx_headroom: headroom to reserve in each transmit skb
15283 * for use by the driver (e.g. for transmit headers.)
15284 *
15285 + * @extra_beacon_tailroom: tailroom to reserve in each beacon tx skb.
15286 + * Can be used by drivers to add extra IEs.
15287 + *
15288 * @channel_change_time: time (in microseconds) it takes to change channels.
15289 *
15290 * @max_signal: Maximum value for signal (rssi) in RX information, used
15291 @@ -1644,6 +1647,7 @@ struct ieee80211_hw {
15292 void *priv;
15293 u32 flags;
15294 unsigned int extra_tx_headroom;
15295 + unsigned int extra_beacon_tailroom;
15296 int channel_change_time;
15297 int vif_data_size;
15298 int sta_data_size;
15299 @@ -4595,4 +4599,49 @@ bool ieee80211_tx_prepare_skb(struct iee
15300 struct ieee80211_vif *vif, struct sk_buff *skb,
15301 int band, struct ieee80211_sta **sta);
15302
15303 +/**
15304 + * struct ieee80211_noa_data - holds temporary data for tracking P2P NoA state
15305 + *
15306 + * @next_tsf: TSF timestamp of the next absent state change
15307 + * @has_next_tsf: next absent state change event pending
15308 + *
15309 + * @absent: descriptor bitmask, set if GO is currently absent
15310 + *
15311 + * private:
15312 + *
15313 + * @count: count fields from the NoA descriptors
15314 + * @desc: adjusted data from the NoA
15315 + */
15316 +struct ieee80211_noa_data {
15317 + u32 next_tsf;
15318 + bool has_next_tsf;
15319 +
15320 + u8 absent;
15321 +
15322 + u8 count[IEEE80211_P2P_NOA_DESC_MAX];
15323 + struct {
15324 + u32 start;
15325 + u32 duration;
15326 + u32 interval;
15327 + } desc[IEEE80211_P2P_NOA_DESC_MAX];
15328 +};
15329 +
15330 +/**
15331 + * ieee80211_parse_p2p_noa - initialize NoA tracking data from P2P IE
15332 + *
15333 + * @attr: P2P NoA IE
15334 + * @data: NoA tracking data
15335 + * @tsf: current TSF timestamp
15336 + */
15337 +int ieee80211_parse_p2p_noa(const struct ieee80211_p2p_noa_attr *attr,
15338 + struct ieee80211_noa_data *data, u32 tsf);
15339 +
15340 +/**
15341 + * ieee80211_update_p2p_noa - get next pending P2P GO absent state change
15342 + *
15343 + * @data: NoA tracking data
15344 + * @tsf: current TSF timestamp
15345 + */
15346 +void ieee80211_update_p2p_noa(struct ieee80211_noa_data *data, u32 tsf);
15347 +
15348 #endif /* MAC80211_H */
15349 --- a/drivers/net/wireless/ath/ath9k/hw-ops.h
15350 +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h
15351 @@ -49,9 +49,10 @@ static inline bool ath9k_hw_calibrate(st
15352 return ath9k_hw_ops(ah)->calibrate(ah, chan, rxchainmask, longcal);
15353 }
15354
15355 -static inline bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked)
15356 +static inline bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked,
15357 + u32 *sync_cause_p)
15358 {
15359 - return ath9k_hw_ops(ah)->get_isr(ah, masked);
15360 + return ath9k_hw_ops(ah)->get_isr(ah, masked, sync_cause_p);
15361 }
15362
15363 static inline void ath9k_hw_set_txdesc(struct ath_hw *ah, void *ds,