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