hw.c 77.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 21
#include <asm/unaligned.h>

22
#include "hw.h"
23
#include "hw-ops.h"
24
#include "rc.h"
25
#include "ar9003_mac.h"
26
#include "ar9003_mci.h"
27

28
static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);
29

30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
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);

47 48 49 50 51 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);
}

static void ath9k_hw_init_mode_regs(struct ath_hw *ah)
{
	ath9k_hw_private_ops(ah)->init_mode_regs(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
static void ath9k_hw_set_clockrate(struct ath_hw *ah)
S
Sujith 已提交
87
{
88
	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
89 90
	struct ath_common *common = ath9k_hw_common(ah);
	unsigned int clockrate;
91

92 93 94 95
	/* 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;
	else if (!ah->curchan) /* should really check for CCK instead */
96 97 98 99 100
		clockrate = ATH9K_CLOCK_RATE_CCK;
	else if (conf->channel->band == IEEE80211_BAND_2GHZ)
		clockrate = ATH9K_CLOCK_RATE_2GHZ_OFDM;
	else if (ah->caps.hw_caps & ATH9K_HW_CAP_FASTCLOCK)
		clockrate = ATH9K_CLOCK_FAST_RATE_5GHZ_OFDM;
101
	else
102 103 104 105 106
		clockrate = ATH9K_CLOCK_RATE_5GHZ_OFDM;

	if (conf_is_ht40(conf))
		clockrate *= 2;

107 108 109 110 111 112 113
	if (ah->curchan) {
		if (IS_CHAN_HALF_RATE(ah->curchan))
			clockrate /= 2;
		if (IS_CHAN_QUARTER_RATE(ah->curchan))
			clockrate /= 4;
	}

114
	common->clockrate = clockrate;
S
Sujith 已提交
115 116
}

117
static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
S
Sujith 已提交
118
{
119
	struct ath_common *common = ath9k_hw_common(ah);
120

121
	return usecs * common->clockrate;
S
Sujith 已提交
122
}
123

S
Sujith 已提交
124
bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
125 126 127
{
	int i;

S
Sujith 已提交
128 129 130
	BUG_ON(timeout < AH_TIME_QUANTUM);

	for (i = 0; i < (timeout / AH_TIME_QUANTUM); i++) {
131 132 133 134 135
		if ((REG_READ(ah, reg) & mask) == val)
			return true;

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

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

S
Sujith 已提交
141
	return false;
142
}
143
EXPORT_SYMBOL(ath9k_hw_wait);
144

145 146 147 148 149 150 151 152 153 154 155 156 157 158
void ath9k_hw_write_array(struct ath_hw *ah, struct ar5416IniArray *array,
			  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);
}

159 160 161 162 163 164 165 166 167 168 169 170
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;
}

171
u16 ath9k_hw_computetxtime(struct ath_hw *ah,
172
			   u8 phy, int kbps,
S
Sujith 已提交
173 174
			   u32 frameLen, u16 rateix,
			   bool shortPreamble)
175
{
S
Sujith 已提交
176
	u32 bitsPerSymbol, numBits, numSymbols, phyTime, txTime;
177

S
Sujith 已提交
178 179
	if (kbps == 0)
		return 0;
180

181
	switch (phy) {
S
Sujith 已提交
182
	case WLAN_RC_PHY_CCK:
S
Sujith 已提交
183
		phyTime = CCK_PREAMBLE_BITS + CCK_PLCP_BITS;
184
		if (shortPreamble)
S
Sujith 已提交
185 186 187 188
			phyTime >>= 1;
		numBits = frameLen << 3;
		txTime = CCK_SIFS_TIME + phyTime + ((numBits * 1000) / kbps);
		break;
S
Sujith 已提交
189
	case WLAN_RC_PHY_OFDM:
190
		if (ah->curchan && IS_CHAN_QUARTER_RATE(ah->curchan)) {
S
Sujith 已提交
191 192 193 194 195 196
			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);
197 198
		} else if (ah->curchan &&
			   IS_CHAN_HALF_RATE(ah->curchan)) {
S
Sujith 已提交
199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
			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:
214 215
		ath_err(ath9k_hw_common(ah),
			"Unknown phy %u (rate ix %u)\n", phy, rateix);
S
Sujith 已提交
216 217 218
		txTime = 0;
		break;
	}
219

S
Sujith 已提交
220 221
	return txTime;
}
222
EXPORT_SYMBOL(ath9k_hw_computetxtime);
223

224
void ath9k_hw_get_channel_centers(struct ath_hw *ah,
S
Sujith 已提交
225 226
				  struct ath9k_channel *chan,
				  struct chan_centers *centers)
227
{
S
Sujith 已提交
228
	int8_t extoff;
229

S
Sujith 已提交
230 231 232 233
	if (!IS_CHAN_HT40(chan)) {
		centers->ctl_center = centers->ext_center =
			centers->synth_center = chan->channel;
		return;
234 235
	}

S
Sujith 已提交
236 237 238 239 240 241 242 243 244 245
	if ((chan->chanmode == CHANNEL_A_HT40PLUS) ||
	    (chan->chanmode == CHANNEL_G_HT40PLUS)) {
		centers->synth_center =
			chan->channel + HT40_CHANNEL_CENTER_SHIFT;
		extoff = 1;
	} else {
		centers->synth_center =
			chan->channel - HT40_CHANNEL_CENTER_SHIFT;
		extoff = -1;
	}
246

S
Sujith 已提交
247 248
	centers->ctl_center =
		centers->synth_center - (extoff * HT40_CHANNEL_CENTER_SHIFT);
249
	/* 25 MHz spacing is supported by hw but not on upper layers */
S
Sujith 已提交
250
	centers->ext_center =
251
		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
252 253
}

S
Sujith 已提交
254 255 256 257
/******************/
/* Chip Revisions */
/******************/

258
static void ath9k_hw_read_revisions(struct ath_hw *ah)
259
{
S
Sujith 已提交
260
	u32 val;
261

262 263 264 265
	switch (ah->hw_version.devid) {
	case AR5416_AR9100_DEVID:
		ah->hw_version.macVersion = AR_SREV_VERSION_9100;
		break;
266 267 268 269 270 271 272 273 274
	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;
275 276 277 278 279 280 281
	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;
	}

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

S
Sujith 已提交
284 285
	if (val == 0xFF) {
		val = REG_READ(ah, AR_SREV);
286 287 288
		ah->hw_version.macVersion =
			(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
289

290
		if (AR_SREV_9462(ah))
291 292 293 294
			ah->is_pciexpress = true;
		else
			ah->is_pciexpress = (val &
					     AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
S
Sujith 已提交
295 296
	} else {
		if (!AR_SREV_9100(ah))
297
			ah->hw_version.macVersion = MS(val, AR_SREV_VERSION);
298

299
		ah->hw_version.macRev = val & AR_SREV_REVISION;
300

301
		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
302
			ah->is_pciexpress = true;
S
Sujith 已提交
303
	}
304 305
}

S
Sujith 已提交
306 307 308 309
/************************************/
/* HW Attach, Detach, Init Routines */
/************************************/

310
static void ath9k_hw_disablepcie(struct ath_hw *ah)
311
{
312
	if (!AR_SREV_5416(ah))
S
Sujith 已提交
313
		return;
314

S
Sujith 已提交
315 316 317 318 319 320 321 322 323
	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);
324

S
Sujith 已提交
325
	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
326 327
}

328 329 330 331 332 333 334 335
static void ath9k_hw_aspm_init(struct ath_hw *ah)
{
	struct ath_common *common = ath9k_hw_common(ah);

	if (common->bus_ops->aspm_init)
		common->bus_ops->aspm_init(common);
}

336
/* This should work for all families including legacy */
337
static bool ath9k_hw_chip_test(struct ath_hw *ah)
338
{
339
	struct ath_common *common = ath9k_hw_common(ah);
340
	u32 regAddr[2] = { AR_STA_ID0 };
S
Sujith 已提交
341
	u32 regHold[2];
J
Joe Perches 已提交
342 343 344
	static const u32 patternData[4] = {
		0x55555555, 0xaaaaaaaa, 0x66666666, 0x99999999
	};
345
	int i, j, loop_max;
346

347 348 349 350 351 352 353
	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 已提交
354 355
		u32 addr = regAddr[i];
		u32 wrData, rdData;
356

S
Sujith 已提交
357 358 359 360 361 362
		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) {
363 364 365
				ath_err(common,
					"address test failed addr: 0x%08x - wr:0x%08x != rd:0x%08x\n",
					addr, wrData, rdData);
S
Sujith 已提交
366 367 368 369 370 371 372 373
				return false;
			}
		}
		for (j = 0; j < 4; j++) {
			wrData = patternData[j];
			REG_WRITE(ah, addr, wrData);
			rdData = REG_READ(ah, addr);
			if (wrData != rdData) {
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
				return false;
			}
379
		}
S
Sujith 已提交
380
		REG_WRITE(ah, regAddr[i], regHold[i]);
381
	}
S
Sujith 已提交
382
	udelay(100);
383

384 385 386
	return true;
}

387
static void ath9k_hw_init_config(struct ath_hw *ah)
S
Sujith 已提交
388 389
{
	int i;
390

391 392 393 394 395 396 397 398
	ah->config.dma_beacon_response_time = 2;
	ah->config.sw_beacon_response_time = 10;
	ah->config.additional_swba_backoff = 0;
	ah->config.ack_6mb = 0x0;
	ah->config.cwm_ignore_extcca = 0;
	ah->config.pcie_clock_req = 0;
	ah->config.pcie_waen = 0;
	ah->config.analog_shiftreg = 1;
399
	ah->config.enable_ani = true;
400

S
Sujith 已提交
401
	for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
402 403
		ah->config.spurchans[i][0] = AR_NO_SPUR;
		ah->config.spurchans[i][1] = AR_NO_SPUR;
404 405
	}

406 407 408
	/* PAPRD needs some more work to be enabled */
	ah->config.paprd_disable = 1;

S
Sujith 已提交
409
	ah->config.rx_intr_mitigation = true;
410
	ah->config.pcieSerDesWrite = true;
411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428

	/*
	 * 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)
429
		ah->config.serialize_regmode = SER_REG_MODE_AUTO;
430 431
}

432
static void ath9k_hw_init_defaults(struct ath_hw *ah)
433
{
434 435 436 437 438
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);

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

439 440
	ah->hw_version.magic = AR5416_MAGIC;
	ah->hw_version.subvendorid = 0;
441

442
	ah->atim_window = 0;
443 444 445
	ah->sta_id1_defaults =
		AR_STA_ID1_CRPT_MIC_ENABLE |
		AR_STA_ID1_MCAST_KSRCH;
446 447
	if (AR_SREV_9100(ah))
		ah->sta_id1_defaults |= AR_STA_ID1_AR9100_BA_FIX;
448
	ah->enable_32kHz_clock = DONT_USE_32KHZ;
449
	ah->slottime = ATH9K_SLOT_TIME_9;
450
	ah->globaltxtimeout = (u32) -1;
451
	ah->power_mode = ATH9K_PM_UNDEFINED;
452
	ah->htc_reset_init = true;
453 454
}

455
static int ath9k_hw_init_macaddr(struct ath_hw *ah)
456
{
457
	struct ath_common *common = ath9k_hw_common(ah);
458 459 460
	u32 sum;
	int i;
	u16 eeval;
J
Joe Perches 已提交
461
	static const u32 EEP_MAC[] = { EEP_MAC_LSW, EEP_MAC_MID, EEP_MAC_MSW };
462 463 464

	sum = 0;
	for (i = 0; i < 3; i++) {
465
		eeval = ah->eep_ops->get_eeprom(ah, EEP_MAC[i]);
466
		sum += eeval;
467 468
		common->macaddr[2 * i] = eeval >> 8;
		common->macaddr[2 * i + 1] = eeval & 0xff;
469
	}
S
Sujith 已提交
470
	if (sum == 0 || sum == 0xffff * 3)
471 472 473 474 475
		return -EADDRNOTAVAIL;

	return 0;
}

476
static int ath9k_hw_post_init(struct ath_hw *ah)
477
{
S
Sujith Manoharan 已提交
478
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
479
	int ecode;
480

S
Sujith Manoharan 已提交
481
	if (common->bus_ops->ath_bus_type != ATH_USB) {
S
Sujith 已提交
482 483 484
		if (!ath9k_hw_chip_test(ah))
			return -ENODEV;
	}
485

486 487 488 489 490
	if (!AR_SREV_9300_20_OR_LATER(ah)) {
		ecode = ar9002_hw_rf_claim(ah);
		if (ecode != 0)
			return ecode;
	}
491

492
	ecode = ath9k_hw_eeprom_init(ah);
S
Sujith 已提交
493 494
	if (ecode != 0)
		return ecode;
495

496
	ath_dbg(ath9k_hw_common(ah), CONFIG, "Eeprom VER: %d, REV: %d\n",
J
Joe Perches 已提交
497 498
		ah->eep_ops->get_eeprom_ver(ah),
		ah->eep_ops->get_eeprom_rev(ah));
499

500 501
	ecode = ath9k_hw_rf_alloc_ext_banks(ah);
	if (ecode) {
502 503
		ath_err(ath9k_hw_common(ah),
			"Failed allocating banks for external radio\n");
504
		ath9k_hw_rf_free_ext_banks(ah);
505
		return ecode;
506
	}
507

508
	if (ah->config.enable_ani) {
S
Sujith 已提交
509
		ath9k_hw_ani_setup(ah);
510
		ath9k_hw_ani_init(ah);
511 512 513 514 515
	}

	return 0;
}

516
static void ath9k_hw_attach_ops(struct ath_hw *ah)
517
{
518 519 520 521
	if (AR_SREV_9300_20_OR_LATER(ah))
		ar9003_hw_attach_ops(ah);
	else
		ar9002_hw_attach_ops(ah);
522 523
}

524 525
/* Called for all hardware families */
static int __ath9k_hw_init(struct ath_hw *ah)
526
{
527
	struct ath_common *common = ath9k_hw_common(ah);
528
	int r = 0;
529

530 531
	ath9k_hw_read_revisions(ah);

532 533 534 535 536 537 538 539 540
	/*
	 * 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.
	 */
	ah->WARegVal = REG_READ(ah, AR_WA);
	ah->WARegVal |= (AR_WA_D3_L1_DISABLE |
			 AR_WA_ASPM_TIMER_BASED_DISABLE);

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

546
	if (AR_SREV_9462(ah))
547 548
		ah->WARegVal &= ~AR_WA_D3_L1_DISABLE;

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

552
	ath9k_hw_attach_ops(ah);
553

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

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

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

574 575 576 577 578
	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;

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

601 602
	if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) ||
	    AR_SREV_9330(ah))
603 604
		ah->is_pciexpress = false;

605 606 607 608
	ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
	ath9k_hw_init_cal_settings(ah);

	ah->ani_function = ATH9K_ANI_ALL;
609
	if (AR_SREV_9280_20_OR_LATER(ah) && !AR_SREV_9300_20_OR_LATER(ah))
610
		ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL;
611 612
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ah->ani_function &= ~ATH9K_ANI_MRC_CCK;
613

614 615
	/* disable ANI for 9340 */
	if (AR_SREV_9340(ah))
616 617
		ah->config.enable_ani = false;

618 619
	ath9k_hw_init_mode_regs(ah);

620
	if (!ah->is_pciexpress)
621 622
		ath9k_hw_disablepcie(ah);

623 624
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ar9002_hw_cck_chan14_spread(ah);
S
Sujith 已提交
625

626
	r = ath9k_hw_post_init(ah);
627
	if (r)
628
		return r;
629 630

	ath9k_hw_init_mode_gain_regs(ah);
631 632 633 634
	r = ath9k_hw_fill_cap_info(ah);
	if (r)
		return r;

635 636 637
	if (ah->is_pciexpress)
		ath9k_hw_aspm_init(ah);

638 639
	r = ath9k_hw_init_macaddr(ah);
	if (r) {
640
		ath_err(common, "Failed to initialize MAC address\n");
641
		return r;
642 643
	}

644
	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
645
		ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
S
Sujith 已提交
646
	else
647
		ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
648

649 650 651 652
	if (AR_SREV_9330(ah))
		ah->bb_watchdog_timeout_ms = 85;
	else
		ah->bb_watchdog_timeout_ms = 25;
653

654 655
	common->state = ATH_HW_INITIALIZED;

656
	return 0;
657 658
}

659
int ath9k_hw_init(struct ath_hw *ah)
660
{
661 662
	int ret;
	struct ath_common *common = ath9k_hw_common(ah);
663

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

691 692
	ret = __ath9k_hw_init(ah);
	if (ret) {
693 694 695
		ath_err(common,
			"Unable to initialize hardware; initialization status: %d\n",
			ret);
696 697
		return ret;
	}
698

699
	return 0;
700
}
701
EXPORT_SYMBOL(ath9k_hw_init);
702

703
static void ath9k_hw_init_qos(struct ath_hw *ah)
704
{
S
Sujith 已提交
705 706
	ENABLE_REGWRITE_BUFFER(ah);

S
Sujith 已提交
707 708
	REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa);
	REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210);
709

S
Sujith 已提交
710 711 712 713 714 715 716 717 718 719
	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 已提交
720 721

	REGWRITE_BUFFER_FLUSH(ah);
722 723
}

724
u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)
725
{
726 727 728
	REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
	udelay(100);
	REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
729

730 731
	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0)
		udelay(100);
732

733
	return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;
734 735 736
}
EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc);

737
static void ath9k_hw_init_pll(struct ath_hw *ah,
S
Sujith 已提交
738
			      struct ath9k_channel *chan)
739
{
740 741
	u32 pll;

742 743
	if (AR_SREV_9485(ah)) {

744 745 746 747 748 749 750
		/* 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);
751

752 753 754 755 756 757
		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);
758 759

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
760 761 762
			      AR_CH0_BB_DPLL2_OUTDIV, 0x1);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_LOCAL_PLL, 0x1);
763
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
764
			      AR_CH0_BB_DPLL2_EN_NEGTRIG, 0x1);
765

766
		/* program BB PLL phase_shift to 0x6 */
767
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
768 769 770 771
			      AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x6);

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_PLL_PWD, 0x0);
772
		udelay(1000);
773 774 775 776 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
	} 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);
806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831 832 833 834 835 836 837 838 839 840
	} else if (AR_SREV_9340(ah)) {
		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 {
			pll2_divint = 88;
			pll2_divfrac = 0;
			refdiv = 5;
		}

		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);
		regval = (regval & 0x80071fff) | (0x1 << 30) | (0x1 << 13) |
			 (0x4 << 26) | (0x18 << 19);
		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);
841
	}
842 843

	pll = ath9k_hw_compute_pll_control(ah, chan);
844

845
	REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
846

847
	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah))
848 849
		udelay(1000);

850 851
	/* Switch the core clock for ar9271 to 117Mhz */
	if (AR_SREV_9271(ah)) {
852 853
		udelay(500);
		REG_WRITE(ah, 0x50040, 0x304);
854 855
	}

S
Sujith 已提交
856 857 858
	udelay(RTC_PLL_SETTLE_DELAY);

	REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK);
859 860 861 862 863 864 865 866 867 868 869 870 871

	if (AR_SREV_9340(ah)) {
		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);
	}
872 873
}

874
static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
875
					  enum nl80211_iftype opmode)
876
{
877
	u32 sync_default = AR_INTR_SYNC_DEFAULT;
878
	u32 imr_reg = AR_IMR_TXERR |
S
Sujith 已提交
879 880 881 882
		AR_IMR_TXURN |
		AR_IMR_RXERR |
		AR_IMR_RXORN |
		AR_IMR_BCNMISC;
883

884 885 886
	if (AR_SREV_9340(ah))
		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;

887 888 889 890 891 892
	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;
893

894 895 896 897 898 899
	} else {
		if (ah->config.rx_intr_mitigation)
			imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
		else
			imr_reg |= AR_IMR_RXOK;
	}
900

901 902 903 904
	if (ah->config.tx_intr_mitigation)
		imr_reg |= AR_IMR_TXINTM | AR_IMR_TXMINTR;
	else
		imr_reg |= AR_IMR_TXOK;
905

906
	if (opmode == NL80211_IFTYPE_AP)
907
		imr_reg |= AR_IMR_MIB;
908

S
Sujith 已提交
909 910
	ENABLE_REGWRITE_BUFFER(ah);

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

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

S
Sujith 已提交
921 922
	REGWRITE_BUFFER_FLUSH(ah);

923 924 925 926 927 928
	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);
	}
929 930
}

931 932 933 934 935 936 937
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);
}

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

945
static void ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us)
946
{
947 948 949 950 951 952 953 954 955 956
	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);
957
}
S
Sujith 已提交
958

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

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

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

987 988 989
	if (!chan)
		return;

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

993 994 995 996
	if (IS_CHAN_A_FAST_CLOCK(ah, chan))
		rx_lat = 41;
	else
		rx_lat = 37;
997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009
	tx_lat = 54;

	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;

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

		slottime = 21;
		sifstime = 64;
	} else {
1018 1019 1020 1021 1022 1023 1024 1025
		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);
		}
1026 1027 1028 1029 1030 1031 1032 1033 1034
		rx_lat = MS(reg, AR_USEC_RX_LAT);
		tx_lat = MS(reg, AR_USEC_TX_LAT);

		slottime = ah->slottime;
		if (IS_CHAN_5GHZ(chan))
			sifstime = 16;
		else
			sifstime = 10;
	}
1035

1036
	/* As defined by IEEE 802.11-2007 17.3.8.6 */
1037
	acktimeout = slottime + sifstime + 3 * ah->coverage_class;
1038
	ctstimeout = acktimeout;
1039 1040 1041

	/*
	 * Workaround for early ACK timeouts, add an offset to match the
1042
	 * initval's 64us ack timeout value. Use 48us for the CTS timeout.
1043 1044 1045 1046
	 * 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.
	 */
1047
	if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ) {
1048
		acktimeout += 64 - sifstime - ah->slottime;
1049 1050 1051
		ctstimeout += 48 - sifstime - ah->slottime;
	}

1052

1053 1054
	ath9k_hw_set_sifs_time(ah, sifstime);
	ath9k_hw_setslottime(ah, slottime);
1055
	ath9k_hw_set_ack_timeout(ah, acktimeout);
1056
	ath9k_hw_set_cts_timeout(ah, ctstimeout);
1057 1058
	if (ah->globaltxtimeout != (u32) -1)
		ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout);
1059 1060 1061 1062 1063 1064 1065 1066

	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 已提交
1067
}
1068
EXPORT_SYMBOL(ath9k_hw_init_global_settings);
S
Sujith 已提交
1069

S
Sujith 已提交
1070
void ath9k_hw_deinit(struct ath_hw *ah)
S
Sujith 已提交
1071
{
1072 1073
	struct ath_common *common = ath9k_hw_common(ah);

S
Sujith 已提交
1074
	if (common->state < ATH_HW_INITIALIZED)
1075 1076
		goto free_hw;

1077
	ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP);
1078 1079

free_hw:
1080
	ath9k_hw_rf_free_ext_banks(ah);
S
Sujith 已提交
1081
}
S
Sujith 已提交
1082
EXPORT_SYMBOL(ath9k_hw_deinit);
S
Sujith 已提交
1083 1084 1085 1086 1087

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

1088
u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)
1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101
{
	u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band);

	if (IS_CHAN_B(chan))
		ctl |= CTL_11B;
	else if (IS_CHAN_G(chan))
		ctl |= CTL_11G;
	else
		ctl |= CTL_11A;

	return ctl;
}

S
Sujith 已提交
1102 1103 1104 1105
/****************************************/
/* Reset and Channel Switching Routines */
/****************************************/

1106
static inline void ath9k_hw_set_dma(struct ath_hw *ah)
S
Sujith 已提交
1107
{
1108
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
1109

S
Sujith 已提交
1110 1111
	ENABLE_REGWRITE_BUFFER(ah);

1112 1113 1114
	/*
	 * set AHB_MODE not to do cacheline prefetches
	*/
1115 1116
	if (!AR_SREV_9300_20_OR_LATER(ah))
		REG_SET_BIT(ah, AR_AHB_MODE, AR_AHB_PREFETCH_RD_EN);
S
Sujith 已提交
1117

1118 1119 1120
	/*
	 * let mac dma reads be in 128 byte chunks
	 */
1121
	REG_RMW(ah, AR_TXCFG, AR_TXCFG_DMASZ_128B, AR_TXCFG_DMASZ_MASK);
S
Sujith 已提交
1122

S
Sujith 已提交
1123 1124
	REGWRITE_BUFFER_FLUSH(ah);

1125 1126 1127 1128 1129
	/*
	 * 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.
	 */
1130 1131
	if (!AR_SREV_9300_20_OR_LATER(ah))
		REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level);
S
Sujith 已提交
1132

S
Sujith 已提交
1133
	ENABLE_REGWRITE_BUFFER(ah);
S
Sujith 已提交
1134

1135 1136 1137
	/*
	 * let mac dma writes be in 128 byte chunks
	 */
1138
	REG_RMW(ah, AR_RXCFG, AR_RXCFG_DMASZ_128B, AR_RXCFG_DMASZ_MASK);
S
Sujith 已提交
1139

1140 1141 1142
	/*
	 * Setup receive FIFO threshold to hold off TX activities
	 */
S
Sujith 已提交
1143 1144
	REG_WRITE(ah, AR_RXFIFO_CFG, 0x200);

1145 1146 1147 1148 1149 1150 1151 1152
	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);
	}

1153 1154 1155 1156
	/*
	 * reduce the number of usable entries in PCU TXBUF to avoid
	 * wrap around issues.
	 */
S
Sujith 已提交
1157
	if (AR_SREV_9285(ah)) {
1158 1159 1160 1161
		/* 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
		 */
S
Sujith 已提交
1162 1163
		REG_WRITE(ah, AR_PCU_TXBUF_CTRL,
			  AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE);
1164
	} else if (!AR_SREV_9271(ah)) {
S
Sujith 已提交
1165 1166 1167
		REG_WRITE(ah, AR_PCU_TXBUF_CTRL,
			  AR_PCU_TXBUF_CTRL_USABLE_SIZE);
	}
1168

S
Sujith 已提交
1169 1170
	REGWRITE_BUFFER_FLUSH(ah);

1171 1172
	if (AR_SREV_9300_20_OR_LATER(ah))
		ath9k_hw_reset_txstatus_ring(ah);
S
Sujith 已提交
1173 1174
}

1175
static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
S
Sujith 已提交
1176
{
1177 1178
	u32 mask = AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC;
	u32 set = AR_STA_ID1_KSRCH_MODE;
S
Sujith 已提交
1179 1180

	switch (opmode) {
1181
	case NL80211_IFTYPE_ADHOC:
1182
	case NL80211_IFTYPE_MESH_POINT:
1183
		set |= AR_STA_ID1_ADHOC;
S
Sujith 已提交
1184
		REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1185
		break;
1186 1187 1188
	case NL80211_IFTYPE_AP:
		set |= AR_STA_ID1_STA_AP;
		/* fall through */
1189
	case NL80211_IFTYPE_STATION:
1190
		REG_CLR_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1191
		break;
1192
	default:
1193 1194
		if (!ah->is_monitoring)
			set = 0;
1195
		break;
S
Sujith 已提交
1196
	}
1197
	REG_RMW(ah, AR_STA_ID1, set, mask);
S
Sujith 已提交
1198 1199
}

1200 1201
void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
				   u32 *coef_mantissa, u32 *coef_exponent)
S
Sujith 已提交
1202 1203 1204 1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216
{
	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;
}

1217
static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
S
Sujith 已提交
1218 1219 1220 1221
{
	u32 rst_flags;
	u32 tmpReg;

1222
	if (AR_SREV_9100(ah)) {
1223 1224
		REG_RMW_FIELD(ah, AR_RTC_DERIVED_CLK,
			      AR_RTC_DERIVED_CLK_PERIOD, 1);
1225 1226 1227
		(void)REG_READ(ah, AR_RTC_DERIVED_CLK);
	}

S
Sujith 已提交
1228 1229
	ENABLE_REGWRITE_BUFFER(ah);

1230 1231 1232 1233 1234
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245
	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);
		if (tmpReg &
		    (AR_INTR_SYNC_LOCAL_TIMEOUT |
		     AR_INTR_SYNC_RADM_CPL_TIMEOUT)) {
1246
			u32 val;
S
Sujith 已提交
1247
			REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);
1248 1249 1250 1251 1252 1253 1254

			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 已提交
1255 1256 1257 1258 1259 1260 1261
			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;
	}

1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281
	if (AR_SREV_9330(ah)) {
		int npend = 0;
		int i;

		/* AR9330 WAR:
		 * call external reset function to reset WMAC if:
		 * - doing a cold reset
		 * - we have pending frames in the TX queues
		 */

		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;

1282
			ath_dbg(ath9k_hw_common(ah), RESET,
1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296
				"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);
		}
	}

1297
	REG_WRITE(ah, AR_RTC_RC, rst_flags);
S
Sujith 已提交
1298 1299 1300

	REGWRITE_BUFFER_FLUSH(ah);

S
Sujith 已提交
1301 1302
	udelay(50);

1303
	REG_WRITE(ah, AR_RTC_RC, 0);
S
Sujith 已提交
1304
	if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
1305
		ath_dbg(ath9k_hw_common(ah), RESET, "RTC stuck in MAC reset\n");
S
Sujith 已提交
1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317
		return false;
	}

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

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

	return true;
}

1318
static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
S
Sujith 已提交
1319
{
S
Sujith 已提交
1320 1321
	ENABLE_REGWRITE_BUFFER(ah);

1322 1323 1324 1325 1326
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1327 1328 1329
	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
		  AR_RTC_FORCE_WAKE_ON_INT);

1330
	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
1331 1332
		REG_WRITE(ah, AR_RC, AR_RC_AHB);

1333
	REG_WRITE(ah, AR_RTC_RESET, 0);
1334

S
Sujith 已提交
1335 1336
	REGWRITE_BUFFER_FLUSH(ah);

1337 1338 1339 1340
	if (!AR_SREV_9300_20_OR_LATER(ah))
		udelay(2);

	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
1341 1342
		REG_WRITE(ah, AR_RC, 0);

1343
	REG_WRITE(ah, AR_RTC_RESET, 1);
S
Sujith 已提交
1344 1345 1346 1347

	if (!ath9k_hw_wait(ah,
			   AR_RTC_STATUS,
			   AR_RTC_STATUS_M,
S
Sujith 已提交
1348 1349
			   AR_RTC_STATUS_ON,
			   AH_WAIT_TIMEOUT)) {
1350
		ath_dbg(ath9k_hw_common(ah), RESET, "RTC not waking up\n");
S
Sujith 已提交
1351
		return false;
1352 1353
	}

S
Sujith 已提交
1354 1355 1356
	return ath9k_hw_set_reset(ah, ATH9K_RESET_WARM);
}

1357
static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)
S
Sujith 已提交
1358
{
1359
	bool ret = false;
1360

1361 1362 1363 1364 1365
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1366 1367 1368 1369 1370
	REG_WRITE(ah, AR_RTC_FORCE_WAKE,
		  AR_RTC_FORCE_WAKE_EN | AR_RTC_FORCE_WAKE_ON_INT);

	switch (type) {
	case ATH9K_RESET_POWER_ON:
1371 1372
		ret = ath9k_hw_set_reset_power_on(ah);
		break;
S
Sujith 已提交
1373 1374
	case ATH9K_RESET_WARM:
	case ATH9K_RESET_COLD:
1375 1376
		ret = ath9k_hw_set_reset(ah, type);
		break;
S
Sujith 已提交
1377
	default:
1378
		break;
S
Sujith 已提交
1379
	}
1380 1381 1382 1383 1384

	if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI)
		REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);

	return ret;
1385 1386
}

1387
static bool ath9k_hw_chip_reset(struct ath_hw *ah,
S
Sujith 已提交
1388
				struct ath9k_channel *chan)
1389
{
1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
	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;
	}

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

1402
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
S
Sujith 已提交
1403
		return false;
1404

1405
	ah->chip_fullsleep = false;
S
Sujith 已提交
1406 1407
	ath9k_hw_init_pll(ah, chan);
	ath9k_hw_set_rfmode(ah, chan);
1408

S
Sujith 已提交
1409
	return true;
1410 1411
}

1412
static bool ath9k_hw_channel_change(struct ath_hw *ah,
L
Luis R. Rodriguez 已提交
1413
				    struct ath9k_channel *chan)
1414
{
1415
	struct ath_common *common = ath9k_hw_common(ah);
1416
	u32 qnum;
1417
	int r;
1418 1419 1420 1421 1422 1423 1424 1425
	bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA);
	bool band_switch, mode_diff;
	u8 ini_reloaded;

	band_switch = (chan->channelFlags & (CHANNEL_2GHZ | CHANNEL_5GHZ)) !=
		      (ah->curchan->channelFlags & (CHANNEL_2GHZ |
						    CHANNEL_5GHZ));
	mode_diff = (chan->chanmode != ah->curchan->chanmode);
1426 1427 1428

	for (qnum = 0; qnum < AR_NUM_QCU; qnum++) {
		if (ath9k_hw_numtxpending(ah, qnum)) {
1429
			ath_dbg(common, QUEUE,
J
Joe Perches 已提交
1430
				"Transmit frames pending on queue %d\n", qnum);
1431 1432 1433 1434
			return false;
		}
	}

1435
	if (!ath9k_hw_rfbus_req(ah)) {
1436
		ath_err(common, "Could not kill baseband RX\n");
1437 1438 1439
		return false;
	}

1440 1441 1442 1443 1444 1445 1446 1447 1448 1449 1450 1451
	if (edma && (band_switch || mode_diff)) {
		ath9k_hw_mark_phy_inactive(ah);
		udelay(5);

		ath9k_hw_init_pll(ah, NULL);

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

1452
	ath9k_hw_set_channel_regs(ah, chan);
1453

1454
	r = ath9k_hw_rf_set_freq(ah, chan);
1455
	if (r) {
1456
		ath_err(common, "Failed to set channel\n");
1457
		return false;
1458
	}
1459
	ath9k_hw_set_clockrate(ah);
1460
	ath9k_hw_apply_txpower(ah, chan);
1461
	ath9k_hw_rfbus_done(ah);
1462

S
Sujith 已提交
1463 1464 1465
	if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
		ath9k_hw_set_delta_slope(ah, chan);

1466
	ath9k_hw_spur_mitigate_freq(ah, chan);
S
Sujith 已提交
1467

1468
	if (edma && (band_switch || mode_diff)) {
1469
		ah->ah_flags |= AH_FASTCC;
1470 1471 1472 1473 1474 1475 1476
		if (band_switch || ini_reloaded)
			ah->eep_ops->set_board_values(ah, chan);

		ath9k_hw_init_bb(ah, chan);

		if (band_switch || ini_reloaded)
			ath9k_hw_init_cal(ah, chan);
1477
		ah->ah_flags &= ~AH_FASTCC;
1478 1479
	}

S
Sujith 已提交
1480 1481 1482
	return true;
}

1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496
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)));
	}
}

1497
bool ath9k_hw_check_alive(struct ath_hw *ah)
J
Johannes Berg 已提交
1498
{
1499 1500 1501
	int count = 50;
	u32 reg;

1502
	if (AR_SREV_9285_12_OR_LATER(ah))
1503 1504 1505 1506
		return true;

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

1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519
		if ((reg & 0x7E7FFFEF) == 0x00702400)
			continue;

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

1521
	return false;
J
Johannes Berg 已提交
1522
}
1523
EXPORT_SYMBOL(ath9k_hw_check_alive);
J
Johannes Berg 已提交
1524

1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 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
/*
 * Fast channel change:
 * (Change synthesizer based on channel freq without resetting chip)
 *
 * Don't do FCC when
 *   - Flag is not set
 *   - Chip is just coming out of full sleep
 *   - Channel to be set is same as current channel
 *   - Channel flags are different, (eg.,moving from 2GHz to 5GHz channel)
 */
static int ath9k_hw_do_fastcc(struct ath_hw *ah, struct ath9k_channel *chan)
{
	struct ath_common *common = ath9k_hw_common(ah);
	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;

	if ((chan->channelFlags & CHANNEL_ALL) !=
	    (ah->curchan->channelFlags & CHANNEL_ALL))
		goto fail;

	if (!ath9k_hw_check_alive(ah))
		goto fail;

	/*
	 * For AR9462, make sure that calibration data for
	 * re-using are present.
	 */
	if (AR_SREV_9462(ah) && (!ah->caldata ||
				 !ah->caldata->done_txiqcal_once ||
				 !ah->caldata->done_txclcal_once ||
				 !ah->caldata->rtt_hist.num_readings))
		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;

	ath9k_hw_loadnf(ah, ah->curchan);
	ath9k_hw_start_nfcal(ah, true);

	if ((ah->caps.hw_caps & ATH9K_HW_CAP_MCI) && ar9003_mci_is_ready(ah))
		ar9003_mci_2g5g_switch(ah, true);

	if (AR_SREV_9271(ah))
		ar9002_hw_load_ani_reg(ah, chan);

	return 0;
fail:
	return -EINVAL;
}

1590
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1591
		   struct ath9k_hw_cal_data *caldata, bool fastcc)
1592
{
1593
	struct ath_common *common = ath9k_hw_common(ah);
1594 1595 1596
	u32 saveLedState;
	u32 saveDefAntenna;
	u32 macStaId1;
S
Sujith 已提交
1597
	u64 tsf = 0;
1598
	int i, r;
1599
	bool start_mci_reset = false;
1600 1601 1602 1603
	bool mci = !!(ah->caps.hw_caps & ATH9K_HW_CAP_MCI);
	bool save_fullsleep = ah->chip_fullsleep;

	if (mci) {
1604 1605 1606
		start_mci_reset = ar9003_mci_start_reset(ah, chan);
		if (start_mci_reset)
			return 0;
1607 1608
	}

1609
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
1610
		return -EIO;
1611

1612 1613
	if (ah->curchan && !ah->chip_fullsleep)
		ath9k_hw_getnf(ah, ah->curchan);
1614

1615 1616 1617 1618 1619 1620 1621 1622 1623
	ah->caldata = caldata;
	if (caldata &&
	    (chan->channel != caldata->channel ||
	     (chan->channelFlags & ~CHANNEL_CW_INT) !=
	     (caldata->channelFlags & ~CHANNEL_CW_INT))) {
		/* Operating channel changed, reset channel calibration data */
		memset(caldata, 0, sizeof(*caldata));
		ath9k_init_nfcal_hist_buffer(ah, chan);
	}
1624
	ah->noise = ath9k_hw_getchan_noise(ah, chan);
1625

1626 1627 1628 1629
	if (fastcc) {
		r = ath9k_hw_do_fastcc(ah, chan);
		if (!r)
			return r;
1630 1631
	}

1632 1633
	if (mci)
		ar9003_mci_stop_bt(ah, save_fullsleep);
1634

1635 1636 1637 1638 1639 1640
	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;

S
Sujith 已提交
1641
	/* For chips on which RTC reset is done, save TSF before it gets cleared */
1642 1643
	if (AR_SREV_9100(ah) ||
	    (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)))
S
Sujith 已提交
1644 1645
		tsf = ath9k_hw_gettsf64(ah);

1646 1647 1648 1649 1650 1651
	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);

1652 1653
	ah->paprd_table_write_done = false;

1654
	/* Only required on the first reset */
1655 1656 1657 1658 1659 1660 1661
	if (AR_SREV_9271(ah) && ah->htc_reset_init) {
		REG_WRITE(ah,
			  AR9271_RESET_POWER_DOWN_CONTROL,
			  AR9271_RADIO_RF_RST);
		udelay(50);
	}

1662
	if (!ath9k_hw_chip_reset(ah, chan)) {
1663
		ath_err(common, "Chip reset failed\n");
1664
		return -EINVAL;
1665 1666
	}

1667
	/* Only required on the first reset */
1668 1669 1670 1671 1672 1673 1674 1675
	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 已提交
1676
	/* Restore TSF */
1677
	if (tsf)
S
Sujith 已提交
1678 1679
		ath9k_hw_settsf64(ah, tsf);

1680
	if (AR_SREV_9280_20_OR_LATER(ah))
1681
		REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
1682

S
Sujith 已提交
1683 1684 1685
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ar9002_hw_enable_async_fifo(ah);

L
Luis R. Rodriguez 已提交
1686
	r = ath9k_hw_process_ini(ah, chan);
1687 1688
	if (r)
		return r;
1689

1690 1691 1692
	if (mci)
		ar9003_mci_reset(ah, false, IS_CHAN_2GHZ(chan), save_fullsleep);

1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703
	/*
	 * 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);
	}

1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720
	/* 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;

1721 1722 1723
	if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
		ath9k_hw_set_delta_slope(ah, chan);

1724
	ath9k_hw_spur_mitigate_freq(ah, chan);
1725
	ah->eep_ops->set_board_values(ah, chan);
1726

S
Sujith 已提交
1727 1728
	ENABLE_REGWRITE_BUFFER(ah);

1729 1730
	REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
	REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
1731 1732
		  | macStaId1
		  | AR_STA_ID1_RTS_USE_DEF
1733
		  | (ah->config.
1734
		     ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
1735
		  | ah->sta_id1_defaults);
1736
	ath_hw_setbssidmask(common);
1737
	REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
1738
	ath9k_hw_write_associd(ah);
1739 1740 1741
	REG_WRITE(ah, AR_ISR, ~0);
	REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);

S
Sujith 已提交
1742 1743
	REGWRITE_BUFFER_FLUSH(ah);

1744 1745
	ath9k_hw_set_operating_mode(ah, ah->opmode);

1746
	r = ath9k_hw_rf_set_freq(ah, chan);
1747 1748
	if (r)
		return r;
1749

1750 1751
	ath9k_hw_set_clockrate(ah);

S
Sujith 已提交
1752 1753
	ENABLE_REGWRITE_BUFFER(ah);

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

S
Sujith 已提交
1757 1758
	REGWRITE_BUFFER_FLUSH(ah);

1759
	ah->intr_txqs = 0;
1760
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
1761 1762
		ath9k_hw_resettxqueue(ah, i);

1763
	ath9k_hw_init_interrupt_masks(ah, ah->opmode);
1764
	ath9k_hw_ani_cache_ini_regs(ah);
1765 1766
	ath9k_hw_init_qos(ah);

1767
	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
1768
		ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
J
Johannes Berg 已提交
1769

1770
	ath9k_hw_init_global_settings(ah);
1771

1772 1773 1774 1775 1776 1777 1778
	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);
1779 1780
	}

1781
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM);
1782 1783 1784 1785 1786

	ath9k_hw_set_dma(ah);

	REG_WRITE(ah, AR_OBS, 8);

S
Sujith 已提交
1787
	if (ah->config.rx_intr_mitigation) {
1788 1789 1790 1791
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000);
	}

1792 1793 1794 1795 1796
	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);
	}

1797 1798
	ath9k_hw_init_bb(ah, chan);

1799
	if (caldata) {
1800
		caldata->done_txiqcal_once = false;
1801
		caldata->done_txclcal_once = false;
1802
		caldata->rtt_hist.num_readings = 0;
1803
	}
1804
	if (!ath9k_hw_init_cal(ah, chan))
1805
		return -EIO;
1806

1807 1808 1809
	ath9k_hw_loadnf(ah, chan);
	ath9k_hw_start_nfcal(ah, true);

1810 1811
	if (mci && ar9003_mci_end_reset(ah, chan, caldata))
		return -EIO;
1812

S
Sujith 已提交
1813
	ENABLE_REGWRITE_BUFFER(ah);
1814

1815
	ath9k_hw_restore_chainmask(ah);
1816 1817
	REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ);

S
Sujith 已提交
1818 1819
	REGWRITE_BUFFER_FLUSH(ah);

1820 1821 1822
	/*
	 * For big endian systems turn on swapping for descriptors
	 */
1823 1824 1825 1826
	if (AR_SREV_9100(ah)) {
		u32 mask;
		mask = REG_READ(ah, AR_CFG);
		if (mask & (AR_CFG_SWRB | AR_CFG_SWTB | AR_CFG_SWRG)) {
1827 1828
			ath_dbg(common, RESET, "CFG Byte Swap Set 0x%x\n",
				mask);
1829 1830 1831 1832
		} else {
			mask =
				INIT_CONFIG_STATUS | AR_CFG_SWRB | AR_CFG_SWTB;
			REG_WRITE(ah, AR_CFG, mask);
1833 1834
			ath_dbg(common, RESET, "Setting CFG 0x%x\n",
				REG_READ(ah, AR_CFG));
1835 1836
		}
	} else {
1837 1838 1839 1840 1841 1842 1843
		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);
		}
1844
#ifdef __BIG_ENDIAN
1845
		else if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
1846 1847
			REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);
		else
1848
			REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
1849 1850 1851
#endif
	}

1852
	if (ath9k_hw_btcoex_is_enabled(ah))
1853 1854
		ath9k_hw_btcoex_enable(ah);

1855 1856
	if (mci)
		ar9003_mci_check_bt(ah);
1857

1858
	if (AR_SREV_9300_20_OR_LATER(ah)) {
1859
		ar9003_hw_bb_watchdog_config(ah);
1860

1861 1862 1863
		ar9003_hw_disable_phy_restart(ah);
	}

1864 1865
	ath9k_hw_apply_gpio_override(ah);

1866
	return 0;
1867
}
1868
EXPORT_SYMBOL(ath9k_hw_reset);
1869

S
Sujith 已提交
1870 1871 1872 1873
/******************************/
/* Power Management (Chipset) */
/******************************/

1874 1875 1876 1877
/*
 * Notify Power Mgt is disabled in self-generated frames.
 * If requested, force chip to sleep.
 */
1878
static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)
1879
{
S
Sujith 已提交
1880 1881
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
	if (setChip) {
1882
		if (AR_SREV_9462(ah)) {
1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893
			REG_WRITE(ah, AR_TIMER_MODE,
				  REG_READ(ah, AR_TIMER_MODE) & 0xFFFFFF00);
			REG_WRITE(ah, AR_NDP2_TIMER_MODE, REG_READ(ah,
				  AR_NDP2_TIMER_MODE) & 0xFFFFFF00);
			REG_WRITE(ah, AR_SLP32_INC,
				  REG_READ(ah, AR_SLP32_INC) & 0xFFF00000);
			/* xxx Required for WLAN only case ? */
			REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, 0);
			udelay(100);
		}

1894 1895 1896 1897
		/*
		 * Clear the RTC force wake bit to allow the
		 * mac to go to sleep.
		 */
1898 1899
		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN);

1900
		if (AR_SREV_9462(ah))
1901 1902
			udelay(100);

1903
		if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
S
Sujith 已提交
1904
			REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
1905

1906
		/* Shutdown chip. Active low */
1907
		if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) {
1908 1909 1910
			REG_CLR_BIT(ah, AR_RTC_RESET, AR_RTC_RESET_EN);
			udelay(2);
		}
S
Sujith 已提交
1911
	}
1912 1913

	/* Clear Bit 14 of AR_WA after putting chip into Full Sleep mode. */
1914 1915
	if (AR_SREV_9300_20_OR_LATER(ah))
		REG_WRITE(ah, AR_WA, ah->WARegVal & ~AR_WA_D3_L1_DISABLE);
1916 1917
}

1918 1919 1920 1921 1922
/*
 * 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).
 */
1923
static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip)
1924
{
1925 1926
	u32 val;

S
Sujith 已提交
1927 1928
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
	if (setChip) {
1929
		struct ath9k_hw_capabilities *pCap = &ah->caps;
1930

S
Sujith 已提交
1931
		if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
1932
			/* Set WakeOnInterrupt bit; clear ForceWake bit */
S
Sujith 已提交
1933 1934 1935
			REG_WRITE(ah, AR_RTC_FORCE_WAKE,
				  AR_RTC_FORCE_WAKE_ON_INT);
		} else {
1936 1937 1938 1939 1940 1941 1942 1943 1944 1945

			/* 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.
			 */
1946
			if (AR_SREV_9462(ah)) {
1947 1948 1949 1950
				val = REG_READ(ah, AR_MCI_INTERRUPT_RX_MSG_EN) &
					~AR_MCI_INTERRUPT_RX_HW_MSG_MASK;
				REG_WRITE(ah, AR_MCI_INTERRUPT_RX_MSG_EN, val);
			}
1951 1952 1953 1954
			/*
			 * Clear the RTC force wake bit to allow the
			 * mac to go to sleep.
			 */
S
Sujith 已提交
1955 1956
			REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE,
				    AR_RTC_FORCE_WAKE_EN);
1957

1958
			if (AR_SREV_9462(ah))
1959
				udelay(30);
1960 1961
		}
	}
1962 1963 1964 1965

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

1968
static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)
1969
{
S
Sujith 已提交
1970 1971
	u32 val;
	int i;
1972

1973 1974 1975 1976 1977 1978
	/* 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);
	}

S
Sujith 已提交
1979 1980 1981 1982 1983 1984 1985
	if (setChip) {
		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) != true) {
				return false;
			}
1986 1987
			if (!AR_SREV_9300_20_OR_LATER(ah))
				ath9k_hw_init_pll(ah, NULL);
S
Sujith 已提交
1988 1989 1990 1991
		}
		if (AR_SREV_9100(ah))
			REG_SET_BIT(ah, AR_RTC_RESET,
				    AR_RTC_RESET_EN);
1992

S
Sujith 已提交
1993 1994 1995
		REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
			    AR_RTC_FORCE_WAKE_EN);
		udelay(50);
1996

S
Sujith 已提交
1997 1998 1999 2000 2001 2002 2003
		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);
			REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
				    AR_RTC_FORCE_WAKE_EN);
2004
		}
S
Sujith 已提交
2005
		if (i == 0) {
2006 2007 2008
			ath_err(ath9k_hw_common(ah),
				"Failed to wakeup in %uus\n",
				POWER_UP_TIME / 20);
S
Sujith 已提交
2009
			return false;
2010 2011 2012
		}
	}

S
Sujith 已提交
2013
	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
2014

S
Sujith 已提交
2015
	return true;
2016 2017
}

2018
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
2019
{
2020
	struct ath_common *common = ath9k_hw_common(ah);
2021
	int status = true, setChip = true;
S
Sujith 已提交
2022 2023 2024 2025 2026 2027 2028
	static const char *modes[] = {
		"AWAKE",
		"FULL-SLEEP",
		"NETWORK SLEEP",
		"UNDEFINED"
	};

2029 2030 2031
	if (ah->power_mode == mode)
		return status;

2032
	ath_dbg(common, RESET, "%s -> %s\n",
J
Joe Perches 已提交
2033
		modes[ah->power_mode], modes[mode]);
S
Sujith 已提交
2034 2035 2036 2037

	switch (mode) {
	case ATH9K_PM_AWAKE:
		status = ath9k_hw_set_power_awake(ah, setChip);
2038 2039 2040 2041

		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI)
			REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);

S
Sujith 已提交
2042 2043
		break;
	case ATH9K_PM_FULL_SLEEP:
2044 2045
		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI)
			ar9003_mci_set_full_sleep(ah);
2046

S
Sujith 已提交
2047
		ath9k_set_power_sleep(ah, setChip);
2048
		ah->chip_fullsleep = true;
S
Sujith 已提交
2049 2050
		break;
	case ATH9K_PM_NETWORK_SLEEP:
2051 2052 2053 2054

		if (ah->caps.hw_caps & ATH9K_HW_CAP_MCI)
			REG_WRITE(ah, AR_RTC_KEEP_AWAKE, 0x2);

S
Sujith 已提交
2055 2056
		ath9k_set_power_network_sleep(ah, setChip);
		break;
2057
	default:
2058
		ath_err(common, "Unknown power mode %u\n", mode);
2059 2060
		return false;
	}
2061
	ah->power_mode = mode;
S
Sujith 已提交
2062

2063 2064 2065 2066 2067
	/*
	 * 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.
	 */
2068 2069 2070

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

S
Sujith 已提交
2072
	return status;
2073
}
2074
EXPORT_SYMBOL(ath9k_hw_setpower);
2075

S
Sujith 已提交
2076 2077 2078 2079
/*******************/
/* Beacon Handling */
/*******************/

2080
void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
2081 2082 2083
{
	int flags = 0;

S
Sujith 已提交
2084 2085
	ENABLE_REGWRITE_BUFFER(ah);

2086
	switch (ah->opmode) {
2087
	case NL80211_IFTYPE_ADHOC:
2088
	case NL80211_IFTYPE_MESH_POINT:
2089 2090
		REG_SET_BIT(ah, AR_TXCFG,
			    AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
2091 2092
		REG_WRITE(ah, AR_NEXT_NDP_TIMER, next_beacon +
			  TU_TO_USEC(ah->atim_window ? ah->atim_window : 1));
2093
		flags |= AR_NDP_TIMER_EN;
2094
	case NL80211_IFTYPE_AP:
2095 2096 2097 2098 2099
		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));
2100 2101 2102
		flags |=
			AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN;
		break;
2103
	default:
2104 2105
		ath_dbg(ath9k_hw_common(ah), BEACON,
			"%s: unsupported opmode: %d\n", __func__, ah->opmode);
2106 2107
		return;
		break;
2108 2109
	}

2110 2111 2112 2113
	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);
	REG_WRITE(ah, AR_NDP_PERIOD, beacon_period);
2114

S
Sujith 已提交
2115 2116
	REGWRITE_BUFFER_FLUSH(ah);

2117 2118
	REG_SET_BIT(ah, AR_TIMER_MODE, flags);
}
2119
EXPORT_SYMBOL(ath9k_hw_beaconinit);
2120

2121
void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
S
Sujith 已提交
2122
				    const struct ath9k_beacon_state *bs)
2123 2124
{
	u32 nextTbtt, beaconintval, dtimperiod, beacontimeout;
2125
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2126
	struct ath_common *common = ath9k_hw_common(ah);
2127

S
Sujith 已提交
2128 2129
	ENABLE_REGWRITE_BUFFER(ah);

2130 2131 2132
	REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt));

	REG_WRITE(ah, AR_BEACON_PERIOD,
2133
		  TU_TO_USEC(bs->bs_intval));
2134
	REG_WRITE(ah, AR_DMA_BEACON_PERIOD,
2135
		  TU_TO_USEC(bs->bs_intval));
2136

S
Sujith 已提交
2137 2138
	REGWRITE_BUFFER_FLUSH(ah);

2139 2140 2141
	REG_RMW_FIELD(ah, AR_RSSI_THR,
		      AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold);

2142
	beaconintval = bs->bs_intval;
2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155

	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;

2156 2157 2158 2159
	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);
2160

S
Sujith 已提交
2161 2162
	ENABLE_REGWRITE_BUFFER(ah);

S
Sujith 已提交
2163 2164 2165
	REG_WRITE(ah, AR_NEXT_DTIM,
		  TU_TO_USEC(bs->bs_nextdtim - SLEEP_SLOP));
	REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP));
2166

S
Sujith 已提交
2167 2168 2169
	REG_WRITE(ah, AR_SLEEP1,
		  SM((CAB_TIMEOUT_VAL << 3), AR_SLEEP1_CAB_TIMEOUT)
		  | AR_SLEEP1_ASSUME_DTIM);
2170

S
Sujith 已提交
2171 2172 2173 2174
	if (pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)
		beacontimeout = (BEACON_TIMEOUT_VAL << 3);
	else
		beacontimeout = MIN_BEACON_TIMEOUT_VAL;
2175

S
Sujith 已提交
2176 2177
	REG_WRITE(ah, AR_SLEEP2,
		  SM(beacontimeout, AR_SLEEP2_BEACON_TIMEOUT));
2178

S
Sujith 已提交
2179 2180
	REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval));
	REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod));
2181

S
Sujith 已提交
2182 2183
	REGWRITE_BUFFER_FLUSH(ah);

S
Sujith 已提交
2184 2185 2186
	REG_SET_BIT(ah, AR_TIMER_MODE,
		    AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN |
		    AR_DTIM_TIMER_EN);
2187

2188 2189
	/* TSF Out of Range Threshold */
	REG_WRITE(ah, AR_TSFOOR_THRESHOLD, bs->bs_tsfoor_threshold);
2190
}
2191
EXPORT_SYMBOL(ath9k_hw_set_sta_beacon_timers);
2192

S
Sujith 已提交
2193 2194 2195 2196
/*******************/
/* HW Capabilities */
/*******************/

2197 2198 2199 2200 2201 2202 2203 2204 2205
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 已提交
2206 2207 2208 2209 2210 2211 2212 2213 2214 2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229
/**
 * 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) {
	/* AR9580 will likely be our first target to get testing on */
	case AR_SREV_VERSION_9580:
	default:
		return false;
	}
}

2230
int ath9k_hw_fill_cap_info(struct ath_hw *ah)
2231
{
2232
	struct ath9k_hw_capabilities *pCap = &ah->caps;
2233
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
2234
	struct ath_common *common = ath9k_hw_common(ah);
2235
	unsigned int chip_chainmask;
2236

2237
	u16 eeval;
2238
	u8 ant_div_ctl1, tx_chainmask, rx_chainmask;
2239

S
Sujith 已提交
2240
	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
2241
	regulatory->current_rd = eeval;
2242

2243
	if (ah->opmode != NL80211_IFTYPE_AP &&
2244
	    ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
2245 2246 2247 2248 2249
		if (regulatory->current_rd == 0x64 ||
		    regulatory->current_rd == 0x65)
			regulatory->current_rd += 5;
		else if (regulatory->current_rd == 0x41)
			regulatory->current_rd = 0x43;
2250 2251
		ath_dbg(common, REGULATORY, "regdomain mapped to 0x%x\n",
			regulatory->current_rd);
S
Sujith 已提交
2252
	}
2253

S
Sujith 已提交
2254
	eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
2255
	if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
2256 2257
		ath_err(common,
			"no band has been marked as supported in EEPROM\n");
2258 2259 2260
		return -EINVAL;
	}

2261 2262
	if (eeval & AR5416_OPFLAGS_11A)
		pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
2263

2264 2265
	if (eeval & AR5416_OPFLAGS_11G)
		pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
S
Sujith 已提交
2266

2267 2268
	if (AR_SREV_9485(ah) || AR_SREV_9285(ah) || AR_SREV_9330(ah))
		chip_chainmask = 1;
2269 2270
	else if (AR_SREV_9462(ah))
		chip_chainmask = 3;
2271 2272 2273 2274 2275 2276 2277
	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 已提交
2278
	pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK);
2279 2280 2281 2282
	/*
	 * For AR9271 we will temporarilly uses the rx chainmax as read from
	 * the EEPROM.
	 */
2283
	if ((ah->hw_version.devid == AR5416_DEVID_PCI) &&
2284 2285 2286
	    !(eeval & AR5416_OPFLAGS_11A) &&
	    !(AR_SREV_9271(ah)))
		/* CB71: GPIO 0 is pulled down to indicate 3 rx chains */
2287
		pCap->rx_chainmask = ath9k_hw_gpio_get(ah, 0) ? 0x5 : 0x7;
2288 2289
	else if (AR_SREV_9100(ah))
		pCap->rx_chainmask = 0x7;
2290
	else
2291
		/* Use rx_chainmask from EEPROM. */
2292
		pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK);
2293

2294 2295
	pCap->tx_chainmask = fixup_chainmask(chip_chainmask, pCap->tx_chainmask);
	pCap->rx_chainmask = fixup_chainmask(chip_chainmask, pCap->rx_chainmask);
2296 2297
	ah->txchainmask = pCap->tx_chainmask;
	ah->rxchainmask = pCap->rx_chainmask;
2298

2299
	ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;
2300

2301 2302 2303 2304
	/* 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;

2305 2306
	common->crypt_caps |= ATH_CRYPT_CAP_CIPHER_AESCCM;

2307
	if (ah->hw_version.devid != AR2427_DEVID_PCIE)
S
Sujith 已提交
2308 2309 2310
		pCap->hw_caps |= ATH9K_HW_CAP_HT;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_HT;
2311

2312 2313
	if (AR_SREV_9271(ah))
		pCap->num_gpio_pins = AR9271_NUM_GPIO;
S
Sujith 已提交
2314 2315
	else if (AR_DEVID_7010(ah))
		pCap->num_gpio_pins = AR7010_NUM_GPIO;
2316 2317 2318 2319
	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;
2320
	else if (AR_SREV_9285_12_OR_LATER(ah))
2321
		pCap->num_gpio_pins = AR9285_NUM_GPIO;
2322
	else if (AR_SREV_9280_20_OR_LATER(ah))
S
Sujith 已提交
2323 2324 2325
		pCap->num_gpio_pins = AR928X_NUM_GPIO;
	else
		pCap->num_gpio_pins = AR_NUM_GPIO;
2326

2327
	if (AR_SREV_9160_10_OR_LATER(ah) || AR_SREV_9100(ah))
S
Sujith 已提交
2328
		pCap->rts_aggr_limit = ATH_AMPDU_LIMIT_MAX;
2329
	else
S
Sujith 已提交
2330
		pCap->rts_aggr_limit = (8 * 1024);
2331

2332
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
2333 2334 2335 2336 2337 2338
	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 已提交
2339 2340

		pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
2341
	}
S
Sujith 已提交
2342
#endif
2343
	if (AR_SREV_9271(ah) || AR_SREV_9300_20_OR_LATER(ah))
2344 2345 2346
		pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
2347

2348
	if (AR_SREV_9280(ah) || AR_SREV_9285(ah))
S
Sujith 已提交
2349 2350 2351
		pCap->hw_caps &= ~ATH9K_HW_CAP_4KB_SPLITTRANS;
	else
		pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
2352

2353
	if (AR_SREV_9300_20_OR_LATER(ah)) {
2354
		pCap->hw_caps |= ATH9K_HW_CAP_EDMA | ATH9K_HW_CAP_FASTCLOCK;
2355
		if (!AR_SREV_9330(ah) && !AR_SREV_9485(ah))
2356 2357
			pCap->hw_caps |= ATH9K_HW_CAP_LDPC;

2358 2359 2360
		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);
2361
		pCap->tx_desc_len = sizeof(struct ar9003_txc);
2362
		pCap->txs_len = sizeof(struct ar9003_txs);
2363 2364
		if (!ah->config.paprd_disable &&
		    ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
2365
			pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
2366 2367
	} else {
		pCap->tx_desc_len = sizeof(struct ath_desc);
2368
		if (AR_SREV_9280_20(ah))
2369
			pCap->hw_caps |= ATH9K_HW_CAP_FASTCLOCK;
2370
	}
2371

2372 2373 2374
	if (AR_SREV_9300_20_OR_LATER(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED;

2375 2376 2377
	if (AR_SREV_9300_20_OR_LATER(ah))
		ah->ent_mode = REG_READ(ah, AR_ENT_OTP);

2378
	if (AR_SREV_9287_11_OR_LATER(ah) || AR_SREV_9271(ah))
2379 2380
		pCap->hw_caps |= ATH9K_HW_CAP_SGI_20;

2381 2382 2383 2384 2385 2386 2387
	if (AR_SREV_9285(ah))
		if (ah->eep_ops->get_eeprom(ah, EEP_MODAL_VER) >= 3) {
			ant_div_ctl1 =
				ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
			if ((ant_div_ctl1 & 0x1) && ((ant_div_ctl1 >> 3) & 0x1))
				pCap->hw_caps |= ATH9K_HW_CAP_ANT_DIV_COMB;
		}
2388 2389 2390 2391 2392 2393
	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;
	}


2394
	if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
2395 2396 2397 2398 2399 2400 2401 2402 2403 2404 2405 2406 2407 2408 2409
		ant_div_ctl1 = ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
		/*
		 * enable the diversity-combining algorithm only when
		 * both enable_lna_div and enable_fast_div are set
		 *		Table for Diversity
		 * ant_div_alt_lnaconf		bit 0-1
		 * ant_div_main_lnaconf		bit 2-3
		 * ant_div_alt_gaintb		bit 4
		 * ant_div_main_gaintb		bit 5
		 * enable_ant_div_lnadiv	bit 6
		 * enable_ant_fast_div		bit 7
		 */
		if ((ant_div_ctl1 >> 0x6) == 0x3)
			pCap->hw_caps |= ATH9K_HW_CAP_ANT_DIV_COMB;
	}
2410

2411 2412 2413 2414 2415
	if (AR_SREV_9485_10(ah)) {
		pCap->pcie_lcr_extsync_en = true;
		pCap->pcie_lcr_offset = 0x80;
	}

Z
Zefir Kurtisi 已提交
2416 2417 2418
	if (ath9k_hw_dfs_tested(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_DFS;

2419 2420 2421 2422 2423 2424 2425 2426 2427 2428 2429 2430
	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;
	}

2431 2432
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		ah->enabled_cals |= TX_IQ_CAL;
2433
		if (AR_SREV_9485_OR_LATER(ah))
2434 2435
			ah->enabled_cals |= TX_IQ_ON_AGC_CAL;
	}
2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446

	if (AR_SREV_9462(ah)) {

		if (!(ah->ent_mode & AR_ENT_OTP_49GHZ_DISABLE))
			pCap->hw_caps |= ATH9K_HW_CAP_MCI;

		if (AR_SREV_9462_20(ah))
			pCap->hw_caps |= ATH9K_HW_CAP_RTT;

	}

2447

2448
	return 0;
2449 2450
}

S
Sujith 已提交
2451 2452 2453
/****************************/
/* GPIO / RFKILL / Antennae */
/****************************/
2454

2455
static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah,
S
Sujith 已提交
2456 2457 2458 2459
					 u32 gpio, u32 type)
{
	int addr;
	u32 gpio_shift, tmp;
2460

S
Sujith 已提交
2461 2462 2463 2464 2465 2466
	if (gpio > 11)
		addr = AR_GPIO_OUTPUT_MUX3;
	else if (gpio > 5)
		addr = AR_GPIO_OUTPUT_MUX2;
	else
		addr = AR_GPIO_OUTPUT_MUX1;
2467

S
Sujith 已提交
2468
	gpio_shift = (gpio % 6) * 5;
2469

S
Sujith 已提交
2470 2471 2472 2473
	if (AR_SREV_9280_20_OR_LATER(ah)
	    || (addr != AR_GPIO_OUTPUT_MUX1)) {
		REG_RMW(ah, addr, (type << gpio_shift),
			(0x1f << gpio_shift));
2474
	} else {
S
Sujith 已提交
2475 2476 2477 2478 2479
		tmp = REG_READ(ah, addr);
		tmp = ((tmp & 0x1F0) << 1) | (tmp & ~0x1F0);
		tmp &= ~(0x1f << gpio_shift);
		tmp |= (type << gpio_shift);
		REG_WRITE(ah, addr, tmp);
2480 2481 2482
	}
}

2483
void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio)
2484
{
S
Sujith 已提交
2485
	u32 gpio_shift;
2486

2487
	BUG_ON(gpio >= ah->caps.num_gpio_pins);
2488

S
Sujith 已提交
2489 2490 2491 2492 2493 2494 2495
	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;
	}
2496

S
Sujith 已提交
2497
	gpio_shift = gpio << 1;
S
Sujith 已提交
2498 2499 2500 2501
	REG_RMW(ah,
		AR_GPIO_OE_OUT,
		(AR_GPIO_OE_OUT_DRV_NO << gpio_shift),
		(AR_GPIO_OE_OUT_DRV << gpio_shift));
2502
}
2503
EXPORT_SYMBOL(ath9k_hw_cfg_gpio_input);
2504

2505
u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)
2506
{
2507 2508 2509
#define MS_REG_READ(x, y) \
	(MS(REG_READ(ah, AR_GPIO_IN_OUT), x##_GPIO_IN_VAL) & (AR_GPIO_BIT(y)))

2510
	if (gpio >= ah->caps.num_gpio_pins)
S
Sujith 已提交
2511
		return 0xffffffff;
2512

S
Sujith 已提交
2513 2514 2515 2516 2517
	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))
2518 2519
		return (MS(REG_READ(ah, AR_GPIO_IN), AR9300_GPIO_IN_VAL) &
			AR_GPIO_BIT(gpio)) != 0;
2520
	else if (AR_SREV_9271(ah))
2521
		return MS_REG_READ(AR9271, gpio) != 0;
2522
	else if (AR_SREV_9287_11_OR_LATER(ah))
2523
		return MS_REG_READ(AR9287, gpio) != 0;
2524
	else if (AR_SREV_9285_12_OR_LATER(ah))
2525
		return MS_REG_READ(AR9285, gpio) != 0;
2526
	else if (AR_SREV_9280_20_OR_LATER(ah))
2527 2528 2529
		return MS_REG_READ(AR928X, gpio) != 0;
	else
		return MS_REG_READ(AR, gpio) != 0;
2530
}
2531
EXPORT_SYMBOL(ath9k_hw_gpio_get);
2532

2533
void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
S
Sujith 已提交
2534
			 u32 ah_signal_type)
2535
{
S
Sujith 已提交
2536
	u32 gpio_shift;
2537

S
Sujith 已提交
2538 2539 2540 2541 2542 2543 2544
	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;
	}
2545

S
Sujith 已提交
2546
	ath9k_hw_gpio_cfg_output_mux(ah, gpio, ah_signal_type);
S
Sujith 已提交
2547 2548 2549 2550 2551
	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));
2552
}
2553
EXPORT_SYMBOL(ath9k_hw_cfg_output);
2554

2555
void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)
2556
{
S
Sujith 已提交
2557 2558 2559 2560 2561 2562 2563
	if (AR_DEVID_7010(ah)) {
		val = val ? 0 : 1;
		REG_RMW(ah, AR7010_GPIO_OUT, ((val&1) << gpio),
			AR_GPIO_BIT(gpio));
		return;
	}

2564 2565 2566
	if (AR_SREV_9271(ah))
		val = ~val;

S
Sujith 已提交
2567 2568
	REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio),
		AR_GPIO_BIT(gpio));
2569
}
2570
EXPORT_SYMBOL(ath9k_hw_set_gpio);
2571

2572
void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna)
2573
{
S
Sujith 已提交
2574
	REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7));
2575
}
2576
EXPORT_SYMBOL(ath9k_hw_setantenna);
2577

S
Sujith 已提交
2578 2579 2580 2581
/*********************/
/* General Operation */
/*********************/

2582
u32 ath9k_hw_getrxfilter(struct ath_hw *ah)
2583
{
S
Sujith 已提交
2584 2585
	u32 bits = REG_READ(ah, AR_RX_FILTER);
	u32 phybits = REG_READ(ah, AR_PHY_ERR);
2586

S
Sujith 已提交
2587 2588 2589 2590
	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 已提交
2591

S
Sujith 已提交
2592
	return bits;
2593
}
2594
EXPORT_SYMBOL(ath9k_hw_getrxfilter);
2595

2596
void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
2597
{
S
Sujith 已提交
2598
	u32 phybits;
2599

S
Sujith 已提交
2600 2601
	ENABLE_REGWRITE_BUFFER(ah);

2602
	if (AR_SREV_9462(ah))
2603 2604
		bits |= ATH9K_RX_FILTER_CONTROL_WRAPPER;

S
Sujith 已提交
2605 2606
	REG_WRITE(ah, AR_RX_FILTER, bits);

S
Sujith 已提交
2607 2608 2609 2610 2611 2612
	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);
2613

S
Sujith 已提交
2614
	if (phybits)
2615
		REG_SET_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2616
	else
2617
		REG_CLR_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2618 2619

	REGWRITE_BUFFER_FLUSH(ah);
S
Sujith 已提交
2620
}
2621
EXPORT_SYMBOL(ath9k_hw_setrxfilter);
2622

2623
bool ath9k_hw_phy_disable(struct ath_hw *ah)
S
Sujith 已提交
2624
{
2625 2626 2627 2628
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
		return false;

	ath9k_hw_init_pll(ah, NULL);
2629
	ah->htc_reset_init = true;
2630
	return true;
S
Sujith 已提交
2631
}
2632
EXPORT_SYMBOL(ath9k_hw_phy_disable);
2633

2634
bool ath9k_hw_disable(struct ath_hw *ah)
S
Sujith 已提交
2635
{
2636
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
S
Sujith 已提交
2637
		return false;
2638

2639 2640 2641 2642 2643
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_COLD))
		return false;

	ath9k_hw_init_pll(ah, NULL);
	return true;
2644
}
2645
EXPORT_SYMBOL(ath9k_hw_disable);
2646

2647 2648 2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660 2661 2662 2663 2664 2665 2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682
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);
}

void ath9k_hw_apply_txpower(struct ath_hw *ah, struct ath9k_channel *chan)
{
	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),
				 ant_reduction, new_pwr, false);
}

2683
void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
2684
{
2685
	struct ath_regulatory *reg = ath9k_hw_regulatory(ah);
2686
	struct ath9k_channel *chan = ah->curchan;
2687
	struct ieee80211_channel *channel = chan->chan;
2688

D
Dan Carpenter 已提交
2689
	reg->power_limit = min_t(u32, limit, MAX_RATE_POWER);
2690
	if (test)
2691
		channel->max_power = MAX_RATE_POWER / 2;
2692

2693
	ath9k_hw_apply_txpower(ah, chan);
2694

2695 2696
	if (test)
		channel->max_power = DIV_ROUND_UP(reg->max_power_level, 2);
2697
}
2698
EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
2699

2700
void ath9k_hw_setopmode(struct ath_hw *ah)
2701
{
2702
	ath9k_hw_set_operating_mode(ah, ah->opmode);
2703
}
2704
EXPORT_SYMBOL(ath9k_hw_setopmode);
2705

2706
void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1)
2707
{
S
Sujith 已提交
2708 2709
	REG_WRITE(ah, AR_MCAST_FIL0, filter0);
	REG_WRITE(ah, AR_MCAST_FIL1, filter1);
2710
}
2711
EXPORT_SYMBOL(ath9k_hw_setmcastfilter);
2712

2713
void ath9k_hw_write_associd(struct ath_hw *ah)
2714
{
2715 2716 2717 2718 2719
	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));
2720
}
2721
EXPORT_SYMBOL(ath9k_hw_write_associd);
2722

2723 2724
#define ATH9K_MAX_TSF_READ 10

2725
u64 ath9k_hw_gettsf64(struct ath_hw *ah)
2726
{
2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737
	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;
	}
2738

2739
	WARN_ON( i == ATH9K_MAX_TSF_READ );
2740

2741
	return (((u64)tsf_upper1 << 32) | tsf_lower);
S
Sujith 已提交
2742
}
2743
EXPORT_SYMBOL(ath9k_hw_gettsf64);
2744

2745
void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64)
2746 2747
{
	REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff);
A
Alina Friedrichsen 已提交
2748
	REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
2749
}
2750
EXPORT_SYMBOL(ath9k_hw_settsf64);
2751

2752
void ath9k_hw_reset_tsf(struct ath_hw *ah)
S
Sujith 已提交
2753
{
2754 2755
	if (!ath9k_hw_wait(ah, AR_SLP32_MODE, AR_SLP32_TSF_WRITE_STATUS, 0,
			   AH_TSF_WRITE_TIMEOUT))
2756
		ath_dbg(ath9k_hw_common(ah), RESET,
J
Joe Perches 已提交
2757
			"AR_SLP32_TSF_WRITE_STATUS limit exceeded\n");
2758

S
Sujith 已提交
2759 2760
	REG_WRITE(ah, AR_RESET_TSF, AR_RESET_TSF_ONCE);
}
2761
EXPORT_SYMBOL(ath9k_hw_reset_tsf);
2762

S
Sujith 已提交
2763
void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)
S
Sujith 已提交
2764 2765
{
	if (setting)
2766
		ah->misc_mode |= AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2767
	else
2768
		ah->misc_mode &= ~AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2769
}
2770
EXPORT_SYMBOL(ath9k_hw_set_tsfadjust);
2771

L
Luis R. Rodriguez 已提交
2772
void ath9k_hw_set11nmac2040(struct ath_hw *ah)
S
Sujith 已提交
2773
{
L
Luis R. Rodriguez 已提交
2774
	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
S
Sujith 已提交
2775 2776
	u32 macmode;

L
Luis R. Rodriguez 已提交
2777
	if (conf_is_ht40(conf) && !ah->config.cwm_ignore_extcca)
S
Sujith 已提交
2778 2779 2780
		macmode = AR_2040_JOINED_RX_CLEAR;
	else
		macmode = 0;
2781

S
Sujith 已提交
2782
	REG_WRITE(ah, AR_2040_MODE, macmode);
2783
}
2784 2785 2786 2787 2788 2789 2790 2791 2792 2793 2794 2795 2796 2797 2798 2799 2800 2801 2802 2803 2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824 2825 2826 2827 2828 2829

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

/* compute and clear index of rightmost 1 */
static u32 rightmost_index(struct ath_gen_timer_table *timer_table, u32 *mask)
{
	u32 b;

	b = *mask;
	b &= (0-b);
	*mask &= ~b;
	b *= debruijn32;
	b >>= 27;

	return timer_table->gen_timer_index[b];
}

2830
u32 ath9k_hw_gettsf32(struct ath_hw *ah)
2831 2832 2833
{
	return REG_READ(ah, AR_TSF_L32);
}
2834
EXPORT_SYMBOL(ath9k_hw_gettsf32);
2835 2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847

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;

	timer = kzalloc(sizeof(struct ath_gen_timer), GFP_KERNEL);

	if (timer == NULL) {
2848 2849 2850
		ath_err(ath9k_hw_common(ah),
			"Failed to allocate memory for hw timer[%d]\n",
			timer_index);
2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862
		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;
}
2863
EXPORT_SYMBOL(ath_gen_timer_alloc);
2864

2865 2866
void ath9k_hw_gen_timer_start(struct ath_hw *ah,
			      struct ath_gen_timer *timer,
2867
			      u32 trig_timeout,
2868
			      u32 timer_period)
2869 2870
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2871
	u32 tsf, timer_next;
2872 2873 2874 2875 2876 2877 2878

	BUG_ON(!timer_period);

	set_bit(timer->index, &timer_table->timer_mask.timer_bits);

	tsf = ath9k_hw_gettsf32(ah);

2879 2880
	timer_next = tsf + trig_timeout;

2881
	ath_dbg(ath9k_hw_common(ah), HWTIMER,
J
Joe Perches 已提交
2882 2883
		"current tsf %x period %x timer_next %x\n",
		tsf, timer_period, timer_next);
2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894

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

2895
	if (AR_SREV_9462(ah)) {
2896
		/*
2897
		 * Starting from AR9462, each generic timer can select which tsf
2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908
		 * 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));
	}

2909 2910 2911 2912 2913
	/* Enable both trigger and thresh interrupt masks */
	REG_SET_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)));
}
2914
EXPORT_SYMBOL(ath9k_hw_gen_timer_start);
2915

2916
void ath9k_hw_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;

	if ((timer->index < AR_FIRST_NDP_TIMER) ||
		(timer->index >= ATH_MAX_GEN_TIMER)) {
		return;
	}

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

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

	clear_bit(timer->index, &timer_table->timer_mask.timer_bits);
}
2936
EXPORT_SYMBOL(ath9k_hw_gen_timer_stop);
2937 2938 2939 2940 2941 2942 2943 2944 2945

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);
}
2946
EXPORT_SYMBOL(ath_gen_timer_free);
2947 2948 2949 2950 2951 2952 2953 2954

/*
 * 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;
2955
	struct ath_common *common = ath9k_hw_common(ah);
2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968 2969
	u32 trigger_mask, thresh_mask, index;

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

	trigger_mask &= ~thresh_mask;

	while (thresh_mask) {
		index = rightmost_index(timer_table, &thresh_mask);
		timer = timer_table->timers[index];
		BUG_ON(!timer);
2970 2971
		ath_dbg(common, HWTIMER, "TSF overflow for Gen timer %d\n",
			index);
2972 2973 2974 2975 2976 2977 2978
		timer->overflow(timer->arg);
	}

	while (trigger_mask) {
		index = rightmost_index(timer_table, &trigger_mask);
		timer = timer_table->timers[index];
		BUG_ON(!timer);
2979
		ath_dbg(common, HWTIMER,
J
Joe Perches 已提交
2980
			"Gen timer[%d] trigger\n", index);
2981 2982 2983
		timer->trigger(timer->arg);
	}
}
2984
EXPORT_SYMBOL(ath_gen_timer_isr);
2985

2986 2987 2988 2989
/********/
/* HTC  */
/********/

2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001
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" },
3002 3003
	{ AR_SREV_VERSION_9287,         "9287" },
	{ AR_SREV_VERSION_9271,         "9271" },
3004
	{ AR_SREV_VERSION_9300,         "9300" },
3005
	{ AR_SREV_VERSION_9330,         "9330" },
3006
	{ AR_SREV_VERSION_9340,		"9340" },
3007
	{ AR_SREV_VERSION_9485,         "9485" },
3008
	{ AR_SREV_VERSION_9462,         "9462" },
3009 3010 3011 3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025
};

/* 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.
 */
3026
static const char *ath9k_hw_mac_bb_name(u32 mac_bb_version)
3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042
{
	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.
 */
3043
static const char *ath9k_hw_rf_name(u16 rf_version)
3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054
{
	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 "????";
}
3055 3056 3057 3058 3059 3060

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

	/* chipsets >= AR9280 are single-chip */
3061
	if (AR_SREV_9280_20_OR_LATER(ah)) {
3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079
		used = snprintf(hw_name, len,
			       "Atheros AR%s Rev:%x",
			       ath9k_hw_mac_bb_name(ah->hw_version.macVersion),
			       ah->hw_version.macRev);
	}
	else {
		used = snprintf(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);
	}

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