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