hw.c revision 31a0bd3c7564ec79cf86a3eb9f9aaa3c47099d9b
1/*
2 * Copyright (c) 2008-2009 Atheros Communications Inc.
3 *
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#include <linux/io.h>
18#include <asm/unaligned.h>
19
20#include "hw.h"
21#include "hw-ops.h"
22#include "rc.h"
23#include "initvals.h"
24
25#define ATH9K_CLOCK_RATE_CCK		22
26#define ATH9K_CLOCK_RATE_5GHZ_OFDM	40
27#define ATH9K_CLOCK_RATE_2GHZ_OFDM	44
28
29static void ar9002_hw_attach_ops(struct ath_hw *ah);
30static void ar9003_hw_attach_ops(struct ath_hw *ah);
31
32static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);
33
34MODULE_AUTHOR("Atheros Communications");
35MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards.");
36MODULE_SUPPORTED_DEVICE("Atheros 802.11n WLAN cards");
37MODULE_LICENSE("Dual BSD/GPL");
38
39static int __init ath9k_init(void)
40{
41	return 0;
42}
43module_init(ath9k_init);
44
45static void __exit ath9k_exit(void)
46{
47	return;
48}
49module_exit(ath9k_exit);
50
51/* Private hardware callbacks */
52
53static void ath9k_hw_init_cal_settings(struct ath_hw *ah)
54{
55	ath9k_hw_private_ops(ah)->init_cal_settings(ah);
56}
57
58static void ath9k_hw_init_mode_regs(struct ath_hw *ah)
59{
60	ath9k_hw_private_ops(ah)->init_mode_regs(ah);
61}
62
63static bool ath9k_hw_macversion_supported(struct ath_hw *ah)
64{
65	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
66
67	return priv_ops->macversion_supported(ah->hw_version.macVersion);
68}
69
70static u32 ath9k_hw_compute_pll_control(struct ath_hw *ah,
71					struct ath9k_channel *chan)
72{
73	return ath9k_hw_private_ops(ah)->compute_pll_control(ah, chan);
74}
75
76/********************/
77/* Helper Functions */
78/********************/
79
80static u32 ath9k_hw_mac_clks(struct ath_hw *ah, u32 usecs)
81{
82	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
83
84	if (!ah->curchan) /* should really check for CCK instead */
85		return usecs *ATH9K_CLOCK_RATE_CCK;
86	if (conf->channel->band == IEEE80211_BAND_2GHZ)
87		return usecs *ATH9K_CLOCK_RATE_2GHZ_OFDM;
88	return usecs *ATH9K_CLOCK_RATE_5GHZ_OFDM;
89}
90
91static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
92{
93	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
94
95	if (conf_is_ht40(conf))
96		return ath9k_hw_mac_clks(ah, usecs) * 2;
97	else
98		return ath9k_hw_mac_clks(ah, usecs);
99}
100
101bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
102{
103	int i;
104
105	BUG_ON(timeout < AH_TIME_QUANTUM);
106
107	for (i = 0; i < (timeout / AH_TIME_QUANTUM); i++) {
108		if ((REG_READ(ah, reg) & mask) == val)
109			return true;
110
111		udelay(AH_TIME_QUANTUM);
112	}
113
114	ath_print(ath9k_hw_common(ah), ATH_DBG_ANY,
115		  "timeout (%d us) on reg 0x%x: 0x%08x & 0x%08x != 0x%08x\n",
116		  timeout, reg, REG_READ(ah, reg), mask, val);
117
118	return false;
119}
120EXPORT_SYMBOL(ath9k_hw_wait);
121
122u32 ath9k_hw_reverse_bits(u32 val, u32 n)
123{
124	u32 retval;
125	int i;
126
127	for (i = 0, retval = 0; i < n; i++) {
128		retval = (retval << 1) | (val & 1);
129		val >>= 1;
130	}
131	return retval;
132}
133
134bool ath9k_get_channel_edges(struct ath_hw *ah,
135			     u16 flags, u16 *low,
136			     u16 *high)
137{
138	struct ath9k_hw_capabilities *pCap = &ah->caps;
139
140	if (flags & CHANNEL_5GHZ) {
141		*low = pCap->low_5ghz_chan;
142		*high = pCap->high_5ghz_chan;
143		return true;
144	}
145	if ((flags & CHANNEL_2GHZ)) {
146		*low = pCap->low_2ghz_chan;
147		*high = pCap->high_2ghz_chan;
148		return true;
149	}
150	return false;
151}
152
153u16 ath9k_hw_computetxtime(struct ath_hw *ah,
154			   u8 phy, int kbps,
155			   u32 frameLen, u16 rateix,
156			   bool shortPreamble)
157{
158	u32 bitsPerSymbol, numBits, numSymbols, phyTime, txTime;
159
160	if (kbps == 0)
161		return 0;
162
163	switch (phy) {
164	case WLAN_RC_PHY_CCK:
165		phyTime = CCK_PREAMBLE_BITS + CCK_PLCP_BITS;
166		if (shortPreamble)
167			phyTime >>= 1;
168		numBits = frameLen << 3;
169		txTime = CCK_SIFS_TIME + phyTime + ((numBits * 1000) / kbps);
170		break;
171	case WLAN_RC_PHY_OFDM:
172		if (ah->curchan && IS_CHAN_QUARTER_RATE(ah->curchan)) {
173			bitsPerSymbol =	(kbps * OFDM_SYMBOL_TIME_QUARTER) / 1000;
174			numBits = OFDM_PLCP_BITS + (frameLen << 3);
175			numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
176			txTime = OFDM_SIFS_TIME_QUARTER
177				+ OFDM_PREAMBLE_TIME_QUARTER
178				+ (numSymbols * OFDM_SYMBOL_TIME_QUARTER);
179		} else if (ah->curchan &&
180			   IS_CHAN_HALF_RATE(ah->curchan)) {
181			bitsPerSymbol =	(kbps * OFDM_SYMBOL_TIME_HALF) / 1000;
182			numBits = OFDM_PLCP_BITS + (frameLen << 3);
183			numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
184			txTime = OFDM_SIFS_TIME_HALF +
185				OFDM_PREAMBLE_TIME_HALF
186				+ (numSymbols * OFDM_SYMBOL_TIME_HALF);
187		} else {
188			bitsPerSymbol = (kbps * OFDM_SYMBOL_TIME) / 1000;
189			numBits = OFDM_PLCP_BITS + (frameLen << 3);
190			numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
191			txTime = OFDM_SIFS_TIME + OFDM_PREAMBLE_TIME
192				+ (numSymbols * OFDM_SYMBOL_TIME);
193		}
194		break;
195	default:
196		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
197			  "Unknown phy %u (rate ix %u)\n", phy, rateix);
198		txTime = 0;
199		break;
200	}
201
202	return txTime;
203}
204EXPORT_SYMBOL(ath9k_hw_computetxtime);
205
206void ath9k_hw_get_channel_centers(struct ath_hw *ah,
207				  struct ath9k_channel *chan,
208				  struct chan_centers *centers)
209{
210	int8_t extoff;
211
212	if (!IS_CHAN_HT40(chan)) {
213		centers->ctl_center = centers->ext_center =
214			centers->synth_center = chan->channel;
215		return;
216	}
217
218	if ((chan->chanmode == CHANNEL_A_HT40PLUS) ||
219	    (chan->chanmode == CHANNEL_G_HT40PLUS)) {
220		centers->synth_center =
221			chan->channel + HT40_CHANNEL_CENTER_SHIFT;
222		extoff = 1;
223	} else {
224		centers->synth_center =
225			chan->channel - HT40_CHANNEL_CENTER_SHIFT;
226		extoff = -1;
227	}
228
229	centers->ctl_center =
230		centers->synth_center - (extoff * HT40_CHANNEL_CENTER_SHIFT);
231	/* 25 MHz spacing is supported by hw but not on upper layers */
232	centers->ext_center =
233		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
234}
235
236/******************/
237/* Chip Revisions */
238/******************/
239
240static void ath9k_hw_read_revisions(struct ath_hw *ah)
241{
242	u32 val;
243
244	val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
245
246	if (val == 0xFF) {
247		val = REG_READ(ah, AR_SREV);
248		ah->hw_version.macVersion =
249			(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
250		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
251		ah->is_pciexpress = (val & AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
252	} else {
253		if (!AR_SREV_9100(ah))
254			ah->hw_version.macVersion = MS(val, AR_SREV_VERSION);
255
256		ah->hw_version.macRev = val & AR_SREV_REVISION;
257
258		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
259			ah->is_pciexpress = true;
260	}
261}
262
263static int ath9k_hw_get_radiorev(struct ath_hw *ah)
264{
265	u32 val;
266	int i;
267
268	REG_WRITE(ah, AR_PHY(0x36), 0x00007058);
269
270	for (i = 0; i < 8; i++)
271		REG_WRITE(ah, AR_PHY(0x20), 0x00010000);
272	val = (REG_READ(ah, AR_PHY(256)) >> 24) & 0xff;
273	val = ((val & 0xf0) >> 4) | ((val & 0x0f) << 4);
274
275	return ath9k_hw_reverse_bits(val, 8);
276}
277
278/************************************/
279/* HW Attach, Detach, Init Routines */
280/************************************/
281
282static void ath9k_hw_disablepcie(struct ath_hw *ah)
283{
284	if (AR_SREV_9100(ah))
285		return;
286
287	REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00);
288	REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
289	REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029);
290	REG_WRITE(ah, AR_PCIE_SERDES, 0x57160824);
291	REG_WRITE(ah, AR_PCIE_SERDES, 0x25980579);
292	REG_WRITE(ah, AR_PCIE_SERDES, 0x00000000);
293	REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40);
294	REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554);
295	REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007);
296
297	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
298}
299
300static bool ath9k_hw_chip_test(struct ath_hw *ah)
301{
302	struct ath_common *common = ath9k_hw_common(ah);
303	u32 regAddr[2] = { AR_STA_ID0, AR_PHY_BASE + (8 << 2) };
304	u32 regHold[2];
305	u32 patternData[4] = { 0x55555555,
306			       0xaaaaaaaa,
307			       0x66666666,
308			       0x99999999 };
309	int i, j;
310
311	for (i = 0; i < 2; i++) {
312		u32 addr = regAddr[i];
313		u32 wrData, rdData;
314
315		regHold[i] = REG_READ(ah, addr);
316		for (j = 0; j < 0x100; j++) {
317			wrData = (j << 16) | j;
318			REG_WRITE(ah, addr, wrData);
319			rdData = REG_READ(ah, addr);
320			if (rdData != wrData) {
321				ath_print(common, ATH_DBG_FATAL,
322					  "address test failed "
323					  "addr: 0x%08x - wr:0x%08x != "
324					  "rd:0x%08x\n",
325					  addr, wrData, rdData);
326				return false;
327			}
328		}
329		for (j = 0; j < 4; j++) {
330			wrData = patternData[j];
331			REG_WRITE(ah, addr, wrData);
332			rdData = REG_READ(ah, addr);
333			if (wrData != rdData) {
334				ath_print(common, ATH_DBG_FATAL,
335					  "address test failed "
336					  "addr: 0x%08x - wr:0x%08x != "
337					  "rd:0x%08x\n",
338					  addr, wrData, rdData);
339				return false;
340			}
341		}
342		REG_WRITE(ah, regAddr[i], regHold[i]);
343	}
344	udelay(100);
345
346	return true;
347}
348
349static void ath9k_hw_init_config(struct ath_hw *ah)
350{
351	int i;
352
353	ah->config.dma_beacon_response_time = 2;
354	ah->config.sw_beacon_response_time = 10;
355	ah->config.additional_swba_backoff = 0;
356	ah->config.ack_6mb = 0x0;
357	ah->config.cwm_ignore_extcca = 0;
358	ah->config.pcie_powersave_enable = 0;
359	ah->config.pcie_clock_req = 0;
360	ah->config.pcie_waen = 0;
361	ah->config.analog_shiftreg = 1;
362	ah->config.ofdm_trig_low = 200;
363	ah->config.ofdm_trig_high = 500;
364	ah->config.cck_trig_high = 200;
365	ah->config.cck_trig_low = 100;
366
367	/*
368	 * For now ANI is disabled for AR9003, it is still
369	 * being tested.
370	 */
371	if (!AR_SREV_9300_20_OR_LATER(ah))
372		ah->config.enable_ani = 1;
373
374	for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
375		ah->config.spurchans[i][0] = AR_NO_SPUR;
376		ah->config.spurchans[i][1] = AR_NO_SPUR;
377	}
378
379	if (ah->hw_version.devid != AR2427_DEVID_PCIE)
380		ah->config.ht_enable = 1;
381	else
382		ah->config.ht_enable = 0;
383
384	ah->config.rx_intr_mitigation = true;
385
386	/*
387	 * We need this for PCI devices only (Cardbus, PCI, miniPCI)
388	 * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
389	 * This means we use it for all AR5416 devices, and the few
390	 * minor PCI AR9280 devices out there.
391	 *
392	 * Serialization is required because these devices do not handle
393	 * well the case of two concurrent reads/writes due to the latency
394	 * involved. During one read/write another read/write can be issued
395	 * on another CPU while the previous read/write may still be working
396	 * on our hardware, if we hit this case the hardware poops in a loop.
397	 * We prevent this by serializing reads and writes.
398	 *
399	 * This issue is not present on PCI-Express devices or pre-AR5416
400	 * devices (legacy, 802.11abg).
401	 */
402	if (num_possible_cpus() > 1)
403		ah->config.serialize_regmode = SER_REG_MODE_AUTO;
404}
405
406static void ath9k_hw_init_defaults(struct ath_hw *ah)
407{
408	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
409
410	regulatory->country_code = CTRY_DEFAULT;
411	regulatory->power_limit = MAX_RATE_POWER;
412	regulatory->tp_scale = ATH9K_TP_SCALE_MAX;
413
414	ah->hw_version.magic = AR5416_MAGIC;
415	ah->hw_version.subvendorid = 0;
416
417	ah->ah_flags = 0;
418	if (!AR_SREV_9100(ah))
419		ah->ah_flags = AH_USE_EEPROM;
420
421	ah->atim_window = 0;
422	ah->sta_id1_defaults = AR_STA_ID1_CRPT_MIC_ENABLE;
423	ah->beacon_interval = 100;
424	ah->enable_32kHz_clock = DONT_USE_32KHZ;
425	ah->slottime = (u32) -1;
426	ah->globaltxtimeout = (u32) -1;
427	ah->power_mode = ATH9K_PM_UNDEFINED;
428}
429
430static int ath9k_hw_rf_claim(struct ath_hw *ah)
431{
432	u32 val;
433
434	REG_WRITE(ah, AR_PHY(0), 0x00000007);
435
436	val = ath9k_hw_get_radiorev(ah);
437	switch (val & AR_RADIO_SREV_MAJOR) {
438	case 0:
439		val = AR_RAD5133_SREV_MAJOR;
440		break;
441	case AR_RAD5133_SREV_MAJOR:
442	case AR_RAD5122_SREV_MAJOR:
443	case AR_RAD2133_SREV_MAJOR:
444	case AR_RAD2122_SREV_MAJOR:
445		break;
446	default:
447		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
448			  "Radio Chip Rev 0x%02X not supported\n",
449			  val & AR_RADIO_SREV_MAJOR);
450		return -EOPNOTSUPP;
451	}
452
453	ah->hw_version.analog5GhzRev = val;
454
455	return 0;
456}
457
458static int ath9k_hw_init_macaddr(struct ath_hw *ah)
459{
460	struct ath_common *common = ath9k_hw_common(ah);
461	u32 sum;
462	int i;
463	u16 eeval;
464
465	sum = 0;
466	for (i = 0; i < 3; i++) {
467		eeval = ah->eep_ops->get_eeprom(ah, AR_EEPROM_MAC(i));
468		sum += eeval;
469		common->macaddr[2 * i] = eeval >> 8;
470		common->macaddr[2 * i + 1] = eeval & 0xff;
471	}
472	if (sum == 0 || sum == 0xffff * 3)
473		return -EADDRNOTAVAIL;
474
475	return 0;
476}
477
478static void ath9k_hw_init_rxgain_ini(struct ath_hw *ah)
479{
480	u32 rxgain_type;
481
482	if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_17) {
483		rxgain_type = ah->eep_ops->get_eeprom(ah, EEP_RXGAIN_TYPE);
484
485		if (rxgain_type == AR5416_EEP_RXGAIN_13DB_BACKOFF)
486			INIT_INI_ARRAY(&ah->iniModesRxGain,
487			ar9280Modes_backoff_13db_rxgain_9280_2,
488			ARRAY_SIZE(ar9280Modes_backoff_13db_rxgain_9280_2), 6);
489		else if (rxgain_type == AR5416_EEP_RXGAIN_23DB_BACKOFF)
490			INIT_INI_ARRAY(&ah->iniModesRxGain,
491			ar9280Modes_backoff_23db_rxgain_9280_2,
492			ARRAY_SIZE(ar9280Modes_backoff_23db_rxgain_9280_2), 6);
493		else
494			INIT_INI_ARRAY(&ah->iniModesRxGain,
495			ar9280Modes_original_rxgain_9280_2,
496			ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6);
497	} else {
498		INIT_INI_ARRAY(&ah->iniModesRxGain,
499			ar9280Modes_original_rxgain_9280_2,
500			ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6);
501	}
502}
503
504static void ath9k_hw_init_txgain_ini(struct ath_hw *ah)
505{
506	u32 txgain_type;
507
508	if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_19) {
509		txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE);
510
511		if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER)
512			INIT_INI_ARRAY(&ah->iniModesTxGain,
513			ar9280Modes_high_power_tx_gain_9280_2,
514			ARRAY_SIZE(ar9280Modes_high_power_tx_gain_9280_2), 6);
515		else
516			INIT_INI_ARRAY(&ah->iniModesTxGain,
517			ar9280Modes_original_tx_gain_9280_2,
518			ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6);
519	} else {
520		INIT_INI_ARRAY(&ah->iniModesTxGain,
521		ar9280Modes_original_tx_gain_9280_2,
522		ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6);
523	}
524}
525
526static int ath9k_hw_post_init(struct ath_hw *ah)
527{
528	int ecode;
529
530	if (!AR_SREV_9271(ah)) {
531		if (!ath9k_hw_chip_test(ah))
532			return -ENODEV;
533	}
534
535	ecode = ath9k_hw_rf_claim(ah);
536	if (ecode != 0)
537		return ecode;
538
539	ecode = ath9k_hw_eeprom_init(ah);
540	if (ecode != 0)
541		return ecode;
542
543	ath_print(ath9k_hw_common(ah), ATH_DBG_CONFIG,
544		  "Eeprom VER: %d, REV: %d\n",
545		  ah->eep_ops->get_eeprom_ver(ah),
546		  ah->eep_ops->get_eeprom_rev(ah));
547
548	ecode = ath9k_hw_rf_alloc_ext_banks(ah);
549	if (ecode) {
550		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
551			  "Failed allocating banks for "
552			  "external radio\n");
553		return ecode;
554	}
555
556	if (!AR_SREV_9100(ah)) {
557		ath9k_hw_ani_setup(ah);
558		ath9k_hw_ani_init(ah);
559	}
560
561	return 0;
562}
563
564static bool ar9002_hw_macversion_supported(u32 macversion)
565{
566	switch (macversion) {
567	case AR_SREV_VERSION_5416_PCI:
568	case AR_SREV_VERSION_5416_PCIE:
569	case AR_SREV_VERSION_9160:
570	case AR_SREV_VERSION_9100:
571	case AR_SREV_VERSION_9280:
572	case AR_SREV_VERSION_9285:
573	case AR_SREV_VERSION_9287:
574	case AR_SREV_VERSION_9271:
575		return true;
576	default:
577		break;
578	}
579	return false;
580}
581
582static bool ar9003_hw_macversion_supported(u32 macversion)
583{
584	switch (macversion) {
585	case AR_SREV_VERSION_9300:
586		return true;
587	default:
588		break;
589	}
590	return false;
591}
592
593static void ar9002_hw_init_cal_settings(struct ath_hw *ah)
594{
595	if (AR_SREV_9160_10_OR_LATER(ah)) {
596		if (AR_SREV_9280_10_OR_LATER(ah)) {
597			ah->iq_caldata.calData = &iq_cal_single_sample;
598			ah->adcgain_caldata.calData =
599				&adc_gain_cal_single_sample;
600			ah->adcdc_caldata.calData =
601				&adc_dc_cal_single_sample;
602			ah->adcdc_calinitdata.calData =
603				&adc_init_dc_cal;
604		} else {
605			ah->iq_caldata.calData = &iq_cal_multi_sample;
606			ah->adcgain_caldata.calData =
607				&adc_gain_cal_multi_sample;
608			ah->adcdc_caldata.calData =
609				&adc_dc_cal_multi_sample;
610			ah->adcdc_calinitdata.calData =
611				&adc_init_dc_cal;
612		}
613		ah->supp_cals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL;
614	}
615}
616
617static void ar9002_hw_init_mode_regs(struct ath_hw *ah)
618{
619	if (AR_SREV_9271(ah)) {
620		INIT_INI_ARRAY(&ah->iniModes, ar9271Modes_9271,
621			       ARRAY_SIZE(ar9271Modes_9271), 6);
622		INIT_INI_ARRAY(&ah->iniCommon, ar9271Common_9271,
623			       ARRAY_SIZE(ar9271Common_9271), 2);
624		INIT_INI_ARRAY(&ah->iniCommon_normal_cck_fir_coeff_9271,
625			       ar9271Common_normal_cck_fir_coeff_9271,
626			       ARRAY_SIZE(ar9271Common_normal_cck_fir_coeff_9271), 2);
627		INIT_INI_ARRAY(&ah->iniCommon_japan_2484_cck_fir_coeff_9271,
628			       ar9271Common_japan_2484_cck_fir_coeff_9271,
629			       ARRAY_SIZE(ar9271Common_japan_2484_cck_fir_coeff_9271), 2);
630		INIT_INI_ARRAY(&ah->iniModes_9271_1_0_only,
631			       ar9271Modes_9271_1_0_only,
632			       ARRAY_SIZE(ar9271Modes_9271_1_0_only), 6);
633		INIT_INI_ARRAY(&ah->iniModes_9271_ANI_reg, ar9271Modes_9271_ANI_reg,
634			       ARRAY_SIZE(ar9271Modes_9271_ANI_reg), 6);
635		INIT_INI_ARRAY(&ah->iniModes_high_power_tx_gain_9271,
636			       ar9271Modes_high_power_tx_gain_9271,
637			       ARRAY_SIZE(ar9271Modes_high_power_tx_gain_9271), 6);
638		INIT_INI_ARRAY(&ah->iniModes_normal_power_tx_gain_9271,
639			       ar9271Modes_normal_power_tx_gain_9271,
640			       ARRAY_SIZE(ar9271Modes_normal_power_tx_gain_9271), 6);
641		return;
642	}
643
644	if (AR_SREV_9287_11_OR_LATER(ah)) {
645		INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_1,
646				ARRAY_SIZE(ar9287Modes_9287_1_1), 6);
647		INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_1,
648				ARRAY_SIZE(ar9287Common_9287_1_1), 2);
649		if (ah->config.pcie_clock_req)
650			INIT_INI_ARRAY(&ah->iniPcieSerdes,
651			ar9287PciePhy_clkreq_off_L1_9287_1_1,
652			ARRAY_SIZE(ar9287PciePhy_clkreq_off_L1_9287_1_1), 2);
653		else
654			INIT_INI_ARRAY(&ah->iniPcieSerdes,
655			ar9287PciePhy_clkreq_always_on_L1_9287_1_1,
656			ARRAY_SIZE(ar9287PciePhy_clkreq_always_on_L1_9287_1_1),
657					2);
658	} else if (AR_SREV_9287_10_OR_LATER(ah)) {
659		INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_0,
660				ARRAY_SIZE(ar9287Modes_9287_1_0), 6);
661		INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_0,
662				ARRAY_SIZE(ar9287Common_9287_1_0), 2);
663
664		if (ah->config.pcie_clock_req)
665			INIT_INI_ARRAY(&ah->iniPcieSerdes,
666			ar9287PciePhy_clkreq_off_L1_9287_1_0,
667			ARRAY_SIZE(ar9287PciePhy_clkreq_off_L1_9287_1_0), 2);
668		else
669			INIT_INI_ARRAY(&ah->iniPcieSerdes,
670			ar9287PciePhy_clkreq_always_on_L1_9287_1_0,
671			ARRAY_SIZE(ar9287PciePhy_clkreq_always_on_L1_9287_1_0),
672				  2);
673	} else if (AR_SREV_9285_12_OR_LATER(ah)) {
674
675
676		INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285_1_2,
677			       ARRAY_SIZE(ar9285Modes_9285_1_2), 6);
678		INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285_1_2,
679			       ARRAY_SIZE(ar9285Common_9285_1_2), 2);
680
681		if (ah->config.pcie_clock_req) {
682			INIT_INI_ARRAY(&ah->iniPcieSerdes,
683			ar9285PciePhy_clkreq_off_L1_9285_1_2,
684			ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285_1_2), 2);
685		} else {
686			INIT_INI_ARRAY(&ah->iniPcieSerdes,
687			ar9285PciePhy_clkreq_always_on_L1_9285_1_2,
688			ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285_1_2),
689				  2);
690		}
691	} else if (AR_SREV_9285_10_OR_LATER(ah)) {
692		INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285,
693			       ARRAY_SIZE(ar9285Modes_9285), 6);
694		INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285,
695			       ARRAY_SIZE(ar9285Common_9285), 2);
696
697		if (ah->config.pcie_clock_req) {
698			INIT_INI_ARRAY(&ah->iniPcieSerdes,
699			ar9285PciePhy_clkreq_off_L1_9285,
700			ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285), 2);
701		} else {
702			INIT_INI_ARRAY(&ah->iniPcieSerdes,
703			ar9285PciePhy_clkreq_always_on_L1_9285,
704			ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285), 2);
705		}
706	} else if (AR_SREV_9280_20_OR_LATER(ah)) {
707		INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280_2,
708			       ARRAY_SIZE(ar9280Modes_9280_2), 6);
709		INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280_2,
710			       ARRAY_SIZE(ar9280Common_9280_2), 2);
711
712		if (ah->config.pcie_clock_req) {
713			INIT_INI_ARRAY(&ah->iniPcieSerdes,
714			       ar9280PciePhy_clkreq_off_L1_9280,
715			       ARRAY_SIZE(ar9280PciePhy_clkreq_off_L1_9280),2);
716		} else {
717			INIT_INI_ARRAY(&ah->iniPcieSerdes,
718			       ar9280PciePhy_clkreq_always_on_L1_9280,
719			       ARRAY_SIZE(ar9280PciePhy_clkreq_always_on_L1_9280), 2);
720		}
721		INIT_INI_ARRAY(&ah->iniModesAdditional,
722			       ar9280Modes_fast_clock_9280_2,
723			       ARRAY_SIZE(ar9280Modes_fast_clock_9280_2), 3);
724	} else if (AR_SREV_9280_10_OR_LATER(ah)) {
725		INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280,
726			       ARRAY_SIZE(ar9280Modes_9280), 6);
727		INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280,
728			       ARRAY_SIZE(ar9280Common_9280), 2);
729	} else if (AR_SREV_9160_10_OR_LATER(ah)) {
730		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9160,
731			       ARRAY_SIZE(ar5416Modes_9160), 6);
732		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9160,
733			       ARRAY_SIZE(ar5416Common_9160), 2);
734		INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9160,
735			       ARRAY_SIZE(ar5416Bank0_9160), 2);
736		INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9160,
737			       ARRAY_SIZE(ar5416BB_RfGain_9160), 3);
738		INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9160,
739			       ARRAY_SIZE(ar5416Bank1_9160), 2);
740		INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9160,
741			       ARRAY_SIZE(ar5416Bank2_9160), 2);
742		INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9160,
743			       ARRAY_SIZE(ar5416Bank3_9160), 3);
744		INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9160,
745			       ARRAY_SIZE(ar5416Bank6_9160), 3);
746		INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9160,
747			       ARRAY_SIZE(ar5416Bank6TPC_9160), 3);
748		INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9160,
749			       ARRAY_SIZE(ar5416Bank7_9160), 2);
750		if (AR_SREV_9160_11(ah)) {
751			INIT_INI_ARRAY(&ah->iniAddac,
752				       ar5416Addac_91601_1,
753				       ARRAY_SIZE(ar5416Addac_91601_1), 2);
754		} else {
755			INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9160,
756				       ARRAY_SIZE(ar5416Addac_9160), 2);
757		}
758	} else if (AR_SREV_9100_OR_LATER(ah)) {
759		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9100,
760			       ARRAY_SIZE(ar5416Modes_9100), 6);
761		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100,
762			       ARRAY_SIZE(ar5416Common_9100), 2);
763		INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9100,
764			       ARRAY_SIZE(ar5416Bank0_9100), 2);
765		INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9100,
766			       ARRAY_SIZE(ar5416BB_RfGain_9100), 3);
767		INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9100,
768			       ARRAY_SIZE(ar5416Bank1_9100), 2);
769		INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9100,
770			       ARRAY_SIZE(ar5416Bank2_9100), 2);
771		INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9100,
772			       ARRAY_SIZE(ar5416Bank3_9100), 3);
773		INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100,
774			       ARRAY_SIZE(ar5416Bank6_9100), 3);
775		INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9100,
776			       ARRAY_SIZE(ar5416Bank6TPC_9100), 3);
777		INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9100,
778			       ARRAY_SIZE(ar5416Bank7_9100), 2);
779		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100,
780			       ARRAY_SIZE(ar5416Addac_9100), 2);
781	} else {
782		INIT_INI_ARRAY(&ah->iniModes, ar5416Modes,
783			       ARRAY_SIZE(ar5416Modes), 6);
784		INIT_INI_ARRAY(&ah->iniCommon, ar5416Common,
785			       ARRAY_SIZE(ar5416Common), 2);
786		INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0,
787			       ARRAY_SIZE(ar5416Bank0), 2);
788		INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain,
789			       ARRAY_SIZE(ar5416BB_RfGain), 3);
790		INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1,
791			       ARRAY_SIZE(ar5416Bank1), 2);
792		INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2,
793			       ARRAY_SIZE(ar5416Bank2), 2);
794		INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3,
795			       ARRAY_SIZE(ar5416Bank3), 3);
796		INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6,
797			       ARRAY_SIZE(ar5416Bank6), 3);
798		INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC,
799			       ARRAY_SIZE(ar5416Bank6TPC), 3);
800		INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7,
801			       ARRAY_SIZE(ar5416Bank7), 2);
802		INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac,
803			       ARRAY_SIZE(ar5416Addac), 2);
804	}
805}
806
807static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
808{
809	if (AR_SREV_9287_11_OR_LATER(ah))
810		INIT_INI_ARRAY(&ah->iniModesRxGain,
811		ar9287Modes_rx_gain_9287_1_1,
812		ARRAY_SIZE(ar9287Modes_rx_gain_9287_1_1), 6);
813	else if (AR_SREV_9287_10(ah))
814		INIT_INI_ARRAY(&ah->iniModesRxGain,
815		ar9287Modes_rx_gain_9287_1_0,
816		ARRAY_SIZE(ar9287Modes_rx_gain_9287_1_0), 6);
817	else if (AR_SREV_9280_20(ah))
818		ath9k_hw_init_rxgain_ini(ah);
819
820	if (AR_SREV_9287_11_OR_LATER(ah)) {
821		INIT_INI_ARRAY(&ah->iniModesTxGain,
822		ar9287Modes_tx_gain_9287_1_1,
823		ARRAY_SIZE(ar9287Modes_tx_gain_9287_1_1), 6);
824	} else if (AR_SREV_9287_10(ah)) {
825		INIT_INI_ARRAY(&ah->iniModesTxGain,
826		ar9287Modes_tx_gain_9287_1_0,
827		ARRAY_SIZE(ar9287Modes_tx_gain_9287_1_0), 6);
828	} else if (AR_SREV_9280_20(ah)) {
829		ath9k_hw_init_txgain_ini(ah);
830	} else if (AR_SREV_9285_12_OR_LATER(ah)) {
831		u32 txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE);
832
833		/* txgain table */
834		if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER) {
835			if (AR_SREV_9285E_20(ah)) {
836				INIT_INI_ARRAY(&ah->iniModesTxGain,
837				ar9285Modes_XE2_0_high_power,
838				ARRAY_SIZE(
839				  ar9285Modes_XE2_0_high_power), 6);
840			} else {
841				INIT_INI_ARRAY(&ah->iniModesTxGain,
842				ar9285Modes_high_power_tx_gain_9285_1_2,
843				ARRAY_SIZE(
844				  ar9285Modes_high_power_tx_gain_9285_1_2), 6);
845			}
846		} else {
847			if (AR_SREV_9285E_20(ah)) {
848				INIT_INI_ARRAY(&ah->iniModesTxGain,
849				ar9285Modes_XE2_0_normal_power,
850				ARRAY_SIZE(
851				  ar9285Modes_XE2_0_normal_power), 6);
852			} else {
853				INIT_INI_ARRAY(&ah->iniModesTxGain,
854				ar9285Modes_original_tx_gain_9285_1_2,
855				ARRAY_SIZE(
856				  ar9285Modes_original_tx_gain_9285_1_2), 6);
857			}
858		}
859	}
860}
861
862static void ath9k_hw_init_eeprom_fix(struct ath_hw *ah)
863{
864	struct base_eep_header *pBase = &(ah->eeprom.def.baseEepHeader);
865	struct ath_common *common = ath9k_hw_common(ah);
866
867	ah->need_an_top2_fixup = (ah->hw_version.devid == AR9280_DEVID_PCI) &&
868				 (ah->eep_map != EEP_MAP_4KBITS) &&
869				 ((pBase->version & 0xff) > 0x0a) &&
870				 (pBase->pwdclkind == 0);
871
872	if (ah->need_an_top2_fixup)
873		ath_print(common, ATH_DBG_EEPROM,
874			  "needs fixup for AR_AN_TOP2 register\n");
875}
876
877static void ath9k_hw_attach_ops(struct ath_hw *ah)
878{
879	if (AR_SREV_9300_20_OR_LATER(ah))
880		ar9003_hw_attach_ops(ah);
881	else
882		ar9002_hw_attach_ops(ah);
883}
884
885/* Called for all hardware families */
886static int __ath9k_hw_init(struct ath_hw *ah)
887{
888	struct ath_common *common = ath9k_hw_common(ah);
889	int r = 0;
890
891	if (ah->hw_version.devid == AR5416_AR9100_DEVID)
892		ah->hw_version.macVersion = AR_SREV_VERSION_9100;
893
894	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
895		ath_print(common, ATH_DBG_FATAL,
896			  "Couldn't reset chip\n");
897		return -EIO;
898	}
899
900	ath9k_hw_init_defaults(ah);
901	ath9k_hw_init_config(ah);
902
903	ath9k_hw_attach_ops(ah);
904
905	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
906		ath_print(common, ATH_DBG_FATAL, "Couldn't wakeup chip\n");
907		return -EIO;
908	}
909
910	if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
911		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
912		    (AR_SREV_9280(ah) && !ah->is_pciexpress)) {
913			ah->config.serialize_regmode =
914				SER_REG_MODE_ON;
915		} else {
916			ah->config.serialize_regmode =
917				SER_REG_MODE_OFF;
918		}
919	}
920
921	ath_print(common, ATH_DBG_RESET, "serialize_regmode is %d\n",
922		ah->config.serialize_regmode);
923
924	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
925		ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD >> 1;
926	else
927		ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD;
928
929	if (!ath9k_hw_macversion_supported(ah)) {
930		ath_print(common, ATH_DBG_FATAL,
931			  "Mac Chip Rev 0x%02x.%x is not supported by "
932			  "this driver\n", ah->hw_version.macVersion,
933			  ah->hw_version.macRev);
934		return -EOPNOTSUPP;
935	}
936
937	if (AR_SREV_9100(ah)) {
938		ah->iq_caldata.calData = &iq_cal_multi_sample;
939		ah->supp_cals = IQ_MISMATCH_CAL;
940		ah->is_pciexpress = false;
941	}
942
943	if (AR_SREV_9271(ah))
944		ah->is_pciexpress = false;
945
946	ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
947	ath9k_hw_init_cal_settings(ah);
948
949	ah->ani_function = ATH9K_ANI_ALL;
950	if (AR_SREV_9280_10_OR_LATER(ah) && !AR_SREV_9300_20_OR_LATER(ah))
951		ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL;
952
953	ath9k_hw_init_mode_regs(ah);
954
955	if (ah->is_pciexpress)
956		ath9k_hw_configpcipowersave(ah, 0, 0);
957	else
958		ath9k_hw_disablepcie(ah);
959
960	/* Support for Japan ch.14 (2484) spread */
961	if (AR_SREV_9287_11_OR_LATER(ah)) {
962		INIT_INI_ARRAY(&ah->iniCckfirNormal,
963		       ar9287Common_normal_cck_fir_coeff_92871_1,
964		       ARRAY_SIZE(ar9287Common_normal_cck_fir_coeff_92871_1), 2);
965		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
966		       ar9287Common_japan_2484_cck_fir_coeff_92871_1,
967		       ARRAY_SIZE(ar9287Common_japan_2484_cck_fir_coeff_92871_1), 2);
968	}
969
970	r = ath9k_hw_post_init(ah);
971	if (r)
972		return r;
973
974	ath9k_hw_init_mode_gain_regs(ah);
975	r = ath9k_hw_fill_cap_info(ah);
976	if (r)
977		return r;
978
979	ath9k_hw_init_eeprom_fix(ah);
980
981	r = ath9k_hw_init_macaddr(ah);
982	if (r) {
983		ath_print(common, ATH_DBG_FATAL,
984			  "Failed to initialize MAC address\n");
985		return r;
986	}
987
988	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
989		ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
990	else
991		ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
992
993	ath9k_init_nfcal_hist_buffer(ah);
994
995	common->state = ATH_HW_INITIALIZED;
996
997	return 0;
998}
999
1000int ath9k_hw_init(struct ath_hw *ah)
1001{
1002	int ret;
1003	struct ath_common *common = ath9k_hw_common(ah);
1004
1005	/* These are all the AR5008/AR9001/AR9002 hardware family of chipsets */
1006	switch (ah->hw_version.devid) {
1007	case AR5416_DEVID_PCI:
1008	case AR5416_DEVID_PCIE:
1009	case AR5416_AR9100_DEVID:
1010	case AR9160_DEVID_PCI:
1011	case AR9280_DEVID_PCI:
1012	case AR9280_DEVID_PCIE:
1013	case AR9285_DEVID_PCIE:
1014	case AR9287_DEVID_PCI:
1015	case AR9287_DEVID_PCIE:
1016	case AR2427_DEVID_PCIE:
1017	case AR9300_DEVID_PCIE:
1018		break;
1019	default:
1020		if (common->bus_ops->ath_bus_type == ATH_USB)
1021			break;
1022		ath_print(common, ATH_DBG_FATAL,
1023			  "Hardware device ID 0x%04x not supported\n",
1024			  ah->hw_version.devid);
1025		return -EOPNOTSUPP;
1026	}
1027
1028	ret = __ath9k_hw_init(ah);
1029	if (ret) {
1030		ath_print(common, ATH_DBG_FATAL,
1031			  "Unable to initialize hardware; "
1032			  "initialization status: %d\n", ret);
1033		return ret;
1034	}
1035
1036	return 0;
1037}
1038EXPORT_SYMBOL(ath9k_hw_init);
1039
1040static void ath9k_hw_init_qos(struct ath_hw *ah)
1041{
1042	REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa);
1043	REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210);
1044
1045	REG_WRITE(ah, AR_QOS_NO_ACK,
1046		  SM(2, AR_QOS_NO_ACK_TWO_BIT) |
1047		  SM(5, AR_QOS_NO_ACK_BIT_OFF) |
1048		  SM(0, AR_QOS_NO_ACK_BYTE_OFF));
1049
1050	REG_WRITE(ah, AR_TXOP_X, AR_TXOP_X_VAL);
1051	REG_WRITE(ah, AR_TXOP_0_3, 0xFFFFFFFF);
1052	REG_WRITE(ah, AR_TXOP_4_7, 0xFFFFFFFF);
1053	REG_WRITE(ah, AR_TXOP_8_11, 0xFFFFFFFF);
1054	REG_WRITE(ah, AR_TXOP_12_15, 0xFFFFFFFF);
1055}
1056
1057static void ath9k_hw_init_pll(struct ath_hw *ah,
1058			      struct ath9k_channel *chan)
1059{
1060	u32 pll = ath9k_hw_compute_pll_control(ah, chan);
1061
1062	REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
1063
1064	/* Switch the core clock for ar9271 to 117Mhz */
1065	if (AR_SREV_9271(ah)) {
1066		udelay(500);
1067		REG_WRITE(ah, 0x50040, 0x304);
1068	}
1069
1070	udelay(RTC_PLL_SETTLE_DELAY);
1071
1072	REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK);
1073}
1074
1075static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
1076					  enum nl80211_iftype opmode)
1077{
1078	u32 imr_reg = AR_IMR_TXERR |
1079		AR_IMR_TXURN |
1080		AR_IMR_RXERR |
1081		AR_IMR_RXORN |
1082		AR_IMR_BCNMISC;
1083
1084	if (ah->config.rx_intr_mitigation)
1085		imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
1086	else
1087		imr_reg |= AR_IMR_RXOK;
1088
1089	imr_reg |= AR_IMR_TXOK;
1090
1091	if (opmode == NL80211_IFTYPE_AP)
1092		imr_reg |= AR_IMR_MIB;
1093
1094	REG_WRITE(ah, AR_IMR, imr_reg);
1095	ah->imrs2_reg |= AR_IMR_S2_GTT;
1096	REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
1097
1098	if (!AR_SREV_9100(ah)) {
1099		REG_WRITE(ah, AR_INTR_SYNC_CAUSE, 0xFFFFFFFF);
1100		REG_WRITE(ah, AR_INTR_SYNC_ENABLE, AR_INTR_SYNC_DEFAULT);
1101		REG_WRITE(ah, AR_INTR_SYNC_MASK, 0);
1102	}
1103}
1104
1105static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us)
1106{
1107	u32 val = ath9k_hw_mac_to_clks(ah, us);
1108	val = min(val, (u32) 0xFFFF);
1109	REG_WRITE(ah, AR_D_GBL_IFS_SLOT, val);
1110}
1111
1112static void ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us)
1113{
1114	u32 val = ath9k_hw_mac_to_clks(ah, us);
1115	val = min(val, (u32) MS(0xFFFFFFFF, AR_TIME_OUT_ACK));
1116	REG_RMW_FIELD(ah, AR_TIME_OUT, AR_TIME_OUT_ACK, val);
1117}
1118
1119static void ath9k_hw_set_cts_timeout(struct ath_hw *ah, u32 us)
1120{
1121	u32 val = ath9k_hw_mac_to_clks(ah, us);
1122	val = min(val, (u32) MS(0xFFFFFFFF, AR_TIME_OUT_CTS));
1123	REG_RMW_FIELD(ah, AR_TIME_OUT, AR_TIME_OUT_CTS, val);
1124}
1125
1126static bool ath9k_hw_set_global_txtimeout(struct ath_hw *ah, u32 tu)
1127{
1128	if (tu > 0xFFFF) {
1129		ath_print(ath9k_hw_common(ah), ATH_DBG_XMIT,
1130			  "bad global tx timeout %u\n", tu);
1131		ah->globaltxtimeout = (u32) -1;
1132		return false;
1133	} else {
1134		REG_RMW_FIELD(ah, AR_GTXTO, AR_GTXTO_TIMEOUT_LIMIT, tu);
1135		ah->globaltxtimeout = tu;
1136		return true;
1137	}
1138}
1139
1140void ath9k_hw_init_global_settings(struct ath_hw *ah)
1141{
1142	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
1143	int acktimeout;
1144	int slottime;
1145	int sifstime;
1146
1147	ath_print(ath9k_hw_common(ah), ATH_DBG_RESET, "ah->misc_mode 0x%x\n",
1148		  ah->misc_mode);
1149
1150	if (ah->misc_mode != 0)
1151		REG_WRITE(ah, AR_PCU_MISC,
1152			  REG_READ(ah, AR_PCU_MISC) | ah->misc_mode);
1153
1154	if (conf->channel && conf->channel->band == IEEE80211_BAND_5GHZ)
1155		sifstime = 16;
1156	else
1157		sifstime = 10;
1158
1159	/* As defined by IEEE 802.11-2007 17.3.8.6 */
1160	slottime = ah->slottime + 3 * ah->coverage_class;
1161	acktimeout = slottime + sifstime;
1162
1163	/*
1164	 * Workaround for early ACK timeouts, add an offset to match the
1165	 * initval's 64us ack timeout value.
1166	 * This was initially only meant to work around an issue with delayed
1167	 * BA frames in some implementations, but it has been found to fix ACK
1168	 * timeout issues in other cases as well.
1169	 */
1170	if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ)
1171		acktimeout += 64 - sifstime - ah->slottime;
1172
1173	ath9k_hw_setslottime(ah, slottime);
1174	ath9k_hw_set_ack_timeout(ah, acktimeout);
1175	ath9k_hw_set_cts_timeout(ah, acktimeout);
1176	if (ah->globaltxtimeout != (u32) -1)
1177		ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout);
1178}
1179EXPORT_SYMBOL(ath9k_hw_init_global_settings);
1180
1181void ath9k_hw_deinit(struct ath_hw *ah)
1182{
1183	struct ath_common *common = ath9k_hw_common(ah);
1184
1185	if (common->state < ATH_HW_INITIALIZED)
1186		goto free_hw;
1187
1188	if (!AR_SREV_9100(ah))
1189		ath9k_hw_ani_disable(ah);
1190
1191	ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP);
1192
1193free_hw:
1194	ath9k_hw_rf_free_ext_banks(ah);
1195}
1196EXPORT_SYMBOL(ath9k_hw_deinit);
1197
1198/*******/
1199/* INI */
1200/*******/
1201
1202u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)
1203{
1204	u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band);
1205
1206	if (IS_CHAN_B(chan))
1207		ctl |= CTL_11B;
1208	else if (IS_CHAN_G(chan))
1209		ctl |= CTL_11G;
1210	else
1211		ctl |= CTL_11A;
1212
1213	return ctl;
1214}
1215
1216/****************************************/
1217/* Reset and Channel Switching Routines */
1218/****************************************/
1219
1220static inline void ath9k_hw_set_dma(struct ath_hw *ah)
1221{
1222	u32 regval;
1223
1224	/*
1225	 * set AHB_MODE not to do cacheline prefetches
1226	*/
1227	regval = REG_READ(ah, AR_AHB_MODE);
1228	REG_WRITE(ah, AR_AHB_MODE, regval | AR_AHB_PREFETCH_RD_EN);
1229
1230	/*
1231	 * let mac dma reads be in 128 byte chunks
1232	 */
1233	regval = REG_READ(ah, AR_TXCFG) & ~AR_TXCFG_DMASZ_MASK;
1234	REG_WRITE(ah, AR_TXCFG, regval | AR_TXCFG_DMASZ_128B);
1235
1236	/*
1237	 * Restore TX Trigger Level to its pre-reset value.
1238	 * The initial value depends on whether aggregation is enabled, and is
1239	 * adjusted whenever underruns are detected.
1240	 */
1241	REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level);
1242
1243	/*
1244	 * let mac dma writes be in 128 byte chunks
1245	 */
1246	regval = REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_DMASZ_MASK;
1247	REG_WRITE(ah, AR_RXCFG, regval | AR_RXCFG_DMASZ_128B);
1248
1249	/*
1250	 * Setup receive FIFO threshold to hold off TX activities
1251	 */
1252	REG_WRITE(ah, AR_RXFIFO_CFG, 0x200);
1253
1254	/*
1255	 * reduce the number of usable entries in PCU TXBUF to avoid
1256	 * wrap around issues.
1257	 */
1258	if (AR_SREV_9285(ah)) {
1259		/* For AR9285 the number of Fifos are reduced to half.
1260		 * So set the usable tx buf size also to half to
1261		 * avoid data/delimiter underruns
1262		 */
1263		REG_WRITE(ah, AR_PCU_TXBUF_CTRL,
1264			  AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE);
1265	} else if (!AR_SREV_9271(ah)) {
1266		REG_WRITE(ah, AR_PCU_TXBUF_CTRL,
1267			  AR_PCU_TXBUF_CTRL_USABLE_SIZE);
1268	}
1269}
1270
1271static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
1272{
1273	u32 val;
1274
1275	val = REG_READ(ah, AR_STA_ID1);
1276	val &= ~(AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC);
1277	switch (opmode) {
1278	case NL80211_IFTYPE_AP:
1279		REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_STA_AP
1280			  | AR_STA_ID1_KSRCH_MODE);
1281		REG_CLR_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1282		break;
1283	case NL80211_IFTYPE_ADHOC:
1284	case NL80211_IFTYPE_MESH_POINT:
1285		REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_ADHOC
1286			  | AR_STA_ID1_KSRCH_MODE);
1287		REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1288		break;
1289	case NL80211_IFTYPE_STATION:
1290	case NL80211_IFTYPE_MONITOR:
1291		REG_WRITE(ah, AR_STA_ID1, val | AR_STA_ID1_KSRCH_MODE);
1292		break;
1293	}
1294}
1295
1296void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
1297				   u32 *coef_mantissa, u32 *coef_exponent)
1298{
1299	u32 coef_exp, coef_man;
1300
1301	for (coef_exp = 31; coef_exp > 0; coef_exp--)
1302		if ((coef_scaled >> coef_exp) & 0x1)
1303			break;
1304
1305	coef_exp = 14 - (coef_exp - COEF_SCALE_S);
1306
1307	coef_man = coef_scaled + (1 << (COEF_SCALE_S - coef_exp - 1));
1308
1309	*coef_mantissa = coef_man >> (COEF_SCALE_S - coef_exp);
1310	*coef_exponent = coef_exp - 16;
1311}
1312
1313static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
1314{
1315	u32 rst_flags;
1316	u32 tmpReg;
1317
1318	if (AR_SREV_9100(ah)) {
1319		u32 val = REG_READ(ah, AR_RTC_DERIVED_CLK);
1320		val &= ~AR_RTC_DERIVED_CLK_PERIOD;
1321		val |= SM(1, AR_RTC_DERIVED_CLK_PERIOD);
1322		REG_WRITE(ah, AR_RTC_DERIVED_CLK, val);
1323		(void)REG_READ(ah, AR_RTC_DERIVED_CLK);
1324	}
1325
1326	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
1327		  AR_RTC_FORCE_WAKE_ON_INT);
1328
1329	if (AR_SREV_9100(ah)) {
1330		rst_flags = AR_RTC_RC_MAC_WARM | AR_RTC_RC_MAC_COLD |
1331			AR_RTC_RC_COLD_RESET | AR_RTC_RC_WARM_RESET;
1332	} else {
1333		tmpReg = REG_READ(ah, AR_INTR_SYNC_CAUSE);
1334		if (tmpReg &
1335		    (AR_INTR_SYNC_LOCAL_TIMEOUT |
1336		     AR_INTR_SYNC_RADM_CPL_TIMEOUT)) {
1337			u32 val;
1338			REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);
1339
1340			val = AR_RC_HOSTIF;
1341			if (!AR_SREV_9300_20_OR_LATER(ah))
1342				val |= AR_RC_AHB;
1343			REG_WRITE(ah, AR_RC, val);
1344
1345		} else if (!AR_SREV_9300_20_OR_LATER(ah))
1346			REG_WRITE(ah, AR_RC, AR_RC_AHB);
1347
1348		rst_flags = AR_RTC_RC_MAC_WARM;
1349		if (type == ATH9K_RESET_COLD)
1350			rst_flags |= AR_RTC_RC_MAC_COLD;
1351	}
1352
1353	REG_WRITE(ah, AR_RTC_RC, rst_flags);
1354	udelay(50);
1355
1356	REG_WRITE(ah, AR_RTC_RC, 0);
1357	if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
1358		ath_print(ath9k_hw_common(ah), ATH_DBG_RESET,
1359			  "RTC stuck in MAC reset\n");
1360		return false;
1361	}
1362
1363	if (!AR_SREV_9100(ah))
1364		REG_WRITE(ah, AR_RC, 0);
1365
1366	if (AR_SREV_9100(ah))
1367		udelay(50);
1368
1369	return true;
1370}
1371
1372static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
1373{
1374	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
1375		  AR_RTC_FORCE_WAKE_ON_INT);
1376
1377	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
1378		REG_WRITE(ah, AR_RC, AR_RC_AHB);
1379
1380	REG_WRITE(ah, AR_RTC_RESET, 0);
1381	udelay(2);
1382
1383	if (!AR_SREV_9100(ah))
1384		REG_WRITE(ah, AR_RC, 0);
1385
1386	REG_WRITE(ah, AR_RTC_RESET, 1);
1387
1388	if (!ath9k_hw_wait(ah,
1389			   AR_RTC_STATUS,
1390			   AR_RTC_STATUS_M,
1391			   AR_RTC_STATUS_ON,
1392			   AH_WAIT_TIMEOUT)) {
1393		ath_print(ath9k_hw_common(ah), ATH_DBG_RESET,
1394			  "RTC not waking up\n");
1395		return false;
1396	}
1397
1398	ath9k_hw_read_revisions(ah);
1399
1400	return ath9k_hw_set_reset(ah, ATH9K_RESET_WARM);
1401}
1402
1403static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)
1404{
1405	REG_WRITE(ah, AR_RTC_FORCE_WAKE,
1406		  AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);
1407
1408	switch (type) {
1409	case ATH9K_RESET_POWER_ON:
1410		return ath9k_hw_set_reset_power_on(ah);
1411	case ATH9K_RESET_WARM:
1412	case ATH9K_RESET_COLD:
1413		return ath9k_hw_set_reset(ah, type);
1414	default:
1415		return false;
1416	}
1417}
1418
1419static bool ath9k_hw_chip_reset(struct ath_hw *ah,
1420				struct ath9k_channel *chan)
1421{
1422	if (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)) {
1423		if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON))
1424			return false;
1425	} else if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
1426		return false;
1427
1428	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
1429		return false;
1430
1431	ah->chip_fullsleep = false;
1432	ath9k_hw_init_pll(ah, chan);
1433	ath9k_hw_set_rfmode(ah, chan);
1434
1435	return true;
1436}
1437
1438static bool ath9k_hw_channel_change(struct ath_hw *ah,
1439				    struct ath9k_channel *chan)
1440{
1441	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
1442	struct ath_common *common = ath9k_hw_common(ah);
1443	struct ieee80211_channel *channel = chan->chan;
1444	u32 qnum;
1445	int r;
1446
1447	for (qnum = 0; qnum < AR_NUM_QCU; qnum++) {
1448		if (ath9k_hw_numtxpending(ah, qnum)) {
1449			ath_print(common, ATH_DBG_QUEUE,
1450				  "Transmit frames pending on "
1451				  "queue %d\n", qnum);
1452			return false;
1453		}
1454	}
1455
1456	if (!ath9k_hw_rfbus_req(ah)) {
1457		ath_print(common, ATH_DBG_FATAL,
1458			  "Could not kill baseband RX\n");
1459		return false;
1460	}
1461
1462	ath9k_hw_set_channel_regs(ah, chan);
1463
1464	r = ath9k_hw_rf_set_freq(ah, chan);
1465	if (r) {
1466		ath_print(common, ATH_DBG_FATAL,
1467			  "Failed to set channel\n");
1468		return false;
1469	}
1470
1471	ah->eep_ops->set_txpower(ah, chan,
1472			     ath9k_regd_get_ctl(regulatory, chan),
1473			     channel->max_antenna_gain * 2,
1474			     channel->max_power * 2,
1475			     min((u32) MAX_RATE_POWER,
1476			     (u32) regulatory->power_limit));
1477
1478	ath9k_hw_rfbus_done(ah);
1479
1480	if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
1481		ath9k_hw_set_delta_slope(ah, chan);
1482
1483	ath9k_hw_spur_mitigate_freq(ah, chan);
1484
1485	if (!chan->oneTimeCalsDone)
1486		chan->oneTimeCalsDone = true;
1487
1488	return true;
1489}
1490
1491int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1492		    bool bChannelChange)
1493{
1494	struct ath_common *common = ath9k_hw_common(ah);
1495	u32 saveLedState;
1496	struct ath9k_channel *curchan = ah->curchan;
1497	u32 saveDefAntenna;
1498	u32 macStaId1;
1499	u64 tsf = 0;
1500	int i, r;
1501
1502	ah->txchainmask = common->tx_chainmask;
1503	ah->rxchainmask = common->rx_chainmask;
1504
1505	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
1506		return -EIO;
1507
1508	if (curchan && !ah->chip_fullsleep)
1509		ath9k_hw_getnf(ah, curchan);
1510
1511	if (bChannelChange &&
1512	    (ah->chip_fullsleep != true) &&
1513	    (ah->curchan != NULL) &&
1514	    (chan->channel != ah->curchan->channel) &&
1515	    ((chan->channelFlags & CHANNEL_ALL) ==
1516	     (ah->curchan->channelFlags & CHANNEL_ALL)) &&
1517	     !(AR_SREV_9280(ah) || IS_CHAN_A_5MHZ_SPACED(chan) ||
1518	     IS_CHAN_A_5MHZ_SPACED(ah->curchan))) {
1519
1520		if (ath9k_hw_channel_change(ah, chan)) {
1521			ath9k_hw_loadnf(ah, ah->curchan);
1522			ath9k_hw_start_nfcal(ah);
1523			return 0;
1524		}
1525	}
1526
1527	saveDefAntenna = REG_READ(ah, AR_DEF_ANTENNA);
1528	if (saveDefAntenna == 0)
1529		saveDefAntenna = 1;
1530
1531	macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;
1532
1533	/* For chips on which RTC reset is done, save TSF before it gets cleared */
1534	if (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL))
1535		tsf = ath9k_hw_gettsf64(ah);
1536
1537	saveLedState = REG_READ(ah, AR_CFG_LED) &
1538		(AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL |
1539		 AR_CFG_LED_BLINK_THRESH_SEL | AR_CFG_LED_BLINK_SLOW);
1540
1541	ath9k_hw_mark_phy_inactive(ah);
1542
1543	/* Only required on the first reset */
1544	if (AR_SREV_9271(ah) && ah->htc_reset_init) {
1545		REG_WRITE(ah,
1546			  AR9271_RESET_POWER_DOWN_CONTROL,
1547			  AR9271_RADIO_RF_RST);
1548		udelay(50);
1549	}
1550
1551	if (!ath9k_hw_chip_reset(ah, chan)) {
1552		ath_print(common, ATH_DBG_FATAL, "Chip reset failed\n");
1553		return -EINVAL;
1554	}
1555
1556	/* Only required on the first reset */
1557	if (AR_SREV_9271(ah) && ah->htc_reset_init) {
1558		ah->htc_reset_init = false;
1559		REG_WRITE(ah,
1560			  AR9271_RESET_POWER_DOWN_CONTROL,
1561			  AR9271_GATE_MAC_CTL);
1562		udelay(50);
1563	}
1564
1565	/* Restore TSF */
1566	if (tsf && AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL))
1567		ath9k_hw_settsf64(ah, tsf);
1568
1569	if (AR_SREV_9280_10_OR_LATER(ah))
1570		REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
1571
1572	r = ath9k_hw_process_ini(ah, chan);
1573	if (r)
1574		return r;
1575
1576	/* Setup MFP options for CCMP */
1577	if (AR_SREV_9280_20_OR_LATER(ah)) {
1578		/* Mask Retry(b11), PwrMgt(b12), MoreData(b13) to 0 in mgmt
1579		 * frames when constructing CCMP AAD. */
1580		REG_RMW_FIELD(ah, AR_AES_MUTE_MASK1, AR_AES_MUTE_MASK1_FC_MGMT,
1581			      0xc7ff);
1582		ah->sw_mgmt_crypto = false;
1583	} else if (AR_SREV_9160_10_OR_LATER(ah)) {
1584		/* Disable hardware crypto for management frames */
1585		REG_CLR_BIT(ah, AR_PCU_MISC_MODE2,
1586			    AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE);
1587		REG_SET_BIT(ah, AR_PCU_MISC_MODE2,
1588			    AR_PCU_MISC_MODE2_NO_CRYPTO_FOR_NON_DATA_PKT);
1589		ah->sw_mgmt_crypto = true;
1590	} else
1591		ah->sw_mgmt_crypto = true;
1592
1593	if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
1594		ath9k_hw_set_delta_slope(ah, chan);
1595
1596	ath9k_hw_spur_mitigate_freq(ah, chan);
1597	ah->eep_ops->set_board_values(ah, chan);
1598
1599	REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
1600	REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
1601		  | macStaId1
1602		  | AR_STA_ID1_RTS_USE_DEF
1603		  | (ah->config.
1604		     ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
1605		  | ah->sta_id1_defaults);
1606	ath9k_hw_set_operating_mode(ah, ah->opmode);
1607
1608	ath_hw_setbssidmask(common);
1609
1610	REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
1611
1612	ath9k_hw_write_associd(ah);
1613
1614	REG_WRITE(ah, AR_ISR, ~0);
1615
1616	REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);
1617
1618	r = ath9k_hw_rf_set_freq(ah, chan);
1619	if (r)
1620		return r;
1621
1622	for (i = 0; i < AR_NUM_DCU; i++)
1623		REG_WRITE(ah, AR_DQCUMASK(i), 1 << i);
1624
1625	ah->intr_txqs = 0;
1626	for (i = 0; i < ah->caps.total_queues; i++)
1627		ath9k_hw_resettxqueue(ah, i);
1628
1629	ath9k_hw_init_interrupt_masks(ah, ah->opmode);
1630	ath9k_hw_init_qos(ah);
1631
1632	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
1633		ath9k_enable_rfkill(ah);
1634
1635	ath9k_hw_init_global_settings(ah);
1636
1637	if (AR_SREV_9287_12_OR_LATER(ah)) {
1638		REG_WRITE(ah, AR_D_GBL_IFS_SIFS,
1639			  AR_D_GBL_IFS_SIFS_ASYNC_FIFO_DUR);
1640		REG_WRITE(ah, AR_D_GBL_IFS_SLOT,
1641			  AR_D_GBL_IFS_SLOT_ASYNC_FIFO_DUR);
1642		REG_WRITE(ah, AR_D_GBL_IFS_EIFS,
1643			  AR_D_GBL_IFS_EIFS_ASYNC_FIFO_DUR);
1644
1645		REG_WRITE(ah, AR_TIME_OUT, AR_TIME_OUT_ACK_CTS_ASYNC_FIFO_DUR);
1646		REG_WRITE(ah, AR_USEC, AR_USEC_ASYNC_FIFO_DUR);
1647
1648		REG_SET_BIT(ah, AR_MAC_PCU_LOGIC_ANALYZER,
1649			    AR_MAC_PCU_LOGIC_ANALYZER_DISBUG20768);
1650		REG_RMW_FIELD(ah, AR_AHB_MODE, AR_AHB_CUSTOM_BURST_EN,
1651			      AR_AHB_CUSTOM_BURST_ASYNC_FIFO_VAL);
1652	}
1653	if (AR_SREV_9287_12_OR_LATER(ah)) {
1654		REG_SET_BIT(ah, AR_PCU_MISC_MODE2,
1655				AR_PCU_MISC_MODE2_ENABLE_AGGWEP);
1656	}
1657
1658	REG_WRITE(ah, AR_STA_ID1,
1659		  REG_READ(ah, AR_STA_ID1) | AR_STA_ID1_PRESERVE_SEQNUM);
1660
1661	ath9k_hw_set_dma(ah);
1662
1663	REG_WRITE(ah, AR_OBS, 8);
1664
1665	if (ah->config.rx_intr_mitigation) {
1666		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
1667		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000);
1668	}
1669
1670	ath9k_hw_init_bb(ah, chan);
1671
1672	if (!ath9k_hw_init_cal(ah, chan))
1673		return -EIO;
1674
1675	ath9k_hw_restore_chainmask(ah);
1676	REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ);
1677
1678	/*
1679	 * For big endian systems turn on swapping for descriptors
1680	 */
1681	if (AR_SREV_9100(ah)) {
1682		u32 mask;
1683		mask = REG_READ(ah, AR_CFG);
1684		if (mask & (AR_CFG_SWRB | AR_CFG_SWTB | AR_CFG_SWRG)) {
1685			ath_print(common, ATH_DBG_RESET,
1686				"CFG Byte Swap Set 0x%x\n", mask);
1687		} else {
1688			mask =
1689				INIT_CONFIG_STATUS | AR_CFG_SWRB | AR_CFG_SWTB;
1690			REG_WRITE(ah, AR_CFG, mask);
1691			ath_print(common, ATH_DBG_RESET,
1692				"Setting CFG 0x%x\n", REG_READ(ah, AR_CFG));
1693		}
1694	} else {
1695		/* Configure AR9271 target WLAN */
1696                if (AR_SREV_9271(ah))
1697			REG_WRITE(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB);
1698#ifdef __BIG_ENDIAN
1699                else
1700			REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
1701#endif
1702	}
1703
1704	if (ah->btcoex_hw.enabled)
1705		ath9k_hw_btcoex_enable(ah);
1706
1707	return 0;
1708}
1709EXPORT_SYMBOL(ath9k_hw_reset);
1710
1711/************************/
1712/* Key Cache Management */
1713/************************/
1714
1715bool ath9k_hw_keyreset(struct ath_hw *ah, u16 entry)
1716{
1717	u32 keyType;
1718
1719	if (entry >= ah->caps.keycache_size) {
1720		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
1721			  "keychache entry %u out of range\n", entry);
1722		return false;
1723	}
1724
1725	keyType = REG_READ(ah, AR_KEYTABLE_TYPE(entry));
1726
1727	REG_WRITE(ah, AR_KEYTABLE_KEY0(entry), 0);
1728	REG_WRITE(ah, AR_KEYTABLE_KEY1(entry), 0);
1729	REG_WRITE(ah, AR_KEYTABLE_KEY2(entry), 0);
1730	REG_WRITE(ah, AR_KEYTABLE_KEY3(entry), 0);
1731	REG_WRITE(ah, AR_KEYTABLE_KEY4(entry), 0);
1732	REG_WRITE(ah, AR_KEYTABLE_TYPE(entry), AR_KEYTABLE_TYPE_CLR);
1733	REG_WRITE(ah, AR_KEYTABLE_MAC0(entry), 0);
1734	REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), 0);
1735
1736	if (keyType == AR_KEYTABLE_TYPE_TKIP && ATH9K_IS_MIC_ENABLED(ah)) {
1737		u16 micentry = entry + 64;
1738
1739		REG_WRITE(ah, AR_KEYTABLE_KEY0(micentry), 0);
1740		REG_WRITE(ah, AR_KEYTABLE_KEY1(micentry), 0);
1741		REG_WRITE(ah, AR_KEYTABLE_KEY2(micentry), 0);
1742		REG_WRITE(ah, AR_KEYTABLE_KEY3(micentry), 0);
1743
1744	}
1745
1746	return true;
1747}
1748EXPORT_SYMBOL(ath9k_hw_keyreset);
1749
1750bool ath9k_hw_keysetmac(struct ath_hw *ah, u16 entry, const u8 *mac)
1751{
1752	u32 macHi, macLo;
1753
1754	if (entry >= ah->caps.keycache_size) {
1755		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
1756			  "keychache entry %u out of range\n", entry);
1757		return false;
1758	}
1759
1760	if (mac != NULL) {
1761		macHi = (mac[5] << 8) | mac[4];
1762		macLo = (mac[3] << 24) |
1763			(mac[2] << 16) |
1764			(mac[1] << 8) |
1765			mac[0];
1766		macLo >>= 1;
1767		macLo |= (macHi & 1) << 31;
1768		macHi >>= 1;
1769	} else {
1770		macLo = macHi = 0;
1771	}
1772	REG_WRITE(ah, AR_KEYTABLE_MAC0(entry), macLo);
1773	REG_WRITE(ah, AR_KEYTABLE_MAC1(entry), macHi | AR_KEYTABLE_VALID);
1774
1775	return true;
1776}
1777EXPORT_SYMBOL(ath9k_hw_keysetmac);
1778
1779bool ath9k_hw_set_keycache_entry(struct ath_hw *ah, u16 entry,
1780				 const struct ath9k_keyval *k,
1781				 const u8 *mac)
1782{
1783	const struct ath9k_hw_capabilities *pCap = &ah->caps;
1784	struct ath_common *common = ath9k_hw_common(ah);
1785	u32 key0, key1, key2, key3, key4;
1786	u32 keyType;
1787
1788	if (entry >= pCap->keycache_size) {
1789		ath_print(common, ATH_DBG_FATAL,
1790			  "keycache entry %u out of range\n", entry);
1791		return false;
1792	}
1793
1794	switch (k->kv_type) {
1795	case ATH9K_CIPHER_AES_OCB:
1796		keyType = AR_KEYTABLE_TYPE_AES;
1797		break;
1798	case ATH9K_CIPHER_AES_CCM:
1799		if (!(pCap->hw_caps & ATH9K_HW_CAP_CIPHER_AESCCM)) {
1800			ath_print(common, ATH_DBG_ANY,
1801				  "AES-CCM not supported by mac rev 0x%x\n",
1802				  ah->hw_version.macRev);
1803			return false;
1804		}
1805		keyType = AR_KEYTABLE_TYPE_CCM;
1806		break;
1807	case ATH9K_CIPHER_TKIP:
1808		keyType = AR_KEYTABLE_TYPE_TKIP;
1809		if (ATH9K_IS_MIC_ENABLED(ah)
1810		    && entry + 64 >= pCap->keycache_size) {
1811			ath_print(common, ATH_DBG_ANY,
1812				  "entry %u inappropriate for TKIP\n", entry);
1813			return false;
1814		}
1815		break;
1816	case ATH9K_CIPHER_WEP:
1817		if (k->kv_len < WLAN_KEY_LEN_WEP40) {
1818			ath_print(common, ATH_DBG_ANY,
1819				  "WEP key length %u too small\n", k->kv_len);
1820			return false;
1821		}
1822		if (k->kv_len <= WLAN_KEY_LEN_WEP40)
1823			keyType = AR_KEYTABLE_TYPE_40;
1824		else if (k->kv_len <= WLAN_KEY_LEN_WEP104)
1825			keyType = AR_KEYTABLE_TYPE_104;
1826		else
1827			keyType = AR_KEYTABLE_TYPE_128;
1828		break;
1829	case ATH9K_CIPHER_CLR:
1830		keyType = AR_KEYTABLE_TYPE_CLR;
1831		break;
1832	default:
1833		ath_print(common, ATH_DBG_FATAL,
1834			  "cipher %u not supported\n", k->kv_type);
1835		return false;
1836	}
1837
1838	key0 = get_unaligned_le32(k->kv_val + 0);
1839	key1 = get_unaligned_le16(k->kv_val + 4);
1840	key2 = get_unaligned_le32(k->kv_val + 6);
1841	key3 = get_unaligned_le16(k->kv_val + 10);
1842	key4 = get_unaligned_le32(k->kv_val + 12);
1843	if (k->kv_len <= WLAN_KEY_LEN_WEP104)
1844		key4 &= 0xff;
1845
1846	/*
1847	 * Note: Key cache registers access special memory area that requires
1848	 * two 32-bit writes to actually update the values in the internal
1849	 * memory. Consequently, the exact order and pairs used here must be
1850	 * maintained.
1851	 */
1852
1853	if (keyType == AR_KEYTABLE_TYPE_TKIP && ATH9K_IS_MIC_ENABLED(ah)) {
1854		u16 micentry = entry + 64;
1855
1856		/*
1857		 * Write inverted key[47:0] first to avoid Michael MIC errors
1858		 * on frames that could be sent or received at the same time.
1859		 * The correct key will be written in the end once everything
1860		 * else is ready.
1861		 */
1862		REG_WRITE(ah, AR_KEYTABLE_KEY0(entry), ~key0);
1863		REG_WRITE(ah, AR_KEYTABLE_KEY1(entry), ~key1);
1864
1865		/* Write key[95:48] */
1866		REG_WRITE(ah, AR_KEYTABLE_KEY2(entry), key2);
1867		REG_WRITE(ah, AR_KEYTABLE_KEY3(entry), key3);
1868
1869		/* Write key[127:96] and key type */
1870		REG_WRITE(ah, AR_KEYTABLE_KEY4(entry), key4);
1871		REG_WRITE(ah, AR_KEYTABLE_TYPE(entry), keyType);
1872
1873		/* Write MAC address for the entry */
1874		(void) ath9k_hw_keysetmac(ah, entry, mac);
1875
1876		if (ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA) {
1877			/*
1878			 * TKIP uses two key cache entries:
1879			 * Michael MIC TX/RX keys in the same key cache entry
1880			 * (idx = main index + 64):
1881			 * key0 [31:0] = RX key [31:0]
1882			 * key1 [15:0] = TX key [31:16]
1883			 * key1 [31:16] = reserved
1884			 * key2 [31:0] = RX key [63:32]
1885			 * key3 [15:0] = TX key [15:0]
1886			 * key3 [31:16] = reserved
1887			 * key4 [31:0] = TX key [63:32]
1888			 */
1889			u32 mic0, mic1, mic2, mic3, mic4;
1890
1891			mic0 = get_unaligned_le32(k->kv_mic + 0);
1892			mic2 = get_unaligned_le32(k->kv_mic + 4);
1893			mic1 = get_unaligned_le16(k->kv_txmic + 2) & 0xffff;
1894			mic3 = get_unaligned_le16(k->kv_txmic + 0) & 0xffff;
1895			mic4 = get_unaligned_le32(k->kv_txmic + 4);
1896
1897			/* Write RX[31:0] and TX[31:16] */
1898			REG_WRITE(ah, AR_KEYTABLE_KEY0(micentry), mic0);
1899			REG_WRITE(ah, AR_KEYTABLE_KEY1(micentry), mic1);
1900
1901			/* Write RX[63:32] and TX[15:0] */
1902			REG_WRITE(ah, AR_KEYTABLE_KEY2(micentry), mic2);
1903			REG_WRITE(ah, AR_KEYTABLE_KEY3(micentry), mic3);
1904
1905			/* Write TX[63:32] and keyType(reserved) */
1906			REG_WRITE(ah, AR_KEYTABLE_KEY4(micentry), mic4);
1907			REG_WRITE(ah, AR_KEYTABLE_TYPE(micentry),
1908				  AR_KEYTABLE_TYPE_CLR);
1909
1910		} else {
1911			/*
1912			 * TKIP uses four key cache entries (two for group
1913			 * keys):
1914			 * Michael MIC TX/RX keys are in different key cache
1915			 * entries (idx = main index + 64 for TX and
1916			 * main index + 32 + 96 for RX):
1917			 * key0 [31:0] = TX/RX MIC key [31:0]
1918			 * key1 [31:0] = reserved
1919			 * key2 [31:0] = TX/RX MIC key [63:32]
1920			 * key3 [31:0] = reserved
1921			 * key4 [31:0] = reserved
1922			 *
1923			 * Upper layer code will call this function separately
1924			 * for TX and RX keys when these registers offsets are
1925			 * used.
1926			 */
1927			u32 mic0, mic2;
1928
1929			mic0 = get_unaligned_le32(k->kv_mic + 0);
1930			mic2 = get_unaligned_le32(k->kv_mic + 4);
1931
1932			/* Write MIC key[31:0] */
1933			REG_WRITE(ah, AR_KEYTABLE_KEY0(micentry), mic0);
1934			REG_WRITE(ah, AR_KEYTABLE_KEY1(micentry), 0);
1935
1936			/* Write MIC key[63:32] */
1937			REG_WRITE(ah, AR_KEYTABLE_KEY2(micentry), mic2);
1938			REG_WRITE(ah, AR_KEYTABLE_KEY3(micentry), 0);
1939
1940			/* Write TX[63:32] and keyType(reserved) */
1941			REG_WRITE(ah, AR_KEYTABLE_KEY4(micentry), 0);
1942			REG_WRITE(ah, AR_KEYTABLE_TYPE(micentry),
1943				  AR_KEYTABLE_TYPE_CLR);
1944		}
1945
1946		/* MAC address registers are reserved for the MIC entry */
1947		REG_WRITE(ah, AR_KEYTABLE_MAC0(micentry), 0);
1948		REG_WRITE(ah, AR_KEYTABLE_MAC1(micentry), 0);
1949
1950		/*
1951		 * Write the correct (un-inverted) key[47:0] last to enable
1952		 * TKIP now that all other registers are set with correct
1953		 * values.
1954		 */
1955		REG_WRITE(ah, AR_KEYTABLE_KEY0(entry), key0);
1956		REG_WRITE(ah, AR_KEYTABLE_KEY1(entry), key1);
1957	} else {
1958		/* Write key[47:0] */
1959		REG_WRITE(ah, AR_KEYTABLE_KEY0(entry), key0);
1960		REG_WRITE(ah, AR_KEYTABLE_KEY1(entry), key1);
1961
1962		/* Write key[95:48] */
1963		REG_WRITE(ah, AR_KEYTABLE_KEY2(entry), key2);
1964		REG_WRITE(ah, AR_KEYTABLE_KEY3(entry), key3);
1965
1966		/* Write key[127:96] and key type */
1967		REG_WRITE(ah, AR_KEYTABLE_KEY4(entry), key4);
1968		REG_WRITE(ah, AR_KEYTABLE_TYPE(entry), keyType);
1969
1970		/* Write MAC address for the entry */
1971		(void) ath9k_hw_keysetmac(ah, entry, mac);
1972	}
1973
1974	return true;
1975}
1976EXPORT_SYMBOL(ath9k_hw_set_keycache_entry);
1977
1978bool ath9k_hw_keyisvalid(struct ath_hw *ah, u16 entry)
1979{
1980	if (entry < ah->caps.keycache_size) {
1981		u32 val = REG_READ(ah, AR_KEYTABLE_MAC1(entry));
1982		if (val & AR_KEYTABLE_VALID)
1983			return true;
1984	}
1985	return false;
1986}
1987EXPORT_SYMBOL(ath9k_hw_keyisvalid);
1988
1989/******************************/
1990/* Power Management (Chipset) */
1991/******************************/
1992
1993/*
1994 * Notify Power Mgt is disabled in self-generated frames.
1995 * If requested, force chip to sleep.
1996 */
1997static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)
1998{
1999	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2000	if (setChip) {
2001		/*
2002		 * Clear the RTC force wake bit to allow the
2003		 * mac to go to sleep.
2004		 */
2005		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE,
2006			    AR_RTC_FORCE_WAKE_EN);
2007		if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
2008			REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
2009
2010		/* Shutdown chip. Active low */
2011		if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah))
2012			REG_CLR_BIT(ah, (AR_RTC_RESET),
2013				    AR_RTC_RESET_EN);
2014	}
2015}
2016
2017/*
2018 * Notify Power Management is enabled in self-generating
2019 * frames. If request, set power mode of chip to
2020 * auto/normal.  Duration in units of 128us (1/8 TU).
2021 */
2022static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip)
2023{
2024	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2025	if (setChip) {
2026		struct ath9k_hw_capabilities *pCap = &ah->caps;
2027
2028		if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
2029			/* Set WakeOnInterrupt bit; clear ForceWake bit */
2030			REG_WRITE(ah, AR_RTC_FORCE_WAKE,
2031				  AR_RTC_FORCE_WAKE_ON_INT);
2032		} else {
2033			/*
2034			 * Clear the RTC force wake bit to allow the
2035			 * mac to go to sleep.
2036			 */
2037			REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE,
2038				    AR_RTC_FORCE_WAKE_EN);
2039		}
2040	}
2041}
2042
2043static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)
2044{
2045	u32 val;
2046	int i;
2047
2048	if (setChip) {
2049		if ((REG_READ(ah, AR_RTC_STATUS) &
2050		     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) {
2051			if (ath9k_hw_set_reset_reg(ah,
2052					   ATH9K_RESET_POWER_ON) != true) {
2053				return false;
2054			}
2055			if (!AR_SREV_9300_20_OR_LATER(ah))
2056				ath9k_hw_init_pll(ah, NULL);
2057		}
2058		if (AR_SREV_9100(ah))
2059			REG_SET_BIT(ah, AR_RTC_RESET,
2060				    AR_RTC_RESET_EN);
2061
2062		REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
2063			    AR_RTC_FORCE_WAKE_EN);
2064		udelay(50);
2065
2066		for (i = POWER_UP_TIME / 50; i > 0; i--) {
2067			val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M;
2068			if (val == AR_RTC_STATUS_ON)
2069				break;
2070			udelay(50);
2071			REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
2072				    AR_RTC_FORCE_WAKE_EN);
2073		}
2074		if (i == 0) {
2075			ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
2076				  "Failed to wakeup in %uus\n",
2077				  POWER_UP_TIME / 20);
2078			return false;
2079		}
2080	}
2081
2082	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2083
2084	return true;
2085}
2086
2087bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
2088{
2089	struct ath_common *common = ath9k_hw_common(ah);
2090	int status = true, setChip = true;
2091	static const char *modes[] = {
2092		"AWAKE",
2093		"FULL-SLEEP",
2094		"NETWORK SLEEP",
2095		"UNDEFINED"
2096	};
2097
2098	if (ah->power_mode == mode)
2099		return status;
2100
2101	ath_print(common, ATH_DBG_RESET, "%s -> %s\n",
2102		  modes[ah->power_mode], modes[mode]);
2103
2104	switch (mode) {
2105	case ATH9K_PM_AWAKE:
2106		status = ath9k_hw_set_power_awake(ah, setChip);
2107		break;
2108	case ATH9K_PM_FULL_SLEEP:
2109		ath9k_set_power_sleep(ah, setChip);
2110		ah->chip_fullsleep = true;
2111		break;
2112	case ATH9K_PM_NETWORK_SLEEP:
2113		ath9k_set_power_network_sleep(ah, setChip);
2114		break;
2115	default:
2116		ath_print(common, ATH_DBG_FATAL,
2117			  "Unknown power mode %u\n", mode);
2118		return false;
2119	}
2120	ah->power_mode = mode;
2121
2122	return status;
2123}
2124EXPORT_SYMBOL(ath9k_hw_setpower);
2125
2126/*
2127 * Helper for ASPM support.
2128 *
2129 * Disable PLL when in L0s as well as receiver clock when in L1.
2130 * This power saving option must be enabled through the SerDes.
2131 *
2132 * Programming the SerDes must go through the same 288 bit serial shift
2133 * register as the other analog registers.  Hence the 9 writes.
2134 */
2135static void ar9002_hw_configpcipowersave(struct ath_hw *ah,
2136					 int restore,
2137					 int power_off)
2138{
2139	u8 i;
2140	u32 val;
2141
2142	if (ah->is_pciexpress != true)
2143		return;
2144
2145	/* Do not touch SerDes registers */
2146	if (ah->config.pcie_powersave_enable == 2)
2147		return;
2148
2149	/* Nothing to do on restore for 11N */
2150	if (!restore) {
2151		if (AR_SREV_9280_20_OR_LATER(ah)) {
2152			/*
2153			 * AR9280 2.0 or later chips use SerDes values from the
2154			 * initvals.h initialized depending on chipset during
2155			 * __ath9k_hw_init()
2156			 */
2157			for (i = 0; i < ah->iniPcieSerdes.ia_rows; i++) {
2158				REG_WRITE(ah, INI_RA(&ah->iniPcieSerdes, i, 0),
2159					  INI_RA(&ah->iniPcieSerdes, i, 1));
2160			}
2161		} else if (AR_SREV_9280(ah) &&
2162			   (ah->hw_version.macRev == AR_SREV_REVISION_9280_10)) {
2163			REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fd00);
2164			REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
2165
2166			/* RX shut off when elecidle is asserted */
2167			REG_WRITE(ah, AR_PCIE_SERDES, 0xa8000019);
2168			REG_WRITE(ah, AR_PCIE_SERDES, 0x13160820);
2169			REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980560);
2170
2171			/* Shut off CLKREQ active in L1 */
2172			if (ah->config.pcie_clock_req)
2173				REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffc);
2174			else
2175				REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffd);
2176
2177			REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40);
2178			REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554);
2179			REG_WRITE(ah, AR_PCIE_SERDES, 0x00043007);
2180
2181			/* Load the new settings */
2182			REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
2183
2184		} else {
2185			REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00);
2186			REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
2187
2188			/* RX shut off when elecidle is asserted */
2189			REG_WRITE(ah, AR_PCIE_SERDES, 0x28000039);
2190			REG_WRITE(ah, AR_PCIE_SERDES, 0x53160824);
2191			REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980579);
2192
2193			/*
2194			 * Ignore ah->ah_config.pcie_clock_req setting for
2195			 * pre-AR9280 11n
2196			 */
2197			REG_WRITE(ah, AR_PCIE_SERDES, 0x001defff);
2198
2199			REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40);
2200			REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554);
2201			REG_WRITE(ah, AR_PCIE_SERDES, 0x000e3007);
2202
2203			/* Load the new settings */
2204			REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
2205		}
2206
2207		udelay(1000);
2208
2209		/* set bit 19 to allow forcing of pcie core into L1 state */
2210		REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
2211
2212		/* Several PCIe massages to ensure proper behaviour */
2213		if (ah->config.pcie_waen) {
2214			val = ah->config.pcie_waen;
2215			if (!power_off)
2216				val &= (~AR_WA_D3_L1_DISABLE);
2217		} else {
2218			if (AR_SREV_9285(ah) || AR_SREV_9271(ah) ||
2219			    AR_SREV_9287(ah)) {
2220				val = AR9285_WA_DEFAULT;
2221				if (!power_off)
2222					val &= (~AR_WA_D3_L1_DISABLE);
2223			} else if (AR_SREV_9280(ah)) {
2224				/*
2225				 * On AR9280 chips bit 22 of 0x4004 needs to be
2226				 * set otherwise card may disappear.
2227				 */
2228				val = AR9280_WA_DEFAULT;
2229				if (!power_off)
2230					val &= (~AR_WA_D3_L1_DISABLE);
2231			} else
2232				val = AR_WA_DEFAULT;
2233		}
2234
2235		REG_WRITE(ah, AR_WA, val);
2236	}
2237
2238	if (power_off) {
2239		/*
2240		 * Set PCIe workaround bits
2241		 * bit 14 in WA register (disable L1) should only
2242		 * be set when device enters D3 and be cleared
2243		 * when device comes back to D0.
2244		 */
2245		if (ah->config.pcie_waen) {
2246			if (ah->config.pcie_waen & AR_WA_D3_L1_DISABLE)
2247				REG_SET_BIT(ah, AR_WA, AR_WA_D3_L1_DISABLE);
2248		} else {
2249			if (((AR_SREV_9285(ah) || AR_SREV_9271(ah) ||
2250			      AR_SREV_9287(ah)) &&
2251			     (AR9285_WA_DEFAULT & AR_WA_D3_L1_DISABLE)) ||
2252			    (AR_SREV_9280(ah) &&
2253			     (AR9280_WA_DEFAULT & AR_WA_D3_L1_DISABLE))) {
2254				REG_SET_BIT(ah, AR_WA, AR_WA_D3_L1_DISABLE);
2255			}
2256		}
2257	}
2258}
2259
2260/**********************/
2261/* Interrupt Handling */
2262/**********************/
2263
2264bool ath9k_hw_intrpend(struct ath_hw *ah)
2265{
2266	u32 host_isr;
2267
2268	if (AR_SREV_9100(ah))
2269		return true;
2270
2271	host_isr = REG_READ(ah, AR_INTR_ASYNC_CAUSE);
2272	if ((host_isr & AR_INTR_MAC_IRQ) && (host_isr != AR_INTR_SPURIOUS))
2273		return true;
2274
2275	host_isr = REG_READ(ah, AR_INTR_SYNC_CAUSE);
2276	if ((host_isr & AR_INTR_SYNC_DEFAULT)
2277	    && (host_isr != AR_INTR_SPURIOUS))
2278		return true;
2279
2280	return false;
2281}
2282EXPORT_SYMBOL(ath9k_hw_intrpend);
2283
2284bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked)
2285{
2286	u32 isr = 0;
2287	u32 mask2 = 0;
2288	struct ath9k_hw_capabilities *pCap = &ah->caps;
2289	u32 sync_cause = 0;
2290	bool fatal_int = false;
2291	struct ath_common *common = ath9k_hw_common(ah);
2292
2293	if (!AR_SREV_9100(ah)) {
2294		if (REG_READ(ah, AR_INTR_ASYNC_CAUSE) & AR_INTR_MAC_IRQ) {
2295			if ((REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M)
2296			    == AR_RTC_STATUS_ON) {
2297				isr = REG_READ(ah, AR_ISR);
2298			}
2299		}
2300
2301		sync_cause = REG_READ(ah, AR_INTR_SYNC_CAUSE) &
2302			AR_INTR_SYNC_DEFAULT;
2303
2304		*masked = 0;
2305
2306		if (!isr && !sync_cause)
2307			return false;
2308	} else {
2309		*masked = 0;
2310		isr = REG_READ(ah, AR_ISR);
2311	}
2312
2313	if (isr) {
2314		if (isr & AR_ISR_BCNMISC) {
2315			u32 isr2;
2316			isr2 = REG_READ(ah, AR_ISR_S2);
2317			if (isr2 & AR_ISR_S2_TIM)
2318				mask2 |= ATH9K_INT_TIM;
2319			if (isr2 & AR_ISR_S2_DTIM)
2320				mask2 |= ATH9K_INT_DTIM;
2321			if (isr2 & AR_ISR_S2_DTIMSYNC)
2322				mask2 |= ATH9K_INT_DTIMSYNC;
2323			if (isr2 & (AR_ISR_S2_CABEND))
2324				mask2 |= ATH9K_INT_CABEND;
2325			if (isr2 & AR_ISR_S2_GTT)
2326				mask2 |= ATH9K_INT_GTT;
2327			if (isr2 & AR_ISR_S2_CST)
2328				mask2 |= ATH9K_INT_CST;
2329			if (isr2 & AR_ISR_S2_TSFOOR)
2330				mask2 |= ATH9K_INT_TSFOOR;
2331		}
2332
2333		isr = REG_READ(ah, AR_ISR_RAC);
2334		if (isr == 0xffffffff) {
2335			*masked = 0;
2336			return false;
2337		}
2338
2339		*masked = isr & ATH9K_INT_COMMON;
2340
2341		if (ah->config.rx_intr_mitigation) {
2342			if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM))
2343				*masked |= ATH9K_INT_RX;
2344		}
2345
2346		if (isr & (AR_ISR_RXOK | AR_ISR_RXERR))
2347			*masked |= ATH9K_INT_RX;
2348		if (isr &
2349		    (AR_ISR_TXOK | AR_ISR_TXDESC | AR_ISR_TXERR |
2350		     AR_ISR_TXEOL)) {
2351			u32 s0_s, s1_s;
2352
2353			*masked |= ATH9K_INT_TX;
2354
2355			s0_s = REG_READ(ah, AR_ISR_S0_S);
2356			ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK);
2357			ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC);
2358
2359			s1_s = REG_READ(ah, AR_ISR_S1_S);
2360			ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR);
2361			ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL);
2362		}
2363
2364		if (isr & AR_ISR_RXORN) {
2365			ath_print(common, ATH_DBG_INTERRUPT,
2366				  "receive FIFO overrun interrupt\n");
2367		}
2368
2369		if (!AR_SREV_9100(ah)) {
2370			if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
2371				u32 isr5 = REG_READ(ah, AR_ISR_S5_S);
2372				if (isr5 & AR_ISR_S5_TIM_TIMER)
2373					*masked |= ATH9K_INT_TIM_TIMER;
2374			}
2375		}
2376
2377		*masked |= mask2;
2378	}
2379
2380	if (AR_SREV_9100(ah))
2381		return true;
2382
2383	if (isr & AR_ISR_GENTMR) {
2384		u32 s5_s;
2385
2386		s5_s = REG_READ(ah, AR_ISR_S5_S);
2387		if (isr & AR_ISR_GENTMR) {
2388			ah->intr_gen_timer_trigger =
2389				MS(s5_s, AR_ISR_S5_GENTIMER_TRIG);
2390
2391			ah->intr_gen_timer_thresh =
2392				MS(s5_s, AR_ISR_S5_GENTIMER_THRESH);
2393
2394			if (ah->intr_gen_timer_trigger)
2395				*masked |= ATH9K_INT_GENTIMER;
2396
2397		}
2398	}
2399
2400	if (sync_cause) {
2401		fatal_int =
2402			(sync_cause &
2403			 (AR_INTR_SYNC_HOST1_FATAL | AR_INTR_SYNC_HOST1_PERR))
2404			? true : false;
2405
2406		if (fatal_int) {
2407			if (sync_cause & AR_INTR_SYNC_HOST1_FATAL) {
2408				ath_print(common, ATH_DBG_ANY,
2409					  "received PCI FATAL interrupt\n");
2410			}
2411			if (sync_cause & AR_INTR_SYNC_HOST1_PERR) {
2412				ath_print(common, ATH_DBG_ANY,
2413					  "received PCI PERR interrupt\n");
2414			}
2415			*masked |= ATH9K_INT_FATAL;
2416		}
2417		if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT) {
2418			ath_print(common, ATH_DBG_INTERRUPT,
2419				  "AR_INTR_SYNC_RADM_CPL_TIMEOUT\n");
2420			REG_WRITE(ah, AR_RC, AR_RC_HOSTIF);
2421			REG_WRITE(ah, AR_RC, 0);
2422			*masked |= ATH9K_INT_FATAL;
2423		}
2424		if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT) {
2425			ath_print(common, ATH_DBG_INTERRUPT,
2426				  "AR_INTR_SYNC_LOCAL_TIMEOUT\n");
2427		}
2428
2429		REG_WRITE(ah, AR_INTR_SYNC_CAUSE_CLR, sync_cause);
2430		(void) REG_READ(ah, AR_INTR_SYNC_CAUSE_CLR);
2431	}
2432
2433	return true;
2434}
2435EXPORT_SYMBOL(ath9k_hw_getisr);
2436
2437enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints)
2438{
2439	enum ath9k_int omask = ah->imask;
2440	u32 mask, mask2;
2441	struct ath9k_hw_capabilities *pCap = &ah->caps;
2442	struct ath_common *common = ath9k_hw_common(ah);
2443
2444	ath_print(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints);
2445
2446	if (omask & ATH9K_INT_GLOBAL) {
2447		ath_print(common, ATH_DBG_INTERRUPT, "disable IER\n");
2448		REG_WRITE(ah, AR_IER, AR_IER_DISABLE);
2449		(void) REG_READ(ah, AR_IER);
2450		if (!AR_SREV_9100(ah)) {
2451			REG_WRITE(ah, AR_INTR_ASYNC_ENABLE, 0);
2452			(void) REG_READ(ah, AR_INTR_ASYNC_ENABLE);
2453
2454			REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);
2455			(void) REG_READ(ah, AR_INTR_SYNC_ENABLE);
2456		}
2457	}
2458
2459	mask = ints & ATH9K_INT_COMMON;
2460	mask2 = 0;
2461
2462	if (ints & ATH9K_INT_TX) {
2463		if (ah->txok_interrupt_mask)
2464			mask |= AR_IMR_TXOK;
2465		if (ah->txdesc_interrupt_mask)
2466			mask |= AR_IMR_TXDESC;
2467		if (ah->txerr_interrupt_mask)
2468			mask |= AR_IMR_TXERR;
2469		if (ah->txeol_interrupt_mask)
2470			mask |= AR_IMR_TXEOL;
2471	}
2472	if (ints & ATH9K_INT_RX) {
2473		mask |= AR_IMR_RXERR;
2474		if (ah->config.rx_intr_mitigation)
2475			mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM;
2476		else
2477			mask |= AR_IMR_RXOK | AR_IMR_RXDESC;
2478		if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP))
2479			mask |= AR_IMR_GENTMR;
2480	}
2481
2482	if (ints & (ATH9K_INT_BMISC)) {
2483		mask |= AR_IMR_BCNMISC;
2484		if (ints & ATH9K_INT_TIM)
2485			mask2 |= AR_IMR_S2_TIM;
2486		if (ints & ATH9K_INT_DTIM)
2487			mask2 |= AR_IMR_S2_DTIM;
2488		if (ints & ATH9K_INT_DTIMSYNC)
2489			mask2 |= AR_IMR_S2_DTIMSYNC;
2490		if (ints & ATH9K_INT_CABEND)
2491			mask2 |= AR_IMR_S2_CABEND;
2492		if (ints & ATH9K_INT_TSFOOR)
2493			mask2 |= AR_IMR_S2_TSFOOR;
2494	}
2495
2496	if (ints & (ATH9K_INT_GTT | ATH9K_INT_CST)) {
2497		mask |= AR_IMR_BCNMISC;
2498		if (ints & ATH9K_INT_GTT)
2499			mask2 |= AR_IMR_S2_GTT;
2500		if (ints & ATH9K_INT_CST)
2501			mask2 |= AR_IMR_S2_CST;
2502	}
2503
2504	ath_print(common, ATH_DBG_INTERRUPT, "new IMR 0x%x\n", mask);
2505	REG_WRITE(ah, AR_IMR, mask);
2506	ah->imrs2_reg &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC |
2507			   AR_IMR_S2_CABEND | AR_IMR_S2_CABTO |
2508			   AR_IMR_S2_TSFOOR | AR_IMR_S2_GTT | AR_IMR_S2_CST);
2509	ah->imrs2_reg |= mask2;
2510	REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
2511
2512	if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
2513		if (ints & ATH9K_INT_TIM_TIMER)
2514			REG_SET_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
2515		else
2516			REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER);
2517	}
2518
2519	if (ints & ATH9K_INT_GLOBAL) {
2520		ath_print(common, ATH_DBG_INTERRUPT, "enable IER\n");
2521		REG_WRITE(ah, AR_IER, AR_IER_ENABLE);
2522		if (!AR_SREV_9100(ah)) {
2523			REG_WRITE(ah, AR_INTR_ASYNC_ENABLE,
2524				  AR_INTR_MAC_IRQ);
2525			REG_WRITE(ah, AR_INTR_ASYNC_MASK, AR_INTR_MAC_IRQ);
2526
2527
2528			REG_WRITE(ah, AR_INTR_SYNC_ENABLE,
2529				  AR_INTR_SYNC_DEFAULT);
2530			REG_WRITE(ah, AR_INTR_SYNC_MASK,
2531				  AR_INTR_SYNC_DEFAULT);
2532		}
2533		ath_print(common, ATH_DBG_INTERRUPT, "AR_IMR 0x%x IER 0x%x\n",
2534			  REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER));
2535	}
2536
2537	return omask;
2538}
2539EXPORT_SYMBOL(ath9k_hw_set_interrupts);
2540
2541/*******************/
2542/* Beacon Handling */
2543/*******************/
2544
2545void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
2546{
2547	int flags = 0;
2548
2549	ah->beacon_interval = beacon_period;
2550
2551	switch (ah->opmode) {
2552	case NL80211_IFTYPE_STATION:
2553	case NL80211_IFTYPE_MONITOR:
2554		REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(next_beacon));
2555		REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, 0xffff);
2556		REG_WRITE(ah, AR_NEXT_SWBA, 0x7ffff);
2557		flags |= AR_TBTT_TIMER_EN;
2558		break;
2559	case NL80211_IFTYPE_ADHOC:
2560	case NL80211_IFTYPE_MESH_POINT:
2561		REG_SET_BIT(ah, AR_TXCFG,
2562			    AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
2563		REG_WRITE(ah, AR_NEXT_NDP_TIMER,
2564			  TU_TO_USEC(next_beacon +
2565				     (ah->atim_window ? ah->
2566				      atim_window : 1)));
2567		flags |= AR_NDP_TIMER_EN;
2568	case NL80211_IFTYPE_AP:
2569		REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(next_beacon));
2570		REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT,
2571			  TU_TO_USEC(next_beacon -
2572				     ah->config.
2573				     dma_beacon_response_time));
2574		REG_WRITE(ah, AR_NEXT_SWBA,
2575			  TU_TO_USEC(next_beacon -
2576				     ah->config.
2577				     sw_beacon_response_time));
2578		flags |=
2579			AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN;
2580		break;
2581	default:
2582		ath_print(ath9k_hw_common(ah), ATH_DBG_BEACON,
2583			  "%s: unsupported opmode: %d\n",
2584			  __func__, ah->opmode);
2585		return;
2586		break;
2587	}
2588
2589	REG_WRITE(ah, AR_BEACON_PERIOD, TU_TO_USEC(beacon_period));
2590	REG_WRITE(ah, AR_DMA_BEACON_PERIOD, TU_TO_USEC(beacon_period));
2591	REG_WRITE(ah, AR_SWBA_PERIOD, TU_TO_USEC(beacon_period));
2592	REG_WRITE(ah, AR_NDP_PERIOD, TU_TO_USEC(beacon_period));
2593
2594	beacon_period &= ~ATH9K_BEACON_ENA;
2595	if (beacon_period & ATH9K_BEACON_RESET_TSF) {
2596		ath9k_hw_reset_tsf(ah);
2597	}
2598
2599	REG_SET_BIT(ah, AR_TIMER_MODE, flags);
2600}
2601EXPORT_SYMBOL(ath9k_hw_beaconinit);
2602
2603void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
2604				    const struct ath9k_beacon_state *bs)
2605{
2606	u32 nextTbtt, beaconintval, dtimperiod, beacontimeout;
2607	struct ath9k_hw_capabilities *pCap = &ah->caps;
2608	struct ath_common *common = ath9k_hw_common(ah);
2609
2610	REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt));
2611
2612	REG_WRITE(ah, AR_BEACON_PERIOD,
2613		  TU_TO_USEC(bs->bs_intval & ATH9K_BEACON_PERIOD));
2614	REG_WRITE(ah, AR_DMA_BEACON_PERIOD,
2615		  TU_TO_USEC(bs->bs_intval & ATH9K_BEACON_PERIOD));
2616
2617	REG_RMW_FIELD(ah, AR_RSSI_THR,
2618		      AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold);
2619
2620	beaconintval = bs->bs_intval & ATH9K_BEACON_PERIOD;
2621
2622	if (bs->bs_sleepduration > beaconintval)
2623		beaconintval = bs->bs_sleepduration;
2624
2625	dtimperiod = bs->bs_dtimperiod;
2626	if (bs->bs_sleepduration > dtimperiod)
2627		dtimperiod = bs->bs_sleepduration;
2628
2629	if (beaconintval == dtimperiod)
2630		nextTbtt = bs->bs_nextdtim;
2631	else
2632		nextTbtt = bs->bs_nexttbtt;
2633
2634	ath_print(common, ATH_DBG_BEACON, "next DTIM %d\n", bs->bs_nextdtim);
2635	ath_print(common, ATH_DBG_BEACON, "next beacon %d\n", nextTbtt);
2636	ath_print(common, ATH_DBG_BEACON, "beacon period %d\n", beaconintval);
2637	ath_print(common, ATH_DBG_BEACON, "DTIM period %d\n", dtimperiod);
2638
2639	REG_WRITE(ah, AR_NEXT_DTIM,
2640		  TU_TO_USEC(bs->bs_nextdtim - SLEEP_SLOP));
2641	REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP));
2642
2643	REG_WRITE(ah, AR_SLEEP1,
2644		  SM((CAB_TIMEOUT_VAL << 3), AR_SLEEP1_CAB_TIMEOUT)
2645		  | AR_SLEEP1_ASSUME_DTIM);
2646
2647	if (pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)
2648		beacontimeout = (BEACON_TIMEOUT_VAL << 3);
2649	else
2650		beacontimeout = MIN_BEACON_TIMEOUT_VAL;
2651
2652	REG_WRITE(ah, AR_SLEEP2,
2653		  SM(beacontimeout, AR_SLEEP2_BEACON_TIMEOUT));
2654
2655	REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval));
2656	REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod));
2657
2658	REG_SET_BIT(ah, AR_TIMER_MODE,
2659		    AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN |
2660		    AR_DTIM_TIMER_EN);
2661
2662	/* TSF Out of Range Threshold */
2663	REG_WRITE(ah, AR_TSFOOR_THRESHOLD, bs->bs_tsfoor_threshold);
2664}
2665EXPORT_SYMBOL(ath9k_hw_set_sta_beacon_timers);
2666
2667/*******************/
2668/* HW Capabilities */
2669/*******************/
2670
2671int ath9k_hw_fill_cap_info(struct ath_hw *ah)
2672{
2673	struct ath9k_hw_capabilities *pCap = &ah->caps;
2674	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
2675	struct ath_common *common = ath9k_hw_common(ah);
2676	struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
2677
2678	u16 capField = 0, eeval;
2679
2680	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
2681	regulatory->current_rd = eeval;
2682
2683	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_1);
2684	if (AR_SREV_9285_10_OR_LATER(ah))
2685		eeval |= AR9285_RDEXT_DEFAULT;
2686	regulatory->current_rd_ext = eeval;
2687
2688	capField = ah->eep_ops->get_eeprom(ah, EEP_OP_CAP);
2689
2690	if (ah->opmode != NL80211_IFTYPE_AP &&
2691	    ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
2692		if (regulatory->current_rd == 0x64 ||
2693		    regulatory->current_rd == 0x65)
2694			regulatory->current_rd += 5;
2695		else if (regulatory->current_rd == 0x41)
2696			regulatory->current_rd = 0x43;
2697		ath_print(common, ATH_DBG_REGULATORY,
2698			  "regdomain mapped to 0x%x\n", regulatory->current_rd);
2699	}
2700
2701	eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
2702	if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
2703		ath_print(common, ATH_DBG_FATAL,
2704			  "no band has been marked as supported in EEPROM.\n");
2705		return -EINVAL;
2706	}
2707
2708	bitmap_zero(pCap->wireless_modes, ATH9K_MODE_MAX);
2709
2710	if (eeval & AR5416_OPFLAGS_11A) {
2711		set_bit(ATH9K_MODE_11A, pCap->wireless_modes);
2712		if (ah->config.ht_enable) {
2713			if (!(eeval & AR5416_OPFLAGS_N_5G_HT20))
2714				set_bit(ATH9K_MODE_11NA_HT20,
2715					pCap->wireless_modes);
2716			if (!(eeval & AR5416_OPFLAGS_N_5G_HT40)) {
2717				set_bit(ATH9K_MODE_11NA_HT40PLUS,
2718					pCap->wireless_modes);
2719				set_bit(ATH9K_MODE_11NA_HT40MINUS,
2720					pCap->wireless_modes);
2721			}
2722		}
2723	}
2724
2725	if (eeval & AR5416_OPFLAGS_11G) {
2726		set_bit(ATH9K_MODE_11G, pCap->wireless_modes);
2727		if (ah->config.ht_enable) {
2728			if (!(eeval & AR5416_OPFLAGS_N_2G_HT20))
2729				set_bit(ATH9K_MODE_11NG_HT20,
2730					pCap->wireless_modes);
2731			if (!(eeval & AR5416_OPFLAGS_N_2G_HT40)) {
2732				set_bit(ATH9K_MODE_11NG_HT40PLUS,
2733					pCap->wireless_modes);
2734				set_bit(ATH9K_MODE_11NG_HT40MINUS,
2735					pCap->wireless_modes);
2736			}
2737		}
2738	}
2739
2740	pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK);
2741	/*
2742	 * For AR9271 we will temporarilly uses the rx chainmax as read from
2743	 * the EEPROM.
2744	 */
2745	if ((ah->hw_version.devid == AR5416_DEVID_PCI) &&
2746	    !(eeval & AR5416_OPFLAGS_11A) &&
2747	    !(AR_SREV_9271(ah)))
2748		/* CB71: GPIO 0 is pulled down to indicate 3 rx chains */
2749		pCap->rx_chainmask = ath9k_hw_gpio_get(ah, 0) ? 0x5 : 0x7;
2750	else
2751		/* Use rx_chainmask from EEPROM. */
2752		pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK);
2753
2754	if (!(AR_SREV_9280(ah) && (ah->hw_version.macRev == 0)))
2755		ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;
2756
2757	pCap->low_2ghz_chan = 2312;
2758	pCap->high_2ghz_chan = 2732;
2759
2760	pCap->low_5ghz_chan = 4920;
2761	pCap->high_5ghz_chan = 6100;
2762
2763	pCap->hw_caps &= ~ATH9K_HW_CAP_CIPHER_CKIP;
2764	pCap->hw_caps |= ATH9K_HW_CAP_CIPHER_TKIP;
2765	pCap->hw_caps |= ATH9K_HW_CAP_CIPHER_AESCCM;
2766
2767	pCap->hw_caps &= ~ATH9K_HW_CAP_MIC_CKIP;
2768	pCap->hw_caps |= ATH9K_HW_CAP_MIC_TKIP;
2769	pCap->hw_caps |= ATH9K_HW_CAP_MIC_AESCCM;
2770
2771	if (ah->config.ht_enable)
2772		pCap->hw_caps |= ATH9K_HW_CAP_HT;
2773	else
2774		pCap->hw_caps &= ~ATH9K_HW_CAP_HT;
2775
2776	pCap->hw_caps |= ATH9K_HW_CAP_GTT;
2777	pCap->hw_caps |= ATH9K_HW_CAP_VEOL;
2778	pCap->hw_caps |= ATH9K_HW_CAP_BSSIDMASK;
2779	pCap->hw_caps &= ~ATH9K_HW_CAP_MCAST_KEYSEARCH;
2780
2781	if (capField & AR_EEPROM_EEPCAP_MAXQCU)
2782		pCap->total_queues =
2783			MS(capField, AR_EEPROM_EEPCAP_MAXQCU);
2784	else
2785		pCap->total_queues = ATH9K_NUM_TX_QUEUES;
2786
2787	if (capField & AR_EEPROM_EEPCAP_KC_ENTRIES)
2788		pCap->keycache_size =
2789			1 << MS(capField, AR_EEPROM_EEPCAP_KC_ENTRIES);
2790	else
2791		pCap->keycache_size = AR_KEYTABLE_SIZE;
2792
2793	pCap->hw_caps |= ATH9K_HW_CAP_FASTCC;
2794
2795	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
2796		pCap->tx_triglevel_max = MAX_TX_FIFO_THRESHOLD >> 1;
2797	else
2798		pCap->tx_triglevel_max = MAX_TX_FIFO_THRESHOLD;
2799
2800	if (AR_SREV_9271(ah))
2801		pCap->num_gpio_pins = AR9271_NUM_GPIO;
2802	else if (AR_SREV_9285_10_OR_LATER(ah))
2803		pCap->num_gpio_pins = AR9285_NUM_GPIO;
2804	else if (AR_SREV_9280_10_OR_LATER(ah))
2805		pCap->num_gpio_pins = AR928X_NUM_GPIO;
2806	else
2807		pCap->num_gpio_pins = AR_NUM_GPIO;
2808
2809	if (AR_SREV_9160_10_OR_LATER(ah) || AR_SREV_9100(ah)) {
2810		pCap->hw_caps |= ATH9K_HW_CAP_CST;
2811		pCap->rts_aggr_limit = ATH_AMPDU_LIMIT_MAX;
2812	} else {
2813		pCap->rts_aggr_limit = (8 * 1024);
2814	}
2815
2816	pCap->hw_caps |= ATH9K_HW_CAP_ENHANCEDPM;
2817
2818#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
2819	ah->rfsilent = ah->eep_ops->get_eeprom(ah, EEP_RF_SILENT);
2820	if (ah->rfsilent & EEP_RFSILENT_ENABLED) {
2821		ah->rfkill_gpio =
2822			MS(ah->rfsilent, EEP_RFSILENT_GPIO_SEL);
2823		ah->rfkill_polarity =
2824			MS(ah->rfsilent, EEP_RFSILENT_POLARITY);
2825
2826		pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
2827	}
2828#endif
2829	if (AR_SREV_9271(ah))
2830		pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
2831	else
2832		pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
2833
2834	if (AR_SREV_9280(ah) || AR_SREV_9285(ah))
2835		pCap->hw_caps &= ~ATH9K_HW_CAP_4KB_SPLITTRANS;
2836	else
2837		pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
2838
2839	if (regulatory->current_rd_ext & (1 << REG_EXT_JAPAN_MIDBAND)) {
2840		pCap->reg_cap =
2841			AR_EEPROM_EEREGCAP_EN_KK_NEW_11A |
2842			AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN |
2843			AR_EEPROM_EEREGCAP_EN_KK_U2 |
2844			AR_EEPROM_EEREGCAP_EN_KK_MIDBAND;
2845	} else {
2846		pCap->reg_cap =
2847			AR_EEPROM_EEREGCAP_EN_KK_NEW_11A |
2848			AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN;
2849	}
2850
2851	/* Advertise midband for AR5416 with FCC midband set in eeprom */
2852	if (regulatory->current_rd_ext & (1 << REG_EXT_FCC_MIDBAND) &&
2853	    AR_SREV_5416(ah))
2854		pCap->reg_cap |= AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND;
2855
2856	pCap->num_antcfg_5ghz =
2857		ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_5GHZ);
2858	pCap->num_antcfg_2ghz =
2859		ah->eep_ops->get_num_ant_config(ah, ATH9K_HAL_FREQ_BAND_2GHZ);
2860
2861	if (AR_SREV_9280_10_OR_LATER(ah) &&
2862	    ath9k_hw_btcoex_supported(ah)) {
2863		btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO;
2864		btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO;
2865
2866		if (AR_SREV_9285(ah)) {
2867			btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
2868			btcoex_hw->btpriority_gpio = ATH_BTPRIORITY_GPIO;
2869		} else {
2870			btcoex_hw->scheme = ATH_BTCOEX_CFG_2WIRE;
2871		}
2872	} else {
2873		btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE;
2874	}
2875
2876	return 0;
2877}
2878
2879bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type,
2880			    u32 capability, u32 *result)
2881{
2882	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
2883	switch (type) {
2884	case ATH9K_CAP_CIPHER:
2885		switch (capability) {
2886		case ATH9K_CIPHER_AES_CCM:
2887		case ATH9K_CIPHER_AES_OCB:
2888		case ATH9K_CIPHER_TKIP:
2889		case ATH9K_CIPHER_WEP:
2890		case ATH9K_CIPHER_MIC:
2891		case ATH9K_CIPHER_CLR:
2892			return true;
2893		default:
2894			return false;
2895		}
2896	case ATH9K_CAP_TKIP_MIC:
2897		switch (capability) {
2898		case 0:
2899			return true;
2900		case 1:
2901			return (ah->sta_id1_defaults &
2902				AR_STA_ID1_CRPT_MIC_ENABLE) ? true :
2903			false;
2904		}
2905	case ATH9K_CAP_TKIP_SPLIT:
2906		return (ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA) ?
2907			false : true;
2908	case ATH9K_CAP_MCAST_KEYSRCH:
2909		switch (capability) {
2910		case 0:
2911			return true;
2912		case 1:
2913			if (REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_ADHOC) {
2914				return false;
2915			} else {
2916				return (ah->sta_id1_defaults &
2917					AR_STA_ID1_MCAST_KSRCH) ? true :
2918					false;
2919			}
2920		}
2921		return false;
2922	case ATH9K_CAP_TXPOW:
2923		switch (capability) {
2924		case 0:
2925			return 0;
2926		case 1:
2927			*result = regulatory->power_limit;
2928			return 0;
2929		case 2:
2930			*result = regulatory->max_power_level;
2931			return 0;
2932		case 3:
2933			*result = regulatory->tp_scale;
2934			return 0;
2935		}
2936		return false;
2937	case ATH9K_CAP_DS:
2938		return (AR_SREV_9280_20_OR_LATER(ah) &&
2939			(ah->eep_ops->get_eeprom(ah, EEP_RC_CHAIN_MASK) == 1))
2940			? false : true;
2941	default:
2942		return false;
2943	}
2944}
2945EXPORT_SYMBOL(ath9k_hw_getcapability);
2946
2947bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type,
2948			    u32 capability, u32 setting, int *status)
2949{
2950	switch (type) {
2951	case ATH9K_CAP_TKIP_MIC:
2952		if (setting)
2953			ah->sta_id1_defaults |=
2954				AR_STA_ID1_CRPT_MIC_ENABLE;
2955		else
2956			ah->sta_id1_defaults &=
2957				~AR_STA_ID1_CRPT_MIC_ENABLE;
2958		return true;
2959	case ATH9K_CAP_MCAST_KEYSRCH:
2960		if (setting)
2961			ah->sta_id1_defaults |= AR_STA_ID1_MCAST_KSRCH;
2962		else
2963			ah->sta_id1_defaults &= ~AR_STA_ID1_MCAST_KSRCH;
2964		return true;
2965	default:
2966		return false;
2967	}
2968}
2969EXPORT_SYMBOL(ath9k_hw_setcapability);
2970
2971/****************************/
2972/* GPIO / RFKILL / Antennae */
2973/****************************/
2974
2975static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah,
2976					 u32 gpio, u32 type)
2977{
2978	int addr;
2979	u32 gpio_shift, tmp;
2980
2981	if (gpio > 11)
2982		addr = AR_GPIO_OUTPUT_MUX3;
2983	else if (gpio > 5)
2984		addr = AR_GPIO_OUTPUT_MUX2;
2985	else
2986		addr = AR_GPIO_OUTPUT_MUX1;
2987
2988	gpio_shift = (gpio % 6) * 5;
2989
2990	if (AR_SREV_9280_20_OR_LATER(ah)
2991	    || (addr != AR_GPIO_OUTPUT_MUX1)) {
2992		REG_RMW(ah, addr, (type << gpio_shift),
2993			(0x1f << gpio_shift));
2994	} else {
2995		tmp = REG_READ(ah, addr);
2996		tmp = ((tmp & 0x1F0) << 1) | (tmp & ~0x1F0);
2997		tmp &= ~(0x1f << gpio_shift);
2998		tmp |= (type << gpio_shift);
2999		REG_WRITE(ah, addr, tmp);
3000	}
3001}
3002
3003void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio)
3004{
3005	u32 gpio_shift;
3006
3007	BUG_ON(gpio >= ah->caps.num_gpio_pins);
3008
3009	gpio_shift = gpio << 1;
3010
3011	REG_RMW(ah,
3012		AR_GPIO_OE_OUT,
3013		(AR_GPIO_OE_OUT_DRV_NO << gpio_shift),
3014		(AR_GPIO_OE_OUT_DRV << gpio_shift));
3015}
3016EXPORT_SYMBOL(ath9k_hw_cfg_gpio_input);
3017
3018u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)
3019{
3020#define MS_REG_READ(x, y) \
3021	(MS(REG_READ(ah, AR_GPIO_IN_OUT), x##_GPIO_IN_VAL) & (AR_GPIO_BIT(y)))
3022
3023	if (gpio >= ah->caps.num_gpio_pins)
3024		return 0xffffffff;
3025
3026	if (AR_SREV_9300_20_OR_LATER(ah))
3027		return MS_REG_READ(AR9300, gpio) != 0;
3028	else if (AR_SREV_9271(ah))
3029		return MS_REG_READ(AR9271, gpio) != 0;
3030	else if (AR_SREV_9287_10_OR_LATER(ah))
3031		return MS_REG_READ(AR9287, gpio) != 0;
3032	else if (AR_SREV_9285_10_OR_LATER(ah))
3033		return MS_REG_READ(AR9285, gpio) != 0;
3034	else if (AR_SREV_9280_10_OR_LATER(ah))
3035		return MS_REG_READ(AR928X, gpio) != 0;
3036	else
3037		return MS_REG_READ(AR, gpio) != 0;
3038}
3039EXPORT_SYMBOL(ath9k_hw_gpio_get);
3040
3041void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
3042			 u32 ah_signal_type)
3043{
3044	u32 gpio_shift;
3045
3046	ath9k_hw_gpio_cfg_output_mux(ah, gpio, ah_signal_type);
3047
3048	gpio_shift = 2 * gpio;
3049
3050	REG_RMW(ah,
3051		AR_GPIO_OE_OUT,
3052		(AR_GPIO_OE_OUT_DRV_ALL << gpio_shift),
3053		(AR_GPIO_OE_OUT_DRV << gpio_shift));
3054}
3055EXPORT_SYMBOL(ath9k_hw_cfg_output);
3056
3057void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)
3058{
3059	if (AR_SREV_9271(ah))
3060		val = ~val;
3061
3062	REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio),
3063		AR_GPIO_BIT(gpio));
3064}
3065EXPORT_SYMBOL(ath9k_hw_set_gpio);
3066
3067u32 ath9k_hw_getdefantenna(struct ath_hw *ah)
3068{
3069	return REG_READ(ah, AR_DEF_ANTENNA) & 0x7;
3070}
3071EXPORT_SYMBOL(ath9k_hw_getdefantenna);
3072
3073void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna)
3074{
3075	REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7));
3076}
3077EXPORT_SYMBOL(ath9k_hw_setantenna);
3078
3079/*********************/
3080/* General Operation */
3081/*********************/
3082
3083u32 ath9k_hw_getrxfilter(struct ath_hw *ah)
3084{
3085	u32 bits = REG_READ(ah, AR_RX_FILTER);
3086	u32 phybits = REG_READ(ah, AR_PHY_ERR);
3087
3088	if (phybits & AR_PHY_ERR_RADAR)
3089		bits |= ATH9K_RX_FILTER_PHYRADAR;
3090	if (phybits & (AR_PHY_ERR_OFDM_TIMING | AR_PHY_ERR_CCK_TIMING))
3091		bits |= ATH9K_RX_FILTER_PHYERR;
3092
3093	return bits;
3094}
3095EXPORT_SYMBOL(ath9k_hw_getrxfilter);
3096
3097void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
3098{
3099	u32 phybits;
3100
3101	REG_WRITE(ah, AR_RX_FILTER, bits);
3102
3103	phybits = 0;
3104	if (bits & ATH9K_RX_FILTER_PHYRADAR)
3105		phybits |= AR_PHY_ERR_RADAR;
3106	if (bits & ATH9K_RX_FILTER_PHYERR)
3107		phybits |= AR_PHY_ERR_OFDM_TIMING | AR_PHY_ERR_CCK_TIMING;
3108	REG_WRITE(ah, AR_PHY_ERR, phybits);
3109
3110	if (phybits)
3111		REG_WRITE(ah, AR_RXCFG,
3112			  REG_READ(ah, AR_RXCFG) | AR_RXCFG_ZLFDMA);
3113	else
3114		REG_WRITE(ah, AR_RXCFG,
3115			  REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_ZLFDMA);
3116}
3117EXPORT_SYMBOL(ath9k_hw_setrxfilter);
3118
3119bool ath9k_hw_phy_disable(struct ath_hw *ah)
3120{
3121	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
3122		return false;
3123
3124	ath9k_hw_init_pll(ah, NULL);
3125	return true;
3126}
3127EXPORT_SYMBOL(ath9k_hw_phy_disable);
3128
3129bool ath9k_hw_disable(struct ath_hw *ah)
3130{
3131	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
3132		return false;
3133
3134	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_COLD))
3135		return false;
3136
3137	ath9k_hw_init_pll(ah, NULL);
3138	return true;
3139}
3140EXPORT_SYMBOL(ath9k_hw_disable);
3141
3142void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit)
3143{
3144	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
3145	struct ath9k_channel *chan = ah->curchan;
3146	struct ieee80211_channel *channel = chan->chan;
3147
3148	regulatory->power_limit = min(limit, (u32) MAX_RATE_POWER);
3149
3150	ah->eep_ops->set_txpower(ah, chan,
3151				 ath9k_regd_get_ctl(regulatory, chan),
3152				 channel->max_antenna_gain * 2,
3153				 channel->max_power * 2,
3154				 min((u32) MAX_RATE_POWER,
3155				 (u32) regulatory->power_limit));
3156}
3157EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
3158
3159void ath9k_hw_setmac(struct ath_hw *ah, const u8 *mac)
3160{
3161	memcpy(ath9k_hw_common(ah)->macaddr, mac, ETH_ALEN);
3162}
3163EXPORT_SYMBOL(ath9k_hw_setmac);
3164
3165void ath9k_hw_setopmode(struct ath_hw *ah)
3166{
3167	ath9k_hw_set_operating_mode(ah, ah->opmode);
3168}
3169EXPORT_SYMBOL(ath9k_hw_setopmode);
3170
3171void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1)
3172{
3173	REG_WRITE(ah, AR_MCAST_FIL0, filter0);
3174	REG_WRITE(ah, AR_MCAST_FIL1, filter1);
3175}
3176EXPORT_SYMBOL(ath9k_hw_setmcastfilter);
3177
3178void ath9k_hw_write_associd(struct ath_hw *ah)
3179{
3180	struct ath_common *common = ath9k_hw_common(ah);
3181
3182	REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(common->curbssid));
3183	REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(common->curbssid + 4) |
3184		  ((common->curaid & 0x3fff) << AR_BSS_ID1_AID_S));
3185}
3186EXPORT_SYMBOL(ath9k_hw_write_associd);
3187
3188u64 ath9k_hw_gettsf64(struct ath_hw *ah)
3189{
3190	u64 tsf;
3191
3192	tsf = REG_READ(ah, AR_TSF_U32);
3193	tsf = (tsf << 32) | REG_READ(ah, AR_TSF_L32);
3194
3195	return tsf;
3196}
3197EXPORT_SYMBOL(ath9k_hw_gettsf64);
3198
3199void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64)
3200{
3201	REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff);
3202	REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
3203}
3204EXPORT_SYMBOL(ath9k_hw_settsf64);
3205
3206void ath9k_hw_reset_tsf(struct ath_hw *ah)
3207{
3208	if (!ath9k_hw_wait(ah, AR_SLP32_MODE, AR_SLP32_TSF_WRITE_STATUS, 0,
3209			   AH_TSF_WRITE_TIMEOUT))
3210		ath_print(ath9k_hw_common(ah), ATH_DBG_RESET,
3211			  "AR_SLP32_TSF_WRITE_STATUS limit exceeded\n");
3212
3213	REG_WRITE(ah, AR_RESET_TSF, AR_RESET_TSF_ONCE);
3214}
3215EXPORT_SYMBOL(ath9k_hw_reset_tsf);
3216
3217void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)
3218{
3219	if (setting)
3220		ah->misc_mode |= AR_PCU_TX_ADD_TSF;
3221	else
3222		ah->misc_mode &= ~AR_PCU_TX_ADD_TSF;
3223}
3224EXPORT_SYMBOL(ath9k_hw_set_tsfadjust);
3225
3226/*
3227 *  Extend 15-bit time stamp from rx descriptor to
3228 *  a full 64-bit TSF using the current h/w TSF.
3229*/
3230u64 ath9k_hw_extend_tsf(struct ath_hw *ah, u32 rstamp)
3231{
3232	u64 tsf;
3233
3234	tsf = ath9k_hw_gettsf64(ah);
3235	if ((tsf & 0x7fff) < rstamp)
3236		tsf -= 0x8000;
3237	return (tsf & ~0x7fff) | rstamp;
3238}
3239EXPORT_SYMBOL(ath9k_hw_extend_tsf);
3240
3241void ath9k_hw_set11nmac2040(struct ath_hw *ah)
3242{
3243	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
3244	u32 macmode;
3245
3246	if (conf_is_ht40(conf) && !ah->config.cwm_ignore_extcca)
3247		macmode = AR_2040_JOINED_RX_CLEAR;
3248	else
3249		macmode = 0;
3250
3251	REG_WRITE(ah, AR_2040_MODE, macmode);
3252}
3253
3254/* HW Generic timers configuration */
3255
3256static const struct ath_gen_timer_configuration gen_tmr_configuration[] =
3257{
3258	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3259	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3260	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3261	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3262	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3263	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3264	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3265	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
3266	{AR_NEXT_NDP2_TIMER, AR_NDP2_PERIOD, AR_NDP2_TIMER_MODE, 0x0001},
3267	{AR_NEXT_NDP2_TIMER + 1*4, AR_NDP2_PERIOD + 1*4,
3268				AR_NDP2_TIMER_MODE, 0x0002},
3269	{AR_NEXT_NDP2_TIMER + 2*4, AR_NDP2_PERIOD + 2*4,
3270				AR_NDP2_TIMER_MODE, 0x0004},
3271	{AR_NEXT_NDP2_TIMER + 3*4, AR_NDP2_PERIOD + 3*4,
3272				AR_NDP2_TIMER_MODE, 0x0008},
3273	{AR_NEXT_NDP2_TIMER + 4*4, AR_NDP2_PERIOD + 4*4,
3274				AR_NDP2_TIMER_MODE, 0x0010},
3275	{AR_NEXT_NDP2_TIMER + 5*4, AR_NDP2_PERIOD + 5*4,
3276				AR_NDP2_TIMER_MODE, 0x0020},
3277	{AR_NEXT_NDP2_TIMER + 6*4, AR_NDP2_PERIOD + 6*4,
3278				AR_NDP2_TIMER_MODE, 0x0040},
3279	{AR_NEXT_NDP2_TIMER + 7*4, AR_NDP2_PERIOD + 7*4,
3280				AR_NDP2_TIMER_MODE, 0x0080}
3281};
3282
3283/* HW generic timer primitives */
3284
3285/* compute and clear index of rightmost 1 */
3286static u32 rightmost_index(struct ath_gen_timer_table *timer_table, u32 *mask)
3287{
3288	u32 b;
3289
3290	b = *mask;
3291	b &= (0-b);
3292	*mask &= ~b;
3293	b *= debruijn32;
3294	b >>= 27;
3295
3296	return timer_table->gen_timer_index[b];
3297}
3298
3299u32 ath9k_hw_gettsf32(struct ath_hw *ah)
3300{
3301	return REG_READ(ah, AR_TSF_L32);
3302}
3303EXPORT_SYMBOL(ath9k_hw_gettsf32);
3304
3305struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
3306					  void (*trigger)(void *),
3307					  void (*overflow)(void *),
3308					  void *arg,
3309					  u8 timer_index)
3310{
3311	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
3312	struct ath_gen_timer *timer;
3313
3314	timer = kzalloc(sizeof(struct ath_gen_timer), GFP_KERNEL);
3315
3316	if (timer == NULL) {
3317		ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL,
3318			  "Failed to allocate memory"
3319			  "for hw timer[%d]\n", timer_index);
3320		return NULL;
3321	}
3322
3323	/* allocate a hardware generic timer slot */
3324	timer_table->timers[timer_index] = timer;
3325	timer->index = timer_index;
3326	timer->trigger = trigger;
3327	timer->overflow = overflow;
3328	timer->arg = arg;
3329
3330	return timer;
3331}
3332EXPORT_SYMBOL(ath_gen_timer_alloc);
3333
3334void ath9k_hw_gen_timer_start(struct ath_hw *ah,
3335			      struct ath_gen_timer *timer,
3336			      u32 timer_next,
3337			      u32 timer_period)
3338{
3339	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
3340	u32 tsf;
3341
3342	BUG_ON(!timer_period);
3343
3344	set_bit(timer->index, &timer_table->timer_mask.timer_bits);
3345
3346	tsf = ath9k_hw_gettsf32(ah);
3347
3348	ath_print(ath9k_hw_common(ah), ATH_DBG_HWTIMER,
3349		  "curent tsf %x period %x"
3350		  "timer_next %x\n", tsf, timer_period, timer_next);
3351
3352	/*
3353	 * Pull timer_next forward if the current TSF already passed it
3354	 * because of software latency
3355	 */
3356	if (timer_next < tsf)
3357		timer_next = tsf + timer_period;
3358
3359	/*
3360	 * Program generic timer registers
3361	 */
3362	REG_WRITE(ah, gen_tmr_configuration[timer->index].next_addr,
3363		 timer_next);
3364	REG_WRITE(ah, gen_tmr_configuration[timer->index].period_addr,
3365		  timer_period);
3366	REG_SET_BIT(ah, gen_tmr_configuration[timer->index].mode_addr,
3367		    gen_tmr_configuration[timer->index].mode_mask);
3368
3369	/* Enable both trigger and thresh interrupt masks */
3370	REG_SET_BIT(ah, AR_IMR_S5,
3371		(SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) |
3372		SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG)));
3373}
3374EXPORT_SYMBOL(ath9k_hw_gen_timer_start);
3375
3376void ath9k_hw_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
3377{
3378	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
3379
3380	if ((timer->index < AR_FIRST_NDP_TIMER) ||
3381		(timer->index >= ATH_MAX_GEN_TIMER)) {
3382		return;
3383	}
3384
3385	/* Clear generic timer enable bits. */
3386	REG_CLR_BIT(ah, gen_tmr_configuration[timer->index].mode_addr,
3387			gen_tmr_configuration[timer->index].mode_mask);
3388
3389	/* Disable both trigger and thresh interrupt masks */
3390	REG_CLR_BIT(ah, AR_IMR_S5,
3391		(SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) |
3392		SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG)));
3393
3394	clear_bit(timer->index, &timer_table->timer_mask.timer_bits);
3395}
3396EXPORT_SYMBOL(ath9k_hw_gen_timer_stop);
3397
3398void ath_gen_timer_free(struct ath_hw *ah, struct ath_gen_timer *timer)
3399{
3400	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
3401
3402	/* free the hardware generic timer slot */
3403	timer_table->timers[timer->index] = NULL;
3404	kfree(timer);
3405}
3406EXPORT_SYMBOL(ath_gen_timer_free);
3407
3408/*
3409 * Generic Timer Interrupts handling
3410 */
3411void ath_gen_timer_isr(struct ath_hw *ah)
3412{
3413	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
3414	struct ath_gen_timer *timer;
3415	struct ath_common *common = ath9k_hw_common(ah);
3416	u32 trigger_mask, thresh_mask, index;
3417
3418	/* get hardware generic timer interrupt status */
3419	trigger_mask = ah->intr_gen_timer_trigger;
3420	thresh_mask = ah->intr_gen_timer_thresh;
3421	trigger_mask &= timer_table->timer_mask.val;
3422	thresh_mask &= timer_table->timer_mask.val;
3423
3424	trigger_mask &= ~thresh_mask;
3425
3426	while (thresh_mask) {
3427		index = rightmost_index(timer_table, &thresh_mask);
3428		timer = timer_table->timers[index];
3429		BUG_ON(!timer);
3430		ath_print(common, ATH_DBG_HWTIMER,
3431			  "TSF overflow for Gen timer %d\n", index);
3432		timer->overflow(timer->arg);
3433	}
3434
3435	while (trigger_mask) {
3436		index = rightmost_index(timer_table, &trigger_mask);
3437		timer = timer_table->timers[index];
3438		BUG_ON(!timer);
3439		ath_print(common, ATH_DBG_HWTIMER,
3440			  "Gen timer[%d] trigger\n", index);
3441		timer->trigger(timer->arg);
3442	}
3443}
3444EXPORT_SYMBOL(ath_gen_timer_isr);
3445
3446/********/
3447/* HTC  */
3448/********/
3449
3450void ath9k_hw_htc_resetinit(struct ath_hw *ah)
3451{
3452	ah->htc_reset_init = true;
3453}
3454EXPORT_SYMBOL(ath9k_hw_htc_resetinit);
3455
3456static struct {
3457	u32 version;
3458	const char * name;
3459} ath_mac_bb_names[] = {
3460	/* Devices with external radios */
3461	{ AR_SREV_VERSION_5416_PCI,	"5416" },
3462	{ AR_SREV_VERSION_5416_PCIE,	"5418" },
3463	{ AR_SREV_VERSION_9100,		"9100" },
3464	{ AR_SREV_VERSION_9160,		"9160" },
3465	/* Single-chip solutions */
3466	{ AR_SREV_VERSION_9280,		"9280" },
3467	{ AR_SREV_VERSION_9285,		"9285" },
3468	{ AR_SREV_VERSION_9287,         "9287" },
3469	{ AR_SREV_VERSION_9271,         "9271" },
3470};
3471
3472/* For devices with external radios */
3473static struct {
3474	u16 version;
3475	const char * name;
3476} ath_rf_names[] = {
3477	{ 0,				"5133" },
3478	{ AR_RAD5133_SREV_MAJOR,	"5133" },
3479	{ AR_RAD5122_SREV_MAJOR,	"5122" },
3480	{ AR_RAD2133_SREV_MAJOR,	"2133" },
3481	{ AR_RAD2122_SREV_MAJOR,	"2122" }
3482};
3483
3484/*
3485 * Return the MAC/BB name. "????" is returned if the MAC/BB is unknown.
3486 */
3487static const char *ath9k_hw_mac_bb_name(u32 mac_bb_version)
3488{
3489	int i;
3490
3491	for (i=0; i<ARRAY_SIZE(ath_mac_bb_names); i++) {
3492		if (ath_mac_bb_names[i].version == mac_bb_version) {
3493			return ath_mac_bb_names[i].name;
3494		}
3495	}
3496
3497	return "????";
3498}
3499
3500/*
3501 * Return the RF name. "????" is returned if the RF is unknown.
3502 * Used for devices with external radios.
3503 */
3504static const char *ath9k_hw_rf_name(u16 rf_version)
3505{
3506	int i;
3507
3508	for (i=0; i<ARRAY_SIZE(ath_rf_names); i++) {
3509		if (ath_rf_names[i].version == rf_version) {
3510			return ath_rf_names[i].name;
3511		}
3512	}
3513
3514	return "????";
3515}
3516
3517void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len)
3518{
3519	int used;
3520
3521	/* chipsets >= AR9280 are single-chip */
3522	if (AR_SREV_9280_10_OR_LATER(ah)) {
3523		used = snprintf(hw_name, len,
3524			       "Atheros AR%s Rev:%x",
3525			       ath9k_hw_mac_bb_name(ah->hw_version.macVersion),
3526			       ah->hw_version.macRev);
3527	}
3528	else {
3529		used = snprintf(hw_name, len,
3530			       "Atheros AR%s MAC/BB Rev:%x AR%s RF Rev:%x",
3531			       ath9k_hw_mac_bb_name(ah->hw_version.macVersion),
3532			       ah->hw_version.macRev,
3533			       ath9k_hw_rf_name((ah->hw_version.analog5GhzRev &
3534						AR_RADIO_SREV_MAJOR)),
3535			       ah->hw_version.phyRev);
3536	}
3537
3538	hw_name[used] = '\0';
3539}
3540EXPORT_SYMBOL(ath9k_hw_name);
3541
3542/* Sets up the AR5008/AR9001/AR9002 hardware familiy callbacks */
3543static void ar9002_hw_attach_ops(struct ath_hw *ah)
3544{
3545	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
3546	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
3547
3548	priv_ops->init_cal_settings = ar9002_hw_init_cal_settings;
3549	priv_ops->init_mode_regs = ar9002_hw_init_mode_regs;
3550	priv_ops->macversion_supported = ar9002_hw_macversion_supported;
3551
3552	ops->config_pci_powersave = ar9002_hw_configpcipowersave;
3553
3554	ar5008_hw_attach_phy_ops(ah);
3555	if (AR_SREV_9280_10_OR_LATER(ah))
3556		ar9002_hw_attach_phy_ops(ah);
3557}
3558
3559/* Sets up the AR9003 hardware familiy callbacks */
3560static void ar9003_hw_attach_ops(struct ath_hw *ah)
3561{
3562	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
3563
3564	priv_ops->macversion_supported = ar9003_hw_macversion_supported;
3565
3566	ar9003_hw_attach_phy_ops(ah);
3567}
3568