hw.c 80.0 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 "rc.h"
27
#include "ar9003_mac.h"
28
#include "ar9003_mci.h"
29
#include "ar9003_phy.h"
30 31
#include "debug.h"
#include "ath9k.h"
32

33
static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);
34

35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
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");

static int __init ath9k_init(void)
{
	return 0;
}
module_init(ath9k_init);

static void __exit ath9k_exit(void)
{
	return;
}
module_exit(ath9k_exit);

52 53 54 55 56 57 58
/* Private hardware callbacks */

static void ath9k_hw_init_cal_settings(struct ath_hw *ah)
{
	ath9k_hw_private_ops(ah)->init_cal_settings(ah);
}

59 60 61 62 63 64
static u32 ath9k_hw_compute_pll_control(struct ath_hw *ah,
					struct ath9k_channel *chan)
{
	return ath9k_hw_private_ops(ah)->compute_pll_control(ah, chan);
}

65 66 67 68 69 70 71 72
static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah)
{
	if (!ath9k_hw_private_ops(ah)->init_mode_gain_regs)
		return;

	ath9k_hw_private_ops(ah)->init_mode_gain_regs(ah);
}

73 74 75 76 77 78 79 80 81
static void ath9k_hw_ani_cache_ini_regs(struct ath_hw *ah)
{
	/* You will not have this callback if using the old ANI */
	if (!ath9k_hw_private_ops(ah)->ani_cache_ini_regs)
		return;

	ath9k_hw_private_ops(ah)->ani_cache_ini_regs(ah);
}

S
Sujith 已提交
82 83 84
/********************/
/* Helper Functions */
/********************/
85

86 87 88 89 90
#ifdef CONFIG_ATH9K_DEBUGFS

#endif


91
static void ath9k_hw_set_clockrate(struct ath_hw *ah)
S
Sujith 已提交
92
{
93
	struct ath_common *common = ath9k_hw_common(ah);
94
	struct ath9k_channel *chan = ah->curchan;
95
	unsigned int clockrate;
96

97 98 99
	/* 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;
100
	else if (!chan) /* should really check for CCK instead */
101
		clockrate = ATH9K_CLOCK_RATE_CCK;
102
	else if (IS_CHAN_2GHZ(chan))
103 104 105
		clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM;
	else if (ah->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)
		clockrate = ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM;
106
	else
107 108
		clockrate = ATH9K_CLOCK_RATE_5GHZ_OFDM;

109 110 111
	if (chan) {
		if (IS_CHAN_HT40(chan))
			clockrate *= 2;
112
		if (IS_CHAN_HALF_RATE(chan))
113
			clockrate /= 2;
114
		if (IS_CHAN_QUARTER_RATE(chan))
115 116 117
			clockrate /= 4;
	}

118
	common->clockrate = clockrate;
S
Sujith 已提交
119 120
}

121
static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
S
Sujith 已提交
122
{
123
	struct ath_common *common = ath9k_hw_common(ah);
124

125
	return usecs * common->clockrate;
S
Sujith 已提交
126
}
127

S
Sujith 已提交
128
bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
129 130 131
{
	int i;

S
Sujith 已提交
132 133 134
	BUG_ON(timeout < AH_TIME_QUANTUM);

	for (i = 0; i < (timeout / AH_TIME_QUANTUM); i++) {
135 136 137 138 139
		if ((REG_READ(ah, reg) & mask) == val)
			return true;

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

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

S
Sujith 已提交
145
	return false;
146
}
147
EXPORT_SYMBOL(ath9k_hw_wait);
148

149 150 151
void ath9k_hw_synth_delay(struct ath_hw *ah, struct ath9k_channel *chan,
			  int hw_delay)
{
F
Felix Fietkau 已提交
152
	hw_delay /= 10;
153 154 155 156 157 158 159 160 161

	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);
}

162
void ath9k_hw_write_array(struct ath_hw *ah, const struct ar5416IniArray *array,
163 164 165 166 167 168 169 170 171 172 173 174 175
			  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);
}

176 177 178 179 180 181 182 183 184 185 186 187
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;
}

188
u16 ath9k_hw_computetxtime(struct ath_hw *ah,
189
			   u8 phy, int kbps,
S
Sujith 已提交
190 191
			   u32 frameLen, u16 rateix,
			   bool shortPreamble)
192
{
S
Sujith 已提交
193
	u32 bitsPerSymbol, numBits, numSymbols, phyTime, txTime;
194

S
Sujith 已提交
195 196
	if (kbps == 0)
		return 0;
197

198
	switch (phy) {
S
Sujith 已提交
199
	case WLAN_RC_PHY_CCK:
S
Sujith 已提交
200
		phyTime = CCK_PREAMBLE_BITS + CCK_PLCP_BITS;
201
		if (shortPreamble)
S
Sujith 已提交
202 203 204 205
			phyTime >>= 1;
		numBits = frameLen << 3;
		txTime = CCK_SIFS_TIME + phyTime + ((numBits * 1000) / kbps);
		break;
S
Sujith 已提交
206
	case WLAN_RC_PHY_OFDM:
207
		if (ah->curchan && IS_CHAN_QUARTER_RATE(ah->curchan)) {
S
Sujith 已提交
208 209 210 211 212 213
			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);
214 215
		} else if (ah->curchan &&
			   IS_CHAN_HALF_RATE(ah->curchan)) {
S
Sujith 已提交
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230
			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:
231 232
		ath_err(ath9k_hw_common(ah),
			"Unknown phy %u (rate ix %u)\n", phy, rateix);
S
Sujith 已提交
233 234 235
		txTime = 0;
		break;
	}
236

S
Sujith 已提交
237 238
	return txTime;
}
239
EXPORT_SYMBOL(ath9k_hw_computetxtime);
240

241
void ath9k_hw_get_channel_centers(struct ath_hw *ah,
S
Sujith 已提交
242 243
				  struct ath9k_channel *chan,
				  struct chan_centers *centers)
244
{
S
Sujith 已提交
245
	int8_t extoff;
246

S
Sujith 已提交
247 248 249 250
	if (!IS_CHAN_HT40(chan)) {
		centers->ctl_center = centers->ext_center =
			centers->synth_center = chan->channel;
		return;
251 252
	}

253
	if (IS_CHAN_HT40PLUS(chan)) {
S
Sujith 已提交
254 255 256 257 258 259 260 261
		centers->synth_center =
			chan->channel + HT40_CHANNEL_CENTER_SHIFT;
		extoff = 1;
	} else {
		centers->synth_center =
			chan->channel - HT40_CHANNEL_CENTER_SHIFT;
		extoff = -1;
	}
262

S
Sujith 已提交
263 264
	centers->ctl_center =
		centers->synth_center - (extoff * HT40_CHANNEL_CENTER_SHIFT);
265
	/* 25 MHz spacing is supported by hw but not on upper layers */
S
Sujith 已提交
266
	centers->ext_center =
267
		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
268 269
}

S
Sujith 已提交
270 271 272 273
/******************/
/* Chip Revisions */
/******************/

274
static void ath9k_hw_read_revisions(struct ath_hw *ah)
275
{
S
Sujith 已提交
276
	u32 val;
277

278 279 280 281
	switch (ah->hw_version.devid) {
	case AR5416_AR9100_DEVID:
		ah->hw_version.macVersion = AR_SREV_VERSION_9100;
		break;
282 283 284 285 286 287 288 289 290
	case AR9300_DEVID_AR9330:
		ah->hw_version.macVersion = AR_SREV_VERSION_9330;
		if (ah->get_mac_revision) {
			ah->hw_version.macRev = ah->get_mac_revision();
		} else {
			val = REG_READ(ah, AR_SREV);
			ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
		}
		return;
291 292 293 294 295
	case AR9300_DEVID_AR9340:
		ah->hw_version.macVersion = AR_SREV_VERSION_9340;
		val = REG_READ(ah, AR_SREV);
		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
		return;
G
Gabor Juhos 已提交
296 297 298
	case AR9300_DEVID_QCA955X:
		ah->hw_version.macVersion = AR_SREV_VERSION_9550;
		return;
299 300
	}

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

S
Sujith 已提交
303 304
	if (val == 0xFF) {
		val = REG_READ(ah, AR_SREV);
305 306 307
		ah->hw_version.macVersion =
			(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
308

309
		if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
310 311 312 313
			ah->is_pciexpress = true;
		else
			ah->is_pciexpress = (val &
					     AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
S
Sujith 已提交
314 315
	} else {
		if (!AR_SREV_9100(ah))
316
			ah->hw_version.macVersion = MS(val, AR_SREV_VERSION);
317

318
		ah->hw_version.macRev = val & AR_SREV_REVISION;
319

320
		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
321
			ah->is_pciexpress = true;
S
Sujith 已提交
322
	}
323 324
}

S
Sujith 已提交
325 326 327 328
/************************************/
/* HW Attach, Detach, Init Routines */
/************************************/

329
static void ath9k_hw_disablepcie(struct ath_hw *ah)
330
{
331
	if (!AR_SREV_5416(ah))
S
Sujith 已提交
332
		return;
333

S
Sujith 已提交
334 335 336 337 338 339 340 341 342
	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);
343

S
Sujith 已提交
344
	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
345 346
}

347
/* This should work for all families including legacy */
348
static bool ath9k_hw_chip_test(struct ath_hw *ah)
349
{
350
	struct ath_common *common = ath9k_hw_common(ah);
351
	u32 regAddr[2] = { AR_STA_ID0 };
S
Sujith 已提交
352
	u32 regHold[2];
J
Joe Perches 已提交
353 354 355
	static const u32 patternData[4] = {
		0x55555555, 0xaaaaaaaa, 0x66666666, 0x99999999
	};
356
	int i, j, loop_max;
357

358 359 360 361 362 363 364
	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 已提交
365 366
		u32 addr = regAddr[i];
		u32 wrData, rdData;
367

S
Sujith 已提交
368 369 370 371 372 373
		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) {
374 375 376
				ath_err(common,
					"address test failed addr: 0x%08x - wr:0x%08x != rd:0x%08x\n",
					addr, wrData, rdData);
S
Sujith 已提交
377 378 379 380 381 382 383 384
				return false;
			}
		}
		for (j = 0; j < 4; j++) {
			wrData = patternData[j];
			REG_WRITE(ah, addr, wrData);
			rdData = REG_READ(ah, addr);
			if (wrData != rdData) {
385 386 387
				ath_err(common,
					"address test failed addr: 0x%08x - wr:0x%08x != rd:0x%08x\n",
					addr, wrData, rdData);
S
Sujith 已提交
388 389
				return false;
			}
390
		}
S
Sujith 已提交
391
		REG_WRITE(ah, regAddr[i], regHold[i]);
392
	}
S
Sujith 已提交
393
	udelay(100);
394

395 396 397
	return true;
}

398
static void ath9k_hw_init_config(struct ath_hw *ah)
S
Sujith 已提交
399
{
400 401
	ah->config.dma_beacon_response_time = 1;
	ah->config.sw_beacon_response_time = 6;
402 403 404
	ah->config.ack_6mb = 0x0;
	ah->config.cwm_ignore_extcca = 0;
	ah->config.analog_shiftreg = 1;
405

S
Sujith 已提交
406
	ah->config.rx_intr_mitigation = true;
407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424

	/*
	 * 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)
425
		ah->config.serialize_regmode = SER_REG_MODE_AUTO;
426 427
}

428
static void ath9k_hw_init_defaults(struct ath_hw *ah)
429
{
430 431 432 433 434
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);

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

435 436
	ah->hw_version.magic = AR5416_MAGIC;
	ah->hw_version.subvendorid = 0;
437

438 439 440
	ah->sta_id1_defaults =
		AR_STA_ID1_CRPT_MIC_ENABLE |
		AR_STA_ID1_MCAST_KSRCH;
441 442
	if (AR_SREV_9100(ah))
		ah->sta_id1_defaults |= AR_STA_ID1_AR9100_BA_FIX;
443
	ah->slottime = ATH9K_SLOT_TIME_9;
444
	ah->globaltxtimeout = (u32) -1;
445
	ah->power_mode = ATH9K_PM_UNDEFINED;
446
	ah->htc_reset_init = true;
447 448
}

449
static int ath9k_hw_init_macaddr(struct ath_hw *ah)
450
{
451
	struct ath_common *common = ath9k_hw_common(ah);
452 453 454
	u32 sum;
	int i;
	u16 eeval;
J
Joe Perches 已提交
455
	static const u32 EEP_MAC[] = { EEP_MAC_LSW, EEP_MAC_MID, EEP_MAC_MSW };
456 457 458

	sum = 0;
	for (i = 0; i < 3; i++) {
459
		eeval = ah->eep_ops->get_eeprom(ah, EEP_MAC[i]);
460
		sum += eeval;
461 462
		common->macaddr[2 * i] = eeval >> 8;
		common->macaddr[2 * i + 1] = eeval & 0xff;
463
	}
S
Sujith 已提交
464
	if (sum == 0 || sum == 0xffff * 3)
465 466 467 468 469
		return -EADDRNOTAVAIL;

	return 0;
}

470
static int ath9k_hw_post_init(struct ath_hw *ah)
471
{
S
Sujith Manoharan 已提交
472
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
473
	int ecode;
474

S
Sujith Manoharan 已提交
475
	if (common->bus_ops->ath_bus_type != ATH_USB) {
S
Sujith 已提交
476 477 478
		if (!ath9k_hw_chip_test(ah))
			return -ENODEV;
	}
479

480 481 482 483 484
	if (!AR_SREV_9300_20_OR_LATER(ah)) {
		ecode = ar9002_hw_rf_claim(ah);
		if (ecode != 0)
			return ecode;
	}
485

486
	ecode = ath9k_hw_eeprom_init(ah);
S
Sujith 已提交
487 488
	if (ecode != 0)
		return ecode;
489

490
	ath_dbg(ath9k_hw_common(ah), CONFIG, "Eeprom VER: %d, REV: %d\n",
J
Joe Perches 已提交
491 492
		ah->eep_ops->get_eeprom_ver(ah),
		ah->eep_ops->get_eeprom_rev(ah));
493

494
	ath9k_hw_ani_init(ah);
495

496 497 498 499
	/*
	 * EEPROM needs to be initialized before we do this.
	 * This is required for regulatory compliance.
	 */
500
	if (AR_SREV_9300_20_OR_LATER(ah)) {
501 502
		u16 regdmn = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
		if ((regdmn & 0xF0) == CTL_FCC) {
503 504
			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;
505 506 507
		}
	}

508 509 510
	return 0;
}

511
static int ath9k_hw_attach_ops(struct ath_hw *ah)
512
{
513 514 515 516 517
	if (!AR_SREV_9300_20_OR_LATER(ah))
		return ar9002_hw_attach_ops(ah);

	ar9003_hw_attach_ops(ah);
	return 0;
518 519
}

520 521
/* Called for all hardware families */
static int __ath9k_hw_init(struct ath_hw *ah)
522
{
523
	struct ath_common *common = ath9k_hw_common(ah);
524
	int r = 0;
525

526 527
	ath9k_hw_read_revisions(ah);

528 529 530 531 532
	/*
	 * 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.
	 */
533 534 535 536 537
	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);
	}
538

539
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
540
		ath_err(common, "Couldn't reset chip\n");
541
		return -EIO;
542 543
	}

544 545 546 547 548
	if (AR_SREV_9565(ah)) {
		ah->WARegVal |= AR_WA_BIT22;
		REG_WRITE(ah, AR_WA, ah->WARegVal);
	}

549 550 551
	ath9k_hw_init_defaults(ah);
	ath9k_hw_init_config(ah);

552 553 554
	r = ath9k_hw_attach_ops(ah);
	if (r)
		return r;
555

556
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
557
		ath_err(common, "Couldn't wakeup chip\n");
558
		return -EIO;
559 560
	}

561
	if (NR_CPUS > 1 && ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
562
		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
563
		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah) || AR_SREV_9287(ah)) &&
564
		     !ah->is_pciexpress)) {
565 566 567 568 569 570 571 572
			ah->config.serialize_regmode =
				SER_REG_MODE_ON;
		} else {
			ah->config.serialize_regmode =
				SER_REG_MODE_OFF;
		}
	}

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

576 577 578 579 580
	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;

581 582 583 584 585 586 587 588 589 590
	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:
591
	case AR_SREV_VERSION_9330:
592
	case AR_SREV_VERSION_9485:
593
	case AR_SREV_VERSION_9340:
594
	case AR_SREV_VERSION_9462:
G
Gabor Juhos 已提交
595
	case AR_SREV_VERSION_9550:
596
	case AR_SREV_VERSION_9565:
597 598
		break;
	default:
599 600 601
		ath_err(common,
			"Mac Chip Rev 0x%02x.%x is not supported by this driver\n",
			ah->hw_version.macVersion, ah->hw_version.macRev);
602
		return -EOPNOTSUPP;
603 604
	}

605
	if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) ||
606
	    AR_SREV_9330(ah) || AR_SREV_9550(ah))
607 608
		ah->is_pciexpress = false;

609 610 611 612
	ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
	ath9k_hw_init_cal_settings(ah);

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

616
	if (!ah->is_pciexpress)
617 618
		ath9k_hw_disablepcie(ah);

619
	r = ath9k_hw_post_init(ah);
620
	if (r)
621
		return r;
622 623

	ath9k_hw_init_mode_gain_regs(ah);
624 625 626 627
	r = ath9k_hw_fill_cap_info(ah);
	if (r)
		return r;

628 629
	r = ath9k_hw_init_macaddr(ah);
	if (r) {
630
		ath_err(common, "Failed to initialize MAC address\n");
631
		return r;
632 633
	}

634
	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
635
		ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
S
Sujith 已提交
636
	else
637
		ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
638

639 640 641 642
	if (AR_SREV_9330(ah))
		ah->bb_watchdog_timeout_ms = 85;
	else
		ah->bb_watchdog_timeout_ms = 25;
643

644 645
	common->state = ATH_HW_INITIALIZED;

646
	return 0;
647 648
}

649
int ath9k_hw_init(struct ath_hw *ah)
650
{
651 652
	int ret;
	struct ath_common *common = ath9k_hw_common(ah);
653

654
	/* These are all the AR5008/AR9001/AR9002/AR9003 hardware family of chipsets */
655 656 657 658 659 660 661 662
	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:
663 664
	case AR9287_DEVID_PCI:
	case AR9287_DEVID_PCIE:
665
	case AR2427_DEVID_PCIE:
666
	case AR9300_DEVID_PCIE:
667
	case AR9300_DEVID_AR9485_PCIE:
G
Gabor Juhos 已提交
668
	case AR9300_DEVID_AR9330:
669
	case AR9300_DEVID_AR9340:
G
Gabor Juhos 已提交
670
	case AR9300_DEVID_QCA955X:
L
Luis R. Rodriguez 已提交
671
	case AR9300_DEVID_AR9580:
672
	case AR9300_DEVID_AR9462:
673
	case AR9485_DEVID_AR1111:
674
	case AR9300_DEVID_AR9565:
675 676 677 678
		break;
	default:
		if (common->bus_ops->ath_bus_type == ATH_USB)
			break;
679 680
		ath_err(common, "Hardware device ID 0x%04x not supported\n",
			ah->hw_version.devid);
681 682
		return -EOPNOTSUPP;
	}
683

684 685
	ret = __ath9k_hw_init(ah);
	if (ret) {
686 687 688
		ath_err(common,
			"Unable to initialize hardware; initialization status: %d\n",
			ret);
689 690
		return ret;
	}
691

692
	return 0;
693
}
694
EXPORT_SYMBOL(ath9k_hw_init);
695

696
static void ath9k_hw_init_qos(struct ath_hw *ah)
697
{
S
Sujith 已提交
698 699
	ENABLE_REGWRITE_BUFFER(ah);

S
Sujith 已提交
700 701
	REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa);
	REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210);
702

S
Sujith 已提交
703 704 705 706 707 708 709 710 711 712
	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 已提交
713 714

	REGWRITE_BUFFER_FLUSH(ah);
715 716
}

717
u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)
718
{
719 720 721
	struct ath_common *common = ath9k_hw_common(ah);
	int i = 0;

722 723 724
	REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
	udelay(100);
	REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
725

726 727
	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0) {

728
		udelay(100);
729

730 731 732 733 734 735 736 737
		if (WARN_ON_ONCE(i >= 100)) {
			ath_err(common, "PLL4 meaurement not done\n");
			break;
		}

		i++;
	}

738
	return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;
739 740 741
}
EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc);

742
static void ath9k_hw_init_pll(struct ath_hw *ah,
S
Sujith 已提交
743
			      struct ath9k_channel *chan)
744
{
745 746
	u32 pll;

747
	if (AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
748 749 750 751 752 753 754
		/* 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);
755

756 757 758 759 760 761
		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);
762 763

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
764 765 766
			      AR_CH0_BB_DPLL2_OUTDIV, 0x1);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_LOCAL_PLL, 0x1);
767
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
768
			      AR_CH0_BB_DPLL2_EN_NEGTRIG, 0x1);
769

770
		/* program BB PLL phase_shift to 0x6 */
771
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
772 773 774 775
			      AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x6);

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_PLL_PWD, 0x0);
776
		udelay(1000);
777 778 779 780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809
	} 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);

		REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c);
		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);
810
	} else if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {
811 812 813 814 815 816 817 818 819 820 821 822 823
		u32 regval, pll2_divint, pll2_divfrac, refdiv;

		REG_WRITE(ah, AR_RTC_PLL_CONTROL, 0x1142c);
		udelay(1000);

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

		if (ah->is_clk_25mhz) {
			pll2_divint = 0x54;
			pll2_divfrac = 0x1eb85;
			refdiv = 3;
		} else {
824 825 826 827 828 829 830 831 832
			if (AR_SREV_9340(ah)) {
				pll2_divint = 88;
				pll2_divfrac = 0;
				refdiv = 5;
			} else {
				pll2_divint = 0x11;
				pll2_divfrac = 0x26666;
				refdiv = 1;
			}
833 834 835 836 837 838 839 840 841 842 843 844
		}

		regval = REG_READ(ah, AR_PHY_PLL_MODE);
		regval |= (0x1 << 16);
		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);
845 846 847 848 849 850
		if (AR_SREV_9340(ah))
			regval = (regval & 0x80071fff) | (0x1 << 30) |
				 (0x1 << 13) | (0x4 << 26) | (0x18 << 19);
		else
			regval = (regval & 0x80071fff) | (0x3 << 30) |
				 (0x1 << 13) | (0x4 << 26) | (0x60 << 19);
851 852 853 854
		REG_WRITE(ah, AR_PHY_PLL_MODE, regval);
		REG_WRITE(ah, AR_PHY_PLL_MODE,
			  REG_READ(ah, AR_PHY_PLL_MODE) & 0xfffeffff);
		udelay(1000);
855
	}
856 857

	pll = ath9k_hw_compute_pll_control(ah, chan);
858 859
	if (AR_SREV_9565(ah))
		pll |= 0x40000;
860
	REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
861

862 863
	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah) ||
	    AR_SREV_9550(ah))
864 865
		udelay(1000);

866 867
	/* Switch the core clock for ar9271 to 117Mhz */
	if (AR_SREV_9271(ah)) {
868 869
		udelay(500);
		REG_WRITE(ah, 0x50040, 0x304);
870 871
	}

S
Sujith 已提交
872 873 874
	udelay(RTC_PLL_SETTLE_DELAY);

	REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK);
875

876
	if (AR_SREV_9340(ah) || AR_SREV_9550(ah)) {
877 878 879 880 881 882 883 884 885 886 887
		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);
	}
888 889
}

890
static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
891
					  enum nl80211_iftype opmode)
892
{
893
	u32 sync_default = AR_INTR_SYNC_DEFAULT;
894
	u32 imr_reg = AR_IMR_TXERR |
S
Sujith 已提交
895 896 897 898
		AR_IMR_TXURN |
		AR_IMR_RXERR |
		AR_IMR_RXORN |
		AR_IMR_BCNMISC;
899

900
	if (AR_SREV_9340(ah) || AR_SREV_9550(ah))
901 902
		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;

903 904 905 906 907 908
	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;
909

910 911 912 913 914 915
	} else {
		if (ah->config.rx_intr_mitigation)
			imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
		else
			imr_reg |= AR_IMR_RXOK;
	}
916

917 918 919 920
	if (ah->config.tx_intr_mitigation)
		imr_reg |= AR_IMR_TXINTM | AR_IMR_TXMINTR;
	else
		imr_reg |= AR_IMR_TXOK;
921

S
Sujith 已提交
922 923
	ENABLE_REGWRITE_BUFFER(ah);

924
	REG_WRITE(ah, AR_IMR, imr_reg);
925 926
	ah->imrs2_reg |= AR_IMR_S2_GTT;
	REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
927

S
Sujith 已提交
928 929
	if (!AR_SREV_9100(ah)) {
		REG_WRITE(ah, AR_INTR_SYNC_CAUSE, 0xFFFFFFFF);
930
		REG_WRITE(ah, AR_INTR_SYNC_ENABLE, sync_default);
S
Sujith 已提交
931 932
		REG_WRITE(ah, AR_INTR_SYNC_MASK, 0);
	}
933

S
Sujith 已提交
934 935
	REGWRITE_BUFFER_FLUSH(ah);

936 937 938 939 940 941
	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);
	}
942 943
}

944 945 946 947 948 949 950
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);
}

951
static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us)
952
{
953 954 955
	u32 val = ath9k_hw_mac_to_clks(ah, us);
	val = min(val, (u32) 0xFFFF);
	REG_WRITE(ah, AR_D_GBL_IFS_SLOT, val);
956 957
}

958
static void ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us)
959
{
960 961 962 963 964 965 966 967 968 969
	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);
}

static void ath9k_hw_set_cts_timeout(struct ath_hw *ah, u32 us)
{
	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);
970
}
S
Sujith 已提交
971

972
static bool ath9k_hw_set_global_txtimeout(struct ath_hw *ah, u32 tu)
973 974
{
	if (tu > 0xFFFF) {
975 976
		ath_dbg(ath9k_hw_common(ah), XMIT, "bad global tx timeout %u\n",
			tu);
977
		ah->globaltxtimeout = (u32) -1;
978 979 980
		return false;
	} else {
		REG_RMW_FIELD(ah, AR_GTXTO, AR_GTXTO_TIMEOUT_LIMIT, tu);
981
		ah->globaltxtimeout = tu;
982 983 984 985
		return true;
	}
}

986
void ath9k_hw_init_global_settings(struct ath_hw *ah)
987
{
988 989
	struct ath_common *common = ath9k_hw_common(ah);
	const struct ath9k_channel *chan = ah->curchan;
990
	int acktimeout, ctstimeout, ack_offset = 0;
991
	int slottime;
992
	int sifstime;
993 994
	int rx_lat = 0, tx_lat = 0, eifs = 0;
	u32 reg;
995

996
	ath_dbg(ath9k_hw_common(ah), RESET, "ah->misc_mode 0x%x\n",
J
Joe Perches 已提交
997
		ah->misc_mode);
998

999 1000 1001
	if (!chan)
		return;

1002
	if (ah->misc_mode != 0)
1003
		REG_SET_BIT(ah, AR_PCU_MISC, ah->misc_mode);
1004

1005 1006 1007 1008
	if (IS_CHAN_A_FAST_CLOCK(ah, chan))
		rx_lat = 41;
	else
		rx_lat = 37;
1009 1010
	tx_lat = 54;

1011 1012 1013 1014 1015
	if (IS_CHAN_5GHZ(chan))
		sifstime = 16;
	else
		sifstime = 10;

1016 1017 1018 1019 1020 1021 1022
	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;

1023
		sifstime = 32;
1024
		ack_offset = 16;
1025 1026 1027
		slottime = 13;
	} else if (IS_CHAN_QUARTER_RATE(chan)) {
		eifs = 340;
1028
		rx_lat = (rx_lat * 4) - 1;
1029 1030 1031 1032
		tx_lat *= 4;
		if (IS_CHAN_A_FAST_CLOCK(ah, chan))
		    tx_lat += 22;

1033
		sifstime = 64;
1034
		ack_offset = 32;
1035 1036
		slottime = 21;
	} else {
1037 1038 1039 1040 1041 1042 1043 1044
		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);
		}
1045 1046 1047 1048 1049
		rx_lat = MS(reg, AR_USEC_RX_LAT);
		tx_lat = MS(reg, AR_USEC_TX_LAT);

		slottime = ah->slottime;
	}
1050

1051
	/* As defined by IEEE 802.11-2007 17.3.8.6 */
1052 1053
	slottime += 3 * ah->coverage_class;
	acktimeout = slottime + sifstime + ack_offset;
1054
	ctstimeout = acktimeout;
1055 1056 1057

	/*
	 * Workaround for early ACK timeouts, add an offset to match the
1058
	 * initval's 64us ack timeout value. Use 48us for the CTS timeout.
1059 1060 1061 1062
	 * 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.
	 */
1063
	if (IS_CHAN_2GHZ(chan) &&
1064
	    !IS_CHAN_HALF_RATE(chan) && !IS_CHAN_QUARTER_RATE(chan)) {
1065
		acktimeout += 64 - sifstime - ah->slottime;
1066 1067 1068
		ctstimeout += 48 - sifstime - ah->slottime;
	}

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

	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 已提交
1083
}
1084
EXPORT_SYMBOL(ath9k_hw_init_global_settings);
S
Sujith 已提交
1085

S
Sujith 已提交
1086
void ath9k_hw_deinit(struct ath_hw *ah)
S
Sujith 已提交
1087
{
1088 1089
	struct ath_common *common = ath9k_hw_common(ah);

S
Sujith 已提交
1090
	if (common->state < ATH_HW_INITIALIZED)
1091
		return;
1092

1093
	ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP);
S
Sujith 已提交
1094
}
S
Sujith 已提交
1095
EXPORT_SYMBOL(ath9k_hw_deinit);
S
Sujith 已提交
1096 1097 1098 1099 1100

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

1101
u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)
1102 1103 1104
{
	u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band);

F
Felix Fietkau 已提交
1105
	if (IS_CHAN_2GHZ(chan))
1106 1107 1108 1109 1110 1111 1112
		ctl |= CTL_11G;
	else
		ctl |= CTL_11A;

	return ctl;
}

S
Sujith 已提交
1113 1114 1115 1116
/****************************************/
/* Reset and Channel Switching Routines */
/****************************************/

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

S
Sujith 已提交
1122 1123
	ENABLE_REGWRITE_BUFFER(ah);

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

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

S
Sujith 已提交
1135 1136
	REGWRITE_BUFFER_FLUSH(ah);

1137 1138 1139 1140 1141
	/*
	 * 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.
	 */
1142 1143
	if (!AR_SREV_9300_20_OR_LATER(ah))
		REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level);
S
Sujith 已提交
1144

S
Sujith 已提交
1145
	ENABLE_REGWRITE_BUFFER(ah);
S
Sujith 已提交
1146

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

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

1157 1158 1159 1160 1161 1162 1163 1164
	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);
	}

1165 1166 1167 1168
	/*
	 * reduce the number of usable entries in PCU TXBUF to avoid
	 * wrap around issues.
	 */
S
Sujith 已提交
1169
	if (AR_SREV_9285(ah)) {
1170 1171 1172 1173
		/* 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
		 */
1174 1175 1176 1177 1178 1179
		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 已提交
1180
	}
1181

1182 1183 1184
	if (!AR_SREV_9271(ah))
		REG_WRITE(ah, AR_PCU_TXBUF_CTRL, txbuf_size);

S
Sujith 已提交
1185 1186
	REGWRITE_BUFFER_FLUSH(ah);

1187 1188
	if (AR_SREV_9300_20_OR_LATER(ah))
		ath9k_hw_reset_txstatus_ring(ah);
S
Sujith 已提交
1189 1190
}

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

	switch (opmode) {
1197
	case NL80211_IFTYPE_ADHOC:
1198
		set |= AR_STA_ID1_ADHOC;
S
Sujith 已提交
1199
		REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1200
		break;
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 1333 1334 1335
	if (AR_SREV_9300_20_OR_LATER(ah))
		udelay(50);
	else if (AR_SREV_9100(ah))
		udelay(10000);
	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 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590 1591 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604
static bool ath9k_hw_check_dcs(u32 dma_dbg, u32 num_dcu_states,
			       int *hang_state, int *hang_pos)
{
	static u32 dcu_chain_state[] = {5, 6, 9}; /* DCU chain stuck states */
	u32 chain_state, dcs_pos, i;

	for (dcs_pos = 0; dcs_pos < num_dcu_states; dcs_pos++) {
		chain_state = (dma_dbg >> (5 * dcs_pos)) & 0x1f;
		for (i = 0; i < 3; i++) {
			if (chain_state == dcu_chain_state[i]) {
				*hang_state = chain_state;
				*hang_pos = dcs_pos;
				return true;
			}
		}
	}
	return false;
}

#define DCU_COMPLETE_STATE        1
#define DCU_COMPLETE_STATE_MASK 0x3
#define NUM_STATUS_READS         50
static bool ath9k_hw_detect_mac_hang(struct ath_hw *ah)
{
	u32 chain_state, comp_state, dcs_reg = AR_DMADBG_4;
	u32 i, hang_pos, hang_state, num_state = 6;

	comp_state = REG_READ(ah, AR_DMADBG_6);

	if ((comp_state & DCU_COMPLETE_STATE_MASK) != DCU_COMPLETE_STATE) {
		ath_dbg(ath9k_hw_common(ah), RESET,
			"MAC Hang signature not found at DCU complete\n");
		return false;
	}

	chain_state = REG_READ(ah, dcs_reg);
	if (ath9k_hw_check_dcs(chain_state, num_state, &hang_state, &hang_pos))
		goto hang_check_iter;

	dcs_reg = AR_DMADBG_5;
	num_state = 4;
	chain_state = REG_READ(ah, dcs_reg);
	if (ath9k_hw_check_dcs(chain_state, num_state, &hang_state, &hang_pos))
		goto hang_check_iter;

	ath_dbg(ath9k_hw_common(ah), RESET,
		"MAC Hang signature 1 not found\n");
	return false;

hang_check_iter:
	ath_dbg(ath9k_hw_common(ah), RESET,
		"DCU registers: chain %08x complete %08x Hang: state %d pos %d\n",
		chain_state, comp_state, hang_state, hang_pos);

	for (i = 0; i < NUM_STATUS_READS; i++) {
		chain_state = REG_READ(ah, dcs_reg);
		chain_state = (chain_state >> (5 * hang_pos)) & 0x1f;
		comp_state = REG_READ(ah, AR_DMADBG_6);

		if (((comp_state & DCU_COMPLETE_STATE_MASK) !=
					DCU_COMPLETE_STATE) ||
		    (chain_state != hang_state))
			return false;
	}

	ath_dbg(ath9k_hw_common(ah), RESET, "MAC Hang signature 1 found\n");

	return true;
}

1605 1606 1607 1608 1609 1610 1611 1612 1613 1614 1615 1616 1617
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);

1618
bool ath9k_hw_check_alive(struct ath_hw *ah)
J
Johannes Berg 已提交
1619
{
1620 1621 1622
	int count = 50;
	u32 reg;

1623 1624 1625
	if (AR_SREV_9300(ah))
		return !ath9k_hw_detect_mac_hang(ah);

1626
	if (AR_SREV_9285_12_OR_LATER(ah))
1627 1628 1629 1630
		return true;

	do {
		reg = REG_READ(ah, AR_OBS_BUS_1);
J
Johannes Berg 已提交
1631

1632 1633 1634 1635 1636 1637 1638 1639 1640 1641 1642 1643
		if ((reg & 0x7E7FFFEF) == 0x00702400)
			continue;

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

1645
	return false;
J
Johannes Berg 已提交
1646
}
1647
EXPORT_SYMBOL(ath9k_hw_check_alive);
J
Johannes Berg 已提交
1648

1649 1650 1651 1652 1653 1654 1655 1656 1657 1658 1659 1660 1661 1662 1663 1664 1665 1666 1667 1668 1669 1670 1671 1672 1673 1674 1675 1676
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);

1677
	REG_RMW(ah, AR_STA_ID1, macStaId1
1678 1679
		  | AR_STA_ID1_RTS_USE_DEF
		  | (ah->config.ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
1680 1681
		  | ah->sta_id1_defaults,
		  ~AR_STA_ID1_SADH_MASK);
1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735 1736 1737 1738 1739 1740 1741 1742 1743 1744 1745
	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) ||
			 AR_SREV_9550(ah))
			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
	}
}

1746 1747 1748 1749 1750 1751 1752
/*
 * 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);
1753
	struct ath9k_hw_capabilities *pCap = &ah->caps;
1754 1755 1756 1757 1758 1759 1760 1761 1762 1763 1764 1765 1766 1767
	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;

1768 1769 1770 1771
	if ((ah->curchan->channelFlags | chan->channelFlags) &
	    (CHANNEL_HALF | CHANNEL_QUARTER))
		goto fail;

1772
	/*
F
Felix Fietkau 已提交
1773
	 * If cross-band fcc is not supoprted, bail out if channelFlags differ.
1774
	 */
F
Felix Fietkau 已提交
1775
	if (!(pCap->hw_caps & ATH9K_HW_CAP_FCC_BAND_SWITCH) &&
1776
	    ((chan->channelFlags ^ ah->curchan->channelFlags) & ~CHANNEL_HT))
F
Felix Fietkau 已提交
1777
		goto fail;
1778 1779 1780 1781 1782 1783 1784 1785

	if (!ath9k_hw_check_alive(ah))
		goto fail;

	/*
	 * For AR9462, make sure that calibration data for
	 * re-using are present.
	 */
S
Sujith Manoharan 已提交
1786
	if (AR_SREV_9462(ah) && (ah->caldata &&
1787 1788 1789
				 (!test_bit(TXIQCAL_DONE, &ah->caldata->cal_flags) ||
				  !test_bit(TXCLCAL_DONE, &ah->caldata->cal_flags) ||
				  !test_bit(RTT_DONE, &ah->caldata->cal_flags))))
1790 1791 1792 1793 1794 1795 1796 1797 1798
		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 已提交
1799
	if (ath9k_hw_mci_is_enabled(ah))
1800
		ar9003_mci_2g5g_switch(ah, false);
1801

1802 1803 1804
	ath9k_hw_loadnf(ah, ah->curchan);
	ath9k_hw_start_nfcal(ah, true);

1805 1806 1807 1808 1809 1810 1811 1812
	if (AR_SREV_9271(ah))
		ar9002_hw_load_ani_reg(ah, chan);

	return 0;
fail:
	return -EINVAL;
}

1813
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1814
		   struct ath9k_hw_cal_data *caldata, bool fastcc)
1815
{
1816
	struct ath_common *common = ath9k_hw_common(ah);
1817
	struct timespec ts;
1818 1819 1820
	u32 saveLedState;
	u32 saveDefAntenna;
	u32 macStaId1;
S
Sujith 已提交
1821
	u64 tsf = 0;
1822
	s64 usec = 0;
1823
	int r;
1824
	bool start_mci_reset = false;
1825 1826
	bool save_fullsleep = ah->chip_fullsleep;

S
Sujith Manoharan 已提交
1827
	if (ath9k_hw_mci_is_enabled(ah)) {
1828 1829 1830
		start_mci_reset = ar9003_mci_start_reset(ah, chan);
		if (start_mci_reset)
			return 0;
1831 1832
	}

1833
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
1834
		return -EIO;
1835

1836 1837
	if (ah->curchan && !ah->chip_fullsleep)
		ath9k_hw_getnf(ah, ah->curchan);
1838

1839
	ah->caldata = caldata;
1840
	if (caldata && (chan->channel != caldata->channel ||
F
Felix Fietkau 已提交
1841
			chan->channelFlags != caldata->channelFlags)) {
1842 1843 1844
		/* Operating channel changed, reset channel calibration data */
		memset(caldata, 0, sizeof(*caldata));
		ath9k_init_nfcal_hist_buffer(ah, chan);
1845
	} else if (caldata) {
1846
		clear_bit(PAPRD_PACKET_SENT, &caldata->cal_flags);
1847
	}
1848
	ah->noise = ath9k_hw_getchan_noise(ah, chan, chan->noisefloor);
1849

1850 1851 1852 1853
	if (fastcc) {
		r = ath9k_hw_do_fastcc(ah, chan);
		if (!r)
			return r;
1854 1855
	}

S
Sujith Manoharan 已提交
1856
	if (ath9k_hw_mci_is_enabled(ah))
1857
		ar9003_mci_stop_bt(ah, save_fullsleep);
1858

1859 1860 1861 1862 1863 1864
	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;

1865 1866 1867 1868
	/* Save TSF before chip reset, a cold reset clears it */
	tsf = ath9k_hw_gettsf64(ah);
	getrawmonotonic(&ts);
	usec = ts.tv_sec * 1000 + ts.tv_nsec / 1000;
S
Sujith 已提交
1869

1870 1871 1872 1873 1874 1875
	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);

1876 1877
	ah->paprd_table_write_done = false;

1878
	/* Only required on the first reset */
1879 1880 1881 1882 1883 1884 1885
	if (AR_SREV_9271(ah) && ah->htc_reset_init) {
		REG_WRITE(ah,
			  AR9271_RESET_POWER_DOWN_CONTROL,
			  AR9271_RADIO_RF_RST);
		udelay(50);
	}

1886
	if (!ath9k_hw_chip_reset(ah, chan)) {
1887
		ath_err(common, "Chip reset failed\n");
1888
		return -EINVAL;
1889 1890
	}

1891
	/* Only required on the first reset */
1892 1893 1894 1895 1896 1897 1898 1899
	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 已提交
1900
	/* Restore TSF */
1901 1902 1903
	getrawmonotonic(&ts);
	usec = ts.tv_sec * 1000 + ts.tv_nsec / 1000 - usec;
	ath9k_hw_settsf64(ah, tsf + usec);
S
Sujith 已提交
1904

1905
	if (AR_SREV_9280_20_OR_LATER(ah))
1906
		REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
1907

S
Sujith 已提交
1908 1909 1910
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ar9002_hw_enable_async_fifo(ah);

L
Luis R. Rodriguez 已提交
1911
	r = ath9k_hw_process_ini(ah, chan);
1912 1913
	if (r)
		return r;
1914

1915 1916
	ath9k_hw_set_rfmode(ah, chan);

S
Sujith Manoharan 已提交
1917
	if (ath9k_hw_mci_is_enabled(ah))
1918 1919
		ar9003_mci_reset(ah, false, IS_CHAN_2GHZ(chan), save_fullsleep);

1920 1921 1922 1923 1924 1925 1926 1927 1928 1929 1930
	/*
	 * 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);
	}

1931
	ath9k_hw_init_mfp(ah);
1932

F
Felix Fietkau 已提交
1933
	ath9k_hw_set_delta_slope(ah, chan);
1934
	ath9k_hw_spur_mitigate_freq(ah, chan);
1935
	ah->eep_ops->set_board_values(ah, chan);
1936

1937
	ath9k_hw_reset_opmode(ah, macStaId1, saveDefAntenna);
1938

1939
	r = ath9k_hw_rf_set_freq(ah, chan);
1940 1941
	if (r)
		return r;
1942

1943 1944
	ath9k_hw_set_clockrate(ah);

1945
	ath9k_hw_init_queues(ah);
1946
	ath9k_hw_init_interrupt_masks(ah, ah->opmode);
1947
	ath9k_hw_ani_cache_ini_regs(ah);
1948 1949
	ath9k_hw_init_qos(ah);

1950
	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
1951
		ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
J
Johannes Berg 已提交
1952

1953
	ath9k_hw_init_global_settings(ah);
1954

1955 1956 1957 1958 1959 1960 1961
	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);
1962 1963
	}

1964
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM);
1965 1966 1967

	ath9k_hw_set_dma(ah);

1968 1969
	if (!ath9k_hw_mci_is_enabled(ah))
		REG_WRITE(ah, AR_OBS, 8);
1970

S
Sujith 已提交
1971
	if (ah->config.rx_intr_mitigation) {
1972 1973 1974 1975
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000);
	}

1976 1977 1978 1979 1980
	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);
	}

1981 1982
	ath9k_hw_init_bb(ah, chan);

1983
	if (caldata) {
1984 1985
		clear_bit(TXIQCAL_DONE, &caldata->cal_flags);
		clear_bit(TXCLCAL_DONE, &caldata->cal_flags);
1986
	}
1987
	if (!ath9k_hw_init_cal(ah, chan))
1988
		return -EIO;
1989

S
Sujith Manoharan 已提交
1990
	if (ath9k_hw_mci_is_enabled(ah) && ar9003_mci_end_reset(ah, chan, caldata))
1991
		return -EIO;
1992

S
Sujith 已提交
1993
	ENABLE_REGWRITE_BUFFER(ah);
1994

1995
	ath9k_hw_restore_chainmask(ah);
1996 1997
	REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ);

S
Sujith 已提交
1998 1999
	REGWRITE_BUFFER_FLUSH(ah);

2000
	ath9k_hw_init_desc(ah);
2001

2002
	if (ath9k_hw_btcoex_is_enabled(ah))
2003 2004
		ath9k_hw_btcoex_enable(ah);

S
Sujith Manoharan 已提交
2005
	if (ath9k_hw_mci_is_enabled(ah))
2006
		ar9003_mci_check_bt(ah);
2007

2008 2009 2010
	ath9k_hw_loadnf(ah, chan);
	ath9k_hw_start_nfcal(ah, true);

2011
	if (AR_SREV_9300_20_OR_LATER(ah)) {
2012
		ar9003_hw_bb_watchdog_config(ah);
2013 2014 2015
		ar9003_hw_disable_phy_restart(ah);
	}

2016 2017
	ath9k_hw_apply_gpio_override(ah);

2018
	if (AR_SREV_9565(ah) && common->bt_ant_diversity)
2019 2020
		REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV, AR_BTCOEX_WL_LNADIV_FORCE_ON);

2021
	return 0;
2022
}
2023
EXPORT_SYMBOL(ath9k_hw_reset);
2024

S
Sujith 已提交
2025 2026 2027 2028
/******************************/
/* Power Management (Chipset) */
/******************************/

2029 2030 2031 2032
/*
 * Notify Power Mgt is disabled in self-generated frames.
 * If requested, force chip to sleep.
 */
2033
static void ath9k_set_power_sleep(struct ath_hw *ah)
2034
{
S
Sujith 已提交
2035
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2036

2037
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
2038 2039 2040
		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);
2041 2042 2043 2044
		/* xxx Required for WLAN only case ? */
		REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0);
		udelay(100);
	}
2045

2046 2047 2048 2049 2050 2051
	/*
	 * 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);

2052
	if (ath9k_hw_mci_is_enabled(ah))
2053
		udelay(100);
2054

2055 2056
	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
		REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
2057

2058 2059 2060 2061
	/* 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 已提交
2062
	}
2063 2064

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

2069 2070 2071 2072 2073
/*
 * 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).
 */
2074
static void ath9k_set_power_network_sleep(struct ath_hw *ah)
2075
{
2076
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2077

S
Sujith 已提交
2078
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2079

2080 2081 2082 2083 2084
	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 {
2085

2086 2087 2088 2089 2090 2091 2092 2093 2094
		/* 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.
		 */
2095 2096 2097
		if (ath9k_hw_mci_is_enabled(ah))
			REG_CLR_BIT(ah, AR_MCI_INTERRUPT_RX_MSG_EN,
				    AR_MCI_INTERRUPT_RX_HW_MSG_MASK);
2098 2099 2100 2101
		/*
		 * Clear the RTC force wake bit to allow the
		 * mac to go to sleep.
		 */
2102
		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);
2103

2104
		if (ath9k_hw_mci_is_enabled(ah))
2105
			udelay(30);
2106
	}
2107 2108 2109 2110

	/* 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);
2111 2112
}

2113
static bool ath9k_hw_set_power_awake(struct ath_hw *ah)
2114
{
S
Sujith 已提交
2115 2116
	u32 val;
	int i;
2117

2118 2119 2120 2121 2122 2123
	/* 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);
	}

2124 2125 2126 2127
	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 已提交
2128
		}
2129 2130 2131 2132 2133 2134 2135 2136 2137 2138
		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);
	udelay(50);
2139

2140 2141 2142 2143 2144
	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 已提交
2145 2146
		REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
			    AR_RTC_FORCE_WAKE_EN);
2147 2148 2149 2150 2151 2152
	}
	if (i == 0) {
		ath_err(ath9k_hw_common(ah),
			"Failed to wakeup in %uus\n",
			POWER_UP_TIME / 20);
		return false;
2153 2154
	}

2155 2156 2157
	if (ath9k_hw_mci_is_enabled(ah))
		ar9003_mci_set_power_awake(ah);

S
Sujith 已提交
2158
	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2159

S
Sujith 已提交
2160
	return true;
2161 2162
}

2163
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
2164
{
2165
	struct ath_common *common = ath9k_hw_common(ah);
2166
	int status = true;
S
Sujith 已提交
2167 2168 2169 2170 2171 2172 2173
	static const char *modes[] = {
		"AWAKE",
		"FULL-SLEEP",
		"NETWORK SLEEP",
		"UNDEFINED"
	};

2174 2175 2176
	if (ah->power_mode == mode)
		return status;

2177
	ath_dbg(common, RESET, "%s -> %s\n",
J
Joe Perches 已提交
2178
		modes[ah->power_mode], modes[mode]);
S
Sujith 已提交
2179 2180 2181

	switch (mode) {
	case ATH9K_PM_AWAKE:
2182
		status = ath9k_hw_set_power_awake(ah);
S
Sujith 已提交
2183 2184
		break;
	case ATH9K_PM_FULL_SLEEP:
S
Sujith Manoharan 已提交
2185
		if (ath9k_hw_mci_is_enabled(ah))
2186
			ar9003_mci_set_full_sleep(ah);
2187

2188
		ath9k_set_power_sleep(ah);
2189
		ah->chip_fullsleep = true;
S
Sujith 已提交
2190 2191
		break;
	case ATH9K_PM_NETWORK_SLEEP:
2192
		ath9k_set_power_network_sleep(ah);
S
Sujith 已提交
2193
		break;
2194
	default:
2195
		ath_err(common, "Unknown power mode %u\n", mode);
2196 2197
		return false;
	}
2198
	ah->power_mode = mode;
S
Sujith 已提交
2199

2200 2201 2202 2203 2204
	/*
	 * 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.
	 */
2205 2206 2207

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

S
Sujith 已提交
2209
	return status;
2210
}
2211
EXPORT_SYMBOL(ath9k_hw_setpower);
2212

S
Sujith 已提交
2213 2214 2215 2216
/*******************/
/* Beacon Handling */
/*******************/

2217
void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
2218 2219 2220
{
	int flags = 0;

S
Sujith 已提交
2221 2222
	ENABLE_REGWRITE_BUFFER(ah);

2223
	switch (ah->opmode) {
2224
	case NL80211_IFTYPE_ADHOC:
2225 2226
		REG_SET_BIT(ah, AR_TXCFG,
			    AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
2227
	case NL80211_IFTYPE_MESH_POINT:
2228
	case NL80211_IFTYPE_AP:
2229 2230 2231 2232 2233
		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));
2234 2235 2236
		flags |=
			AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN;
		break;
2237
	default:
2238 2239
		ath_dbg(ath9k_hw_common(ah), BEACON,
			"%s: unsupported opmode: %d\n", __func__, ah->opmode);
2240 2241
		return;
		break;
2242 2243
	}

2244 2245 2246
	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);
2247

S
Sujith 已提交
2248 2249
	REGWRITE_BUFFER_FLUSH(ah);

2250 2251
	REG_SET_BIT(ah, AR_TIMER_MODE, flags);
}
2252
EXPORT_SYMBOL(ath9k_hw_beaconinit);
2253

2254
void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
S
Sujith 已提交
2255
				    const struct ath9k_beacon_state *bs)
2256 2257
{
	u32 nextTbtt, beaconintval, dtimperiod, beacontimeout;
2258
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2259
	struct ath_common *common = ath9k_hw_common(ah);
2260

S
Sujith 已提交
2261 2262
	ENABLE_REGWRITE_BUFFER(ah);

2263 2264 2265
	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);
2266

S
Sujith 已提交
2267 2268
	REGWRITE_BUFFER_FLUSH(ah);

2269 2270 2271
	REG_RMW_FIELD(ah, AR_RSSI_THR,
		      AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold);

2272
	beaconintval = bs->bs_intval;
2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285

	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;

2286 2287 2288 2289
	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);
2290

S
Sujith 已提交
2291 2292
	ENABLE_REGWRITE_BUFFER(ah);

2293 2294
	REG_WRITE(ah, AR_NEXT_DTIM, bs->bs_nextdtim - SLEEP_SLOP);
	REG_WRITE(ah, AR_NEXT_TIM, nextTbtt - SLEEP_SLOP);
2295

S
Sujith 已提交
2296 2297 2298
	REG_WRITE(ah, AR_SLEEP1,
		  SM((CAB_TIMEOUT_VAL << 3), AR_SLEEP1_CAB_TIMEOUT)
		  | AR_SLEEP1_ASSUME_DTIM);
2299

S
Sujith 已提交
2300 2301 2302 2303
	if (pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)
		beacontimeout = (BEACON_TIMEOUT_VAL << 3);
	else
		beacontimeout = MIN_BEACON_TIMEOUT_VAL;
2304

S
Sujith 已提交
2305 2306
	REG_WRITE(ah, AR_SLEEP2,
		  SM(beacontimeout, AR_SLEEP2_BEACON_TIMEOUT));
2307

2308 2309
	REG_WRITE(ah, AR_TIM_PERIOD, beaconintval);
	REG_WRITE(ah, AR_DTIM_PERIOD, dtimperiod);
2310

S
Sujith 已提交
2311 2312
	REGWRITE_BUFFER_FLUSH(ah);

S
Sujith 已提交
2313 2314 2315
	REG_SET_BIT(ah, AR_TIMER_MODE,
		    AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN |
		    AR_DTIM_TIMER_EN);
2316

2317 2318
	/* TSF Out of Range Threshold */
	REG_WRITE(ah, AR_TSFOOR_THRESHOLD, bs->bs_tsfoor_threshold);
2319
}
2320
EXPORT_SYMBOL(ath9k_hw_set_sta_beacon_timers);
2321

S
Sujith 已提交
2322 2323 2324 2325
/*******************/
/* HW Capabilities */
/*******************/

2326 2327 2328 2329 2330 2331 2332 2333 2334
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 已提交
2335 2336 2337 2338 2339 2340 2341 2342 2343 2344 2345 2346 2347 2348 2349 2350 2351
/**
 * 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) {
2352 2353
	/* for temporary testing DFS with 9280 */
	case AR_SREV_VERSION_9280:
Z
Zefir Kurtisi 已提交
2354 2355
	/* AR9580 will likely be our first target to get testing on */
	case AR_SREV_VERSION_9580:
2356
		return true;
Z
Zefir Kurtisi 已提交
2357 2358 2359 2360 2361
	default:
		return false;
	}
}

2362
int ath9k_hw_fill_cap_info(struct ath_hw *ah)
2363
{
2364
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2365
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
2366
	struct ath_common *common = ath9k_hw_common(ah);
2367
	unsigned int chip_chainmask;
2368

2369
	u16 eeval;
2370
	u8 ant_div_ctl1, tx_chainmask, rx_chainmask;
2371

S
Sujith 已提交
2372
	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
2373
	regulatory->current_rd = eeval;
2374

2375
	if (ah->opmode != NL80211_IFTYPE_AP &&
2376
	    ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
2377 2378 2379 2380 2381
		if (regulatory->current_rd == 0x64 ||
		    regulatory->current_rd == 0x65)
			regulatory->current_rd += 5;
		else if (regulatory->current_rd == 0x41)
			regulatory->current_rd = 0x43;
2382 2383
		ath_dbg(common, REGULATORY, "regdomain mapped to 0x%x\n",
			regulatory->current_rd);
S
Sujith 已提交
2384
	}
2385

S
Sujith 已提交
2386
	eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
2387
	if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
2388 2389
		ath_err(common,
			"no band has been marked as supported in EEPROM\n");
2390 2391 2392
		return -EINVAL;
	}

2393 2394
	if (eeval & AR5416_OPFLAGS_11A)
		pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
2395

2396 2397
	if (eeval & AR5416_OPFLAGS_11G)
		pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
S
Sujith 已提交
2398

2399 2400 2401 2402
	if (AR_SREV_9485(ah) ||
	    AR_SREV_9285(ah) ||
	    AR_SREV_9330(ah) ||
	    AR_SREV_9565(ah))
2403
		chip_chainmask = 1;
2404 2405
	else if (AR_SREV_9462(ah))
		chip_chainmask = 3;
2406 2407 2408 2409 2410 2411 2412
	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 已提交
2413
	pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK);
2414 2415 2416 2417
	/*
	 * For AR9271 we will temporarilly uses the rx chainmax as read from
	 * the EEPROM.
	 */
2418
	if ((ah->hw_version.devid == AR5416_DEVID_PCI) &&
2419 2420 2421
	    !(eeval & AR5416_OPFLAGS_11A) &&
	    !(AR_SREV_9271(ah)))
		/* CB71: GPIO 0 is pulled down to indicate 3 rx chains */
2422
		pCap->rx_chainmask = ath9k_hw_gpio_get(ah, 0) ? 0x5 : 0x7;
2423 2424
	else if (AR_SREV_9100(ah))
		pCap->rx_chainmask = 0x7;
2425
	else
2426
		/* Use rx_chainmask from EEPROM. */
2427
		pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK);
2428

2429 2430
	pCap->tx_chainmask = fixup_chainmask(chip_chainmask, pCap->tx_chainmask);
	pCap->rx_chainmask = fixup_chainmask(chip_chainmask, pCap->rx_chainmask);
2431 2432
	ah->txchainmask = pCap->tx_chainmask;
	ah->rxchainmask = pCap->rx_chainmask;
2433

2434
	ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;
2435

2436 2437 2438 2439
	/* 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;

2440 2441
	common->crypt_caps |= ATH_CRYPT_CAP_CIPHER_AESCCM;

2442
	if (ah->hw_version.devid != AR2427_DEVID_PCIE)
S
Sujith 已提交
2443 2444 2445
		pCap->hw_caps |= ATH9K_HW_CAP_HT;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_HT;
2446

2447 2448
	if (AR_SREV_9271(ah))
		pCap->num_gpio_pins = AR9271_NUM_GPIO;
S
Sujith 已提交
2449 2450
	else if (AR_DEVID_7010(ah))
		pCap->num_gpio_pins = AR7010_NUM_GPIO;
2451 2452 2453 2454
	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;
2455
	else if (AR_SREV_9285_12_OR_LATER(ah))
2456
		pCap->num_gpio_pins = AR9285_NUM_GPIO;
2457
	else if (AR_SREV_9280_20_OR_LATER(ah))
S
Sujith 已提交
2458 2459 2460
		pCap->num_gpio_pins = AR928X_NUM_GPIO;
	else
		pCap->num_gpio_pins = AR_NUM_GPIO;
2461

2462
	if (AR_SREV_9160_10_OR_LATER(ah) || AR_SREV_9100(ah))
S
Sujith 已提交
2463
		pCap->rts_aggr_limit = ATH_AMPDU_LIMIT_MAX;
2464
	else
S
Sujith 已提交
2465
		pCap->rts_aggr_limit = (8 * 1024);
2466

J
Johannes Berg 已提交
2467
#ifdef CONFIG_ATH9K_RFKILL
2468 2469 2470 2471 2472 2473
	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 已提交
2474 2475

		pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
2476
	}
S
Sujith 已提交
2477
#endif
2478
	if (AR_SREV_9271(ah) || AR_SREV_9300_20_OR_LATER(ah))
2479 2480 2481
		pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
2482

2483
	if (AR_SREV_9280(ah) || AR_SREV_9285(ah))
S
Sujith 已提交
2484 2485 2486
		pCap->hw_caps &= ~ATH9K_HW_CAP_4KB_SPLITTRANS;
	else
		pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
2487

2488
	if (AR_SREV_9300_20_OR_LATER(ah)) {
2489
		pCap->hw_caps |= ATH9K_HW_CAP_EDMA | ATH9K_HW_CAP_FASTCLOCK;
2490
		if (!AR_SREV_9330(ah) && !AR_SREV_9485(ah) && !AR_SREV_9565(ah))
2491 2492
			pCap->hw_caps |= ATH9K_HW_CAP_LDPC;

2493 2494 2495
		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);
2496
		pCap->tx_desc_len = sizeof(struct ar9003_txc);
2497
		pCap->txs_len = sizeof(struct ar9003_txs);
2498 2499
	} else {
		pCap->tx_desc_len = sizeof(struct ath_desc);
2500
		if (AR_SREV_9280_20(ah))
2501
			pCap->hw_caps |= ATH9K_HW_CAP_FASTCLOCK;
2502
	}
2503

2504 2505 2506
	if (AR_SREV_9300_20_OR_LATER(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED;

2507 2508 2509
	if (AR_SREV_9300_20_OR_LATER(ah))
		ah->ent_mode = REG_READ(ah, AR_ENT_OTP);

2510
	if (AR_SREV_9287_11_OR_LATER(ah) || AR_SREV_9271(ah))
2511 2512
		pCap->hw_caps |= ATH9K_HW_CAP_SGI_20;

2513
	if (AR_SREV_9285(ah)) {
2514 2515 2516
		if (ah->eep_ops->get_eeprom(ah, EEP_MODAL_VER) >= 3) {
			ant_div_ctl1 =
				ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
2517
			if ((ant_div_ctl1 & 0x1) && ((ant_div_ctl1 >> 3) & 0x1)) {
2518
				pCap->hw_caps |= ATH9K_HW_CAP_ANT_DIV_COMB;
2519 2520
				ath_info(common, "Enable LNA combining\n");
			}
2521
		}
2522 2523
	}

2524 2525 2526 2527 2528
	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;
	}

2529
	if (AR_SREV_9330(ah) || AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
2530
		ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
2531
		if ((ant_div_ctl1 >> 0x6) == 0x3) {
2532
			pCap->hw_caps |= ATH9K_HW_CAP_ANT_DIV_COMB;
2533 2534
			ath_info(common, "Enable LNA combining\n");
		}
2535
	}
2536

Z
Zefir Kurtisi 已提交
2537 2538 2539
	if (ath9k_hw_dfs_tested(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_DFS;

2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551
	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;
	}

2552
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
2553 2554 2555
		if (!(ah->ent_mode & AR_ENT_OTP_49GHZ_DISABLE))
			pCap->hw_caps |= ATH9K_HW_CAP_MCI;

2556
		if (AR_SREV_9462_20_OR_LATER(ah))
2557 2558 2559
			pCap->hw_caps |= ATH9K_HW_CAP_RTT;
	}

2560 2561
	if (AR_SREV_9462(ah))
		pCap->hw_caps |= ATH9K_HW_WOW_DEVICE_CAPABLE;
2562

S
Sujith Manoharan 已提交
2563 2564 2565 2566
	if (AR_SREV_9300_20_OR_LATER(ah) &&
	    ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
			pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;

S
Sujith Manoharan 已提交
2567 2568 2569 2570 2571 2572 2573
	/*
	 * Fast channel change across bands is available
	 * only for AR9462 and AR9565.
	 */
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_FCC_BAND_SWITCH;

2574
	return 0;
2575 2576
}

S
Sujith 已提交
2577 2578 2579
/****************************/
/* GPIO / RFKILL / Antennae */
/****************************/
2580

2581
static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah,
S
Sujith 已提交
2582 2583 2584 2585
					 u32 gpio, u32 type)
{
	int addr;
	u32 gpio_shift, tmp;
2586

S
Sujith 已提交
2587 2588 2589 2590 2591 2592
	if (gpio > 11)
		addr = AR_GPIO_OUTPUT_MUX3;
	else if (gpio > 5)
		addr = AR_GPIO_OUTPUT_MUX2;
	else
		addr = AR_GPIO_OUTPUT_MUX1;
2593

S
Sujith 已提交
2594
	gpio_shift = (gpio % 6) * 5;
2595

S
Sujith 已提交
2596 2597 2598 2599
	if (AR_SREV_9280_20_OR_LATER(ah)
	    || (addr != AR_GPIO_OUTPUT_MUX1)) {
		REG_RMW(ah, addr, (type << gpio_shift),
			(0x1f << gpio_shift));
2600
	} else {
S
Sujith 已提交
2601 2602 2603 2604 2605
		tmp = REG_READ(ah, addr);
		tmp = ((tmp & 0x1F0) << 1) | (tmp & ~0x1F0);
		tmp &= ~(0x1f << gpio_shift);
		tmp |= (type << gpio_shift);
		REG_WRITE(ah, addr, tmp);
2606 2607 2608
	}
}

2609
void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio)
2610
{
S
Sujith 已提交
2611
	u32 gpio_shift;
2612

2613
	BUG_ON(gpio >= ah->caps.num_gpio_pins);
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_INPUT << gpio_shift),
			(AR7010_GPIO_OE_MASK << gpio_shift));
		return;
	}
2622

S
Sujith 已提交
2623
	gpio_shift = gpio << 1;
S
Sujith 已提交
2624 2625 2626 2627
	REG_RMW(ah,
		AR_GPIO_OE_OUT,
		(AR_GPIO_OE_OUT_DRV_NO << gpio_shift),
		(AR_GPIO_OE_OUT_DRV << gpio_shift));
2628
}
2629
EXPORT_SYMBOL(ath9k_hw_cfg_gpio_input);
2630

2631
u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)
2632
{
2633 2634 2635
#define MS_REG_READ(x, y) \
	(MS(REG_READ(ah, AR_GPIO_IN_OUT), x##_GPIO_IN_VAL) & (AR_GPIO_BIT(y)))

2636
	if (gpio >= ah->caps.num_gpio_pins)
S
Sujith 已提交
2637
		return 0xffffffff;
2638

S
Sujith 已提交
2639 2640 2641 2642 2643
	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))
2644 2645
		return (MS(REG_READ(ah, AR_GPIO_IN), AR9300_GPIO_IN_VAL) &
			AR_GPIO_BIT(gpio)) != 0;
2646
	else if (AR_SREV_9271(ah))
2647
		return MS_REG_READ(AR9271, gpio) != 0;
2648
	else if (AR_SREV_9287_11_OR_LATER(ah))
2649
		return MS_REG_READ(AR9287, gpio) != 0;
2650
	else if (AR_SREV_9285_12_OR_LATER(ah))
2651
		return MS_REG_READ(AR9285, gpio) != 0;
2652
	else if (AR_SREV_9280_20_OR_LATER(ah))
2653 2654 2655
		return MS_REG_READ(AR928X, gpio) != 0;
	else
		return MS_REG_READ(AR, gpio) != 0;
2656
}
2657
EXPORT_SYMBOL(ath9k_hw_gpio_get);
2658

2659
void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
S
Sujith 已提交
2660
			 u32 ah_signal_type)
2661
{
S
Sujith 已提交
2662
	u32 gpio_shift;
2663

S
Sujith 已提交
2664 2665 2666 2667 2668 2669 2670
	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;
	}
2671

S
Sujith 已提交
2672
	ath9k_hw_gpio_cfg_output_mux(ah, gpio, ah_signal_type);
S
Sujith 已提交
2673 2674 2675 2676 2677
	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));
2678
}
2679
EXPORT_SYMBOL(ath9k_hw_cfg_output);
2680

2681
void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)
2682
{
S
Sujith 已提交
2683 2684 2685 2686 2687 2688 2689
	if (AR_DEVID_7010(ah)) {
		val = val ? 0 : 1;
		REG_RMW(ah, AR7010_GPIO_OUT, ((val&1) << gpio),
			AR_GPIO_BIT(gpio));
		return;
	}

2690 2691 2692
	if (AR_SREV_9271(ah))
		val = ~val;

S
Sujith 已提交
2693 2694
	REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio),
		AR_GPIO_BIT(gpio));
2695
}
2696
EXPORT_SYMBOL(ath9k_hw_set_gpio);
2697

2698
void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna)
2699
{
S
Sujith 已提交
2700
	REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7));
2701
}
2702
EXPORT_SYMBOL(ath9k_hw_setantenna);
2703

S
Sujith 已提交
2704 2705 2706 2707
/*********************/
/* General Operation */
/*********************/

2708
u32 ath9k_hw_getrxfilter(struct ath_hw *ah)
2709
{
S
Sujith 已提交
2710 2711
	u32 bits = REG_READ(ah, AR_RX_FILTER);
	u32 phybits = REG_READ(ah, AR_PHY_ERR);
2712

S
Sujith 已提交
2713 2714 2715 2716
	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 已提交
2717

S
Sujith 已提交
2718
	return bits;
2719
}
2720
EXPORT_SYMBOL(ath9k_hw_getrxfilter);
2721

2722
void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
2723
{
S
Sujith 已提交
2724
	u32 phybits;
2725

S
Sujith 已提交
2726 2727
	ENABLE_REGWRITE_BUFFER(ah);

2728
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
2729 2730
		bits |= ATH9K_RX_FILTER_CONTROL_WRAPPER;

S
Sujith 已提交
2731 2732
	REG_WRITE(ah, AR_RX_FILTER, bits);

S
Sujith 已提交
2733 2734 2735 2736 2737 2738
	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);
2739

S
Sujith 已提交
2740
	if (phybits)
2741
		REG_SET_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2742
	else
2743
		REG_CLR_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2744 2745

	REGWRITE_BUFFER_FLUSH(ah);
S
Sujith 已提交
2746
}
2747
EXPORT_SYMBOL(ath9k_hw_setrxfilter);
2748

2749
bool ath9k_hw_phy_disable(struct ath_hw *ah)
S
Sujith 已提交
2750
{
2751 2752 2753
	if (ath9k_hw_mci_is_enabled(ah))
		ar9003_mci_bt_gain_ctrl(ah);

2754 2755 2756 2757
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
		return false;

	ath9k_hw_init_pll(ah, NULL);
2758
	ah->htc_reset_init = true;
2759
	return true;
S
Sujith 已提交
2760
}
2761
EXPORT_SYMBOL(ath9k_hw_phy_disable);
2762

2763
bool ath9k_hw_disable(struct ath_hw *ah)
S
Sujith 已提交
2764
{
2765
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
S
Sujith 已提交
2766
		return false;
2767

2768 2769 2770 2771 2772
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_COLD))
		return false;

	ath9k_hw_init_pll(ah, NULL);
	return true;
2773
}
2774
EXPORT_SYMBOL(ath9k_hw_disable);
2775

2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787
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);
}

2788 2789
void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan,
			    bool test)
2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809
{
	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),
2810
				 ant_reduction, new_pwr, test);
2811 2812
}

2813
void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
2814
{
2815
	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
2816
	struct ath9k_channel *chan = ah->curchan;
2817
	struct ieee80211_channel *channel = chan->chan;
2818

D
Dan Carpenter 已提交
2819
	reg->power_limit = min_t(u32, limit, MAX_RATE_POWER);
2820
	if (test)
2821
		channel->max_power = MAX_RATE_POWER / 2;
2822

2823
	ath9k_hw_apply_txpower(ah, chan, test);
2824

2825 2826
	if (test)
		channel->max_power = DIV_ROUND_UP(reg->max_power_level, 2);
2827
}
2828
EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
2829

2830
void ath9k_hw_setopmode(struct ath_hw *ah)
2831
{
2832
	ath9k_hw_set_operating_mode(ah, ah->opmode);
2833
}
2834
EXPORT_SYMBOL(ath9k_hw_setopmode);
2835

2836
void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1)
2837
{
S
Sujith 已提交
2838 2839
	REG_WRITE(ah, AR_MCAST_FIL0, filter0);
	REG_WRITE(ah, AR_MCAST_FIL1, filter1);
2840
}
2841
EXPORT_SYMBOL(ath9k_hw_setmcastfilter);
2842

2843
void ath9k_hw_write_associd(struct ath_hw *ah)
2844
{
2845 2846 2847 2848 2849
	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));
2850
}
2851
EXPORT_SYMBOL(ath9k_hw_write_associd);
2852

2853 2854
#define ATH9K_MAX_TSF_READ 10

2855
u64 ath9k_hw_gettsf64(struct ath_hw *ah)
2856
{
2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867
	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;
	}
2868

2869
	WARN_ON( i == ATH9K_MAX_TSF_READ );
2870

2871
	return (((u64)tsf_upper1 << 32) | tsf_lower);
S
Sujith 已提交
2872
}
2873
EXPORT_SYMBOL(ath9k_hw_gettsf64);
2874

2875
void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64)
2876 2877
{
	REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff);
A
Alina Friedrichsen 已提交
2878
	REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
2879
}
2880
EXPORT_SYMBOL(ath9k_hw_settsf64);
2881

2882
void ath9k_hw_reset_tsf(struct ath_hw *ah)
S
Sujith 已提交
2883
{
2884 2885
	if (!ath9k_hw_wait(ah, AR_SLP32_MODE, AR_SLP32_TSF_WRITE_STATUS, 0,
			   AH_TSF_WRITE_TIMEOUT))
2886
		ath_dbg(ath9k_hw_common(ah), RESET,
J
Joe Perches 已提交
2887
			"AR_SLP32_TSF_WRITE_STATUS limit exceeded\n");
2888

S
Sujith 已提交
2889 2890
	REG_WRITE(ah, AR_RESET_TSF, AR_RESET_TSF_ONCE);
}
2891
EXPORT_SYMBOL(ath9k_hw_reset_tsf);
2892

2893
void ath9k_hw_set_tsfadjust(struct ath_hw *ah, bool set)
S
Sujith 已提交
2894
{
2895
	if (set)
2896
		ah->misc_mode |= AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2897
	else
2898
		ah->misc_mode &= ~AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2899
}
2900
EXPORT_SYMBOL(ath9k_hw_set_tsfadjust);
2901

2902
void ath9k_hw_set11nmac2040(struct ath_hw *ah, struct ath9k_channel *chan)
S
Sujith 已提交
2903 2904 2905
{
	u32 macmode;

2906
	if (IS_CHAN_HT40(chan) && !ah->config.cwm_ignore_extcca)
S
Sujith 已提交
2907 2908 2909
		macmode = AR_2040_JOINED_RX_CLEAR;
	else
		macmode = 0;
2910

S
Sujith 已提交
2911
	REG_WRITE(ah, AR_2040_MODE, macmode);
2912
}
2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944

/* 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 */

2945
u32 ath9k_hw_gettsf32(struct ath_hw *ah)
2946 2947 2948
{
	return REG_READ(ah, AR_TSF_L32);
}
2949
EXPORT_SYMBOL(ath9k_hw_gettsf32);
2950 2951 2952 2953 2954 2955 2956 2957 2958 2959

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;

2960 2961 2962 2963
	if ((timer_index < AR_FIRST_NDP_TIMER) ||
		(timer_index >= ATH_MAX_GEN_TIMER))
		return NULL;

2964
	timer = kzalloc(sizeof(struct ath_gen_timer), GFP_KERNEL);
2965
	if (timer == NULL)
2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976
		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;
}
2977
EXPORT_SYMBOL(ath_gen_timer_alloc);
2978

2979 2980
void ath9k_hw_gen_timer_start(struct ath_hw *ah,
			      struct ath_gen_timer *timer,
2981
			      u32 timer_next,
2982
			      u32 timer_period)
2983 2984
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2985
	u32 mask = 0;
2986

2987
	timer_table->timer_mask |= BIT(timer->index);
2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998

	/*
	 * 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);

2999
	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
3000
		/*
3001
		 * Starting from AR9462, each generic timer can select which tsf
3002 3003 3004 3005 3006 3007 3008 3009 3010 3011 3012
		 * 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));
	}

3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025
	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);
	}
3026
}
3027
EXPORT_SYMBOL(ath9k_hw_gen_timer_start);
3028

3029
void ath9k_hw_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
3030 3031 3032 3033 3034 3035 3036
{
	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);

3037 3038 3039 3040 3041 3042 3043 3044 3045 3046
	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));
		}
	}

3047 3048 3049 3050 3051
	/* 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)));

3052 3053 3054 3055 3056 3057
	timer_table->timer_mask &= ~BIT(timer->index);

	if (timer_table->timer_mask == 0) {
		ah->imask &= ~ATH9K_INT_GENTIMER;
		ath9k_hw_set_interrupts(ah);
	}
3058
}
3059
EXPORT_SYMBOL(ath9k_hw_gen_timer_stop);
3060 3061 3062 3063 3064 3065 3066 3067 3068

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);
}
3069
EXPORT_SYMBOL(ath_gen_timer_free);
3070 3071 3072 3073 3074 3075 3076 3077

/*
 * 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;
3078 3079
	unsigned long trigger_mask, thresh_mask;
	unsigned int index;
3080 3081 3082 3083

	/* get hardware generic timer interrupt status */
	trigger_mask = ah->intr_gen_timer_trigger;
	thresh_mask = ah->intr_gen_timer_thresh;
3084 3085
	trigger_mask &= timer_table->timer_mask;
	thresh_mask &= timer_table->timer_mask;
3086 3087 3088

	trigger_mask &= ~thresh_mask;

3089
	for_each_set_bit(index, &thresh_mask, ARRAY_SIZE(timer_table->timers)) {
3090
		timer = timer_table->timers[index];
3091 3092 3093 3094
		if (!timer)
		    continue;
		if (!timer->overflow)
		    continue;
3095 3096 3097
		timer->overflow(timer->arg);
	}

3098
	for_each_set_bit(index, &trigger_mask, ARRAY_SIZE(timer_table->timers)) {
3099
		timer = timer_table->timers[index];
3100 3101 3102 3103
		if (!timer)
		    continue;
		if (!timer->trigger)
		    continue;
3104 3105 3106
		timer->trigger(timer->arg);
	}
}
3107
EXPORT_SYMBOL(ath_gen_timer_isr);
3108

3109 3110 3111 3112
/********/
/* HTC  */
/********/

3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124
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" },
3125 3126
	{ AR_SREV_VERSION_9287,         "9287" },
	{ AR_SREV_VERSION_9271,         "9271" },
3127
	{ AR_SREV_VERSION_9300,         "9300" },
3128
	{ AR_SREV_VERSION_9330,         "9330" },
3129
	{ AR_SREV_VERSION_9340,		"9340" },
3130
	{ AR_SREV_VERSION_9485,         "9485" },
3131
	{ AR_SREV_VERSION_9462,         "9462" },
3132
	{ AR_SREV_VERSION_9550,         "9550" },
3133
	{ AR_SREV_VERSION_9565,         "9565" },
3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150
};

/* 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.
 */
3151
static const char *ath9k_hw_mac_bb_name(u32 mac_bb_version)
3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167
{
	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.
 */
3168
static const char *ath9k_hw_rf_name(u16 rf_version)
3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179
{
	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 "????";
}
3180 3181 3182 3183 3184 3185

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

	/* chipsets >= AR9280 are single-chip */
3186
	if (AR_SREV_9280_20_OR_LATER(ah)) {
3187 3188 3189 3190
		used = scnprintf(hw_name, len,
				 "Atheros AR%s Rev:%x",
				 ath9k_hw_mac_bb_name(ah->hw_version.macVersion),
				 ah->hw_version.macRev);
3191 3192
	}
	else {
3193 3194 3195 3196 3197 3198 3199
		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);
3200 3201 3202 3203 3204
	}

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