hw.c 78.5 KB
Newer Older
1
/*
2
 * Copyright (c) 2008-2011 Atheros Communications Inc.
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
 */

#include <linux/io.h>
18
#include <linux/slab.h>
19
#include <linux/module.h>
20
#include <linux/time.h>
21
#include <linux/bitops.h>
22 23
#include <asm/unaligned.h>

24
#include "hw.h"
25
#include "hw-ops.h"
26
#include "ar9003_mac.h"
27
#include "ar9003_mci.h"
28
#include "ar9003_phy.h"
29
#include "ath9k.h"
30

31
static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);
32

33 34 35 36 37
MODULE_AUTHOR("Atheros Communications");
MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards.");
MODULE_SUPPORTED_DEVICE("Atheros 802.11n WLAN cards");
MODULE_LICENSE("Dual BSD/GPL");

38
static void ath9k_hw_set_clockrate(struct ath_hw *ah)
S
Sujith 已提交
39
{
40
	struct ath_common *common = ath9k_hw_common(ah);
41
	struct ath9k_channel *chan = ah->curchan;
42
	unsigned int clockrate;
43

44 45 46
	/* AR9287 v1.3+ uses async FIFO and runs the MAC at 117 MHz */
	if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah))
		clockrate = 117;
47
	else if (!chan) /* should really check for CCK instead */
48
		clockrate = ATH9K_CLOCK_RATE_CCK;
49
	else if (IS_CHAN_2GHZ(chan))
50 51 52
		clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM;
	else if (ah->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)
		clockrate = ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM;
53
	else
54 55
		clockrate = ATH9K_CLOCK_RATE_5GHZ_OFDM;

56 57 58
	if (chan) {
		if (IS_CHAN_HT40(chan))
			clockrate *= 2;
59
		if (IS_CHAN_HALF_RATE(chan))
60
			clockrate /= 2;
61
		if (IS_CHAN_QUARTER_RATE(chan))
62 63 64
			clockrate /= 4;
	}

65
	common->clockrate = clockrate;
S
Sujith 已提交
66 67
}

68
static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
S
Sujith 已提交
69
{
70
	struct ath_common *common = ath9k_hw_common(ah);
71

72
	return usecs * common->clockrate;
S
Sujith 已提交
73
}
74

S
Sujith 已提交
75
bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
76 77 78
{
	int i;

S
Sujith 已提交
79 80 81
	BUG_ON(timeout < AH_TIME_QUANTUM);

	for (i = 0; i < (timeout / AH_TIME_QUANTUM); i++) {
82 83 84 85 86
		if ((REG_READ(ah, reg) & mask) == val)
			return true;

		udelay(AH_TIME_QUANTUM);
	}
S
Sujith 已提交
87

88
	ath_dbg(ath9k_hw_common(ah), ANY,
J
Joe Perches 已提交
89 90
		"timeout (%d us) on reg 0x%x: 0x%08x & 0x%08x != 0x%08x\n",
		timeout, reg, REG_READ(ah, reg), mask, val);
91

S
Sujith 已提交
92
	return false;
93
}
94
EXPORT_SYMBOL(ath9k_hw_wait);
95

96 97 98
void ath9k_hw_synth_delay(struct ath_hw *ah, struct ath9k_channel *chan,
			  int hw_delay)
{
F
Felix Fietkau 已提交
99
	hw_delay /= 10;
100 101 102 103 104 105 106 107 108

	if (IS_CHAN_HALF_RATE(chan))
		hw_delay *= 2;
	else if (IS_CHAN_QUARTER_RATE(chan))
		hw_delay *= 4;

	udelay(hw_delay + BASE_ACTIVATE_DELAY);
}

109
void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
110 111 112 113 114 115 116 117 118 119 120 121 122
			  int column, unsigned int *writecnt)
{
	int r;

	ENABLE_REGWRITE_BUFFER(ah);
	for (r = 0; r < array->ia_rows; r++) {
		REG_WRITE(ah, INI_RA(array, r, 0),
			  INI_RA(array, r, column));
		DO_DELAY(*writecnt);
	}
	REGWRITE_BUFFER_FLUSH(ah);
}

123 124 125 126 127 128 129 130 131 132 133 134
u32 ath9k_hw_reverse_bits(u32 val, u32 n)
{
	u32 retval;
	int i;

	for (i = 0, retval = 0; i < n; i++) {
		retval = (retval << 1) | (val & 1);
		val >>= 1;
	}
	return retval;
}

135
u16 ath9k_hw_computetxtime(struct ath_hw *ah,
136
			   u8 phy, int kbps,
S
Sujith 已提交
137 138
			   u32 frameLen, u16 rateix,
			   bool shortPreamble)
139
{
S
Sujith 已提交
140
	u32 bitsPerSymbol, numBits, numSymbols, phyTime, txTime;
141

S
Sujith 已提交
142 143
	if (kbps == 0)
		return 0;
144

145
	switch (phy) {
S
Sujith 已提交
146
	case WLAN_RC_PHY_CCK:
S
Sujith 已提交
147
		phyTime = CCK_PREAMBLE_BITS + CCK_PLCP_BITS;
148
		if (shortPreamble)
S
Sujith 已提交
149 150 151 152
			phyTime >>= 1;
		numBits = frameLen << 3;
		txTime = CCK_SIFS_TIME + phyTime + ((numBits * 1000) / kbps);
		break;
S
Sujith 已提交
153
	case WLAN_RC_PHY_OFDM:
154
		if (ah->curchan && IS_CHAN_QUARTER_RATE(ah->curchan)) {
S
Sujith 已提交
155 156 157 158 159 160
			bitsPerSymbol =	(kbps * OFDM_SYMBOL_TIME_QUARTER) / 1000;
			numBits = OFDM_PLCP_BITS + (frameLen << 3);
			numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
			txTime = OFDM_SIFS_TIME_QUARTER
				+ OFDM_PREAMBLE_TIME_QUARTER
				+ (numSymbols * OFDM_SYMBOL_TIME_QUARTER);
161 162
		} else if (ah->curchan &&
			   IS_CHAN_HALF_RATE(ah->curchan)) {
S
Sujith 已提交
163 164 165 166 167 168 169 170 171 172 173 174 175 176 177
			bitsPerSymbol =	(kbps * OFDM_SYMBOL_TIME_HALF) / 1000;
			numBits = OFDM_PLCP_BITS + (frameLen << 3);
			numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
			txTime = OFDM_SIFS_TIME_HALF +
				OFDM_PREAMBLE_TIME_HALF
				+ (numSymbols * OFDM_SYMBOL_TIME_HALF);
		} else {
			bitsPerSymbol = (kbps * OFDM_SYMBOL_TIME) / 1000;
			numBits = OFDM_PLCP_BITS + (frameLen << 3);
			numSymbols = DIV_ROUND_UP(numBits, bitsPerSymbol);
			txTime = OFDM_SIFS_TIME + OFDM_PREAMBLE_TIME
				+ (numSymbols * OFDM_SYMBOL_TIME);
		}
		break;
	default:
178 179
		ath_err(ath9k_hw_common(ah),
			"Unknown phy %u (rate ix %u)\n", phy, rateix);
S
Sujith 已提交
180 181 182
		txTime = 0;
		break;
	}
183

S
Sujith 已提交
184 185
	return txTime;
}
186
EXPORT_SYMBOL(ath9k_hw_computetxtime);
187

188
void ath9k_hw_get_channel_centers(struct ath_hw *ah,
S
Sujith 已提交
189 190
				  struct ath9k_channel *chan,
				  struct chan_centers *centers)
191
{
S
Sujith 已提交
192
	int8_t extoff;
193

S
Sujith 已提交
194 195 196 197
	if (!IS_CHAN_HT40(chan)) {
		centers->ctl_center = centers->ext_center =
			centers->synth_center = chan->channel;
		return;
198 199
	}

200
	if (IS_CHAN_HT40PLUS(chan)) {
S
Sujith 已提交
201 202 203 204 205 206 207 208
		centers->synth_center =
			chan->channel + HT40_CHANNEL_CENTER_SHIFT;
		extoff = 1;
	} else {
		centers->synth_center =
			chan->channel - HT40_CHANNEL_CENTER_SHIFT;
		extoff = -1;
	}
209

S
Sujith 已提交
210 211
	centers->ctl_center =
		centers->synth_center - (extoff * HT40_CHANNEL_CENTER_SHIFT);
212
	/* 25 MHz spacing is supported by hw but not on upper layers */
S
Sujith 已提交
213
	centers->ext_center =
214
		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
215 216
}

S
Sujith 已提交
217 218 219 220
/******************/
/* Chip Revisions */
/******************/

221
static void ath9k_hw_read_revisions(struct ath_hw *ah)
222
{
S
Sujith 已提交
223
	u32 val;
224

225 226 227
	if (ah->get_mac_revision)
		ah->hw_version.macRev = ah->get_mac_revision();

228 229 230 231
	switch (ah->hw_version.devid) {
	case AR5416_AR9100_DEVID:
		ah->hw_version.macVersion = AR_SREV_VERSION_9100;
		break;
232 233
	case AR9300_DEVID_AR9330:
		ah->hw_version.macVersion = AR_SREV_VERSION_9330;
234
		if (!ah->get_mac_revision) {
235 236 237 238
			val = REG_READ(ah, AR_SREV);
			ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
		}
		return;
239 240 241
	case AR9300_DEVID_AR9340:
		ah->hw_version.macVersion = AR_SREV_VERSION_9340;
		return;
G
Gabor Juhos 已提交
242 243 244
	case AR9300_DEVID_QCA955X:
		ah->hw_version.macVersion = AR_SREV_VERSION_9550;
		return;
245 246 247
	case AR9300_DEVID_AR953X:
		ah->hw_version.macVersion = AR_SREV_VERSION_9531;
		return;
248 249
	}

S
Sujith 已提交
250
	val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
251

S
Sujith 已提交
252 253
	if (val == 0xFF) {
		val = REG_READ(ah, AR_SREV);
254 255 256
		ah->hw_version.macVersion =
			(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
257

258
		if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
259 260 261 262
			ah->is_pciexpress = true;
		else
			ah->is_pciexpress = (val &
					     AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
S
Sujith 已提交
263 264
	} else {
		if (!AR_SREV_9100(ah))
265
			ah->hw_version.macVersion = MS(val, AR_SREV_VERSION);
266

267
		ah->hw_version.macRev = val & AR_SREV_REVISION;
268

269
		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
270
			ah->is_pciexpress = true;
S
Sujith 已提交
271
	}
272 273
}

S
Sujith 已提交
274 275 276 277
/************************************/
/* HW Attach, Detach, Init Routines */
/************************************/

278
static void ath9k_hw_disablepcie(struct ath_hw *ah)
279
{
280
	if (!AR_SREV_5416(ah))
S
Sujith 已提交
281
		return;
282

S
Sujith 已提交
283 284 285 286 287 288 289 290 291
	REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00);
	REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
	REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029);
	REG_WRITE(ah, AR_PCIE_SERDES, 0x57160824);
	REG_WRITE(ah, AR_PCIE_SERDES, 0x25980579);
	REG_WRITE(ah, AR_PCIE_SERDES, 0x00000000);
	REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40);
	REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554);
	REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007);
292

S
Sujith 已提交
293
	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
294 295
}

296
/* This should work for all families including legacy */
297
static bool ath9k_hw_chip_test(struct ath_hw *ah)
298
{
299
	struct ath_common *common = ath9k_hw_common(ah);
300
	u32 regAddr[2] = { AR_STA_ID0 };
S
Sujith 已提交
301
	u32 regHold[2];
J
Joe Perches 已提交
302 303 304
	static const u32 patternData[4] = {
		0x55555555, 0xaaaaaaaa, 0x66666666, 0x99999999
	};
305
	int i, j, loop_max;
306

307 308 309 310 311 312 313
	if (!AR_SREV_9300_20_OR_LATER(ah)) {
		loop_max = 2;
		regAddr[1] = AR_PHY_BASE + (8 << 2);
	} else
		loop_max = 1;

	for (i = 0; i < loop_max; i++) {
S
Sujith 已提交
314 315
		u32 addr = regAddr[i];
		u32 wrData, rdData;
316

S
Sujith 已提交
317 318 319 320 321 322
		regHold[i] = REG_READ(ah, addr);
		for (j = 0; j < 0x100; j++) {
			wrData = (j << 16) | j;
			REG_WRITE(ah, addr, wrData);
			rdData = REG_READ(ah, addr);
			if (rdData != wrData) {
323 324 325
				ath_err(common,
					"address test failed addr: 0x%08x - wr:0x%08x != rd:0x%08x\n",
					addr, wrData, rdData);
S
Sujith 已提交
326 327 328 329 330 331 332 333
				return false;
			}
		}
		for (j = 0; j < 4; j++) {
			wrData = patternData[j];
			REG_WRITE(ah, addr, wrData);
			rdData = REG_READ(ah, addr);
			if (wrData != rdData) {
334 335 336
				ath_err(common,
					"address test failed addr: 0x%08x - wr:0x%08x != rd:0x%08x\n",
					addr, wrData, rdData);
S
Sujith 已提交
337 338
				return false;
			}
339
		}
S
Sujith 已提交
340
		REG_WRITE(ah, regAddr[i], regHold[i]);
341
	}
S
Sujith 已提交
342
	udelay(100);
343

344 345 346
	return true;
}

347
static void ath9k_hw_init_config(struct ath_hw *ah)
S
Sujith 已提交
348
{
349 350
	struct ath_common *common = ath9k_hw_common(ah);

351 352
	ah->config.dma_beacon_response_time = 1;
	ah->config.sw_beacon_response_time = 6;
353 354
	ah->config.cwm_ignore_extcca = 0;
	ah->config.analog_shiftreg = 1;
355

S
Sujith 已提交
356
	ah->config.rx_intr_mitigation = true;
357

358 359 360 361 362 363 364 365
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		ah->config.rimt_last = 500;
		ah->config.rimt_first = 2000;
	} else {
		ah->config.rimt_last = 250;
		ah->config.rimt_first = 700;
	}

366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382
	/*
	 * We need this for PCI devices only (Cardbus, PCI, miniPCI)
	 * _and_ if on non-uniprocessor systems (Multiprocessor/HT).
	 * This means we use it for all AR5416 devices, and the few
	 * minor PCI AR9280 devices out there.
	 *
	 * Serialization is required because these devices do not handle
	 * well the case of two concurrent reads/writes due to the latency
	 * involved. During one read/write another read/write can be issued
	 * on another CPU while the previous read/write may still be working
	 * on our hardware, if we hit this case the hardware poops in a loop.
	 * We prevent this by serializing reads and writes.
	 *
	 * This issue is not present on PCI-Express devices or pre-AR5416
	 * devices (legacy, 802.11abg).
	 */
	if (num_possible_cpus() > 1)
383
		ah->config.serialize_regmode = SER_REG_MODE_AUTO;
384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401

	if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) &&
		     !ah->is_pciexpress)) {
			ah->config.serialize_regmode = SER_REG_MODE_ON;
		} else {
			ah->config.serialize_regmode = SER_REG_MODE_OFF;
		}
	}

	ath_dbg(common, RESET, "serialize_regmode is %d\n",
		ah->config.serialize_regmode);

	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
		ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD >> 1;
	else
		ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD;
402 403
}

404
static void ath9k_hw_init_defaults(struct ath_hw *ah)
405
{
406 407 408 409 410
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);

	regulatory->country_code = CTRY_DEFAULT;
	regulatory->power_limit = MAX_RATE_POWER;

411 412
	ah->hw_version.magic = AR5416_MAGIC;
	ah->hw_version.subvendorid = 0;
413

414 415
	ah->sta_id1_defaults = AR_STA_ID1_CRPT_MIC_ENABLE |
			       AR_STA_ID1_MCAST_KSRCH;
416 417
	if (AR_SREV_9100(ah))
		ah->sta_id1_defaults |= AR_STA_ID1_AR9100_BA_FIX;
418

419
	ah->slottime = ATH9K_SLOT_TIME_9;
420
	ah->globaltxtimeout = (u32) -1;
421
	ah->power_mode = ATH9K_PM_UNDEFINED;
422
	ah->htc_reset_init = true;
423 424 425 426 427 428 429 430 431

	ah->ani_function = ATH9K_ANI_ALL;
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ah->ani_function &= ~ATH9K_ANI_MRC_CCK;

	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
		ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
	else
		ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
432 433
}

434
static int ath9k_hw_init_macaddr(struct ath_hw *ah)
435
{
436
	struct ath_common *common = ath9k_hw_common(ah);
437 438 439
	u32 sum;
	int i;
	u16 eeval;
J
Joe Perches 已提交
440
	static const u32 EEP_MAC[] = { EEP_MAC_LSW, EEP_MAC_MID, EEP_MAC_MSW };
441 442 443

	sum = 0;
	for (i = 0; i < 3; i++) {
444
		eeval = ah->eep_ops->get_eeprom(ah, EEP_MAC[i]);
445
		sum += eeval;
446 447
		common->macaddr[2 * i] = eeval >> 8;
		common->macaddr[2 * i + 1] = eeval & 0xff;
448
	}
S
Sujith 已提交
449
	if (sum == 0 || sum == 0xffff * 3)
450 451 452 453 454
		return -EADDRNOTAVAIL;

	return 0;
}

455
static int ath9k_hw_post_init(struct ath_hw *ah)
456
{
S
Sujith Manoharan 已提交
457
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
458
	int ecode;
459

S
Sujith Manoharan 已提交
460
	if (common->bus_ops->ath_bus_type != ATH_USB) {
S
Sujith 已提交
461 462 463
		if (!ath9k_hw_chip_test(ah))
			return -ENODEV;
	}
464

465 466 467 468 469
	if (!AR_SREV_9300_20_OR_LATER(ah)) {
		ecode = ar9002_hw_rf_claim(ah);
		if (ecode != 0)
			return ecode;
	}
470

471
	ecode = ath9k_hw_eeprom_init(ah);
S
Sujith 已提交
472 473
	if (ecode != 0)
		return ecode;
474

475
	ath_dbg(ath9k_hw_common(ah), CONFIG, "Eeprom VER: %d, REV: %d\n",
J
Joe Perches 已提交
476 477
		ah->eep_ops->get_eeprom_ver(ah),
		ah->eep_ops->get_eeprom_rev(ah));
478

479
	ath9k_hw_ani_init(ah);
480

481 482 483 484
	/*
	 * EEPROM needs to be initialized before we do this.
	 * This is required for regulatory compliance.
	 */
485
	if (AR_SREV_9300_20_OR_LATER(ah)) {
486 487
		u16 regdmn = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
		if ((regdmn & 0xF0) == CTL_FCC) {
488 489
			ah->nf_2g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_2GHZ;
			ah->nf_5g.max = AR_PHY_CCA_MAX_GOOD_VAL_9300_FCC_5GHZ;
490 491 492
		}
	}

493 494 495
	return 0;
}

496
static int ath9k_hw_attach_ops(struct ath_hw *ah)
497
{
498 499 500 501 502
	if (!AR_SREV_9300_20_OR_LATER(ah))
		return ar9002_hw_attach_ops(ah);

	ar9003_hw_attach_ops(ah);
	return 0;
503 504
}

505 506
/* Called for all hardware families */
static int __ath9k_hw_init(struct ath_hw *ah)
507
{
508
	struct ath_common *common = ath9k_hw_common(ah);
509
	int r = 0;
510

511 512
	ath9k_hw_read_revisions(ah);

513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528
	switch (ah->hw_version.macVersion) {
	case AR_SREV_VERSION_5416_PCI:
	case AR_SREV_VERSION_5416_PCIE:
	case AR_SREV_VERSION_9160:
	case AR_SREV_VERSION_9100:
	case AR_SREV_VERSION_9280:
	case AR_SREV_VERSION_9285:
	case AR_SREV_VERSION_9287:
	case AR_SREV_VERSION_9271:
	case AR_SREV_VERSION_9300:
	case AR_SREV_VERSION_9330:
	case AR_SREV_VERSION_9485:
	case AR_SREV_VERSION_9340:
	case AR_SREV_VERSION_9462:
	case AR_SREV_VERSION_9550:
	case AR_SREV_VERSION_9565:
529
	case AR_SREV_VERSION_9531:
530 531 532 533 534 535 536 537
		break;
	default:
		ath_err(common,
			"Mac Chip Rev 0x%02x.%x is not supported by this driver\n",
			ah->hw_version.macVersion, ah->hw_version.macRev);
		return -EOPNOTSUPP;
	}

538 539 540 541 542
	/*
	 * Read back AR_WA into a permanent copy and set bits 14 and 17.
	 * We need to do this to avoid RMW of this register. We cannot
	 * read the reg when chip is asleep.
	 */
543 544 545 546 547
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		ah->WARegVal = REG_READ(ah, AR_WA);
		ah->WARegVal |= (AR_WA_D3_L1_DISABLE |
				 AR_WA_ASPM_TIMER_BASED_DISABLE);
	}
548

549
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
550
		ath_err(common, "Couldn't reset chip\n");
551
		return -EIO;
552 553
	}

554 555 556 557 558
	if (AR_SREV_9565(ah)) {
		ah->WARegVal |= AR_WA_BIT22;
		REG_WRITE(ah, AR_WA, ah->WARegVal);
	}

559 560 561
	ath9k_hw_init_defaults(ah);
	ath9k_hw_init_config(ah);

562 563 564
	r = ath9k_hw_attach_ops(ah);
	if (r)
		return r;
565

566
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
567
		ath_err(common, "Couldn't wakeup chip\n");
568
		return -EIO;
569 570
	}

571
	if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) ||
572
	    AR_SREV_9330(ah) || AR_SREV_9550(ah))
573 574
		ah->is_pciexpress = false;

575 576 577
	ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
	ath9k_hw_init_cal_settings(ah);

578
	if (!ah->is_pciexpress)
579 580
		ath9k_hw_disablepcie(ah);

581
	r = ath9k_hw_post_init(ah);
582
	if (r)
583
		return r;
584 585

	ath9k_hw_init_mode_gain_regs(ah);
586 587 588 589
	r = ath9k_hw_fill_cap_info(ah);
	if (r)
		return r;

590 591
	r = ath9k_hw_init_macaddr(ah);
	if (r) {
592
		ath_err(common, "Failed to initialize MAC address\n");
593
		return r;
594 595
	}

596
	ath9k_hw_init_hang_checks(ah);
597

598 599
	common->state = ATH_HW_INITIALIZED;

600
	return 0;
601 602
}

603
int ath9k_hw_init(struct ath_hw *ah)
604
{
605 606
	int ret;
	struct ath_common *common = ath9k_hw_common(ah);
607

608
	/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
609 610 611 612 613 614 615 616
	switch (ah->hw_version.devid) {
	case AR5416_DEVID_PCI:
	case AR5416_DEVID_PCIE:
	case AR5416_AR9100_DEVID:
	case AR9160_DEVID_PCI:
	case AR9280_DEVID_PCI:
	case AR9280_DEVID_PCIE:
	case AR9285_DEVID_PCIE:
617 618
	case AR9287_DEVID_PCI:
	case AR9287_DEVID_PCIE:
619
	case AR2427_DEVID_PCIE:
620
	case AR9300_DEVID_PCIE:
621
	case AR9300_DEVID_AR9485_PCIE:
G
Gabor Juhos 已提交
622
	case AR9300_DEVID_AR9330:
623
	case AR9300_DEVID_AR9340:
G
Gabor Juhos 已提交
624
	case AR9300_DEVID_QCA955X:
L
Luis R. Rodriguez 已提交
625
	case AR9300_DEVID_AR9580:
626
	case AR9300_DEVID_AR9462:
627
	case AR9485_DEVID_AR1111:
628
	case AR9300_DEVID_AR9565:
629
	case AR9300_DEVID_AR953X:
630 631 632 633
		break;
	default:
		if (common->bus_ops->ath_bus_type == ATH_USB)
			break;
634 635
		ath_err(common, "Hardware device ID 0x%04x not supported\n",
			ah->hw_version.devid);
636 637
		return -EOPNOTSUPP;
	}
638

639 640
	ret = __ath9k_hw_init(ah);
	if (ret) {
641 642 643
		ath_err(common,
			"Unable to initialize hardware; initialization status: %d\n",
			ret);
644 645
		return ret;
	}
646

647 648
	ath_dynack_init(ah);

649
	return 0;
650
}
651
EXPORT_SYMBOL(ath9k_hw_init);
652

653
static void ath9k_hw_init_qos(struct ath_hw *ah)
654
{
S
Sujith 已提交
655 656
	ENABLE_REGWRITE_BUFFER(ah);

S
Sujith 已提交
657 658
	REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa);
	REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210);
659

S
Sujith 已提交
660 661 662 663 664 665 666 667 668 669
	REG_WRITE(ah, AR_QOS_NO_ACK,
		  SM(2, AR_QOS_NO_ACK_TWO_BIT) |
		  SM(5, AR_QOS_NO_ACK_BIT_OFF) |
		  SM(0, AR_QOS_NO_ACK_BYTE_OFF));

	REG_WRITE(ah, AR_TXOP_X, AR_TXOP_X_VAL);
	REG_WRITE(ah, AR_TXOP_0_3, 0xFFFFFFFF);
	REG_WRITE(ah, AR_TXOP_4_7, 0xFFFFFFFF);
	REG_WRITE(ah, AR_TXOP_8_11, 0xFFFFFFFF);
	REG_WRITE(ah, AR_TXOP_12_15, 0xFFFFFFFF);
S
Sujith 已提交
670 671

	REGWRITE_BUFFER_FLUSH(ah);
672 673
}

674
u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)
675
{
676 677 678
	struct ath_common *common = ath9k_hw_common(ah);
	int i = 0;

679 680 681
	REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
	udelay(100);
	REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
682

683 684
	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) {

685
		udelay(100);
686

687 688 689 690 691 692 693 694
		if (WARN_ON_ONCE(i >= 100)) {
			ath_err(common, "PLL4 meaurement not done\n");
			break;
		}

		i++;
	}

695
	return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;
696 697 698
}
EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc);

699
static void ath9k_hw_init_pll(struct ath_hw *ah,
S
Sujith 已提交
700
			      struct ath9k_channel *chan)
701
{
702 703
	u32 pll;

704 705
	pll = ath9k_hw_compute_pll_control(ah, chan);

706
	if (AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
707 708 709 710 711 712 713
		/* program BB PLL ki and kd value, ki=0x4, kd=0x40 */
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_PLL_PWD, 0x1);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_DPLL2_KD, 0x40);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_DPLL2_KI, 0x4);
714

715 716 717 718 719 720
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL1,
			      AR_CH0_BB_DPLL1_REFDIV, 0x5);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL1,
			      AR_CH0_BB_DPLL1_NINI, 0x58);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL1,
			      AR_CH0_BB_DPLL1_NFRAC, 0x0);
721 722

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
723 724 725
			      AR_CH0_BB_DPLL2_OUTDIV, 0x1);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_LOCAL_PLL, 0x1);
726
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
727
			      AR_CH0_BB_DPLL2_EN_NEGTRIG, 0x1);
728

729
		/* program BB PLL phase_shift to 0x6 */
730
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
731 732 733 734
			      AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x6);

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_PLL_PWD, 0x0);
735
		udelay(1000);
736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755
	} else if (AR_SREV_9330(ah)) {
		u32 ddr_dpll2, pll_control2, kd;

		if (ah->is_clk_25mhz) {
			ddr_dpll2 = 0x18e82f01;
			pll_control2 = 0xe04a3d;
			kd = 0x1d;
		} else {
			ddr_dpll2 = 0x19e82f01;
			pll_control2 = 0x886666;
			kd = 0x3d;
		}

		/* program DDR PLL ki and kd value */
		REG_WRITE(ah, AR_CH0_DDR_DPLL2, ddr_dpll2);

		/* program DDR PLL phase_shift */
		REG_RMW_FIELD(ah, AR_CH0_DDR_DPLL3,
			      AR_CH0_DPLL3_PHASE_SHIFT, 0x1);

756 757
		REG_WRITE(ah, AR_RTC_PLL_CONTROL,
			  pll | AR_RTC_9300_PLL_BYPASS);
758 759 760 761 762 763 764 765 766 767 768 769
		udelay(1000);

		/* program refdiv, nint, frac to RTC register */
		REG_WRITE(ah, AR_RTC_PLL_CONTROL2, pll_control2);

		/* program BB PLL kd and ki value */
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2, AR_CH0_DPLL2_KD, kd);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2, AR_CH0_DPLL2_KI, 0x06);

		/* program BB PLL phase_shift */
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
			      AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x1);
770
	} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah)) {
771 772
		u32 regval, pll2_divint, pll2_divfrac, refdiv;

773 774
		REG_WRITE(ah, AR_RTC_PLL_CONTROL,
			  pll | AR_RTC_9300_SOC_PLL_BYPASS);
775 776 777 778 779 780
		udelay(1000);

		REG_SET_BIT(ah, AR_PHY_PLL_MODE, 0x1 << 16);
		udelay(100);

		if (ah->is_clk_25mhz) {
781 782 783 784 785 786 787 788 789
			if (AR_SREV_9531(ah)) {
				pll2_divint = 0x1c;
				pll2_divfrac = 0xa3d2;
				refdiv = 1;
			} else {
				pll2_divint = 0x54;
				pll2_divfrac = 0x1eb85;
				refdiv = 3;
			}
790
		} else {
791 792 793 794 795 796
			if (AR_SREV_9340(ah)) {
				pll2_divint = 88;
				pll2_divfrac = 0;
				refdiv = 5;
			} else {
				pll2_divint = 0x11;
797 798
				pll2_divfrac =
					AR_SREV_9531(ah) ? 0x26665 : 0x26666;
799 800
				refdiv = 1;
			}
801 802 803
		}

		regval = REG_READ(ah, AR_PHY_PLL_MODE);
804 805 806 807
		if (AR_SREV_9531(ah))
			regval |= (0x1 << 22);
		else
			regval |= (0x1 << 16);
808 809 810 811 812 813 814 815
		REG_WRITE(ah, AR_PHY_PLL_MODE, regval);
		udelay(100);

		REG_WRITE(ah, AR_PHY_PLL_CONTROL, (refdiv << 27) |
			  (pll2_divint << 18) | pll2_divfrac);
		udelay(100);

		regval = REG_READ(ah, AR_PHY_PLL_MODE);
816
		if (AR_SREV_9340(ah))
817 818 819 820 821 822 823 824 825 826 827 828
			regval = (regval & 0x80071fff) |
				(0x1 << 30) |
				(0x1 << 13) |
				(0x4 << 26) |
				(0x18 << 19);
		else if (AR_SREV_9531(ah))
			regval = (regval & 0x01c00fff) |
				(0x1 << 31) |
				(0x2 << 29) |
				(0xa << 25) |
				(0x1 << 19) |
				(0x6 << 12);
829
		else
830 831 832 833 834
			regval = (regval & 0x80071fff) |
				(0x3 << 30) |
				(0x1 << 13) |
				(0x4 << 26) |
				(0x60 << 19);
835
		REG_WRITE(ah, AR_PHY_PLL_MODE, regval);
836 837 838 839 840 841 842 843

		if (AR_SREV_9531(ah))
			REG_WRITE(ah, AR_PHY_PLL_MODE,
				  REG_READ(ah, AR_PHY_PLL_MODE) & 0xffbfffff);
		else
			REG_WRITE(ah, AR_PHY_PLL_MODE,
				  REG_READ(ah, AR_PHY_PLL_MODE) & 0xfffeffff);

844
		udelay(1000);
845
	}
846

847 848
	if (AR_SREV_9565(ah))
		pll |= 0x40000;
849
	REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
850

851 852
	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah) ||
	    AR_SREV_9550(ah))
853 854
		udelay(1000);

855 856
	/* Switch the core clock for ar9271 to 117Mhz */
	if (AR_SREV_9271(ah)) {
857 858
		udelay(500);
		REG_WRITE(ah, 0x50040, 0x304);
859 860
	}

S
Sujith 已提交
861 862 863
	udelay(RTC_PLL_SETTLE_DELAY);

	REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK);
864

865
	if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {
866 867 868 869 870 871 872 873 874 875 876
		if (ah->is_clk_25mhz) {
			REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x17c << 1);
			REG_WRITE(ah, AR_SLP32_MODE, 0x0010f3d7);
			REG_WRITE(ah,  AR_SLP32_INC, 0x0001e7ae);
		} else {
			REG_WRITE(ah, AR_RTC_DERIVED_CLK, 0x261 << 1);
			REG_WRITE(ah, AR_SLP32_MODE, 0x0010f400);
			REG_WRITE(ah,  AR_SLP32_INC, 0x0001e800);
		}
		udelay(100);
	}
877 878
}

879
static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
880
					  enum nl80211_iftype opmode)
881
{
882
	u32 sync_default = AR_INTR_SYNC_DEFAULT;
883
	u32 imr_reg = AR_IMR_TXERR |
S
Sujith 已提交
884 885 886 887
		AR_IMR_TXURN |
		AR_IMR_RXERR |
		AR_IMR_RXORN |
		AR_IMR_BCNMISC;
888

889
	if (AR_SREV_9340(ah) || AR_SREV_9550(ah) || AR_SREV_9531(ah))
890 891
		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;

892 893 894 895 896 897
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		imr_reg |= AR_IMR_RXOK_HP;
		if (ah->config.rx_intr_mitigation)
			imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
		else
			imr_reg |= AR_IMR_RXOK_LP;
898

899 900 901 902 903 904
	} else {
		if (ah->config.rx_intr_mitigation)
			imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
		else
			imr_reg |= AR_IMR_RXOK;
	}
905

906 907 908 909
	if (ah->config.tx_intr_mitigation)
		imr_reg |= AR_IMR_TXINTM | AR_IMR_TXMINTR;
	else
		imr_reg |= AR_IMR_TXOK;
910

S
Sujith 已提交
911 912
	ENABLE_REGWRITE_BUFFER(ah);

913
	REG_WRITE(ah, AR_IMR, imr_reg);
914 915
	ah->imrs2_reg |= AR_IMR_S2_GTT;
	REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
916

S
Sujith 已提交
917 918
	if (!AR_SREV_9100(ah)) {
		REG_WRITE(ah, AR_INTR_SYNC_CAUSE, 0xFFFFFFFF);
919
		REG_WRITE(ah, AR_INTR_SYNC_ENABLE, sync_default);
S
Sujith 已提交
920 921
		REG_WRITE(ah, AR_INTR_SYNC_MASK, 0);
	}
922

S
Sujith 已提交
923 924
	REGWRITE_BUFFER_FLUSH(ah);

925 926 927 928 929 930
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_INTR_PRIO_ASYNC_ENABLE, 0);
		REG_WRITE(ah, AR_INTR_PRIO_ASYNC_MASK, 0);
		REG_WRITE(ah, AR_INTR_PRIO_SYNC_ENABLE, 0);
		REG_WRITE(ah, AR_INTR_PRIO_SYNC_MASK, 0);
	}
931 932
}

933 934 935 936 937 938 939
static void ath9k_hw_set_sifs_time(struct ath_hw *ah, u32 us)
{
	u32 val = ath9k_hw_mac_to_clks(ah, us - 2);
	val = min(val, (u32) 0xFFFF);
	REG_WRITE(ah, AR_D_GBL_IFS_SIFS, val);
}

940
void ath9k_hw_setslottime(struct ath_hw *ah, u32 us)
941
{
942 943 944
	u32 val = ath9k_hw_mac_to_clks(ah, us);
	val = min(val, (u32) 0xFFFF);
	REG_WRITE(ah, AR_D_GBL_IFS_SLOT, val);
945 946
}

947
void ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us)
948
{
949 950 951 952 953
	u32 val = ath9k_hw_mac_to_clks(ah, us);
	val = min(val, (u32) MS(0xFFFFFFFF, AR_TIME_OUT_ACK));
	REG_RMW_FIELD(ah, AR_TIME_OUT, AR_TIME_OUT_ACK, val);
}

954
void ath9k_hw_set_cts_timeout(struct ath_hw *ah, u32 us)
955 956 957 958
{
	u32 val = ath9k_hw_mac_to_clks(ah, us);
	val = min(val, (u32) MS(0xFFFFFFFF, AR_TIME_OUT_CTS));
	REG_RMW_FIELD(ah, AR_TIME_OUT, AR_TIME_OUT_CTS, val);
959
}
S
Sujith 已提交
960

961
static bool ath9k_hw_set_global_txtimeout(struct ath_hw *ah, u32 tu)
962 963
{
	if (tu > 0xFFFF) {
964 965
		ath_dbg(ath9k_hw_common(ah), XMIT, "bad global tx timeout %u\n",
			tu);
966
		ah->globaltxtimeout = (u32) -1;
967 968 969
		return false;
	} else {
		REG_RMW_FIELD(ah, AR_GTXTO, AR_GTXTO_TIMEOUT_LIMIT, tu);
970
		ah->globaltxtimeout = tu;
971 972 973 974
		return true;
	}
}

975
void ath9k_hw_init_global_settings(struct ath_hw *ah)
976
{
977 978
	struct ath_common *common = ath9k_hw_common(ah);
	const struct ath9k_channel *chan = ah->curchan;
979
	int acktimeout, ctstimeout, ack_offset = 0;
980
	int slottime;
981
	int sifstime;
982 983
	int rx_lat = 0, tx_lat = 0, eifs = 0;
	u32 reg;
984

985
	ath_dbg(ath9k_hw_common(ah), RESET, "ah->misc_mode 0x%x\n",
J
Joe Perches 已提交
986
		ah->misc_mode);
987

988 989 990
	if (!chan)
		return;

991
	if (ah->misc_mode != 0)
992
		REG_SET_BIT(ah, AR_PCU_MISC, ah->misc_mode);
993

994 995 996 997
	if (IS_CHAN_A_FAST_CLOCK(ah, chan))
		rx_lat = 41;
	else
		rx_lat = 37;
998 999
	tx_lat = 54;

1000 1001 1002 1003 1004
	if (IS_CHAN_5GHZ(chan))
		sifstime = 16;
	else
		sifstime = 10;

1005 1006 1007 1008 1009 1010 1011
	if (IS_CHAN_HALF_RATE(chan)) {
		eifs = 175;
		rx_lat *= 2;
		tx_lat *= 2;
		if (IS_CHAN_A_FAST_CLOCK(ah, chan))
		    tx_lat += 11;

1012
		sifstime = 32;
1013
		ack_offset = 16;
1014 1015 1016
		slottime = 13;
	} else if (IS_CHAN_QUARTER_RATE(chan)) {
		eifs = 340;
1017
		rx_lat = (rx_lat * 4) - 1;
1018 1019 1020 1021
		tx_lat *= 4;
		if (IS_CHAN_A_FAST_CLOCK(ah, chan))
		    tx_lat += 22;

1022
		sifstime = 64;
1023
		ack_offset = 32;
1024 1025
		slottime = 21;
	} else {
1026 1027 1028 1029 1030 1031 1032 1033
		if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) {
			eifs = AR_D_GBL_IFS_EIFS_ASYNC_FIFO;
			reg = AR_USEC_ASYNC_FIFO;
		} else {
			eifs = REG_READ(ah, AR_D_GBL_IFS_EIFS)/
				common->clockrate;
			reg = REG_READ(ah, AR_USEC);
		}
1034 1035 1036 1037 1038
		rx_lat = MS(reg, AR_USEC_RX_LAT);
		tx_lat = MS(reg, AR_USEC_TX_LAT);

		slottime = ah->slottime;
	}
1039

1040
	/* As defined by IEEE 802.11-2007 17.3.8.6 */
1041 1042
	slottime += 3 * ah->coverage_class;
	acktimeout = slottime + sifstime + ack_offset;
1043
	ctstimeout = acktimeout;
1044 1045 1046

	/*
	 * Workaround for early ACK timeouts, add an offset to match the
1047
	 * initval's 64us ack timeout value. Use 48us for the CTS timeout.
1048 1049 1050 1051
	 * This was initially only meant to work around an issue with delayed
	 * BA frames in some implementations, but it has been found to fix ACK
	 * timeout issues in other cases as well.
	 */
1052
	if (IS_CHAN_2GHZ(chan) &&
1053
	    !IS_CHAN_HALF_RATE(chan) && !IS_CHAN_QUARTER_RATE(chan)) {
1054
		acktimeout += 64 - sifstime - ah->slottime;
1055 1056 1057
		ctstimeout += 48 - sifstime - ah->slottime;
	}

1058 1059 1060 1061 1062 1063 1064 1065
	if (ah->dynack.enabled) {
		acktimeout = ah->dynack.ackto;
		ctstimeout = acktimeout;
		slottime = (acktimeout - 3) / 2;
	} else {
		ah->dynack.ackto = acktimeout;
	}

1066 1067
	ath9k_hw_set_sifs_time(ah, sifstime);
	ath9k_hw_setslottime(ah, slottime);
1068
	ath9k_hw_set_ack_timeout(ah, acktimeout);
1069
	ath9k_hw_set_cts_timeout(ah, ctstimeout);
1070 1071
	if (ah->globaltxtimeout != (u32) -1)
		ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout);
1072 1073 1074 1075 1076 1077 1078 1079

	REG_WRITE(ah, AR_D_GBL_IFS_EIFS, ath9k_hw_mac_to_clks(ah, eifs));
	REG_RMW(ah, AR_USEC,
		(common->clockrate - 1) |
		SM(rx_lat, AR_USEC_RX_LAT) |
		SM(tx_lat, AR_USEC_TX_LAT),
		AR_USEC_TX_LAT | AR_USEC_RX_LAT | AR_USEC_USEC);

S
Sujith 已提交
1080
}
1081
EXPORT_SYMBOL(ath9k_hw_init_global_settings);
S
Sujith 已提交
1082

S
Sujith 已提交
1083
void ath9k_hw_deinit(struct ath_hw *ah)
S
Sujith 已提交
1084
{
1085 1086
	struct ath_common *common = ath9k_hw_common(ah);

S
Sujith 已提交
1087
	if (common->state < ATH_HW_INITIALIZED)
1088
		return;
1089

1090
	ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP);
S
Sujith 已提交
1091
}
S
Sujith 已提交
1092
EXPORT_SYMBOL(ath9k_hw_deinit);
S
Sujith 已提交
1093 1094 1095 1096 1097

/*******/
/* INI */
/*******/

1098
u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)
1099 1100 1101
{
	u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band);

F
Felix Fietkau 已提交
1102
	if (IS_CHAN_2GHZ(chan))
1103 1104 1105 1106 1107 1108 1109
		ctl |= CTL_11G;
	else
		ctl |= CTL_11A;

	return ctl;
}

S
Sujith 已提交
1110 1111 1112 1113
/****************************************/
/* Reset and Channel Switching Routines */
/****************************************/

1114
static inline void ath9k_hw_set_dma(struct ath_hw *ah)
S
Sujith 已提交
1115
{
1116
	struct ath_common *common = ath9k_hw_common(ah);
1117
	int txbuf_size;
S
Sujith 已提交
1118

S
Sujith 已提交
1119 1120
	ENABLE_REGWRITE_BUFFER(ah);

1121 1122 1123
	/*
	 * set AHB_MODE not to do cacheline prefetches
	*/
1124 1125
	if (!AR_SREV_9300_20_OR_LATER(ah))
		REG_SET_BIT(ah, AR_AHB_MODE, AR_AHB_PREFETCH_RD_EN);
S
Sujith 已提交
1126

1127 1128 1129
	/*
	 * let mac dma reads be in 128 byte chunks
	 */
1130
	REG_RMW(ah, AR_TXCFG, AR_TXCFG_DMASZ_128B, AR_TXCFG_DMASZ_MASK);
S
Sujith 已提交
1131

S
Sujith 已提交
1132 1133
	REGWRITE_BUFFER_FLUSH(ah);

1134 1135 1136 1137 1138
	/*
	 * Restore TX Trigger Level to its pre-reset value.
	 * The initial value depends on whether aggregation is enabled, and is
	 * adjusted whenever underruns are detected.
	 */
1139 1140
	if (!AR_SREV_9300_20_OR_LATER(ah))
		REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level);
S
Sujith 已提交
1141

S
Sujith 已提交
1142
	ENABLE_REGWRITE_BUFFER(ah);
S
Sujith 已提交
1143

1144 1145 1146
	/*
	 * let mac dma writes be in 128 byte chunks
	 */
1147
	REG_RMW(ah, AR_RXCFG, AR_RXCFG_DMASZ_128B, AR_RXCFG_DMASZ_MASK);
S
Sujith 已提交
1148

1149 1150 1151
	/*
	 * Setup receive FIFO threshold to hold off TX activities
	 */
S
Sujith 已提交
1152 1153
	REG_WRITE(ah, AR_RXFIFO_CFG, 0x200);

1154 1155 1156 1157 1158 1159 1160 1161
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_RMW_FIELD(ah, AR_RXBP_THRESH, AR_RXBP_THRESH_HP, 0x1);
		REG_RMW_FIELD(ah, AR_RXBP_THRESH, AR_RXBP_THRESH_LP, 0x1);

		ath9k_hw_set_rx_bufsize(ah, common->rx_bufsize -
			ah->caps.rx_status_len);
	}

1162 1163 1164 1165
	/*
	 * reduce the number of usable entries in PCU TXBUF to avoid
	 * wrap around issues.
	 */
S
Sujith 已提交
1166
	if (AR_SREV_9285(ah)) {
1167 1168 1169 1170
		/* For AR9285 the number of Fifos are reduced to half.
		 * So set the usable tx buf size also to half to
		 * avoid data/delimiter underruns
		 */
1171 1172 1173 1174 1175 1176
		txbuf_size = AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE;
	} else if (AR_SREV_9340_13_OR_LATER(ah)) {
		/* Uses fewer entries for AR934x v1.3+ to prevent rx overruns */
		txbuf_size = AR_9340_PCU_TXBUF_CTRL_USABLE_SIZE;
	} else {
		txbuf_size = AR_PCU_TXBUF_CTRL_USABLE_SIZE;
S
Sujith 已提交
1177
	}
1178

1179 1180 1181
	if (!AR_SREV_9271(ah))
		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, txbuf_size);

S
Sujith 已提交
1182 1183
	REGWRITE_BUFFER_FLUSH(ah);

1184 1185
	if (AR_SREV_9300_20_OR_LATER(ah))
		ath9k_hw_reset_txstatus_ring(ah);
S
Sujith 已提交
1186 1187
}

1188
static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
S
Sujith 已提交
1189
{
1190 1191
	u32 mask = AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC;
	u32 set = AR_STA_ID1_KSRCH_MODE;
S
Sujith 已提交
1192 1193

	switch (opmode) {
1194
	case NL80211_IFTYPE_ADHOC:
1195 1196 1197 1198 1199 1200
		if (!AR_SREV_9340_13(ah)) {
			set |= AR_STA_ID1_ADHOC;
			REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
			break;
		}
		/* fall through */
1201
	case NL80211_IFTYPE_MESH_POINT:
1202 1203 1204
	case NL80211_IFTYPE_AP:
		set |= AR_STA_ID1_STA_AP;
		/* fall through */
1205
	case NL80211_IFTYPE_STATION:
1206
		REG_CLR_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1207
		break;
1208
	default:
1209 1210
		if (!ah->is_monitoring)
			set = 0;
1211
		break;
S
Sujith 已提交
1212
	}
1213
	REG_RMW(ah, AR_STA_ID1, set, mask);
S
Sujith 已提交
1214 1215
}

1216 1217
void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
				   u32 *coef_mantissa, u32 *coef_exponent)
S
Sujith 已提交
1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232
{
	u32 coef_exp, coef_man;

	for (coef_exp = 31; coef_exp > 0; coef_exp--)
		if ((coef_scaled >> coef_exp) & 0x1)
			break;

	coef_exp = 14 - (coef_exp - COEF_SCALE_S);

	coef_man = coef_scaled + (1 << (COEF_SCALE_S - coef_exp - 1));

	*coef_mantissa = coef_man >> (COEF_SCALE_S - coef_exp);
	*coef_exponent = coef_exp - 16;
}

1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268
/* AR9330 WAR:
 * call external reset function to reset WMAC if:
 * - doing a cold reset
 * - we have pending frames in the TX queues.
 */
static bool ath9k_hw_ar9330_reset_war(struct ath_hw *ah, int type)
{
	int i, npend = 0;

	for (i = 0; i < AR_NUM_QCU; i++) {
		npend = ath9k_hw_numtxpending(ah, i);
		if (npend)
			break;
	}

	if (ah->external_reset &&
	    (npend || type == ATH9K_RESET_COLD)) {
		int reset_err = 0;

		ath_dbg(ath9k_hw_common(ah), RESET,
			"reset MAC via external reset\n");

		reset_err = ah->external_reset();
		if (reset_err) {
			ath_err(ath9k_hw_common(ah),
				"External reset failed, err=%d\n",
				reset_err);
			return false;
		}

		REG_WRITE(ah, AR_RTC_RESET, 1);
	}

	return true;
}

1269
static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
S
Sujith 已提交
1270 1271 1272 1273
{
	u32 rst_flags;
	u32 tmpReg;

1274
	if (AR_SREV_9100(ah)) {
1275 1276
		REG_RMW_FIELD(ah, AR_RTC_DERIVED_CLK,
			      AR_RTC_DERIVED_CLK_PERIOD, 1);
1277 1278 1279
		(void)REG_READ(ah, AR_RTC_DERIVED_CLK);
	}

S
Sujith 已提交
1280 1281
	ENABLE_REGWRITE_BUFFER(ah);

1282 1283 1284 1285 1286
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1287 1288 1289 1290 1291 1292 1293 1294
	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
		  AR_RTC_FORCE_WAKE_ON_INT);

	if (AR_SREV_9100(ah)) {
		rst_flags = AR_RTC_RC_MAC_WARM | AR_RTC_RC_MAC_COLD |
			AR_RTC_RC_COLD_RESET | AR_RTC_RC_WARM_RESET;
	} else {
		tmpReg = REG_READ(ah, AR_INTR_SYNC_CAUSE);
1295 1296 1297 1298 1299 1300 1301
		if (AR_SREV_9340(ah))
			tmpReg &= AR9340_INTR_SYNC_LOCAL_TIMEOUT;
		else
			tmpReg &= AR_INTR_SYNC_LOCAL_TIMEOUT |
				  AR_INTR_SYNC_RADM_CPL_TIMEOUT;

		if (tmpReg) {
1302
			u32 val;
S
Sujith 已提交
1303
			REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);
1304 1305 1306 1307 1308 1309 1310

			val = AR_RC_HOSTIF;
			if (!AR_SREV_9300_20_OR_LATER(ah))
				val |= AR_RC_AHB;
			REG_WRITE(ah, AR_RC, val);

		} else if (!AR_SREV_9300_20_OR_LATER(ah))
S
Sujith 已提交
1311 1312 1313 1314 1315 1316 1317
			REG_WRITE(ah, AR_RC, AR_RC_AHB);

		rst_flags = AR_RTC_RC_MAC_WARM;
		if (type == ATH9K_RESET_COLD)
			rst_flags |= AR_RTC_RC_MAC_COLD;
	}

1318
	if (AR_SREV_9330(ah)) {
1319 1320
		if (!ath9k_hw_ar9330_reset_war(ah, type))
			return false;
1321 1322
	}

1323
	if (ath9k_hw_mci_is_enabled(ah))
1324
		ar9003_mci_check_gpm_offset(ah);
1325

1326
	REG_WRITE(ah, AR_RTC_RC, rst_flags);
S
Sujith 已提交
1327 1328 1329

	REGWRITE_BUFFER_FLUSH(ah);

S
Sujith Manoharan 已提交
1330 1331 1332
	if (AR_SREV_9300_20_OR_LATER(ah))
		udelay(50);
	else if (AR_SREV_9100(ah))
S
Sujith Manoharan 已提交
1333
		mdelay(10);
S
Sujith Manoharan 已提交
1334 1335
	else
		udelay(100);
S
Sujith 已提交
1336

1337
	REG_WRITE(ah, AR_RTC_RC, 0);
S
Sujith 已提交
1338
	if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
1339
		ath_dbg(ath9k_hw_common(ah), RESET, "RTC stuck in MAC reset\n");
S
Sujith 已提交
1340 1341 1342 1343 1344 1345 1346 1347 1348 1349 1350 1351
		return false;
	}

	if (!AR_SREV_9100(ah))
		REG_WRITE(ah, AR_RC, 0);

	if (AR_SREV_9100(ah))
		udelay(50);

	return true;
}

1352
static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
S
Sujith 已提交
1353
{
S
Sujith 已提交
1354 1355
	ENABLE_REGWRITE_BUFFER(ah);

1356 1357 1358 1359 1360
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1361 1362 1363
	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
		  AR_RTC_FORCE_WAKE_ON_INT);

1364
	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
1365 1366
		REG_WRITE(ah, AR_RC, AR_RC_AHB);

1367
	REG_WRITE(ah, AR_RTC_RESET, 0);
1368

S
Sujith 已提交
1369 1370
	REGWRITE_BUFFER_FLUSH(ah);

1371
	udelay(2);
1372 1373

	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
1374 1375
		REG_WRITE(ah, AR_RC, 0);

1376
	REG_WRITE(ah, AR_RTC_RESET, 1);
S
Sujith 已提交
1377 1378 1379 1380

	if (!ath9k_hw_wait(ah,
			   AR_RTC_STATUS,
			   AR_RTC_STATUS_M,
S
Sujith 已提交
1381 1382
			   AR_RTC_STATUS_ON,
			   AH_WAIT_TIMEOUT)) {
1383
		ath_dbg(ath9k_hw_common(ah), RESET, "RTC not waking up\n");
S
Sujith 已提交
1384
		return false;
1385 1386
	}

S
Sujith 已提交
1387 1388 1389
	return ath9k_hw_set_reset(ah, ATH9K_RESET_WARM);
}

1390
static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)
S
Sujith 已提交
1391
{
1392
	bool ret = false;
1393

1394 1395 1396 1397 1398
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1399 1400 1401
	REG_WRITE(ah, AR_RTC_FORCE_WAKE,
		  AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);

1402 1403 1404
	if (!ah->reset_power_on)
		type = ATH9K_RESET_POWER_ON;

S
Sujith 已提交
1405 1406
	switch (type) {
	case ATH9K_RESET_POWER_ON:
1407
		ret = ath9k_hw_set_reset_power_on(ah);
1408
		if (ret)
1409
			ah->reset_power_on = true;
1410
		break;
S
Sujith 已提交
1411 1412
	case ATH9K_RESET_WARM:
	case ATH9K_RESET_COLD:
1413 1414
		ret = ath9k_hw_set_reset(ah, type);
		break;
S
Sujith 已提交
1415
	default:
1416
		break;
S
Sujith 已提交
1417
	}
1418 1419

	return ret;
1420 1421
}

1422
static bool ath9k_hw_chip_reset(struct ath_hw *ah,
S
Sujith 已提交
1423
				struct ath9k_channel *chan)
1424
{
1425 1426 1427 1428 1429 1430 1431
	int reset_type = ATH9K_RESET_WARM;

	if (AR_SREV_9280(ah)) {
		if (ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL))
			reset_type = ATH9K_RESET_POWER_ON;
		else
			reset_type = ATH9K_RESET_COLD;
1432 1433 1434
	} else if (ah->chip_fullsleep || REG_READ(ah, AR_Q_TXE) ||
		   (REG_READ(ah, AR_CR) & AR_CR_RXE))
		reset_type = ATH9K_RESET_COLD;
1435 1436

	if (!ath9k_hw_set_reset_reg(ah, reset_type))
S
Sujith 已提交
1437
		return false;
1438

1439
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
S
Sujith 已提交
1440
		return false;
1441

1442
	ah->chip_fullsleep = false;
1443 1444 1445

	if (AR_SREV_9330(ah))
		ar9003_hw_internal_regulator_apply(ah);
S
Sujith 已提交
1446
	ath9k_hw_init_pll(ah, chan);
1447

S
Sujith 已提交
1448
	return true;
1449 1450
}

1451
static bool ath9k_hw_channel_change(struct ath_hw *ah,
L
Luis R. Rodriguez 已提交
1452
				    struct ath9k_channel *chan)
1453
{
1454
	struct ath_common *common = ath9k_hw_common(ah);
1455 1456
	struct ath9k_hw_capabilities *pCap = &ah->caps;
	bool band_switch = false, mode_diff = false;
1457
	u8 ini_reloaded = 0;
1458
	u32 qnum;
1459
	int r;
1460

1461
	if (pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) {
1462 1463 1464
		u32 flags_diff = chan->channelFlags ^ ah->curchan->channelFlags;
		band_switch = !!(flags_diff & CHANNEL_5GHZ);
		mode_diff = !!(flags_diff & ~CHANNEL_HT);
1465
	}
1466 1467 1468

	for (qnum = 0; qnum < AR_NUM_QCU; qnum++) {
		if (ath9k_hw_numtxpending(ah, qnum)) {
1469
			ath_dbg(common, QUEUE,
J
Joe Perches 已提交
1470
				"Transmit frames pending on queue %d\n", qnum);
1471 1472 1473 1474
			return false;
		}
	}

1475
	if (!ath9k_hw_rfbus_req(ah)) {
1476
		ath_err(common, "Could not kill baseband RX\n");
1477 1478 1479
		return false;
	}

1480
	if (band_switch || mode_diff) {
1481 1482 1483
		ath9k_hw_mark_phy_inactive(ah);
		udelay(5);

1484 1485
		if (band_switch)
			ath9k_hw_init_pll(ah, chan);
1486 1487 1488 1489 1490 1491 1492

		if (ath9k_hw_fast_chan_change(ah, chan, &ini_reloaded)) {
			ath_err(common, "Failed to do fast channel change\n");
			return false;
		}
	}

1493
	ath9k_hw_set_channel_regs(ah, chan);
1494

1495
	r = ath9k_hw_rf_set_freq(ah, chan);
1496
	if (r) {
1497
		ath_err(common, "Failed to set channel\n");
1498
		return false;
1499
	}
1500
	ath9k_hw_set_clockrate(ah);
1501
	ath9k_hw_apply_txpower(ah, chan, false);
1502

F
Felix Fietkau 已提交
1503
	ath9k_hw_set_delta_slope(ah, chan);
1504
	ath9k_hw_spur_mitigate_freq(ah, chan);
S
Sujith 已提交
1505

1506 1507
	if (band_switch || ini_reloaded)
		ah->eep_ops->set_board_values(ah, chan);
1508

1509 1510
	ath9k_hw_init_bb(ah, chan);
	ath9k_hw_rfbus_done(ah);
1511

1512 1513 1514
	if (band_switch || ini_reloaded) {
		ah->ah_flags |= AH_FASTCC;
		ath9k_hw_init_cal(ah, chan);
1515
		ah->ah_flags &= ~AH_FASTCC;
1516 1517
	}

S
Sujith 已提交
1518 1519 1520
	return true;
}

1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534
static void ath9k_hw_apply_gpio_override(struct ath_hw *ah)
{
	u32 gpio_mask = ah->gpio_mask;
	int i;

	for (i = 0; gpio_mask; i++, gpio_mask >>= 1) {
		if (!(gpio_mask & 1))
			continue;

		ath9k_hw_cfg_output(ah, i, AR_GPIO_OUTPUT_MUX_AS_OUTPUT);
		ath9k_hw_set_gpio(ah, i, !!(ah->gpio_val & BIT(i)));
	}
}

1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547
void ath9k_hw_check_nav(struct ath_hw *ah)
{
	struct ath_common *common = ath9k_hw_common(ah);
	u32 val;

	val = REG_READ(ah, AR_NAV);
	if (val != 0xdeadbeef && val > 0x7fff) {
		ath_dbg(common, BSTUCK, "Abnormal NAV: 0x%x\n", val);
		REG_WRITE(ah, AR_NAV, 0);
	}
}
EXPORT_SYMBOL(ath9k_hw_check_nav);

1548
bool ath9k_hw_check_alive(struct ath_hw *ah)
J
Johannes Berg 已提交
1549
{
1550
	int count = 50;
1551
	u32 reg, last_val;
1552

1553 1554 1555
	if (AR_SREV_9300(ah))
		return !ath9k_hw_detect_mac_hang(ah);

1556
	if (AR_SREV_9285_12_OR_LATER(ah))
1557 1558
		return true;

1559
	last_val = REG_READ(ah, AR_OBS_BUS_1);
1560 1561
	do {
		reg = REG_READ(ah, AR_OBS_BUS_1);
1562 1563
		if (reg != last_val)
			return true;
J
Johannes Berg 已提交
1564

1565
		udelay(1);
1566
		last_val = reg;
1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578
		if ((reg & 0x7E7FFFEF) == 0x00702400)
			continue;

		switch (reg & 0x7E000B00) {
		case 0x1E000000:
		case 0x52000B00:
		case 0x18000B00:
			continue;
		default:
			return true;
		}
	} while (count-- > 0);
J
Johannes Berg 已提交
1579

1580
	return false;
J
Johannes Berg 已提交
1581
}
1582
EXPORT_SYMBOL(ath9k_hw_check_alive);
J
Johannes Berg 已提交
1583

1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 1607 1608 1609 1610 1611
static void ath9k_hw_init_mfp(struct ath_hw *ah)
{
	/* Setup MFP options for CCMP */
	if (AR_SREV_9280_20_OR_LATER(ah)) {
		/* Mask Retry(b11), PwrMgt(b12), MoreData(b13) to 0 in mgmt
		 * frames when constructing CCMP AAD. */
		REG_RMW_FIELD(ah, AR_AES_MUTE_MASK1, AR_AES_MUTE_MASK1_FC_MGMT,
			      0xc7ff);
		ah->sw_mgmt_crypto = false;
	} else if (AR_SREV_9160_10_OR_LATER(ah)) {
		/* Disable hardware crypto for management frames */
		REG_CLR_BIT(ah, AR_PCU_MISC_MODE2,
			    AR_PCU_MISC_MODE2_MGMT_CRYPTO_ENABLE);
		REG_SET_BIT(ah, AR_PCU_MISC_MODE2,
			    AR_PCU_MISC_MODE2_NO_CRYPTO_FOR_NON_DATA_PKT);
		ah->sw_mgmt_crypto = true;
	} else {
		ah->sw_mgmt_crypto = true;
	}
}

static void ath9k_hw_reset_opmode(struct ath_hw *ah,
				  u32 macStaId1, u32 saveDefAntenna)
{
	struct ath_common *common = ath9k_hw_common(ah);

	ENABLE_REGWRITE_BUFFER(ah);

1612
	REG_RMW(ah, AR_STA_ID1, macStaId1
1613
		  | AR_STA_ID1_RTS_USE_DEF
1614 1615
		  | ah->sta_id1_defaults,
		  ~AR_STA_ID1_SADH_MASK);
1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 1630 1631 1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643 1644 1645 1646 1647 1648 1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671
	ath_hw_setbssidmask(common);
	REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
	ath9k_hw_write_associd(ah);
	REG_WRITE(ah, AR_ISR, ~0);
	REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);

	REGWRITE_BUFFER_FLUSH(ah);

	ath9k_hw_set_operating_mode(ah, ah->opmode);
}

static void ath9k_hw_init_queues(struct ath_hw *ah)
{
	int i;

	ENABLE_REGWRITE_BUFFER(ah);

	for (i = 0; i < AR_NUM_DCU; i++)
		REG_WRITE(ah, AR_DQCUMASK(i), 1 << i);

	REGWRITE_BUFFER_FLUSH(ah);

	ah->intr_txqs = 0;
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
		ath9k_hw_resettxqueue(ah, i);
}

/*
 * For big endian systems turn on swapping for descriptors
 */
static void ath9k_hw_init_desc(struct ath_hw *ah)
{
	struct ath_common *common = ath9k_hw_common(ah);

	if (AR_SREV_9100(ah)) {
		u32 mask;
		mask = REG_READ(ah, AR_CFG);
		if (mask & (AR_CFG_SWRB | AR_CFG_SWTB | AR_CFG_SWRG)) {
			ath_dbg(common, RESET, "CFG Byte Swap Set 0x%x\n",
				mask);
		} else {
			mask = INIT_CONFIG_STATUS | AR_CFG_SWRB | AR_CFG_SWTB;
			REG_WRITE(ah, AR_CFG, mask);
			ath_dbg(common, RESET, "Setting CFG 0x%x\n",
				REG_READ(ah, AR_CFG));
		}
	} else {
		if (common->bus_ops->ath_bus_type == ATH_USB) {
			/* Configure AR9271 target WLAN */
			if (AR_SREV_9271(ah))
				REG_WRITE(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB);
			else
				REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
		}
#ifdef __BIG_ENDIAN
		else if (AR_SREV_9330(ah) || AR_SREV_9340(ah) ||
1672
			 AR_SREV_9550(ah) || AR_SREV_9531(ah))
1673 1674 1675 1676 1677 1678 1679
			REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);
		else
			REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
#endif
	}
}

1680 1681 1682 1683 1684 1685 1686
/*
 * Fast channel change:
 * (Change synthesizer based on channel freq without resetting chip)
 */
static int ath9k_hw_do_fastcc(struct ath_hw *ah, struct ath9k_channel *chan)
{
	struct ath_common *common = ath9k_hw_common(ah);
1687
	struct ath9k_hw_capabilities *pCap = &ah->caps;
1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701
	int ret;

	if (AR_SREV_9280(ah) && common->bus_ops->ath_bus_type == ATH_PCI)
		goto fail;

	if (ah->chip_fullsleep)
		goto fail;

	if (!ah->curchan)
		goto fail;

	if (chan->channel == ah->curchan->channel)
		goto fail;

1702 1703 1704 1705
	if ((ah->curchan->channelFlags | chan->channelFlags) &
	    (CHANNEL_HALF | CHANNEL_QUARTER))
		goto fail;

1706
	/*
F
Felix Fietkau 已提交
1707
	 * If cross-band fcc is not supoprted, bail out if channelFlags differ.
1708
	 */
F
Felix Fietkau 已提交
1709
	if (!(pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) &&
1710
	    ((chan->channelFlags ^ ah->curchan->channelFlags) & ~CHANNEL_HT))
F
Felix Fietkau 已提交
1711
		goto fail;
1712 1713 1714 1715 1716 1717 1718 1719

	if (!ath9k_hw_check_alive(ah))
		goto fail;

	/*
	 * For AR9462, make sure that calibration data for
	 * re-using are present.
	 */
S
Sujith Manoharan 已提交
1720
	if (AR_SREV_9462(ah) && (ah->caldata &&
1721 1722 1723
				 (!test_bit(TXIQCAL_DONE, &ah->caldata->cal_flags) ||
				  !test_bit(TXCLCAL_DONE, &ah->caldata->cal_flags) ||
				  !test_bit(RTT_DONE, &ah->caldata->cal_flags))))
1724 1725 1726 1727 1728 1729 1730 1731 1732
		goto fail;

	ath_dbg(common, RESET, "FastChannelChange for %d -> %d\n",
		ah->curchan->channel, chan->channel);

	ret = ath9k_hw_channel_change(ah, chan);
	if (!ret)
		goto fail;

S
Sujith Manoharan 已提交
1733
	if (ath9k_hw_mci_is_enabled(ah))
1734
		ar9003_mci_2g5g_switch(ah, false);
1735

1736 1737 1738
	ath9k_hw_loadnf(ah, ah->curchan);
	ath9k_hw_start_nfcal(ah, true);

1739 1740 1741 1742 1743 1744 1745 1746
	if (AR_SREV_9271(ah))
		ar9002_hw_load_ani_reg(ah, chan);

	return 0;
fail:
	return -EINVAL;
}

1747 1748 1749 1750 1751 1752 1753 1754 1755 1756 1757 1758 1759 1760 1761 1762 1763
u32 ath9k_hw_get_tsf_offset(struct timespec *last, struct timespec *cur)
{
	struct timespec ts;
	s64 usec;

	if (!cur) {
		getrawmonotonic(&ts);
		cur = &ts;
	}

	usec = cur->tv_sec * 1000000ULL + cur->tv_nsec / 1000;
	usec -= last->tv_sec * 1000000ULL + last->tv_nsec / 1000;

	return (u32) usec;
}
EXPORT_SYMBOL(ath9k_hw_get_tsf_offset);

1764
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1765
		   struct ath9k_hw_cal_data *caldata, bool fastcc)
1766
{
1767
	struct ath_common *common = ath9k_hw_common(ah);
1768 1769 1770
	u32 saveLedState;
	u32 saveDefAntenna;
	u32 macStaId1;
S
Sujith 已提交
1771
	u64 tsf = 0;
1772
	s64 usec = 0;
1773
	int r;
1774
	bool start_mci_reset = false;
1775 1776
	bool save_fullsleep = ah->chip_fullsleep;

S
Sujith Manoharan 已提交
1777
	if (ath9k_hw_mci_is_enabled(ah)) {
1778 1779 1780
		start_mci_reset = ar9003_mci_start_reset(ah, chan);
		if (start_mci_reset)
			return 0;
1781 1782
	}

1783
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
1784
		return -EIO;
1785

1786 1787
	if (ah->curchan && !ah->chip_fullsleep)
		ath9k_hw_getnf(ah, ah->curchan);
1788

1789
	ah->caldata = caldata;
1790
	if (caldata && (chan->channel != caldata->channel ||
F
Felix Fietkau 已提交
1791
			chan->channelFlags != caldata->channelFlags)) {
1792 1793 1794
		/* Operating channel changed, reset channel calibration data */
		memset(caldata, 0, sizeof(*caldata));
		ath9k_init_nfcal_hist_buffer(ah, chan);
1795
	} else if (caldata) {
1796
		clear_bit(PAPRD_PACKET_SENT, &caldata->cal_flags);
1797
	}
1798
	ah->noise = ath9k_hw_getchan_noise(ah, chan, chan->noisefloor);
1799

1800 1801 1802 1803
	if (fastcc) {
		r = ath9k_hw_do_fastcc(ah, chan);
		if (!r)
			return r;
1804 1805
	}

S
Sujith Manoharan 已提交
1806
	if (ath9k_hw_mci_is_enabled(ah))
1807
		ar9003_mci_stop_bt(ah, save_fullsleep);
1808

1809 1810 1811 1812 1813 1814
	saveDefAntenna = REG_READ(ah, AR_DEF_ANTENNA);
	if (saveDefAntenna == 0)
		saveDefAntenna = 1;

	macStaId1 = REG_READ(ah, AR_STA_ID1) & AR_STA_ID1_BASE_RATE_11B;

1815 1816
	/* Save TSF before chip reset, a cold reset clears it */
	tsf = ath9k_hw_gettsf64(ah);
1817
	usec = ktime_to_us(ktime_get_raw());
S
Sujith 已提交
1818

1819 1820 1821 1822 1823 1824
	saveLedState = REG_READ(ah, AR_CFG_LED) &
		(AR_CFG_LED_ASSOC_CTL | AR_CFG_LED_MODE_SEL |
		 AR_CFG_LED_BLINK_THRESH_SEL | AR_CFG_LED_BLINK_SLOW);

	ath9k_hw_mark_phy_inactive(ah);

1825 1826
	ah->paprd_table_write_done = false;

1827
	/* Only required on the first reset */
1828 1829 1830 1831 1832 1833 1834
	if (AR_SREV_9271(ah) && ah->htc_reset_init) {
		REG_WRITE(ah,
			  AR9271_RESET_POWER_DOWN_CONTROL,
			  AR9271_RADIO_RF_RST);
		udelay(50);
	}

1835
	if (!ath9k_hw_chip_reset(ah, chan)) {
1836
		ath_err(common, "Chip reset failed\n");
1837
		return -EINVAL;
1838 1839
	}

1840
	/* Only required on the first reset */
1841 1842 1843 1844 1845 1846 1847 1848
	if (AR_SREV_9271(ah) && ah->htc_reset_init) {
		ah->htc_reset_init = false;
		REG_WRITE(ah,
			  AR9271_RESET_POWER_DOWN_CONTROL,
			  AR9271_GATE_MAC_CTL);
		udelay(50);
	}

S
Sujith 已提交
1849
	/* Restore TSF */
1850
	usec = ktime_to_us(ktime_get_raw()) - usec;
1851
	ath9k_hw_settsf64(ah, tsf + usec);
S
Sujith 已提交
1852

1853
	if (AR_SREV_9280_20_OR_LATER(ah))
1854
		REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
1855

S
Sujith 已提交
1856 1857 1858
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ar9002_hw_enable_async_fifo(ah);

L
Luis R. Rodriguez 已提交
1859
	r = ath9k_hw_process_ini(ah, chan);
1860 1861
	if (r)
		return r;
1862

1863 1864
	ath9k_hw_set_rfmode(ah, chan);

S
Sujith Manoharan 已提交
1865
	if (ath9k_hw_mci_is_enabled(ah))
1866 1867
		ar9003_mci_reset(ah, false, IS_CHAN_2GHZ(chan), save_fullsleep);

1868 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878
	/*
	 * Some AR91xx SoC devices frequently fail to accept TSF writes
	 * right after the chip reset. When that happens, write a new
	 * value after the initvals have been applied, with an offset
	 * based on measured time difference
	 */
	if (AR_SREV_9100(ah) && (ath9k_hw_gettsf64(ah) < tsf)) {
		tsf += 1500;
		ath9k_hw_settsf64(ah, tsf);
	}

1879
	ath9k_hw_init_mfp(ah);
1880

F
Felix Fietkau 已提交
1881
	ath9k_hw_set_delta_slope(ah, chan);
1882
	ath9k_hw_spur_mitigate_freq(ah, chan);
1883
	ah->eep_ops->set_board_values(ah, chan);
1884

1885
	ath9k_hw_reset_opmode(ah, macStaId1, saveDefAntenna);
1886

1887
	r = ath9k_hw_rf_set_freq(ah, chan);
1888 1889
	if (r)
		return r;
1890

1891 1892
	ath9k_hw_set_clockrate(ah);

1893
	ath9k_hw_init_queues(ah);
1894
	ath9k_hw_init_interrupt_masks(ah, ah->opmode);
1895
	ath9k_hw_ani_cache_ini_regs(ah);
1896 1897
	ath9k_hw_init_qos(ah);

1898
	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
1899
		ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
J
Johannes Berg 已提交
1900

1901
	ath9k_hw_init_global_settings(ah);
1902

1903 1904 1905 1906 1907 1908 1909
	if (AR_SREV_9287(ah) && AR_SREV_9287_13_OR_LATER(ah)) {
		REG_SET_BIT(ah, AR_MAC_PCU_LOGIC_ANALYZER,
			    AR_MAC_PCU_LOGIC_ANALYZER_DISBUG20768);
		REG_RMW_FIELD(ah, AR_AHB_MODE, AR_AHB_CUSTOM_BURST_EN,
			      AR_AHB_CUSTOM_BURST_ASYNC_FIFO_VAL);
		REG_SET_BIT(ah, AR_PCU_MISC_MODE2,
			    AR_PCU_MISC_MODE2_ENABLE_AGGWEP);
1910 1911
	}

1912
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM);
1913 1914 1915

	ath9k_hw_set_dma(ah);

1916 1917
	if (!ath9k_hw_mci_is_enabled(ah))
		REG_WRITE(ah, AR_OBS, 8);
1918

S
Sujith 已提交
1919
	if (ah->config.rx_intr_mitigation) {
1920 1921
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, ah->config.rimt_last);
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, ah->config.rimt_first);
1922 1923
	}

1924 1925 1926 1927 1928
	if (ah->config.tx_intr_mitigation) {
		REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300);
		REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750);
	}

1929 1930
	ath9k_hw_init_bb(ah, chan);

1931
	if (caldata) {
1932 1933
		clear_bit(TXIQCAL_DONE, &caldata->cal_flags);
		clear_bit(TXCLCAL_DONE, &caldata->cal_flags);
1934
	}
1935
	if (!ath9k_hw_init_cal(ah, chan))
1936
		return -EIO;
1937

S
Sujith Manoharan 已提交
1938
	if (ath9k_hw_mci_is_enabled(ah) && ar9003_mci_end_reset(ah, chan, caldata))
1939
		return -EIO;
1940

S
Sujith 已提交
1941
	ENABLE_REGWRITE_BUFFER(ah);
1942

1943
	ath9k_hw_restore_chainmask(ah);
1944 1945
	REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ);

S
Sujith 已提交
1946 1947
	REGWRITE_BUFFER_FLUSH(ah);

1948
	ath9k_hw_init_desc(ah);
1949

1950
	if (ath9k_hw_btcoex_is_enabled(ah))
1951 1952
		ath9k_hw_btcoex_enable(ah);

S
Sujith Manoharan 已提交
1953
	if (ath9k_hw_mci_is_enabled(ah))
1954
		ar9003_mci_check_bt(ah);
1955

1956 1957 1958
	ath9k_hw_loadnf(ah, chan);
	ath9k_hw_start_nfcal(ah, true);

1959
	if (AR_SREV_9300_20_OR_LATER(ah))
1960
		ar9003_hw_bb_watchdog_config(ah);
1961 1962

	if (ah->config.hw_hang_checks & HW_PHYRESTART_CLC_WAR)
1963 1964
		ar9003_hw_disable_phy_restart(ah);

1965 1966
	ath9k_hw_apply_gpio_override(ah);

1967
	if (AR_SREV_9565(ah) && common->bt_ant_diversity)
1968 1969
		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);

1970 1971
	if (ah->hw->conf.radar_enabled) {
		/* set HW specific DFS configuration */
1972
		ah->radar_conf.ext_channel = IS_CHAN_HT40(chan);
1973 1974 1975
		ath9k_hw_set_radar_params(ah);
	}

1976
	return 0;
1977
}
1978
EXPORT_SYMBOL(ath9k_hw_reset);
1979

S
Sujith 已提交
1980 1981 1982 1983
/******************************/
/* Power Management (Chipset) */
/******************************/

1984 1985 1986 1987
/*
 * Notify Power Mgt is disabled in self-generated frames.
 * If requested, force chip to sleep.
 */
1988
static void ath9k_set_power_sleep(struct ath_hw *ah)
1989
{
S
Sujith 已提交
1990
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
1991

1992
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
1993 1994 1995
		REG_CLR_BIT(ah, AR_TIMER_MODE, 0xff);
		REG_CLR_BIT(ah, AR_NDP2_TIMER_MODE, 0xff);
		REG_CLR_BIT(ah, AR_SLP32_INC, 0xfffff);
1996 1997 1998 1999
		/* xxx Required for WLAN only case ? */
		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0);
		udelay(100);
	}
2000

2001 2002 2003 2004 2005 2006
	/*
	 * Clear the RTC force wake bit to allow the
	 * mac to go to sleep.
	 */
	REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);

2007
	if (ath9k_hw_mci_is_enabled(ah))
2008
		udelay(100);
2009

2010 2011
	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
		REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
2012

2013 2014 2015 2016
	/* Shutdown chip. Active low */
	if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) {
		REG_CLR_BIT(ah, AR_RTC_RESET, AR_RTC_RESET_EN);
		udelay(2);
S
Sujith 已提交
2017
	}
2018 2019

	/* Clear Bit 14 of AR_WA after putting chip into Full Sleep mode. */
2020 2021
	if (AR_SREV_9300_20_OR_LATER(ah))
		REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);
2022 2023
}

2024 2025 2026 2027 2028
/*
 * Notify Power Management is enabled in self-generating
 * frames. If request, set power mode of chip to
 * auto/normal.  Duration in units of 128us (1/8 TU).
 */
2029
static void ath9k_set_power_network_sleep(struct ath_hw *ah)
2030
{
2031
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2032

S
Sujith 已提交
2033
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2034

2035 2036 2037 2038 2039
	if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
		/* Set WakeOnInterrupt bit; clear ForceWake bit */
		REG_WRITE(ah, AR_RTC_FORCE_WAKE,
			  AR_RTC_FORCE_WAKE_ON_INT);
	} else {
2040

2041 2042 2043 2044 2045 2046 2047 2048 2049
		/* When chip goes into network sleep, it could be waken
		 * up by MCI_INT interrupt caused by BT's HW messages
		 * (LNA_xxx, CONT_xxx) which chould be in a very fast
		 * rate (~100us). This will cause chip to leave and
		 * re-enter network sleep mode frequently, which in
		 * consequence will have WLAN MCI HW to generate lots of
		 * SYS_WAKING and SYS_SLEEPING messages which will make
		 * BT CPU to busy to process.
		 */
2050 2051 2052
		if (ath9k_hw_mci_is_enabled(ah))
			REG_CLR_BIT(ah, AR_MCI_INTERRUPT_RX_MSG_EN,
				    AR_MCI_INTERRUPT_RX_HW_MSG_MASK);
2053 2054 2055 2056
		/*
		 * Clear the RTC force wake bit to allow the
		 * mac to go to sleep.
		 */
2057
		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
2058

2059
		if (ath9k_hw_mci_is_enabled(ah))
2060
			udelay(30);
2061
	}
2062 2063 2064 2065

	/* Clear Bit 14 of AR_WA after putting chip into Net Sleep mode. */
	if (AR_SREV_9300_20_OR_LATER(ah))
		REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);
2066 2067
}

2068
static bool ath9k_hw_set_power_awake(struct ath_hw *ah)
2069
{
S
Sujith 已提交
2070 2071
	u32 val;
	int i;
2072

2073 2074 2075 2076 2077 2078
	/* Set Bits 14 and 17 of AR_WA before powering on the chip. */
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

2079 2080 2081 2082
	if ((REG_READ(ah, AR_RTC_STATUS) &
	     AR_RTC_STATUS_M) == AR_RTC_STATUS_SHUTDOWN) {
		if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
			return false;
S
Sujith 已提交
2083
		}
2084 2085 2086 2087 2088 2089 2090 2091 2092
		if (!AR_SREV_9300_20_OR_LATER(ah))
			ath9k_hw_init_pll(ah, NULL);
	}
	if (AR_SREV_9100(ah))
		REG_SET_BIT(ah, AR_RTC_RESET,
			    AR_RTC_RESET_EN);

	REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
		    AR_RTC_FORCE_WAKE_EN);
2093
	if (AR_SREV_9100(ah))
S
Sujith Manoharan 已提交
2094
		mdelay(10);
2095 2096
	else
		udelay(50);
2097

2098 2099 2100 2101 2102
	for (i = POWER_UP_TIME / 50; i > 0; i--) {
		val = REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M;
		if (val == AR_RTC_STATUS_ON)
			break;
		udelay(50);
S
Sujith 已提交
2103 2104
		REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
			    AR_RTC_FORCE_WAKE_EN);
2105 2106 2107 2108 2109 2110
	}
	if (i == 0) {
		ath_err(ath9k_hw_common(ah),
			"Failed to wakeup in %uus\n",
			POWER_UP_TIME / 20);
		return false;
2111 2112
	}

2113 2114 2115
	if (ath9k_hw_mci_is_enabled(ah))
		ar9003_mci_set_power_awake(ah);

S
Sujith 已提交
2116
	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2117

S
Sujith 已提交
2118
	return true;
2119 2120
}

2121
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
2122
{
2123
	struct ath_common *common = ath9k_hw_common(ah);
2124
	int status = true;
S
Sujith 已提交
2125 2126 2127 2128 2129 2130 2131
	static const char *modes[] = {
		"AWAKE",
		"FULL-SLEEP",
		"NETWORK SLEEP",
		"UNDEFINED"
	};

2132 2133 2134
	if (ah->power_mode == mode)
		return status;

2135
	ath_dbg(common, RESET, "%s -> %s\n",
J
Joe Perches 已提交
2136
		modes[ah->power_mode], modes[mode]);
S
Sujith 已提交
2137 2138 2139

	switch (mode) {
	case ATH9K_PM_AWAKE:
2140
		status = ath9k_hw_set_power_awake(ah);
S
Sujith 已提交
2141 2142
		break;
	case ATH9K_PM_FULL_SLEEP:
S
Sujith Manoharan 已提交
2143
		if (ath9k_hw_mci_is_enabled(ah))
2144
			ar9003_mci_set_full_sleep(ah);
2145

2146
		ath9k_set_power_sleep(ah);
2147
		ah->chip_fullsleep = true;
S
Sujith 已提交
2148 2149
		break;
	case ATH9K_PM_NETWORK_SLEEP:
2150
		ath9k_set_power_network_sleep(ah);
S
Sujith 已提交
2151
		break;
2152
	default:
2153
		ath_err(common, "Unknown power mode %u\n", mode);
2154 2155
		return false;
	}
2156
	ah->power_mode = mode;
S
Sujith 已提交
2157

2158 2159 2160 2161 2162
	/*
	 * XXX: If this warning never comes up after a while then
	 * simply keep the ATH_DBG_WARN_ON_ONCE() but make
	 * ath9k_hw_setpower() return type void.
	 */
2163 2164 2165

	if (!(ah->ah_flags & AH_UNPLUGGED))
		ATH_DBG_WARN_ON_ONCE(!status);
2166

S
Sujith 已提交
2167
	return status;
2168
}
2169
EXPORT_SYMBOL(ath9k_hw_setpower);
2170

S
Sujith 已提交
2171 2172 2173 2174
/*******************/
/* Beacon Handling */
/*******************/

2175
void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
2176 2177 2178
{
	int flags = 0;

S
Sujith 已提交
2179 2180
	ENABLE_REGWRITE_BUFFER(ah);

2181
	switch (ah->opmode) {
2182
	case NL80211_IFTYPE_ADHOC:
2183 2184
		REG_SET_BIT(ah, AR_TXCFG,
			    AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
2185
	case NL80211_IFTYPE_MESH_POINT:
2186
	case NL80211_IFTYPE_AP:
2187 2188 2189 2190 2191
		REG_WRITE(ah, AR_NEXT_TBTT_TIMER, next_beacon);
		REG_WRITE(ah, AR_NEXT_DMA_BEACON_ALERT, next_beacon -
			  TU_TO_USEC(ah->config.dma_beacon_response_time));
		REG_WRITE(ah, AR_NEXT_SWBA, next_beacon -
			  TU_TO_USEC(ah->config.sw_beacon_response_time));
2192 2193 2194
		flags |=
			AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN;
		break;
2195
	default:
2196 2197
		ath_dbg(ath9k_hw_common(ah), BEACON,
			"%s: unsupported opmode: %d\n", __func__, ah->opmode);
2198 2199
		return;
		break;
2200 2201
	}

2202 2203 2204
	REG_WRITE(ah, AR_BEACON_PERIOD, beacon_period);
	REG_WRITE(ah, AR_DMA_BEACON_PERIOD, beacon_period);
	REG_WRITE(ah, AR_SWBA_PERIOD, beacon_period);
2205

S
Sujith 已提交
2206 2207
	REGWRITE_BUFFER_FLUSH(ah);

2208 2209
	REG_SET_BIT(ah, AR_TIMER_MODE, flags);
}
2210
EXPORT_SYMBOL(ath9k_hw_beaconinit);
2211

2212
void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
S
Sujith 已提交
2213
				    const struct ath9k_beacon_state *bs)
2214 2215
{
	u32 nextTbtt, beaconintval, dtimperiod, beacontimeout;
2216
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2217
	struct ath_common *common = ath9k_hw_common(ah);
2218

S
Sujith 已提交
2219 2220
	ENABLE_REGWRITE_BUFFER(ah);

2221 2222 2223
	REG_WRITE(ah, AR_NEXT_TBTT_TIMER, bs->bs_nexttbtt);
	REG_WRITE(ah, AR_BEACON_PERIOD, bs->bs_intval);
	REG_WRITE(ah, AR_DMA_BEACON_PERIOD, bs->bs_intval);
2224

S
Sujith 已提交
2225 2226
	REGWRITE_BUFFER_FLUSH(ah);

2227 2228 2229
	REG_RMW_FIELD(ah, AR_RSSI_THR,
		      AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold);

2230
	beaconintval = bs->bs_intval;
2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243

	if (bs->bs_sleepduration > beaconintval)
		beaconintval = bs->bs_sleepduration;

	dtimperiod = bs->bs_dtimperiod;
	if (bs->bs_sleepduration > dtimperiod)
		dtimperiod = bs->bs_sleepduration;

	if (beaconintval == dtimperiod)
		nextTbtt = bs->bs_nextdtim;
	else
		nextTbtt = bs->bs_nexttbtt;

2244 2245 2246 2247
	ath_dbg(common, BEACON, "next DTIM %d\n", bs->bs_nextdtim);
	ath_dbg(common, BEACON, "next beacon %d\n", nextTbtt);
	ath_dbg(common, BEACON, "beacon period %d\n", beaconintval);
	ath_dbg(common, BEACON, "DTIM period %d\n", dtimperiod);
2248

S
Sujith 已提交
2249 2250
	ENABLE_REGWRITE_BUFFER(ah);

2251 2252
	REG_WRITE(ah, AR_NEXT_DTIM, bs->bs_nextdtim - SLEEP_SLOP);
	REG_WRITE(ah, AR_NEXT_TIM, nextTbtt - SLEEP_SLOP);
2253

S
Sujith 已提交
2254 2255 2256
	REG_WRITE(ah, AR_SLEEP1,
		  SM((CAB_TIMEOUT_VAL << 3), AR_SLEEP1_CAB_TIMEOUT)
		  | AR_SLEEP1_ASSUME_DTIM);
2257

S
Sujith 已提交
2258 2259 2260 2261
	if (pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)
		beacontimeout = (BEACON_TIMEOUT_VAL << 3);
	else
		beacontimeout = MIN_BEACON_TIMEOUT_VAL;
2262

S
Sujith 已提交
2263 2264
	REG_WRITE(ah, AR_SLEEP2,
		  SM(beacontimeout, AR_SLEEP2_BEACON_TIMEOUT));
2265

2266 2267
	REG_WRITE(ah, AR_TIM_PERIOD, beaconintval);
	REG_WRITE(ah, AR_DTIM_PERIOD, dtimperiod);
2268

S
Sujith 已提交
2269 2270
	REGWRITE_BUFFER_FLUSH(ah);

S
Sujith 已提交
2271 2272 2273
	REG_SET_BIT(ah, AR_TIMER_MODE,
		    AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN |
		    AR_DTIM_TIMER_EN);
2274

2275 2276
	/* TSF Out of Range Threshold */
	REG_WRITE(ah, AR_TSFOOR_THRESHOLD, bs->bs_tsfoor_threshold);
2277
}
2278
EXPORT_SYMBOL(ath9k_hw_set_sta_beacon_timers);
2279

S
Sujith 已提交
2280 2281 2282 2283
/*******************/
/* HW Capabilities */
/*******************/

2284 2285 2286 2287 2288 2289 2290 2291 2292
static u8 fixup_chainmask(u8 chip_chainmask, u8 eeprom_chainmask)
{
	eeprom_chainmask &= chip_chainmask;
	if (eeprom_chainmask)
		return eeprom_chainmask;
	else
		return chip_chainmask;
}

Z
Zefir Kurtisi 已提交
2293 2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309
/**
 * ath9k_hw_dfs_tested - checks if DFS has been tested with used chipset
 * @ah: the atheros hardware data structure
 *
 * We enable DFS support upstream on chipsets which have passed a series
 * of tests. The testing requirements are going to be documented. Desired
 * test requirements are documented at:
 *
 * http://wireless.kernel.org/en/users/Drivers/ath9k/dfs
 *
 * Once a new chipset gets properly tested an individual commit can be used
 * to document the testing for DFS for that chipset.
 */
static bool ath9k_hw_dfs_tested(struct ath_hw *ah)
{

	switch (ah->hw_version.macVersion) {
2310 2311
	/* for temporary testing DFS with 9280 */
	case AR_SREV_VERSION_9280:
Z
Zefir Kurtisi 已提交
2312 2313
	/* AR9580 will likely be our first target to get testing on */
	case AR_SREV_VERSION_9580:
2314
		return true;
Z
Zefir Kurtisi 已提交
2315 2316 2317 2318 2319
	default:
		return false;
	}
}

2320
int ath9k_hw_fill_cap_info(struct ath_hw *ah)
2321
{
2322
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2323
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
2324
	struct ath_common *common = ath9k_hw_common(ah);
2325
	unsigned int chip_chainmask;
2326

2327
	u16 eeval;
2328
	u8 ant_div_ctl1, tx_chainmask, rx_chainmask;
2329

S
Sujith 已提交
2330
	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
2331
	regulatory->current_rd = eeval;
2332

2333
	if (ah->opmode != NL80211_IFTYPE_AP &&
2334
	    ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
2335 2336 2337 2338 2339
		if (regulatory->current_rd == 0x64 ||
		    regulatory->current_rd == 0x65)
			regulatory->current_rd += 5;
		else if (regulatory->current_rd == 0x41)
			regulatory->current_rd = 0x43;
2340 2341
		ath_dbg(common, REGULATORY, "regdomain mapped to 0x%x\n",
			regulatory->current_rd);
S
Sujith 已提交
2342
	}
2343

S
Sujith 已提交
2344
	eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
2345
	if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
2346 2347
		ath_err(common,
			"no band has been marked as supported in EEPROM\n");
2348 2349 2350
		return -EINVAL;
	}

2351 2352
	if (eeval & AR5416_OPFLAGS_11A)
		pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
2353

2354 2355
	if (eeval & AR5416_OPFLAGS_11G)
		pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
S
Sujith 已提交
2356

2357 2358 2359 2360
	if (AR_SREV_9485(ah) ||
	    AR_SREV_9285(ah) ||
	    AR_SREV_9330(ah) ||
	    AR_SREV_9565(ah))
2361
		chip_chainmask = 1;
2362 2363
	else if (AR_SREV_9462(ah))
		chip_chainmask = 3;
2364 2365 2366 2367 2368 2369 2370
	else if (!AR_SREV_9280_20_OR_LATER(ah))
		chip_chainmask = 7;
	else if (!AR_SREV_9300_20_OR_LATER(ah) || AR_SREV_9340(ah))
		chip_chainmask = 3;
	else
		chip_chainmask = 7;

S
Sujith 已提交
2371
	pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK);
2372 2373 2374 2375
	/*
	 * For AR9271 we will temporarilly uses the rx chainmax as read from
	 * the EEPROM.
	 */
2376
	if ((ah->hw_version.devid == AR5416_DEVID_PCI) &&
2377 2378 2379
	    !(eeval & AR5416_OPFLAGS_11A) &&
	    !(AR_SREV_9271(ah)))
		/* CB71: GPIO 0 is pulled down to indicate 3 rx chains */
2380
		pCap->rx_chainmask = ath9k_hw_gpio_get(ah, 0) ? 0x5 : 0x7;
2381 2382
	else if (AR_SREV_9100(ah))
		pCap->rx_chainmask = 0x7;
2383
	else
2384
		/* Use rx_chainmask from EEPROM. */
2385
		pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK);
2386

2387 2388
	pCap->tx_chainmask = fixup_chainmask(chip_chainmask, pCap->tx_chainmask);
	pCap->rx_chainmask = fixup_chainmask(chip_chainmask, pCap->rx_chainmask);
2389 2390
	ah->txchainmask = pCap->tx_chainmask;
	ah->rxchainmask = pCap->rx_chainmask;
2391

2392
	ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;
2393

2394 2395 2396 2397
	/* enable key search for every frame in an aggregate */
	if (AR_SREV_9300_20_OR_LATER(ah))
		ah->misc_mode |= AR_PCU_ALWAYS_PERFORM_KEYSEARCH;

2398 2399
	common->crypt_caps |= ATH_CRYPT_CAP_CIPHER_AESCCM;

2400
	if (ah->hw_version.devid != AR2427_DEVID_PCIE)
S
Sujith 已提交
2401 2402 2403
		pCap->hw_caps |= ATH9K_HW_CAP_HT;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_HT;
2404

2405 2406
	if (AR_SREV_9271(ah))
		pCap->num_gpio_pins = AR9271_NUM_GPIO;
S
Sujith 已提交
2407 2408
	else if (AR_DEVID_7010(ah))
		pCap->num_gpio_pins = AR7010_NUM_GPIO;
2409 2410 2411 2412
	else if (AR_SREV_9300_20_OR_LATER(ah))
		pCap->num_gpio_pins = AR9300_NUM_GPIO;
	else if (AR_SREV_9287_11_OR_LATER(ah))
		pCap->num_gpio_pins = AR9287_NUM_GPIO;
2413
	else if (AR_SREV_9285_12_OR_LATER(ah))
2414
		pCap->num_gpio_pins = AR9285_NUM_GPIO;
2415
	else if (AR_SREV_9280_20_OR_LATER(ah))
S
Sujith 已提交
2416 2417 2418
		pCap->num_gpio_pins = AR928X_NUM_GPIO;
	else
		pCap->num_gpio_pins = AR_NUM_GPIO;
2419

2420
	if (AR_SREV_9160_10_OR_LATER(ah) || AR_SREV_9100(ah))
S
Sujith 已提交
2421
		pCap->rts_aggr_limit = ATH_AMPDU_LIMIT_MAX;
2422
	else
S
Sujith 已提交
2423
		pCap->rts_aggr_limit = (8 * 1024);
2424

J
Johannes Berg 已提交
2425
#ifdef CONFIG_ATH9K_RFKILL
2426 2427 2428 2429 2430 2431
	ah->rfsilent = ah->eep_ops->get_eeprom(ah, EEP_RF_SILENT);
	if (ah->rfsilent & EEP_RFSILENT_ENABLED) {
		ah->rfkill_gpio =
			MS(ah->rfsilent, EEP_RFSILENT_GPIO_SEL);
		ah->rfkill_polarity =
			MS(ah->rfsilent, EEP_RFSILENT_POLARITY);
S
Sujith 已提交
2432 2433

		pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
2434
	}
S
Sujith 已提交
2435
#endif
2436
	if (AR_SREV_9271(ah) || AR_SREV_9300_20_OR_LATER(ah))
2437 2438 2439
		pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
2440

2441
	if (AR_SREV_9280(ah) || AR_SREV_9285(ah))
S
Sujith 已提交
2442 2443 2444
		pCap->hw_caps &= ~ATH9K_HW_CAP_4KB_SPLITTRANS;
	else
		pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
2445

2446
	if (AR_SREV_9300_20_OR_LATER(ah)) {
2447
		pCap->hw_caps |= ATH9K_HW_CAP_EDMA | ATH9K_HW_CAP_FASTCLOCK;
2448
		if (!AR_SREV_9330(ah) && !AR_SREV_9485(ah) && !AR_SREV_9565(ah))
2449 2450
			pCap->hw_caps |= ATH9K_HW_CAP_LDPC;

2451 2452 2453
		pCap->rx_hp_qdepth = ATH9K_HW_RX_HP_QDEPTH;
		pCap->rx_lp_qdepth = ATH9K_HW_RX_LP_QDEPTH;
		pCap->rx_status_len = sizeof(struct ar9003_rxs);
2454
		pCap->tx_desc_len = sizeof(struct ar9003_txc);
2455
		pCap->txs_len = sizeof(struct ar9003_txs);
2456 2457
	} else {
		pCap->tx_desc_len = sizeof(struct ath_desc);
2458
		if (AR_SREV_9280_20(ah))
2459
			pCap->hw_caps |= ATH9K_HW_CAP_FASTCLOCK;
2460
	}
2461

2462 2463 2464
	if (AR_SREV_9300_20_OR_LATER(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED;

2465 2466 2467
	if (AR_SREV_9300_20_OR_LATER(ah))
		ah->ent_mode = REG_READ(ah, AR_ENT_OTP);

2468
	if (AR_SREV_9287_11_OR_LATER(ah) || AR_SREV_9271(ah))
2469 2470
		pCap->hw_caps |= ATH9K_HW_CAP_SGI_20;

2471
	if (AR_SREV_9285(ah)) {
2472 2473 2474
		if (ah->eep_ops->get_eeprom(ah, EEP_MODAL_VER) >= 3) {
			ant_div_ctl1 =
				ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
2475
			if ((ant_div_ctl1 & 0x1) && ((ant_div_ctl1 >> 3) & 0x1)) {
2476
				pCap->hw_caps |= ATH9K_HW_CAP_ANT_DIV_COMB;
2477 2478
				ath_info(common, "Enable LNA combining\n");
			}
2479
		}
2480 2481
	}

2482 2483 2484 2485 2486
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		if (ah->eep_ops->get_eeprom(ah, EEP_CHAIN_MASK_REDUCE))
			pCap->hw_caps |= ATH9K_HW_CAP_APM;
	}

2487
	if (AR_SREV_9330(ah) || AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
2488
		ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
2489
		if ((ant_div_ctl1 >> 0x6) == 0x3) {
2490
			pCap->hw_caps |= ATH9K_HW_CAP_ANT_DIV_COMB;
2491 2492
			ath_info(common, "Enable LNA combining\n");
		}
2493
	}
2494

Z
Zefir Kurtisi 已提交
2495 2496 2497
	if (ath9k_hw_dfs_tested(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_DFS;

2498 2499 2500 2501 2502 2503 2504 2505 2506 2507 2508 2509
	tx_chainmask = pCap->tx_chainmask;
	rx_chainmask = pCap->rx_chainmask;
	while (tx_chainmask || rx_chainmask) {
		if (tx_chainmask & BIT(0))
			pCap->max_txchains++;
		if (rx_chainmask & BIT(0))
			pCap->max_rxchains++;

		tx_chainmask >>= 1;
		rx_chainmask >>= 1;
	}

2510
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
2511 2512 2513
		if (!(ah->ent_mode & AR_ENT_OTP_49GHZ_DISABLE))
			pCap->hw_caps |= ATH9K_HW_CAP_MCI;

2514
		if (AR_SREV_9462_20_OR_LATER(ah))
2515 2516 2517
			pCap->hw_caps |= ATH9K_HW_CAP_RTT;
	}

2518 2519
	if (AR_SREV_9462(ah))
		pCap->hw_caps |= ATH9K_HW_WOW_DEVICE_CAPABLE;
2520

S
Sujith Manoharan 已提交
2521 2522 2523 2524
	if (AR_SREV_9300_20_OR_LATER(ah) &&
	    ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
			pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;

2525
	return 0;
2526 2527
}

S
Sujith 已提交
2528 2529 2530
/****************************/
/* GPIO / RFKILL / Antennae */
/****************************/
2531

2532
static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah,
S
Sujith 已提交
2533 2534 2535 2536
					 u32 gpio, u32 type)
{
	int addr;
	u32 gpio_shift, tmp;
2537

S
Sujith 已提交
2538 2539 2540 2541 2542 2543
	if (gpio > 11)
		addr = AR_GPIO_OUTPUT_MUX3;
	else if (gpio > 5)
		addr = AR_GPIO_OUTPUT_MUX2;
	else
		addr = AR_GPIO_OUTPUT_MUX1;
2544

S
Sujith 已提交
2545
	gpio_shift = (gpio % 6) * 5;
2546

S
Sujith 已提交
2547 2548 2549 2550
	if (AR_SREV_9280_20_OR_LATER(ah)
	    || (addr != AR_GPIO_OUTPUT_MUX1)) {
		REG_RMW(ah, addr, (type << gpio_shift),
			(0x1f << gpio_shift));
2551
	} else {
S
Sujith 已提交
2552 2553 2554 2555 2556
		tmp = REG_READ(ah, addr);
		tmp = ((tmp & 0x1F0) << 1) | (tmp & ~0x1F0);
		tmp &= ~(0x1f << gpio_shift);
		tmp |= (type << gpio_shift);
		REG_WRITE(ah, addr, tmp);
2557 2558 2559
	}
}

2560
void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio)
2561
{
S
Sujith 已提交
2562
	u32 gpio_shift;
2563

2564
	BUG_ON(gpio >= ah->caps.num_gpio_pins);
2565

S
Sujith 已提交
2566 2567 2568 2569 2570 2571 2572
	if (AR_DEVID_7010(ah)) {
		gpio_shift = gpio;
		REG_RMW(ah, AR7010_GPIO_OE,
			(AR7010_GPIO_OE_AS_INPUT << gpio_shift),
			(AR7010_GPIO_OE_MASK << gpio_shift));
		return;
	}
2573

S
Sujith 已提交
2574
	gpio_shift = gpio << 1;
S
Sujith 已提交
2575 2576 2577 2578
	REG_RMW(ah,
		AR_GPIO_OE_OUT,
		(AR_GPIO_OE_OUT_DRV_NO << gpio_shift),
		(AR_GPIO_OE_OUT_DRV << gpio_shift));
2579
}
2580
EXPORT_SYMBOL(ath9k_hw_cfg_gpio_input);
2581

2582
u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)
2583
{
2584 2585 2586
#define MS_REG_READ(x, y) \
	(MS(REG_READ(ah, AR_GPIO_IN_OUT), x##_GPIO_IN_VAL) & (AR_GPIO_BIT(y)))

2587
	if (gpio >= ah->caps.num_gpio_pins)
S
Sujith 已提交
2588
		return 0xffffffff;
2589

S
Sujith 已提交
2590 2591 2592 2593 2594
	if (AR_DEVID_7010(ah)) {
		u32 val;
		val = REG_READ(ah, AR7010_GPIO_IN);
		return (MS(val, AR7010_GPIO_IN_VAL) & AR_GPIO_BIT(gpio)) == 0;
	} else if (AR_SREV_9300_20_OR_LATER(ah))
2595 2596
		return (MS(REG_READ(ah, AR_GPIO_IN), AR9300_GPIO_IN_VAL) &
			AR_GPIO_BIT(gpio)) != 0;
2597
	else if (AR_SREV_9271(ah))
2598
		return MS_REG_READ(AR9271, gpio) != 0;
2599
	else if (AR_SREV_9287_11_OR_LATER(ah))
2600
		return MS_REG_READ(AR9287, gpio) != 0;
2601
	else if (AR_SREV_9285_12_OR_LATER(ah))
2602
		return MS_REG_READ(AR9285, gpio) != 0;
2603
	else if (AR_SREV_9280_20_OR_LATER(ah))
2604 2605 2606
		return MS_REG_READ(AR928X, gpio) != 0;
	else
		return MS_REG_READ(AR, gpio) != 0;
2607
}
2608
EXPORT_SYMBOL(ath9k_hw_gpio_get);
2609

2610
void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
S
Sujith 已提交
2611
			 u32 ah_signal_type)
2612
{
S
Sujith 已提交
2613
	u32 gpio_shift;
2614

S
Sujith 已提交
2615 2616 2617 2618 2619 2620 2621
	if (AR_DEVID_7010(ah)) {
		gpio_shift = gpio;
		REG_RMW(ah, AR7010_GPIO_OE,
			(AR7010_GPIO_OE_AS_OUTPUT << gpio_shift),
			(AR7010_GPIO_OE_MASK << gpio_shift));
		return;
	}
2622

S
Sujith 已提交
2623
	ath9k_hw_gpio_cfg_output_mux(ah, gpio, ah_signal_type);
S
Sujith 已提交
2624 2625 2626 2627 2628
	gpio_shift = 2 * gpio;
	REG_RMW(ah,
		AR_GPIO_OE_OUT,
		(AR_GPIO_OE_OUT_DRV_ALL << gpio_shift),
		(AR_GPIO_OE_OUT_DRV << gpio_shift));
2629
}
2630
EXPORT_SYMBOL(ath9k_hw_cfg_output);
2631

2632
void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)
2633
{
S
Sujith 已提交
2634 2635 2636 2637 2638 2639 2640
	if (AR_DEVID_7010(ah)) {
		val = val ? 0 : 1;
		REG_RMW(ah, AR7010_GPIO_OUT, ((val&1) << gpio),
			AR_GPIO_BIT(gpio));
		return;
	}

2641 2642 2643
	if (AR_SREV_9271(ah))
		val = ~val;

S
Sujith 已提交
2644 2645
	REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio),
		AR_GPIO_BIT(gpio));
2646
}
2647
EXPORT_SYMBOL(ath9k_hw_set_gpio);
2648

2649
void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna)
2650
{
S
Sujith 已提交
2651
	REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7));
2652
}
2653
EXPORT_SYMBOL(ath9k_hw_setantenna);
2654

S
Sujith 已提交
2655 2656 2657 2658
/*********************/
/* General Operation */
/*********************/

2659
u32 ath9k_hw_getrxfilter(struct ath_hw *ah)
2660
{
S
Sujith 已提交
2661 2662
	u32 bits = REG_READ(ah, AR_RX_FILTER);
	u32 phybits = REG_READ(ah, AR_PHY_ERR);
2663

S
Sujith 已提交
2664 2665 2666 2667
	if (phybits & AR_PHY_ERR_RADAR)
		bits |= ATH9K_RX_FILTER_PHYRADAR;
	if (phybits & (AR_PHY_ERR_OFDM_TIMING | AR_PHY_ERR_CCK_TIMING))
		bits |= ATH9K_RX_FILTER_PHYERR;
S
Sujith 已提交
2668

S
Sujith 已提交
2669
	return bits;
2670
}
2671
EXPORT_SYMBOL(ath9k_hw_getrxfilter);
2672

2673
void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
2674
{
S
Sujith 已提交
2675
	u32 phybits;
2676

S
Sujith 已提交
2677 2678
	ENABLE_REGWRITE_BUFFER(ah);

2679
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
2680 2681
		bits |= ATH9K_RX_FILTER_CONTROL_WRAPPER;

S
Sujith 已提交
2682 2683
	REG_WRITE(ah, AR_RX_FILTER, bits);

S
Sujith 已提交
2684 2685 2686 2687 2688 2689
	phybits = 0;
	if (bits & ATH9K_RX_FILTER_PHYRADAR)
		phybits |= AR_PHY_ERR_RADAR;
	if (bits & ATH9K_RX_FILTER_PHYERR)
		phybits |= AR_PHY_ERR_OFDM_TIMING | AR_PHY_ERR_CCK_TIMING;
	REG_WRITE(ah, AR_PHY_ERR, phybits);
2690

S
Sujith 已提交
2691
	if (phybits)
2692
		REG_SET_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2693
	else
2694
		REG_CLR_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2695 2696

	REGWRITE_BUFFER_FLUSH(ah);
S
Sujith 已提交
2697
}
2698
EXPORT_SYMBOL(ath9k_hw_setrxfilter);
2699

2700
bool ath9k_hw_phy_disable(struct ath_hw *ah)
S
Sujith 已提交
2701
{
2702 2703 2704
	if (ath9k_hw_mci_is_enabled(ah))
		ar9003_mci_bt_gain_ctrl(ah);

2705 2706 2707 2708
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
		return false;

	ath9k_hw_init_pll(ah, NULL);
2709
	ah->htc_reset_init = true;
2710
	return true;
S
Sujith 已提交
2711
}
2712
EXPORT_SYMBOL(ath9k_hw_phy_disable);
2713

2714
bool ath9k_hw_disable(struct ath_hw *ah)
S
Sujith 已提交
2715
{
2716
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
S
Sujith 已提交
2717
		return false;
2718

2719 2720 2721 2722 2723
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_COLD))
		return false;

	ath9k_hw_init_pll(ah, NULL);
	return true;
2724
}
2725
EXPORT_SYMBOL(ath9k_hw_disable);
2726

2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738
static int get_antenna_gain(struct ath_hw *ah, struct ath9k_channel *chan)
{
	enum eeprom_param gain_param;

	if (IS_CHAN_2GHZ(chan))
		gain_param = EEP_ANTENNA_GAIN_2G;
	else
		gain_param = EEP_ANTENNA_GAIN_5G;

	return ah->eep_ops->get_eeprom(ah, gain_param);
}

2739 2740
void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan,
			    bool test)
2741 2742 2743 2744 2745 2746 2747 2748 2749 2750 2751 2752 2753 2754 2755 2756 2757 2758 2759 2760
{
	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
	struct ieee80211_channel *channel;
	int chan_pwr, new_pwr, max_gain;
	int ant_gain, ant_reduction = 0;

	if (!chan)
		return;

	channel = chan->chan;
	chan_pwr = min_t(int, channel->max_power * 2, MAX_RATE_POWER);
	new_pwr = min_t(int, chan_pwr, reg->power_limit);
	max_gain = chan_pwr - new_pwr + channel->max_antenna_gain * 2;

	ant_gain = get_antenna_gain(ah, chan);
	if (ant_gain > max_gain)
		ant_reduction = ant_gain - max_gain;

	ah->eep_ops->set_txpower(ah, chan,
				 ath9k_regd_get_ctl(reg, chan),
2761
				 ant_reduction, new_pwr, test);
2762 2763
}

2764
void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
2765
{
2766
	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
2767
	struct ath9k_channel *chan = ah->curchan;
2768
	struct ieee80211_channel *channel = chan->chan;
2769

D
Dan Carpenter 已提交
2770
	reg->power_limit = min_t(u32, limit, MAX_RATE_POWER);
2771
	if (test)
2772
		channel->max_power = MAX_RATE_POWER / 2;
2773

2774
	ath9k_hw_apply_txpower(ah, chan, test);
2775

2776 2777
	if (test)
		channel->max_power = DIV_ROUND_UP(reg->max_power_level, 2);
2778
}
2779
EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
2780

2781
void ath9k_hw_setopmode(struct ath_hw *ah)
2782
{
2783
	ath9k_hw_set_operating_mode(ah, ah->opmode);
2784
}
2785
EXPORT_SYMBOL(ath9k_hw_setopmode);
2786

2787
void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1)
2788
{
S
Sujith 已提交
2789 2790
	REG_WRITE(ah, AR_MCAST_FIL0, filter0);
	REG_WRITE(ah, AR_MCAST_FIL1, filter1);
2791
}
2792
EXPORT_SYMBOL(ath9k_hw_setmcastfilter);
2793

2794
void ath9k_hw_write_associd(struct ath_hw *ah)
2795
{
2796 2797 2798 2799 2800
	struct ath_common *common = ath9k_hw_common(ah);

	REG_WRITE(ah, AR_BSS_ID0, get_unaligned_le32(common->curbssid));
	REG_WRITE(ah, AR_BSS_ID1, get_unaligned_le16(common->curbssid + 4) |
		  ((common->curaid & 0x3fff) << AR_BSS_ID1_AID_S));
2801
}
2802
EXPORT_SYMBOL(ath9k_hw_write_associd);
2803

2804 2805
#define ATH9K_MAX_TSF_READ 10

2806
u64 ath9k_hw_gettsf64(struct ath_hw *ah)
2807
{
2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818
	u32 tsf_lower, tsf_upper1, tsf_upper2;
	int i;

	tsf_upper1 = REG_READ(ah, AR_TSF_U32);
	for (i = 0; i < ATH9K_MAX_TSF_READ; i++) {
		tsf_lower = REG_READ(ah, AR_TSF_L32);
		tsf_upper2 = REG_READ(ah, AR_TSF_U32);
		if (tsf_upper2 == tsf_upper1)
			break;
		tsf_upper1 = tsf_upper2;
	}
2819

2820
	WARN_ON( i == ATH9K_MAX_TSF_READ );
2821

2822
	return (((u64)tsf_upper1 << 32) | tsf_lower);
S
Sujith 已提交
2823
}
2824
EXPORT_SYMBOL(ath9k_hw_gettsf64);
2825

2826
void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64)
2827 2828
{
	REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff);
A
Alina Friedrichsen 已提交
2829
	REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
2830
}
2831
EXPORT_SYMBOL(ath9k_hw_settsf64);
2832

2833
void ath9k_hw_reset_tsf(struct ath_hw *ah)
S
Sujith 已提交
2834
{
2835 2836
	if (!ath9k_hw_wait(ah, AR_SLP32_MODE, AR_SLP32_TSF_WRITE_STATUS, 0,
			   AH_TSF_WRITE_TIMEOUT))
2837
		ath_dbg(ath9k_hw_common(ah), RESET,
J
Joe Perches 已提交
2838
			"AR_SLP32_TSF_WRITE_STATUS limit exceeded\n");
2839

S
Sujith 已提交
2840 2841
	REG_WRITE(ah, AR_RESET_TSF, AR_RESET_TSF_ONCE);
}
2842
EXPORT_SYMBOL(ath9k_hw_reset_tsf);
2843

2844
void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set)
S
Sujith 已提交
2845
{
2846
	if (set)
2847
		ah->misc_mode |= AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2848
	else
2849
		ah->misc_mode &= ~AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2850
}
2851
EXPORT_SYMBOL(ath9k_hw_set_tsfadjust);
2852

2853
void ath9k_hw_set11nmac2040(struct ath_hw *ah, struct ath9k_channel *chan)
S
Sujith 已提交
2854 2855 2856
{
	u32 macmode;

2857
	if (IS_CHAN_HT40(chan) && !ah->config.cwm_ignore_extcca)
S
Sujith 已提交
2858 2859 2860
		macmode = AR_2040_JOINED_RX_CLEAR;
	else
		macmode = 0;
2861

S
Sujith 已提交
2862
	REG_WRITE(ah, AR_2040_MODE, macmode);
2863
}
2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 2880 2881 2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895

/* HW Generic timers configuration */

static const struct ath_gen_timer_configuration gen_tmr_configuration[] =
{
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP_TIMER, AR_NDP_PERIOD, AR_TIMER_MODE, 0x0080},
	{AR_NEXT_NDP2_TIMER, AR_NDP2_PERIOD, AR_NDP2_TIMER_MODE, 0x0001},
	{AR_NEXT_NDP2_TIMER + 1*4, AR_NDP2_PERIOD + 1*4,
				AR_NDP2_TIMER_MODE, 0x0002},
	{AR_NEXT_NDP2_TIMER + 2*4, AR_NDP2_PERIOD + 2*4,
				AR_NDP2_TIMER_MODE, 0x0004},
	{AR_NEXT_NDP2_TIMER + 3*4, AR_NDP2_PERIOD + 3*4,
				AR_NDP2_TIMER_MODE, 0x0008},
	{AR_NEXT_NDP2_TIMER + 4*4, AR_NDP2_PERIOD + 4*4,
				AR_NDP2_TIMER_MODE, 0x0010},
	{AR_NEXT_NDP2_TIMER + 5*4, AR_NDP2_PERIOD + 5*4,
				AR_NDP2_TIMER_MODE, 0x0020},
	{AR_NEXT_NDP2_TIMER + 6*4, AR_NDP2_PERIOD + 6*4,
				AR_NDP2_TIMER_MODE, 0x0040},
	{AR_NEXT_NDP2_TIMER + 7*4, AR_NDP2_PERIOD + 7*4,
				AR_NDP2_TIMER_MODE, 0x0080}
};

/* HW generic timer primitives */

2896
u32 ath9k_hw_gettsf32(struct ath_hw *ah)
2897 2898 2899
{
	return REG_READ(ah, AR_TSF_L32);
}
2900
EXPORT_SYMBOL(ath9k_hw_gettsf32);
2901 2902 2903 2904 2905 2906 2907 2908 2909 2910

struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah,
					  void (*trigger)(void *),
					  void (*overflow)(void *),
					  void *arg,
					  u8 timer_index)
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
	struct ath_gen_timer *timer;

2911 2912 2913 2914
	if ((timer_index < AR_FIRST_NDP_TIMER) ||
		(timer_index >= ATH_MAX_GEN_TIMER))
		return NULL;

2915
	timer = kzalloc(sizeof(struct ath_gen_timer), GFP_KERNEL);
2916
	if (timer == NULL)
2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927
		return NULL;

	/* allocate a hardware generic timer slot */
	timer_table->timers[timer_index] = timer;
	timer->index = timer_index;
	timer->trigger = trigger;
	timer->overflow = overflow;
	timer->arg = arg;

	return timer;
}
2928
EXPORT_SYMBOL(ath_gen_timer_alloc);
2929

2930 2931
void ath9k_hw_gen_timer_start(struct ath_hw *ah,
			      struct ath_gen_timer *timer,
2932
			      u32 timer_next,
2933
			      u32 timer_period)
2934 2935
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2936
	u32 mask = 0;
2937

2938
	timer_table->timer_mask |= BIT(timer->index);
2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949

	/*
	 * Program generic timer registers
	 */
	REG_WRITE(ah, gen_tmr_configuration[timer->index].next_addr,
		 timer_next);
	REG_WRITE(ah, gen_tmr_configuration[timer->index].period_addr,
		  timer_period);
	REG_SET_BIT(ah, gen_tmr_configuration[timer->index].mode_addr,
		    gen_tmr_configuration[timer->index].mode_mask);

2950
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
2951
		/*
2952
		 * Starting from AR9462, each generic timer can select which tsf
2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963
		 * to use. But we still follow the old rule, 0 - 7 use tsf and
		 * 8 - 15  use tsf2.
		 */
		if ((timer->index < AR_GEN_TIMER_BANK_1_LEN))
			REG_CLR_BIT(ah, AR_MAC_PCU_GEN_TIMER_TSF_SEL,
				       (1 << timer->index));
		else
			REG_SET_BIT(ah, AR_MAC_PCU_GEN_TIMER_TSF_SEL,
				       (1 << timer->index));
	}

2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976
	if (timer->trigger)
		mask |= SM(AR_GENTMR_BIT(timer->index),
			   AR_IMR_S5_GENTIMER_TRIG);
	if (timer->overflow)
		mask |= SM(AR_GENTMR_BIT(timer->index),
			   AR_IMR_S5_GENTIMER_THRESH);

	REG_SET_BIT(ah, AR_IMR_S5, mask);

	if ((ah->imask & ATH9K_INT_GENTIMER) == 0) {
		ah->imask |= ATH9K_INT_GENTIMER;
		ath9k_hw_set_interrupts(ah);
	}
2977
}
2978
EXPORT_SYMBOL(ath9k_hw_gen_timer_start);
2979

2980
void ath9k_hw_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
2981 2982 2983 2984 2985 2986 2987
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;

	/* Clear generic timer enable bits. */
	REG_CLR_BIT(ah, gen_tmr_configuration[timer->index].mode_addr,
			gen_tmr_configuration[timer->index].mode_mask);

2988 2989 2990 2991 2992 2993 2994 2995 2996 2997
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
		/*
		 * Need to switch back to TSF if it was using TSF2.
		 */
		if ((timer->index >= AR_GEN_TIMER_BANK_1_LEN)) {
			REG_CLR_BIT(ah, AR_MAC_PCU_GEN_TIMER_TSF_SEL,
				    (1 << timer->index));
		}
	}

2998 2999 3000 3001 3002
	/* Disable both trigger and thresh interrupt masks */
	REG_CLR_BIT(ah, AR_IMR_S5,
		(SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_THRESH) |
		SM(AR_GENTMR_BIT(timer->index), AR_IMR_S5_GENTIMER_TRIG)));

3003 3004 3005 3006 3007 3008
	timer_table->timer_mask &= ~BIT(timer->index);

	if (timer_table->timer_mask == 0) {
		ah->imask &= ~ATH9K_INT_GENTIMER;
		ath9k_hw_set_interrupts(ah);
	}
3009
}
3010
EXPORT_SYMBOL(ath9k_hw_gen_timer_stop);
3011 3012 3013 3014 3015 3016 3017 3018 3019

void ath_gen_timer_free(struct ath_hw *ah, struct ath_gen_timer *timer)
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;

	/* free the hardware generic timer slot */
	timer_table->timers[timer->index] = NULL;
	kfree(timer);
}
3020
EXPORT_SYMBOL(ath_gen_timer_free);
3021 3022 3023 3024 3025 3026 3027 3028

/*
 * Generic Timer Interrupts handling
 */
void ath_gen_timer_isr(struct ath_hw *ah)
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
	struct ath_gen_timer *timer;
3029 3030
	unsigned long trigger_mask, thresh_mask;
	unsigned int index;
3031 3032 3033 3034

	/* get hardware generic timer interrupt status */
	trigger_mask = ah->intr_gen_timer_trigger;
	thresh_mask = ah->intr_gen_timer_thresh;
3035 3036
	trigger_mask &= timer_table->timer_mask;
	thresh_mask &= timer_table->timer_mask;
3037

3038
	for_each_set_bit(index, &thresh_mask, ARRAY_SIZE(timer_table->timers)) {
3039
		timer = timer_table->timers[index];
3040 3041 3042 3043
		if (!timer)
		    continue;
		if (!timer->overflow)
		    continue;
3044 3045

		trigger_mask &= ~BIT(index);
3046 3047 3048
		timer->overflow(timer->arg);
	}

3049
	for_each_set_bit(index, &trigger_mask, ARRAY_SIZE(timer_table->timers)) {
3050
		timer = timer_table->timers[index];
3051 3052 3053 3054
		if (!timer)
		    continue;
		if (!timer->trigger)
		    continue;
3055 3056 3057
		timer->trigger(timer->arg);
	}
}
3058
EXPORT_SYMBOL(ath_gen_timer_isr);
3059

3060 3061 3062 3063
/********/
/* HTC  */
/********/

3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075
static struct {
	u32 version;
	const char * name;
} ath_mac_bb_names[] = {
	/* Devices with external radios */
	{ AR_SREV_VERSION_5416_PCI,	"5416" },
	{ AR_SREV_VERSION_5416_PCIE,	"5418" },
	{ AR_SREV_VERSION_9100,		"9100" },
	{ AR_SREV_VERSION_9160,		"9160" },
	/* Single-chip solutions */
	{ AR_SREV_VERSION_9280,		"9280" },
	{ AR_SREV_VERSION_9285,		"9285" },
3076 3077
	{ AR_SREV_VERSION_9287,         "9287" },
	{ AR_SREV_VERSION_9271,         "9271" },
3078
	{ AR_SREV_VERSION_9300,         "9300" },
3079
	{ AR_SREV_VERSION_9330,         "9330" },
3080
	{ AR_SREV_VERSION_9340,		"9340" },
3081
	{ AR_SREV_VERSION_9485,         "9485" },
3082
	{ AR_SREV_VERSION_9462,         "9462" },
3083
	{ AR_SREV_VERSION_9550,         "9550" },
3084
	{ AR_SREV_VERSION_9565,         "9565" },
3085
	{ AR_SREV_VERSION_9531,         "9531" },
3086 3087 3088 3089 3090 3091 3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102
};

/* For devices with external radios */
static struct {
	u16 version;
	const char * name;
} ath_rf_names[] = {
	{ 0,				"5133" },
	{ AR_RAD5133_SREV_MAJOR,	"5133" },
	{ AR_RAD5122_SREV_MAJOR,	"5122" },
	{ AR_RAD2133_SREV_MAJOR,	"2133" },
	{ AR_RAD2122_SREV_MAJOR,	"2122" }
};

/*
 * Return the MAC/BB name. "????" is returned if the MAC/BB is unknown.
 */
3103
static const char *ath9k_hw_mac_bb_name(u32 mac_bb_version)
3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119
{
	int i;

	for (i=0; i<ARRAY_SIZE(ath_mac_bb_names); i++) {
		if (ath_mac_bb_names[i].version == mac_bb_version) {
			return ath_mac_bb_names[i].name;
		}
	}

	return "????";
}

/*
 * Return the RF name. "????" is returned if the RF is unknown.
 * Used for devices with external radios.
 */
3120
static const char *ath9k_hw_rf_name(u16 rf_version)
3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131
{
	int i;

	for (i=0; i<ARRAY_SIZE(ath_rf_names); i++) {
		if (ath_rf_names[i].version == rf_version) {
			return ath_rf_names[i].name;
		}
	}

	return "????";
}
3132 3133 3134 3135 3136 3137

void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len)
{
	int used;

	/* chipsets >= AR9280 are single-chip */
3138
	if (AR_SREV_9280_20_OR_LATER(ah)) {
3139 3140 3141 3142
		used = scnprintf(hw_name, len,
				 "Atheros AR%s Rev:%x",
				 ath9k_hw_mac_bb_name(ah->hw_version.macVersion),
				 ah->hw_version.macRev);
3143 3144
	}
	else {
3145 3146 3147 3148 3149 3150 3151
		used = scnprintf(hw_name, len,
				 "Atheros AR%s MAC/BB Rev:%x AR%s RF Rev:%x",
				 ath9k_hw_mac_bb_name(ah->hw_version.macVersion),
				 ah->hw_version.macRev,
				 ath9k_hw_rf_name((ah->hw_version.analog5GhzRev
						  & AR_RADIO_SREV_MAJOR)),
				 ah->hw_version.phyRev);
3152 3153 3154 3155 3156
	}

	hw_name[used] = '\0';
}
EXPORT_SYMBOL(ath9k_hw_name);