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

21
#include "hw.h"
22
#include "hw-ops.h"
23
#include "rc.h"
24
#include "ar9003_mac.h"
25

26
static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type);
27

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

45 46 47 48 49 50 51 52 53 54 55 56
/* 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);
}

57 58 59 60 61 62
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);
}

63 64 65 66 67 68 69 70
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);
}

71 72 73 74 75 76 77 78 79
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 已提交
80 81 82
/********************/
/* Helper Functions */
/********************/
83

84
static void ath9k_hw_set_clockrate(struct ath_hw *ah)
S
Sujith 已提交
85
{
86
	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
87 88
	struct ath_common *common = ath9k_hw_common(ah);
	unsigned int clockrate;
89

90
	if (!ah->curchan) /* should really check for CCK instead */
91 92 93 94 95
		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;
96
	else
97 98 99 100 101
		clockrate = ATH9K_CLOCK_RATE_5GHZ_OFDM;

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

102 103 104 105 106 107 108
	if (ah->curchan) {
		if (IS_CHAN_HALF_RATE(ah->curchan))
			clockrate /= 2;
		if (IS_CHAN_QUARTER_RATE(ah->curchan))
			clockrate /= 4;
	}

109
	common->clockrate = clockrate;
S
Sujith 已提交
110 111
}

112
static u32 ath9k_hw_mac_to_clks(struct ath_hw *ah, u32 usecs)
S
Sujith 已提交
113
{
114
	struct ath_common *common = ath9k_hw_common(ah);
115

116
	return usecs * common->clockrate;
S
Sujith 已提交
117
}
118

S
Sujith 已提交
119
bool ath9k_hw_wait(struct ath_hw *ah, u32 reg, u32 mask, u32 val, u32 timeout)
120 121 122
{
	int i;

S
Sujith 已提交
123 124 125
	BUG_ON(timeout < AH_TIME_QUANTUM);

	for (i = 0; i < (timeout / AH_TIME_QUANTUM); i++) {
126 127 128 129 130
		if ((REG_READ(ah, reg) & mask) == val)
			return true;

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

J
Joe Perches 已提交
132 133 134
	ath_dbg(ath9k_hw_common(ah), ATH_DBG_ANY,
		"timeout (%d us) on reg 0x%x: 0x%08x & 0x%08x != 0x%08x\n",
		timeout, reg, REG_READ(ah, reg), mask, val);
135

S
Sujith 已提交
136
	return false;
137
}
138
EXPORT_SYMBOL(ath9k_hw_wait);
139

140 141 142 143 144 145 146 147 148 149 150 151 152 153
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);
}

154 155 156 157 158 159 160 161 162 163 164 165
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;
}

166
u16 ath9k_hw_computetxtime(struct ath_hw *ah,
167
			   u8 phy, int kbps,
S
Sujith 已提交
168 169
			   u32 frameLen, u16 rateix,
			   bool shortPreamble)
170
{
S
Sujith 已提交
171
	u32 bitsPerSymbol, numBits, numSymbols, phyTime, txTime;
172

S
Sujith 已提交
173 174
	if (kbps == 0)
		return 0;
175

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

S
Sujith 已提交
215 216
	return txTime;
}
217
EXPORT_SYMBOL(ath9k_hw_computetxtime);
218

219
void ath9k_hw_get_channel_centers(struct ath_hw *ah,
S
Sujith 已提交
220 221
				  struct ath9k_channel *chan,
				  struct chan_centers *centers)
222
{
S
Sujith 已提交
223
	int8_t extoff;
224

S
Sujith 已提交
225 226 227 228
	if (!IS_CHAN_HT40(chan)) {
		centers->ctl_center = centers->ext_center =
			centers->synth_center = chan->channel;
		return;
229 230
	}

S
Sujith 已提交
231 232 233 234 235 236 237 238 239 240
	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;
	}
241

S
Sujith 已提交
242 243
	centers->ctl_center =
		centers->synth_center - (extoff * HT40_CHANNEL_CENTER_SHIFT);
244
	/* 25 MHz spacing is supported by hw but not on upper layers */
S
Sujith 已提交
245
	centers->ext_center =
246
		centers->synth_center + (extoff * HT40_CHANNEL_CENTER_SHIFT);
247 248
}

S
Sujith 已提交
249 250 251 252
/******************/
/* Chip Revisions */
/******************/

253
static void ath9k_hw_read_revisions(struct ath_hw *ah)
254
{
S
Sujith 已提交
255
	u32 val;
256

257 258 259 260
	switch (ah->hw_version.devid) {
	case AR5416_AR9100_DEVID:
		ah->hw_version.macVersion = AR_SREV_VERSION_9100;
		break;
261 262 263 264 265 266 267 268 269
	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;
270 271 272 273 274 275 276
	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 已提交
277
	val = REG_READ(ah, AR_SREV) & AR_SREV_ID;
278

S
Sujith 已提交
279 280
	if (val == 0xFF) {
		val = REG_READ(ah, AR_SREV);
281 282 283
		ah->hw_version.macVersion =
			(val & AR_SREV_VERSION2) >> AR_SREV_TYPE2_S;
		ah->hw_version.macRev = MS(val, AR_SREV_REVISION2);
284
		ah->is_pciexpress = (val & AR_SREV_TYPE2_HOST_MODE) ? 0 : 1;
S
Sujith 已提交
285 286
	} else {
		if (!AR_SREV_9100(ah))
287
			ah->hw_version.macVersion = MS(val, AR_SREV_VERSION);
288

289
		ah->hw_version.macRev = val & AR_SREV_REVISION;
290

291
		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCIE)
292
			ah->is_pciexpress = true;
S
Sujith 已提交
293
	}
294 295
}

S
Sujith 已提交
296 297 298 299
/************************************/
/* HW Attach, Detach, Init Routines */
/************************************/

300
static void ath9k_hw_disablepcie(struct ath_hw *ah)
301
{
302
	if (!AR_SREV_5416(ah))
S
Sujith 已提交
303
		return;
304

S
Sujith 已提交
305 306 307 308 309 310 311 312 313
	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);
314

S
Sujith 已提交
315
	REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
316 317
}

318
/* This should work for all families including legacy */
319
static bool ath9k_hw_chip_test(struct ath_hw *ah)
320
{
321
	struct ath_common *common = ath9k_hw_common(ah);
322
	u32 regAddr[2] = { AR_STA_ID0 };
S
Sujith 已提交
323
	u32 regHold[2];
J
Joe Perches 已提交
324 325 326
	static const u32 patternData[4] = {
		0x55555555, 0xaaaaaaaa, 0x66666666, 0x99999999
	};
327
	int i, j, loop_max;
328

329 330 331 332 333 334 335
	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 已提交
336 337
		u32 addr = regAddr[i];
		u32 wrData, rdData;
338

S
Sujith 已提交
339 340 341 342 343 344
		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) {
345 346 347
				ath_err(common,
					"address test failed addr: 0x%08x - wr:0x%08x != rd:0x%08x\n",
					addr, wrData, rdData);
S
Sujith 已提交
348 349 350 351 352 353 354 355
				return false;
			}
		}
		for (j = 0; j < 4; j++) {
			wrData = patternData[j];
			REG_WRITE(ah, addr, wrData);
			rdData = REG_READ(ah, addr);
			if (wrData != rdData) {
356 357 358
				ath_err(common,
					"address test failed addr: 0x%08x - wr:0x%08x != rd:0x%08x\n",
					addr, wrData, rdData);
S
Sujith 已提交
359 360
				return false;
			}
361
		}
S
Sujith 已提交
362
		REG_WRITE(ah, regAddr[i], regHold[i]);
363
	}
S
Sujith 已提交
364
	udelay(100);
365

366 367 368
	return true;
}

369
static void ath9k_hw_init_config(struct ath_hw *ah)
S
Sujith 已提交
370 371
{
	int i;
372

373 374 375 376 377 378 379 380 381
	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_powersave_enable = 0;
	ah->config.pcie_clock_req = 0;
	ah->config.pcie_waen = 0;
	ah->config.analog_shiftreg = 1;
382
	ah->config.enable_ani = true;
383

S
Sujith 已提交
384
	for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) {
385 386
		ah->config.spurchans[i][0] = AR_NO_SPUR;
		ah->config.spurchans[i][1] = AR_NO_SPUR;
387 388
	}

389 390 391
	/* PAPRD needs some more work to be enabled */
	ah->config.paprd_disable = 1;

S
Sujith 已提交
392
	ah->config.rx_intr_mitigation = true;
393
	ah->config.pcieSerDesWrite = true;
394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411

	/*
	 * 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)
412
		ah->config.serialize_regmode = SER_REG_MODE_AUTO;
413 414
}

415
static void ath9k_hw_init_defaults(struct ath_hw *ah)
416
{
417 418 419 420 421 422
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);

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

423 424
	ah->hw_version.magic = AR5416_MAGIC;
	ah->hw_version.subvendorid = 0;
425

426
	ah->atim_window = 0;
427 428 429
	ah->sta_id1_defaults =
		AR_STA_ID1_CRPT_MIC_ENABLE |
		AR_STA_ID1_MCAST_KSRCH;
430 431
	if (AR_SREV_9100(ah))
		ah->sta_id1_defaults |= AR_STA_ID1_AR9100_BA_FIX;
432
	ah->enable_32kHz_clock = DONT_USE_32KHZ;
F
Felix Fietkau 已提交
433
	ah->slottime = 20;
434
	ah->globaltxtimeout = (u32) -1;
435
	ah->power_mode = ATH9K_PM_UNDEFINED;
436 437
}

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

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

	return 0;
}

459
static int ath9k_hw_post_init(struct ath_hw *ah)
460
{
S
Sujith Manoharan 已提交
461
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
462
	int ecode;
463

S
Sujith Manoharan 已提交
464
	if (common->bus_ops->ath_bus_type != ATH_USB) {
S
Sujith 已提交
465 466 467
		if (!ath9k_hw_chip_test(ah))
			return -ENODEV;
	}
468

469 470 471 472 473
	if (!AR_SREV_9300_20_OR_LATER(ah)) {
		ecode = ar9002_hw_rf_claim(ah);
		if (ecode != 0)
			return ecode;
	}
474

475
	ecode = ath9k_hw_eeprom_init(ah);
S
Sujith 已提交
476 477
	if (ecode != 0)
		return ecode;
478

J
Joe Perches 已提交
479 480 481 482
	ath_dbg(ath9k_hw_common(ah), ATH_DBG_CONFIG,
		"Eeprom VER: %d, REV: %d\n",
		ah->eep_ops->get_eeprom_ver(ah),
		ah->eep_ops->get_eeprom_rev(ah));
483

484 485
	ecode = ath9k_hw_rf_alloc_ext_banks(ah);
	if (ecode) {
486 487
		ath_err(ath9k_hw_common(ah),
			"Failed allocating banks for external radio\n");
488
		ath9k_hw_rf_free_ext_banks(ah);
489
		return ecode;
490
	}
491

492
	if (!AR_SREV_9100(ah) && !AR_SREV_9340(ah)) {
S
Sujith 已提交
493
		ath9k_hw_ani_setup(ah);
494
		ath9k_hw_ani_init(ah);
495 496 497 498 499
	}

	return 0;
}

500
static void ath9k_hw_attach_ops(struct ath_hw *ah)
501
{
502 503 504 505
	if (AR_SREV_9300_20_OR_LATER(ah))
		ar9003_hw_attach_ops(ah);
	else
		ar9002_hw_attach_ops(ah);
506 507
}

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

514 515
	ath9k_hw_read_revisions(ah);

516 517 518 519 520 521 522 523 524
	/*
	 * 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);

525
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) {
526
		ath_err(common, "Couldn't reset chip\n");
527
		return -EIO;
528 529
	}

530 531 532
	ath9k_hw_init_defaults(ah);
	ath9k_hw_init_config(ah);

533
	ath9k_hw_attach_ops(ah);
534

535
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) {
536
		ath_err(common, "Couldn't wakeup chip\n");
537
		return -EIO;
538 539 540 541
	}

	if (ah->config.serialize_regmode == SER_REG_MODE_AUTO) {
		if (ah->hw_version.macVersion == AR_SREV_VERSION_5416_PCI ||
542 543
		    ((AR_SREV_9160(ah) || AR_SREV_9280(ah)) &&
		     !ah->is_pciexpress)) {
544 545 546 547 548 549 550 551
			ah->config.serialize_regmode =
				SER_REG_MODE_ON;
		} else {
			ah->config.serialize_regmode =
				SER_REG_MODE_OFF;
		}
	}

J
Joe Perches 已提交
552
	ath_dbg(common, ATH_DBG_RESET, "serialize_regmode is %d\n",
553 554
		ah->config.serialize_regmode);

555 556 557 558 559
	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;

560 561 562 563 564 565 566 567 568 569
	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:
570
	case AR_SREV_VERSION_9330:
571
	case AR_SREV_VERSION_9485:
572
	case AR_SREV_VERSION_9340:
573 574
		break;
	default:
575 576 577
		ath_err(common,
			"Mac Chip Rev 0x%02x.%x is not supported by this driver\n",
			ah->hw_version.macVersion, ah->hw_version.macRev);
578
		return -EOPNOTSUPP;
579 580
	}

581 582
	if (AR_SREV_9271(ah) || AR_SREV_9100(ah) || AR_SREV_9340(ah) ||
	    AR_SREV_9330(ah))
583 584
		ah->is_pciexpress = false;

585 586 587 588
	ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID);
	ath9k_hw_init_cal_settings(ah);

	ah->ani_function = ATH9K_ANI_ALL;
589
	if (AR_SREV_9280_20_OR_LATER(ah) && !AR_SREV_9300_20_OR_LATER(ah))
590
		ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL;
591 592
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ah->ani_function &= ~ATH9K_ANI_MRC_CCK;
593 594 595

	ath9k_hw_init_mode_regs(ah);

596

597
	if (ah->is_pciexpress)
V
Vivek Natarajan 已提交
598
		ath9k_hw_configpcipowersave(ah, 0, 0);
599 600 601
	else
		ath9k_hw_disablepcie(ah);

602 603
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ar9002_hw_cck_chan14_spread(ah);
S
Sujith 已提交
604

605
	r = ath9k_hw_post_init(ah);
606
	if (r)
607
		return r;
608 609

	ath9k_hw_init_mode_gain_regs(ah);
610 611 612 613
	r = ath9k_hw_fill_cap_info(ah);
	if (r)
		return r;

614 615
	r = ath9k_hw_init_macaddr(ah);
	if (r) {
616
		ath_err(common, "Failed to initialize MAC address\n");
617
		return r;
618 619
	}

620
	if (AR_SREV_9285(ah) || AR_SREV_9271(ah))
621
		ah->tx_trig_level = (AR_FTRIG_256B >> AR_FTRIG_S);
S
Sujith 已提交
622
	else
623
		ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S);
624

625 626 627 628
	if (AR_SREV_9330(ah))
		ah->bb_watchdog_timeout_ms = 85;
	else
		ah->bb_watchdog_timeout_ms = 25;
629

630 631
	common->state = ATH_HW_INITIALIZED;

632
	return 0;
633 634
}

635
int ath9k_hw_init(struct ath_hw *ah)
636
{
637 638
	int ret;
	struct ath_common *common = ath9k_hw_common(ah);
639

640 641 642 643 644 645 646 647 648
	/* 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:
649 650
	case AR9287_DEVID_PCI:
	case AR9287_DEVID_PCIE:
651
	case AR2427_DEVID_PCIE:
652
	case AR9300_DEVID_PCIE:
653
	case AR9300_DEVID_AR9485_PCIE:
G
Gabor Juhos 已提交
654
	case AR9300_DEVID_AR9330:
655
	case AR9300_DEVID_AR9340:
656 657 658 659
		break;
	default:
		if (common->bus_ops->ath_bus_type == ATH_USB)
			break;
660 661
		ath_err(common, "Hardware device ID 0x%04x not supported\n",
			ah->hw_version.devid);
662 663
		return -EOPNOTSUPP;
	}
664

665 666
	ret = __ath9k_hw_init(ah);
	if (ret) {
667 668 669
		ath_err(common,
			"Unable to initialize hardware; initialization status: %d\n",
			ret);
670 671
		return ret;
	}
672

673
	return 0;
674
}
675
EXPORT_SYMBOL(ath9k_hw_init);
676

677
static void ath9k_hw_init_qos(struct ath_hw *ah)
678
{
S
Sujith 已提交
679 680
	ENABLE_REGWRITE_BUFFER(ah);

S
Sujith 已提交
681 682
	REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa);
	REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210);
683

S
Sujith 已提交
684 685 686 687 688 689 690 691 692 693
	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 已提交
694 695

	REGWRITE_BUFFER_FLUSH(ah);
696 697
}

698
u32 ar9003_get_pll_sqsum_dvc(struct ath_hw *ah)
699
{
700 701 702
	REG_CLR_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
	udelay(100);
	REG_SET_BIT(ah, PLL3, PLL3_DO_MEAS_MASK);
703

704 705
	while ((REG_READ(ah, PLL4) & PLL4_MEAS_DONE) == 0)
		udelay(100);
706

707
	return (REG_READ(ah, PLL3) & SQSUM_DVC_MASK) >> 3;
708 709 710
}
EXPORT_SYMBOL(ar9003_get_pll_sqsum_dvc);

711
static void ath9k_hw_init_pll(struct ath_hw *ah,
S
Sujith 已提交
712
			      struct ath9k_channel *chan)
713
{
714 715
	u32 pll;

716 717
	if (AR_SREV_9485(ah)) {

718 719 720 721 722 723 724
		/* 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);
725

726 727 728 729 730 731
		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);
732 733

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
734 735 736
			      AR_CH0_BB_DPLL2_OUTDIV, 0x1);
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_LOCAL_PLL, 0x1);
737
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
738
			      AR_CH0_BB_DPLL2_EN_NEGTRIG, 0x1);
739

740
		/* program BB PLL phase_shift to 0x6 */
741
		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL3,
742 743 744 745
			      AR_CH0_BB_DPLL3_PHASE_SHIFT, 0x6);

		REG_RMW_FIELD(ah, AR_CH0_BB_DPLL2,
			      AR_CH0_BB_DPLL2_PLL_PWD, 0x0);
746
		udelay(1000);
747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 777 778 779
	} 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);
780 781 782 783 784 785 786 787 788 789 790 791 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814
	} 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);
815
	}
816 817

	pll = ath9k_hw_compute_pll_control(ah, chan);
818

819
	REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll);
820

821
	if (AR_SREV_9485(ah) || AR_SREV_9340(ah) || AR_SREV_9330(ah))
822 823
		udelay(1000);

824 825
	/* Switch the core clock for ar9271 to 117Mhz */
	if (AR_SREV_9271(ah)) {
826 827
		udelay(500);
		REG_WRITE(ah, 0x50040, 0x304);
828 829
	}

S
Sujith 已提交
830 831 832
	udelay(RTC_PLL_SETTLE_DELAY);

	REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK);
833 834 835 836 837 838 839 840 841 842 843 844 845

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

848
static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
849
					  enum nl80211_iftype opmode)
850
{
851
	u32 sync_default = AR_INTR_SYNC_DEFAULT;
852
	u32 imr_reg = AR_IMR_TXERR |
S
Sujith 已提交
853 854 855 856
		AR_IMR_TXURN |
		AR_IMR_RXERR |
		AR_IMR_RXORN |
		AR_IMR_BCNMISC;
857

858 859 860
	if (AR_SREV_9340(ah))
		sync_default &= ~AR_INTR_SYNC_HOST1_FATAL;

861 862 863 864 865 866
	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;
867

868 869 870 871 872 873
	} else {
		if (ah->config.rx_intr_mitigation)
			imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR;
		else
			imr_reg |= AR_IMR_RXOK;
	}
874

875 876 877 878
	if (ah->config.tx_intr_mitigation)
		imr_reg |= AR_IMR_TXINTM | AR_IMR_TXMINTR;
	else
		imr_reg |= AR_IMR_TXOK;
879

880
	if (opmode == NL80211_IFTYPE_AP)
881
		imr_reg |= AR_IMR_MIB;
882

S
Sujith 已提交
883 884
	ENABLE_REGWRITE_BUFFER(ah);

885
	REG_WRITE(ah, AR_IMR, imr_reg);
886 887
	ah->imrs2_reg |= AR_IMR_S2_GTT;
	REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
888

S
Sujith 已提交
889 890
	if (!AR_SREV_9100(ah)) {
		REG_WRITE(ah, AR_INTR_SYNC_CAUSE, 0xFFFFFFFF);
891
		REG_WRITE(ah, AR_INTR_SYNC_ENABLE, sync_default);
S
Sujith 已提交
892 893
		REG_WRITE(ah, AR_INTR_SYNC_MASK, 0);
	}
894

S
Sujith 已提交
895 896
	REGWRITE_BUFFER_FLUSH(ah);

897 898 899 900 901 902
	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);
	}
903 904
}

905
static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us)
906
{
907 908 909
	u32 val = ath9k_hw_mac_to_clks(ah, us);
	val = min(val, (u32) 0xFFFF);
	REG_WRITE(ah, AR_D_GBL_IFS_SLOT, val);
910 911
}

912
static void ath9k_hw_set_ack_timeout(struct ath_hw *ah, u32 us)
913
{
914 915 916 917 918 919 920 921 922 923
	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);
924
}
S
Sujith 已提交
925

926
static bool ath9k_hw_set_global_txtimeout(struct ath_hw *ah, u32 tu)
927 928
{
	if (tu > 0xFFFF) {
J
Joe Perches 已提交
929 930
		ath_dbg(ath9k_hw_common(ah), ATH_DBG_XMIT,
			"bad global tx timeout %u\n", tu);
931
		ah->globaltxtimeout = (u32) -1;
932 933 934
		return false;
	} else {
		REG_RMW_FIELD(ah, AR_GTXTO, AR_GTXTO_TIMEOUT_LIMIT, tu);
935
		ah->globaltxtimeout = tu;
936 937 938 939
		return true;
	}
}

940
void ath9k_hw_init_global_settings(struct ath_hw *ah)
941
{
942 943
	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
	int acktimeout;
944
	int slottime;
945 946
	int sifstime;

J
Joe Perches 已提交
947 948
	ath_dbg(ath9k_hw_common(ah), ATH_DBG_RESET, "ah->misc_mode 0x%x\n",
		ah->misc_mode);
949

950
	if (ah->misc_mode != 0)
951
		REG_SET_BIT(ah, AR_PCU_MISC, ah->misc_mode);
952 953 954 955 956 957

	if (conf->channel && conf->channel->band == IEEE80211_BAND_5GHZ)
		sifstime = 16;
	else
		sifstime = 10;

958 959 960
	/* As defined by IEEE 802.11-2007 17.3.8.6 */
	slottime = ah->slottime + 3 * ah->coverage_class;
	acktimeout = slottime + sifstime;
961 962 963 964 965 966 967 968 969 970 971

	/*
	 * Workaround for early ACK timeouts, add an offset to match the
	 * initval's 64us ack timeout value.
	 * 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.
	 */
	if (conf->channel && conf->channel->band == IEEE80211_BAND_2GHZ)
		acktimeout += 64 - sifstime - ah->slottime;

972
	ath9k_hw_setslottime(ah, ah->slottime);
973 974
	ath9k_hw_set_ack_timeout(ah, acktimeout);
	ath9k_hw_set_cts_timeout(ah, acktimeout);
975 976
	if (ah->globaltxtimeout != (u32) -1)
		ath9k_hw_set_global_txtimeout(ah, ah->globaltxtimeout);
S
Sujith 已提交
977
}
978
EXPORT_SYMBOL(ath9k_hw_init_global_settings);
S
Sujith 已提交
979

S
Sujith 已提交
980
void ath9k_hw_deinit(struct ath_hw *ah)
S
Sujith 已提交
981
{
982 983
	struct ath_common *common = ath9k_hw_common(ah);

S
Sujith 已提交
984
	if (common->state < ATH_HW_INITIALIZED)
985 986
		goto free_hw;

987
	ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP);
988 989

free_hw:
990
	ath9k_hw_rf_free_ext_banks(ah);
S
Sujith 已提交
991
}
S
Sujith 已提交
992
EXPORT_SYMBOL(ath9k_hw_deinit);
S
Sujith 已提交
993 994 995 996 997

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

998
u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan)
999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011
{
	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 已提交
1012 1013 1014 1015
/****************************************/
/* Reset and Channel Switching Routines */
/****************************************/

1016
static inline void ath9k_hw_set_dma(struct ath_hw *ah)
S
Sujith 已提交
1017
{
1018
	struct ath_common *common = ath9k_hw_common(ah);
S
Sujith 已提交
1019

S
Sujith 已提交
1020 1021
	ENABLE_REGWRITE_BUFFER(ah);

1022 1023 1024
	/*
	 * set AHB_MODE not to do cacheline prefetches
	*/
1025 1026
	if (!AR_SREV_9300_20_OR_LATER(ah))
		REG_SET_BIT(ah, AR_AHB_MODE, AR_AHB_PREFETCH_RD_EN);
S
Sujith 已提交
1027

1028 1029 1030
	/*
	 * let mac dma reads be in 128 byte chunks
	 */
1031
	REG_RMW(ah, AR_TXCFG, AR_TXCFG_DMASZ_128B, AR_TXCFG_DMASZ_MASK);
S
Sujith 已提交
1032

S
Sujith 已提交
1033 1034
	REGWRITE_BUFFER_FLUSH(ah);

1035 1036 1037 1038 1039
	/*
	 * 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.
	 */
1040 1041
	if (!AR_SREV_9300_20_OR_LATER(ah))
		REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level);
S
Sujith 已提交
1042

S
Sujith 已提交
1043
	ENABLE_REGWRITE_BUFFER(ah);
S
Sujith 已提交
1044

1045 1046 1047
	/*
	 * let mac dma writes be in 128 byte chunks
	 */
1048
	REG_RMW(ah, AR_RXCFG, AR_RXCFG_DMASZ_128B, AR_RXCFG_DMASZ_MASK);
S
Sujith 已提交
1049

1050 1051 1052
	/*
	 * Setup receive FIFO threshold to hold off TX activities
	 */
S
Sujith 已提交
1053 1054
	REG_WRITE(ah, AR_RXFIFO_CFG, 0x200);

1055 1056 1057 1058 1059 1060 1061 1062
	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);
	}

1063 1064 1065 1066
	/*
	 * reduce the number of usable entries in PCU TXBUF to avoid
	 * wrap around issues.
	 */
S
Sujith 已提交
1067
	if (AR_SREV_9285(ah)) {
1068 1069 1070 1071
		/* 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 已提交
1072 1073
		REG_WRITE(ah, AR_PCU_TXBUF_CTRL,
			  AR_9285_PCU_TXBUF_CTRL_USABLE_SIZE);
1074
	} else if (!AR_SREV_9271(ah)) {
S
Sujith 已提交
1075 1076 1077
		REG_WRITE(ah, AR_PCU_TXBUF_CTRL,
			  AR_PCU_TXBUF_CTRL_USABLE_SIZE);
	}
1078

S
Sujith 已提交
1079 1080
	REGWRITE_BUFFER_FLUSH(ah);

1081 1082
	if (AR_SREV_9300_20_OR_LATER(ah))
		ath9k_hw_reset_txstatus_ring(ah);
S
Sujith 已提交
1083 1084
}

1085
static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode)
S
Sujith 已提交
1086
{
1087 1088
	u32 mask = AR_STA_ID1_STA_AP | AR_STA_ID1_ADHOC;
	u32 set = AR_STA_ID1_KSRCH_MODE;
S
Sujith 已提交
1089 1090

	switch (opmode) {
1091
	case NL80211_IFTYPE_ADHOC:
1092
	case NL80211_IFTYPE_MESH_POINT:
1093
		set |= AR_STA_ID1_ADHOC;
S
Sujith 已提交
1094
		REG_SET_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1095
		break;
1096 1097 1098
	case NL80211_IFTYPE_AP:
		set |= AR_STA_ID1_STA_AP;
		/* fall through */
1099
	case NL80211_IFTYPE_STATION:
1100
		REG_CLR_BIT(ah, AR_CFG, AR_CFG_AP_ADHOC_INDICATION);
1101
		break;
1102
	default:
1103 1104
		if (!ah->is_monitoring)
			set = 0;
1105
		break;
S
Sujith 已提交
1106
	}
1107
	REG_RMW(ah, AR_STA_ID1, set, mask);
S
Sujith 已提交
1108 1109
}

1110 1111
void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled,
				   u32 *coef_mantissa, u32 *coef_exponent)
S
Sujith 已提交
1112 1113 1114 1115 1116 1117 1118 1119 1120 1121 1122 1123 1124 1125 1126
{
	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;
}

1127
static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
S
Sujith 已提交
1128 1129 1130 1131
{
	u32 rst_flags;
	u32 tmpReg;

1132
	if (AR_SREV_9100(ah)) {
1133 1134
		REG_RMW_FIELD(ah, AR_RTC_DERIVED_CLK,
			      AR_RTC_DERIVED_CLK_PERIOD, 1);
1135 1136 1137
		(void)REG_READ(ah, AR_RTC_DERIVED_CLK);
	}

S
Sujith 已提交
1138 1139
	ENABLE_REGWRITE_BUFFER(ah);

1140 1141 1142 1143 1144
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1145 1146 1147 1148 1149 1150 1151 1152 1153 1154 1155
	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)) {
1156
			u32 val;
S
Sujith 已提交
1157
			REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0);
1158 1159 1160 1161 1162 1163 1164

			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 已提交
1165 1166 1167 1168 1169 1170 1171
			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;
	}

1172 1173 1174 1175 1176 1177 1178 1179 1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
	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;

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

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

			REG_WRITE(ah, AR_RTC_RESET, 1);
		}
	}

1207
	REG_WRITE(ah, AR_RTC_RC, rst_flags);
S
Sujith 已提交
1208 1209 1210

	REGWRITE_BUFFER_FLUSH(ah);

S
Sujith 已提交
1211 1212
	udelay(50);

1213
	REG_WRITE(ah, AR_RTC_RC, 0);
S
Sujith 已提交
1214
	if (!ath9k_hw_wait(ah, AR_RTC_RC, AR_RTC_RC_M, 0, AH_WAIT_TIMEOUT)) {
J
Joe Perches 已提交
1215 1216
		ath_dbg(ath9k_hw_common(ah), ATH_DBG_RESET,
			"RTC stuck in MAC reset\n");
S
Sujith 已提交
1217 1218 1219 1220 1221 1222 1223 1224 1225 1226 1227 1228
		return false;
	}

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

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

	return true;
}

1229
static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
S
Sujith 已提交
1230
{
S
Sujith 已提交
1231 1232
	ENABLE_REGWRITE_BUFFER(ah);

1233 1234 1235 1236 1237
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1238 1239 1240
	REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
		  AR_RTC_FORCE_WAKE_ON_INT);

1241
	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
1242 1243
		REG_WRITE(ah, AR_RC, AR_RC_AHB);

1244
	REG_WRITE(ah, AR_RTC_RESET, 0);
1245

S
Sujith 已提交
1246 1247
	REGWRITE_BUFFER_FLUSH(ah);

1248 1249 1250 1251
	if (!AR_SREV_9300_20_OR_LATER(ah))
		udelay(2);

	if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
1252 1253
		REG_WRITE(ah, AR_RC, 0);

1254
	REG_WRITE(ah, AR_RTC_RESET, 1);
S
Sujith 已提交
1255 1256 1257 1258

	if (!ath9k_hw_wait(ah,
			   AR_RTC_STATUS,
			   AR_RTC_STATUS_M,
S
Sujith 已提交
1259 1260
			   AR_RTC_STATUS_ON,
			   AH_WAIT_TIMEOUT)) {
J
Joe Perches 已提交
1261 1262
		ath_dbg(ath9k_hw_common(ah), ATH_DBG_RESET,
			"RTC not waking up\n");
S
Sujith 已提交
1263
		return false;
1264 1265
	}

S
Sujith 已提交
1266 1267 1268
	return ath9k_hw_set_reset(ah, ATH9K_RESET_WARM);
}

1269
static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type)
S
Sujith 已提交
1270
{
1271 1272 1273 1274 1275
	if (AR_SREV_9300_20_OR_LATER(ah)) {
		REG_WRITE(ah, AR_WA, ah->WARegVal);
		udelay(10);
	}

S
Sujith 已提交
1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287
	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:
		return ath9k_hw_set_reset_power_on(ah);
	case ATH9K_RESET_WARM:
	case ATH9K_RESET_COLD:
		return ath9k_hw_set_reset(ah, type);
	default:
		return false;
	}
1288 1289
}

1290
static bool ath9k_hw_chip_reset(struct ath_hw *ah,
S
Sujith 已提交
1291
				struct ath9k_channel *chan)
1292
{
1293
	if (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)) {
1294 1295 1296
		if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON))
			return false;
	} else if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
S
Sujith 已提交
1297
		return false;
1298

1299
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
S
Sujith 已提交
1300
		return false;
1301

1302
	ah->chip_fullsleep = false;
S
Sujith 已提交
1303 1304
	ath9k_hw_init_pll(ah, chan);
	ath9k_hw_set_rfmode(ah, chan);
1305

S
Sujith 已提交
1306
	return true;
1307 1308
}

1309
static bool ath9k_hw_channel_change(struct ath_hw *ah,
L
Luis R. Rodriguez 已提交
1310
				    struct ath9k_channel *chan)
1311
{
1312
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
1313
	struct ath_common *common = ath9k_hw_common(ah);
1314
	struct ieee80211_channel *channel = chan->chan;
1315
	u32 qnum;
1316
	int r;
1317 1318 1319

	for (qnum = 0; qnum < AR_NUM_QCU; qnum++) {
		if (ath9k_hw_numtxpending(ah, qnum)) {
J
Joe Perches 已提交
1320 1321
			ath_dbg(common, ATH_DBG_QUEUE,
				"Transmit frames pending on queue %d\n", qnum);
1322 1323 1324 1325
			return false;
		}
	}

1326
	if (!ath9k_hw_rfbus_req(ah)) {
1327
		ath_err(common, "Could not kill baseband RX\n");
1328 1329 1330
		return false;
	}

1331
	ath9k_hw_set_channel_regs(ah, chan);
1332

1333
	r = ath9k_hw_rf_set_freq(ah, chan);
1334
	if (r) {
1335
		ath_err(common, "Failed to set channel\n");
1336
		return false;
1337
	}
1338
	ath9k_hw_set_clockrate(ah);
1339

1340
	ah->eep_ops->set_txpower(ah, chan,
1341
			     ath9k_regd_get_ctl(regulatory, chan),
S
Sujith 已提交
1342 1343 1344
			     channel->max_antenna_gain * 2,
			     channel->max_power * 2,
			     min((u32) MAX_RATE_POWER,
1345
			     (u32) regulatory->power_limit), false);
1346

1347
	ath9k_hw_rfbus_done(ah);
1348

S
Sujith 已提交
1349 1350 1351
	if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
		ath9k_hw_set_delta_slope(ah, chan);

1352
	ath9k_hw_spur_mitigate_freq(ah, chan);
S
Sujith 已提交
1353 1354 1355 1356

	return true;
}

1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
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)));
	}
}

1371
bool ath9k_hw_check_alive(struct ath_hw *ah)
J
Johannes Berg 已提交
1372
{
1373 1374 1375
	int count = 50;
	u32 reg;

1376
	if (AR_SREV_9285_12_OR_LATER(ah))
1377 1378 1379 1380
		return true;

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

1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393
		if ((reg & 0x7E7FFFEF) == 0x00702400)
			continue;

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

1395
	return false;
J
Johannes Berg 已提交
1396
}
1397
EXPORT_SYMBOL(ath9k_hw_check_alive);
J
Johannes Berg 已提交
1398

1399
int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1400
		   struct ath9k_hw_cal_data *caldata, bool bChannelChange)
1401
{
1402
	struct ath_common *common = ath9k_hw_common(ah);
1403
	u32 saveLedState;
1404
	struct ath9k_channel *curchan = ah->curchan;
1405 1406
	u32 saveDefAntenna;
	u32 macStaId1;
S
Sujith 已提交
1407
	u64 tsf = 0;
1408
	int i, r;
1409

1410 1411
	ah->txchainmask = common->tx_chainmask;
	ah->rxchainmask = common->rx_chainmask;
1412

1413
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
1414
		return -EIO;
1415

1416
	if (curchan && !ah->chip_fullsleep)
1417 1418
		ath9k_hw_getnf(ah, curchan);

1419 1420 1421 1422 1423 1424 1425 1426 1427 1428
	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);
	}

1429
	if (bChannelChange &&
1430 1431 1432
	    (ah->chip_fullsleep != true) &&
	    (ah->curchan != NULL) &&
	    (chan->channel != ah->curchan->channel) &&
1433
	    ((chan->channelFlags & CHANNEL_ALL) ==
1434
	     (ah->curchan->channelFlags & CHANNEL_ALL)) &&
1435
	    (!AR_SREV_9280(ah) || AR_DEVID_7010(ah))) {
1436

L
Luis R. Rodriguez 已提交
1437
		if (ath9k_hw_channel_change(ah, chan)) {
1438
			ath9k_hw_loadnf(ah, ah->curchan);
1439
			ath9k_hw_start_nfcal(ah, true);
1440 1441
			if (AR_SREV_9271(ah))
				ar9002_hw_load_ani_reg(ah, chan);
1442
			return 0;
1443 1444 1445 1446 1447 1448 1449 1450 1451
		}
	}

	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 已提交
1452
	/* For chips on which RTC reset is done, save TSF before it gets cleared */
1453 1454
	if (AR_SREV_9100(ah) ||
	    (AR_SREV_9280(ah) && ah->eep_ops->get_eeprom(ah, EEP_OL_PWRCTRL)))
S
Sujith 已提交
1455 1456
		tsf = ath9k_hw_gettsf64(ah);

1457 1458 1459 1460 1461 1462
	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);

1463 1464
	ah->paprd_table_write_done = false;

1465
	/* Only required on the first reset */
1466 1467 1468 1469 1470 1471 1472
	if (AR_SREV_9271(ah) && ah->htc_reset_init) {
		REG_WRITE(ah,
			  AR9271_RESET_POWER_DOWN_CONTROL,
			  AR9271_RADIO_RF_RST);
		udelay(50);
	}

1473
	if (!ath9k_hw_chip_reset(ah, chan)) {
1474
		ath_err(common, "Chip reset failed\n");
1475
		return -EINVAL;
1476 1477
	}

1478
	/* Only required on the first reset */
1479 1480 1481 1482 1483 1484 1485 1486
	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 已提交
1487
	/* Restore TSF */
1488
	if (tsf)
S
Sujith 已提交
1489 1490
		ath9k_hw_settsf64(ah, tsf);

1491
	if (AR_SREV_9280_20_OR_LATER(ah))
1492
		REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE);
1493

S
Sujith 已提交
1494 1495 1496
	if (!AR_SREV_9300_20_OR_LATER(ah))
		ar9002_hw_enable_async_fifo(ah);

L
Luis R. Rodriguez 已提交
1497
	r = ath9k_hw_process_ini(ah, chan);
1498 1499
	if (r)
		return r;
1500

1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511
	/*
	 * 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);
	}

1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528
	/* 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;

1529 1530 1531
	if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan))
		ath9k_hw_set_delta_slope(ah, chan);

1532
	ath9k_hw_spur_mitigate_freq(ah, chan);
1533
	ah->eep_ops->set_board_values(ah, chan);
1534

S
Sujith 已提交
1535 1536
	ENABLE_REGWRITE_BUFFER(ah);

1537 1538
	REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
	REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
1539 1540
		  | macStaId1
		  | AR_STA_ID1_RTS_USE_DEF
1541
		  | (ah->config.
1542
		     ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0)
1543
		  | ah->sta_id1_defaults);
1544
	ath_hw_setbssidmask(common);
1545
	REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna);
1546
	ath9k_hw_write_associd(ah);
1547 1548 1549
	REG_WRITE(ah, AR_ISR, ~0);
	REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);

S
Sujith 已提交
1550 1551
	REGWRITE_BUFFER_FLUSH(ah);

1552 1553
	ath9k_hw_set_operating_mode(ah, ah->opmode);

1554
	r = ath9k_hw_rf_set_freq(ah, chan);
1555 1556
	if (r)
		return r;
1557

1558 1559
	ath9k_hw_set_clockrate(ah);

S
Sujith 已提交
1560 1561
	ENABLE_REGWRITE_BUFFER(ah);

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

S
Sujith 已提交
1565 1566
	REGWRITE_BUFFER_FLUSH(ah);

1567
	ah->intr_txqs = 0;
1568
	for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++)
1569 1570
		ath9k_hw_resettxqueue(ah, i);

1571
	ath9k_hw_init_interrupt_masks(ah, ah->opmode);
1572
	ath9k_hw_ani_cache_ini_regs(ah);
1573 1574
	ath9k_hw_init_qos(ah);

1575
	if (ah->caps.hw_caps & ATH9K_HW_CAP_RFSILENT)
1576
		ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio);
J
Johannes Berg 已提交
1577

1578
	ath9k_hw_init_global_settings(ah);
1579

1580
	if (!AR_SREV_9300_20_OR_LATER(ah)) {
S
Sujith 已提交
1581
		ar9002_hw_update_async_fifo(ah);
1582
		ar9002_hw_enable_wep_aggregation(ah);
1583 1584
	}

1585
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PRESERVE_SEQNUM);
1586 1587 1588 1589 1590

	ath9k_hw_set_dma(ah);

	REG_WRITE(ah, AR_OBS, 8);

S
Sujith 已提交
1591
	if (ah->config.rx_intr_mitigation) {
1592 1593 1594 1595
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_LAST, 500);
		REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000);
	}

1596 1597 1598 1599 1600
	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);
	}

1601 1602
	ath9k_hw_init_bb(ah, chan);

1603
	if (!ath9k_hw_init_cal(ah, chan))
1604
		return -EIO;
1605

S
Sujith 已提交
1606
	ENABLE_REGWRITE_BUFFER(ah);
1607

1608
	ath9k_hw_restore_chainmask(ah);
1609 1610
	REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ);

S
Sujith 已提交
1611 1612
	REGWRITE_BUFFER_FLUSH(ah);

1613 1614 1615
	/*
	 * For big endian systems turn on swapping for descriptors
	 */
1616 1617 1618 1619
	if (AR_SREV_9100(ah)) {
		u32 mask;
		mask = REG_READ(ah, AR_CFG);
		if (mask & (AR_CFG_SWRB | AR_CFG_SWTB | AR_CFG_SWRG)) {
J
Joe Perches 已提交
1620
			ath_dbg(common, ATH_DBG_RESET,
S
Sujith 已提交
1621
				"CFG Byte Swap Set 0x%x\n", mask);
1622 1623 1624 1625
		} else {
			mask =
				INIT_CONFIG_STATUS | AR_CFG_SWRB | AR_CFG_SWTB;
			REG_WRITE(ah, AR_CFG, mask);
J
Joe Perches 已提交
1626
			ath_dbg(common, ATH_DBG_RESET,
S
Sujith 已提交
1627
				"Setting CFG 0x%x\n", REG_READ(ah, AR_CFG));
1628 1629
		}
	} else {
1630 1631 1632 1633 1634 1635 1636
		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);
		}
1637
#ifdef __BIG_ENDIAN
1638
		else if (AR_SREV_9330(ah) || AR_SREV_9340(ah))
1639 1640
			REG_RMW(ah, AR_CFG, AR_CFG_SWRB | AR_CFG_SWTB, 0);
		else
1641
			REG_WRITE(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD);
1642 1643 1644
#endif
	}

1645
	if (ah->btcoex_hw.enabled)
1646 1647
		ath9k_hw_btcoex_enable(ah);

1648
	if (AR_SREV_9300_20_OR_LATER(ah)) {
1649
		ar9003_hw_bb_watchdog_config(ah);
1650

1651 1652 1653
		ar9003_hw_disable_phy_restart(ah);
	}

1654 1655
	ath9k_hw_apply_gpio_override(ah);

1656
	return 0;
1657
}
1658
EXPORT_SYMBOL(ath9k_hw_reset);
1659

S
Sujith 已提交
1660 1661 1662 1663
/******************************/
/* Power Management (Chipset) */
/******************************/

1664 1665 1666 1667
/*
 * Notify Power Mgt is disabled in self-generated frames.
 * If requested, force chip to sleep.
 */
1668
static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip)
1669
{
S
Sujith 已提交
1670 1671
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
	if (setChip) {
1672 1673 1674 1675
		/*
		 * Clear the RTC force wake bit to allow the
		 * mac to go to sleep.
		 */
S
Sujith 已提交
1676 1677
		REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE,
			    AR_RTC_FORCE_WAKE_EN);
1678
		if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah))
S
Sujith 已提交
1679
			REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF);
1680

1681
		/* Shutdown chip. Active low */
1682
		if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah))
S
Sujith 已提交
1683 1684
			REG_CLR_BIT(ah, (AR_RTC_RESET),
				    AR_RTC_RESET_EN);
S
Sujith 已提交
1685
	}
1686 1687 1688 1689 1690

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

1693 1694 1695 1696 1697
/*
 * 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).
 */
1698
static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip)
1699
{
S
Sujith 已提交
1700 1701
	REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
	if (setChip) {
1702
		struct ath9k_hw_capabilities *pCap = &ah->caps;
1703

S
Sujith 已提交
1704
		if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) {
1705
			/* Set WakeOnInterrupt bit; clear ForceWake bit */
S
Sujith 已提交
1706 1707 1708
			REG_WRITE(ah, AR_RTC_FORCE_WAKE,
				  AR_RTC_FORCE_WAKE_ON_INT);
		} else {
1709 1710 1711 1712
			/*
			 * Clear the RTC force wake bit to allow the
			 * mac to go to sleep.
			 */
S
Sujith 已提交
1713 1714
			REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE,
				    AR_RTC_FORCE_WAKE_EN);
1715 1716
		}
	}
1717 1718 1719 1720

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

1723
static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip)
1724
{
S
Sujith 已提交
1725 1726
	u32 val;
	int i;
1727

1728 1729 1730 1731 1732 1733
	/* 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 已提交
1734 1735 1736 1737 1738 1739 1740
	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;
			}
1741 1742
			if (!AR_SREV_9300_20_OR_LATER(ah))
				ath9k_hw_init_pll(ah, NULL);
S
Sujith 已提交
1743 1744 1745 1746
		}
		if (AR_SREV_9100(ah))
			REG_SET_BIT(ah, AR_RTC_RESET,
				    AR_RTC_RESET_EN);
1747

S
Sujith 已提交
1748 1749 1750
		REG_SET_BIT(ah, AR_RTC_FORCE_WAKE,
			    AR_RTC_FORCE_WAKE_EN);
		udelay(50);
1751

S
Sujith 已提交
1752 1753 1754 1755 1756 1757 1758
		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);
1759
		}
S
Sujith 已提交
1760
		if (i == 0) {
1761 1762 1763
			ath_err(ath9k_hw_common(ah),
				"Failed to wakeup in %uus\n",
				POWER_UP_TIME / 20);
S
Sujith 已提交
1764
			return false;
1765 1766 1767
		}
	}

S
Sujith 已提交
1768
	REG_CLR_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV);
1769

S
Sujith 已提交
1770
	return true;
1771 1772
}

1773
bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode)
1774
{
1775
	struct ath_common *common = ath9k_hw_common(ah);
1776
	int status = true, setChip = true;
S
Sujith 已提交
1777 1778 1779 1780 1781 1782 1783
	static const char *modes[] = {
		"AWAKE",
		"FULL-SLEEP",
		"NETWORK SLEEP",
		"UNDEFINED"
	};

1784 1785 1786
	if (ah->power_mode == mode)
		return status;

J
Joe Perches 已提交
1787 1788
	ath_dbg(common, ATH_DBG_RESET, "%s -> %s\n",
		modes[ah->power_mode], modes[mode]);
S
Sujith 已提交
1789 1790 1791 1792 1793 1794 1795

	switch (mode) {
	case ATH9K_PM_AWAKE:
		status = ath9k_hw_set_power_awake(ah, setChip);
		break;
	case ATH9K_PM_FULL_SLEEP:
		ath9k_set_power_sleep(ah, setChip);
1796
		ah->chip_fullsleep = true;
S
Sujith 已提交
1797 1798 1799 1800
		break;
	case ATH9K_PM_NETWORK_SLEEP:
		ath9k_set_power_network_sleep(ah, setChip);
		break;
1801
	default:
1802
		ath_err(common, "Unknown power mode %u\n", mode);
1803 1804
		return false;
	}
1805
	ah->power_mode = mode;
S
Sujith 已提交
1806

1807 1808 1809 1810 1811
	/*
	 * 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.
	 */
1812 1813 1814

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

S
Sujith 已提交
1816
	return status;
1817
}
1818
EXPORT_SYMBOL(ath9k_hw_setpower);
1819

S
Sujith 已提交
1820 1821 1822 1823
/*******************/
/* Beacon Handling */
/*******************/

1824
void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
1825 1826 1827
{
	int flags = 0;

S
Sujith 已提交
1828 1829
	ENABLE_REGWRITE_BUFFER(ah);

1830
	switch (ah->opmode) {
1831
	case NL80211_IFTYPE_ADHOC:
1832
	case NL80211_IFTYPE_MESH_POINT:
1833 1834
		REG_SET_BIT(ah, AR_TXCFG,
			    AR_TXCFG_ADHOC_BEACON_ATIM_TX_POLICY);
1835 1836
		REG_WRITE(ah, AR_NEXT_NDP_TIMER, next_beacon +
			  TU_TO_USEC(ah->atim_window ? ah->atim_window : 1));
1837
		flags |= AR_NDP_TIMER_EN;
1838
	case NL80211_IFTYPE_AP:
1839 1840 1841 1842 1843
		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));
1844 1845 1846
		flags |=
			AR_TBTT_TIMER_EN | AR_DBA_TIMER_EN | AR_SWBA_TIMER_EN;
		break;
1847
	default:
J
Joe Perches 已提交
1848 1849 1850
		ath_dbg(ath9k_hw_common(ah), ATH_DBG_BEACON,
			"%s: unsupported opmode: %d\n",
			__func__, ah->opmode);
1851 1852
		return;
		break;
1853 1854
	}

1855 1856 1857 1858
	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);
1859

S
Sujith 已提交
1860 1861
	REGWRITE_BUFFER_FLUSH(ah);

1862 1863
	REG_SET_BIT(ah, AR_TIMER_MODE, flags);
}
1864
EXPORT_SYMBOL(ath9k_hw_beaconinit);
1865

1866
void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
S
Sujith 已提交
1867
				    const struct ath9k_beacon_state *bs)
1868 1869
{
	u32 nextTbtt, beaconintval, dtimperiod, beacontimeout;
1870
	struct ath9k_hw_capabilities *pCap = &ah->caps;
1871
	struct ath_common *common = ath9k_hw_common(ah);
1872

S
Sujith 已提交
1873 1874
	ENABLE_REGWRITE_BUFFER(ah);

1875 1876 1877
	REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt));

	REG_WRITE(ah, AR_BEACON_PERIOD,
1878
		  TU_TO_USEC(bs->bs_intval));
1879
	REG_WRITE(ah, AR_DMA_BEACON_PERIOD,
1880
		  TU_TO_USEC(bs->bs_intval));
1881

S
Sujith 已提交
1882 1883
	REGWRITE_BUFFER_FLUSH(ah);

1884 1885 1886
	REG_RMW_FIELD(ah, AR_RSSI_THR,
		      AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold);

1887
	beaconintval = bs->bs_intval;
1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900

	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;

J
Joe Perches 已提交
1901 1902 1903 1904
	ath_dbg(common, ATH_DBG_BEACON, "next DTIM %d\n", bs->bs_nextdtim);
	ath_dbg(common, ATH_DBG_BEACON, "next beacon %d\n", nextTbtt);
	ath_dbg(common, ATH_DBG_BEACON, "beacon period %d\n", beaconintval);
	ath_dbg(common, ATH_DBG_BEACON, "DTIM period %d\n", dtimperiod);
1905

S
Sujith 已提交
1906 1907
	ENABLE_REGWRITE_BUFFER(ah);

S
Sujith 已提交
1908 1909 1910
	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));
1911

S
Sujith 已提交
1912 1913 1914
	REG_WRITE(ah, AR_SLEEP1,
		  SM((CAB_TIMEOUT_VAL << 3), AR_SLEEP1_CAB_TIMEOUT)
		  | AR_SLEEP1_ASSUME_DTIM);
1915

S
Sujith 已提交
1916 1917 1918 1919
	if (pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)
		beacontimeout = (BEACON_TIMEOUT_VAL << 3);
	else
		beacontimeout = MIN_BEACON_TIMEOUT_VAL;
1920

S
Sujith 已提交
1921 1922
	REG_WRITE(ah, AR_SLEEP2,
		  SM(beacontimeout, AR_SLEEP2_BEACON_TIMEOUT));
1923

S
Sujith 已提交
1924 1925
	REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval));
	REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod));
1926

S
Sujith 已提交
1927 1928
	REGWRITE_BUFFER_FLUSH(ah);

S
Sujith 已提交
1929 1930 1931
	REG_SET_BIT(ah, AR_TIMER_MODE,
		    AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN |
		    AR_DTIM_TIMER_EN);
1932

1933 1934
	/* TSF Out of Range Threshold */
	REG_WRITE(ah, AR_TSFOOR_THRESHOLD, bs->bs_tsfoor_threshold);
1935
}
1936
EXPORT_SYMBOL(ath9k_hw_set_sta_beacon_timers);
1937

S
Sujith 已提交
1938 1939 1940 1941
/*******************/
/* HW Capabilities */
/*******************/

1942
int ath9k_hw_fill_cap_info(struct ath_hw *ah)
1943
{
1944
	struct ath9k_hw_capabilities *pCap = &ah->caps;
1945
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
1946
	struct ath_common *common = ath9k_hw_common(ah);
1947
	struct ath_btcoex_hw *btcoex_hw = &ah->btcoex_hw;
1948

1949
	u16 eeval;
1950
	u8 ant_div_ctl1, tx_chainmask, rx_chainmask;
1951

S
Sujith 已提交
1952
	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_0);
1953
	regulatory->current_rd = eeval;
1954

S
Sujith 已提交
1955
	eeval = ah->eep_ops->get_eeprom(ah, EEP_REG_1);
1956
	if (AR_SREV_9285_12_OR_LATER(ah))
1957
		eeval |= AR9285_RDEXT_DEFAULT;
1958
	regulatory->current_rd_ext = eeval;
1959

1960
	if (ah->opmode != NL80211_IFTYPE_AP &&
1961
	    ah->hw_version.subvendorid == AR_SUBVENDOR_ID_NEW_A) {
1962 1963 1964 1965 1966
		if (regulatory->current_rd == 0x64 ||
		    regulatory->current_rd == 0x65)
			regulatory->current_rd += 5;
		else if (regulatory->current_rd == 0x41)
			regulatory->current_rd = 0x43;
J
Joe Perches 已提交
1967 1968
		ath_dbg(common, ATH_DBG_REGULATORY,
			"regdomain mapped to 0x%x\n", regulatory->current_rd);
S
Sujith 已提交
1969
	}
1970

S
Sujith 已提交
1971
	eeval = ah->eep_ops->get_eeprom(ah, EEP_OP_MODE);
1972
	if ((eeval & (AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A)) == 0) {
1973 1974
		ath_err(common,
			"no band has been marked as supported in EEPROM\n");
1975 1976 1977
		return -EINVAL;
	}

1978 1979
	if (eeval & AR5416_OPFLAGS_11A)
		pCap->hw_caps |= ATH9K_HW_CAP_5GHZ;
1980

1981 1982
	if (eeval & AR5416_OPFLAGS_11G)
		pCap->hw_caps |= ATH9K_HW_CAP_2GHZ;
S
Sujith 已提交
1983

S
Sujith 已提交
1984
	pCap->tx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_TX_MASK);
1985 1986 1987 1988
	/*
	 * For AR9271 we will temporarilly uses the rx chainmax as read from
	 * the EEPROM.
	 */
1989
	if ((ah->hw_version.devid == AR5416_DEVID_PCI) &&
1990 1991 1992
	    !(eeval & AR5416_OPFLAGS_11A) &&
	    !(AR_SREV_9271(ah)))
		/* CB71: GPIO 0 is pulled down to indicate 3 rx chains */
1993
		pCap->rx_chainmask = ath9k_hw_gpio_get(ah, 0) ? 0x5 : 0x7;
1994 1995
	else if (AR_SREV_9100(ah))
		pCap->rx_chainmask = 0x7;
1996
	else
1997
		/* Use rx_chainmask from EEPROM. */
1998
		pCap->rx_chainmask = ah->eep_ops->get_eeprom(ah, EEP_RX_MASK);
1999

2000
	ah->misc_mode |= AR_PCU_MIC_NEW_LOC_ENA;
2001

2002 2003 2004 2005
	/* 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;

2006 2007
	common->crypt_caps |= ATH_CRYPT_CAP_CIPHER_AESCCM;

2008
	if (ah->hw_version.devid != AR2427_DEVID_PCIE)
S
Sujith 已提交
2009 2010 2011
		pCap->hw_caps |= ATH9K_HW_CAP_HT;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_HT;
2012

2013 2014
	if (AR_SREV_9271(ah))
		pCap->num_gpio_pins = AR9271_NUM_GPIO;
S
Sujith 已提交
2015 2016
	else if (AR_DEVID_7010(ah))
		pCap->num_gpio_pins = AR7010_NUM_GPIO;
2017
	else if (AR_SREV_9285_12_OR_LATER(ah))
2018
		pCap->num_gpio_pins = AR9285_NUM_GPIO;
2019
	else if (AR_SREV_9280_20_OR_LATER(ah))
S
Sujith 已提交
2020 2021 2022
		pCap->num_gpio_pins = AR928X_NUM_GPIO;
	else
		pCap->num_gpio_pins = AR_NUM_GPIO;
2023

S
Sujith 已提交
2024 2025 2026 2027 2028
	if (AR_SREV_9160_10_OR_LATER(ah) || AR_SREV_9100(ah)) {
		pCap->hw_caps |= ATH9K_HW_CAP_CST;
		pCap->rts_aggr_limit = ATH_AMPDU_LIMIT_MAX;
	} else {
		pCap->rts_aggr_limit = (8 * 1024);
2029 2030
	}

2031
#if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
2032 2033 2034 2035 2036 2037
	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 已提交
2038 2039

		pCap->hw_caps |= ATH9K_HW_CAP_RFSILENT;
2040
	}
S
Sujith 已提交
2041
#endif
2042
	if (AR_SREV_9271(ah) || AR_SREV_9300_20_OR_LATER(ah))
2043 2044 2045
		pCap->hw_caps |= ATH9K_HW_CAP_AUTOSLEEP;
	else
		pCap->hw_caps &= ~ATH9K_HW_CAP_AUTOSLEEP;
2046

2047
	if (AR_SREV_9280(ah) || AR_SREV_9285(ah))
S
Sujith 已提交
2048 2049 2050
		pCap->hw_caps &= ~ATH9K_HW_CAP_4KB_SPLITTRANS;
	else
		pCap->hw_caps |= ATH9K_HW_CAP_4KB_SPLITTRANS;
2051

2052 2053
	if (common->btcoex_enabled) {
		if (AR_SREV_9300_20_OR_LATER(ah)) {
2054
			btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
2055 2056 2057 2058 2059 2060 2061 2062 2063 2064 2065 2066 2067 2068
			btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9300;
			btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9300;
			btcoex_hw->btpriority_gpio = ATH_BTPRIORITY_GPIO_9300;
		} else if (AR_SREV_9280_20_OR_LATER(ah)) {
			btcoex_hw->btactive_gpio = ATH_BTACTIVE_GPIO_9280;
			btcoex_hw->wlanactive_gpio = ATH_WLANACTIVE_GPIO_9280;

			if (AR_SREV_9285(ah)) {
				btcoex_hw->scheme = ATH_BTCOEX_CFG_3WIRE;
				btcoex_hw->btpriority_gpio =
						ATH_BTPRIORITY_GPIO_9285;
			} else {
				btcoex_hw->scheme = ATH_BTCOEX_CFG_2WIRE;
			}
2069
		}
2070
	} else {
2071
		btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE;
2072
	}
2073

2074
	if (AR_SREV_9300_20_OR_LATER(ah)) {
2075
		pCap->hw_caps |= ATH9K_HW_CAP_EDMA | ATH9K_HW_CAP_FASTCLOCK;
2076
		if (!AR_SREV_9330(ah) && !AR_SREV_9485(ah))
2077 2078
			pCap->hw_caps |= ATH9K_HW_CAP_LDPC;

2079 2080 2081
		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);
2082
		pCap->tx_desc_len = sizeof(struct ar9003_txc);
2083
		pCap->txs_len = sizeof(struct ar9003_txs);
2084 2085
		if (!ah->config.paprd_disable &&
		    ah->eep_ops->get_eeprom(ah, EEP_PAPRD))
2086
			pCap->hw_caps |= ATH9K_HW_CAP_PAPRD;
2087 2088
	} else {
		pCap->tx_desc_len = sizeof(struct ath_desc);
2089
		if (AR_SREV_9280_20(ah))
2090
			pCap->hw_caps |= ATH9K_HW_CAP_FASTCLOCK;
2091
	}
2092

2093 2094 2095
	if (AR_SREV_9300_20_OR_LATER(ah))
		pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED;

2096 2097 2098
	if (AR_SREV_9300_20_OR_LATER(ah))
		ah->ent_mode = REG_READ(ah, AR_ENT_OTP);

2099
	if (AR_SREV_9287_11_OR_LATER(ah) || AR_SREV_9271(ah))
2100 2101
		pCap->hw_caps |= ATH9K_HW_CAP_SGI_20;

2102 2103 2104 2105 2106 2107 2108
	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;
		}
2109 2110 2111 2112 2113 2114
	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;
	}


2115
	if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130
		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;
	}
2131

2132 2133 2134 2135 2136
	if (AR_SREV_9485_10(ah)) {
		pCap->pcie_lcr_extsync_en = true;
		pCap->pcie_lcr_offset = 0x80;
	}

2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148
	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;
	}

2149
	return 0;
2150 2151
}

S
Sujith 已提交
2152 2153 2154
/****************************/
/* GPIO / RFKILL / Antennae */
/****************************/
2155

2156
static void ath9k_hw_gpio_cfg_output_mux(struct ath_hw *ah,
S
Sujith 已提交
2157 2158 2159 2160
					 u32 gpio, u32 type)
{
	int addr;
	u32 gpio_shift, tmp;
2161

S
Sujith 已提交
2162 2163 2164 2165 2166 2167
	if (gpio > 11)
		addr = AR_GPIO_OUTPUT_MUX3;
	else if (gpio > 5)
		addr = AR_GPIO_OUTPUT_MUX2;
	else
		addr = AR_GPIO_OUTPUT_MUX1;
2168

S
Sujith 已提交
2169
	gpio_shift = (gpio % 6) * 5;
2170

S
Sujith 已提交
2171 2172 2173 2174
	if (AR_SREV_9280_20_OR_LATER(ah)
	    || (addr != AR_GPIO_OUTPUT_MUX1)) {
		REG_RMW(ah, addr, (type << gpio_shift),
			(0x1f << gpio_shift));
2175
	} else {
S
Sujith 已提交
2176 2177 2178 2179 2180
		tmp = REG_READ(ah, addr);
		tmp = ((tmp & 0x1F0) << 1) | (tmp & ~0x1F0);
		tmp &= ~(0x1f << gpio_shift);
		tmp |= (type << gpio_shift);
		REG_WRITE(ah, addr, tmp);
2181 2182 2183
	}
}

2184
void ath9k_hw_cfg_gpio_input(struct ath_hw *ah, u32 gpio)
2185
{
S
Sujith 已提交
2186
	u32 gpio_shift;
2187

2188
	BUG_ON(gpio >= ah->caps.num_gpio_pins);
2189

S
Sujith 已提交
2190 2191 2192 2193 2194 2195 2196
	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;
	}
2197

S
Sujith 已提交
2198
	gpio_shift = gpio << 1;
S
Sujith 已提交
2199 2200 2201 2202
	REG_RMW(ah,
		AR_GPIO_OE_OUT,
		(AR_GPIO_OE_OUT_DRV_NO << gpio_shift),
		(AR_GPIO_OE_OUT_DRV << gpio_shift));
2203
}
2204
EXPORT_SYMBOL(ath9k_hw_cfg_gpio_input);
2205

2206
u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio)
2207
{
2208 2209 2210
#define MS_REG_READ(x, y) \
	(MS(REG_READ(ah, AR_GPIO_IN_OUT), x##_GPIO_IN_VAL) & (AR_GPIO_BIT(y)))

2211
	if (gpio >= ah->caps.num_gpio_pins)
S
Sujith 已提交
2212
		return 0xffffffff;
2213

S
Sujith 已提交
2214 2215 2216 2217 2218
	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))
2219 2220
		return (MS(REG_READ(ah, AR_GPIO_IN), AR9300_GPIO_IN_VAL) &
			AR_GPIO_BIT(gpio)) != 0;
2221
	else if (AR_SREV_9271(ah))
2222
		return MS_REG_READ(AR9271, gpio) != 0;
2223
	else if (AR_SREV_9287_11_OR_LATER(ah))
2224
		return MS_REG_READ(AR9287, gpio) != 0;
2225
	else if (AR_SREV_9285_12_OR_LATER(ah))
2226
		return MS_REG_READ(AR9285, gpio) != 0;
2227
	else if (AR_SREV_9280_20_OR_LATER(ah))
2228 2229 2230
		return MS_REG_READ(AR928X, gpio) != 0;
	else
		return MS_REG_READ(AR, gpio) != 0;
2231
}
2232
EXPORT_SYMBOL(ath9k_hw_gpio_get);
2233

2234
void ath9k_hw_cfg_output(struct ath_hw *ah, u32 gpio,
S
Sujith 已提交
2235
			 u32 ah_signal_type)
2236
{
S
Sujith 已提交
2237
	u32 gpio_shift;
2238

S
Sujith 已提交
2239 2240 2241 2242 2243 2244 2245
	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;
	}
2246

S
Sujith 已提交
2247
	ath9k_hw_gpio_cfg_output_mux(ah, gpio, ah_signal_type);
S
Sujith 已提交
2248 2249 2250 2251 2252
	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));
2253
}
2254
EXPORT_SYMBOL(ath9k_hw_cfg_output);
2255

2256
void ath9k_hw_set_gpio(struct ath_hw *ah, u32 gpio, u32 val)
2257
{
S
Sujith 已提交
2258 2259 2260 2261 2262 2263 2264
	if (AR_DEVID_7010(ah)) {
		val = val ? 0 : 1;
		REG_RMW(ah, AR7010_GPIO_OUT, ((val&1) << gpio),
			AR_GPIO_BIT(gpio));
		return;
	}

2265 2266 2267
	if (AR_SREV_9271(ah))
		val = ~val;

S
Sujith 已提交
2268 2269
	REG_RMW(ah, AR_GPIO_IN_OUT, ((val & 1) << gpio),
		AR_GPIO_BIT(gpio));
2270
}
2271
EXPORT_SYMBOL(ath9k_hw_set_gpio);
2272

2273
u32 ath9k_hw_getdefantenna(struct ath_hw *ah)
2274
{
S
Sujith 已提交
2275
	return REG_READ(ah, AR_DEF_ANTENNA) & 0x7;
2276
}
2277
EXPORT_SYMBOL(ath9k_hw_getdefantenna);
2278

2279
void ath9k_hw_setantenna(struct ath_hw *ah, u32 antenna)
2280
{
S
Sujith 已提交
2281
	REG_WRITE(ah, AR_DEF_ANTENNA, (antenna & 0x7));
2282
}
2283
EXPORT_SYMBOL(ath9k_hw_setantenna);
2284

S
Sujith 已提交
2285 2286 2287 2288
/*********************/
/* General Operation */
/*********************/

2289
u32 ath9k_hw_getrxfilter(struct ath_hw *ah)
2290
{
S
Sujith 已提交
2291 2292
	u32 bits = REG_READ(ah, AR_RX_FILTER);
	u32 phybits = REG_READ(ah, AR_PHY_ERR);
2293

S
Sujith 已提交
2294 2295 2296 2297
	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 已提交
2298

S
Sujith 已提交
2299
	return bits;
2300
}
2301
EXPORT_SYMBOL(ath9k_hw_getrxfilter);
2302

2303
void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
2304
{
S
Sujith 已提交
2305
	u32 phybits;
2306

S
Sujith 已提交
2307 2308
	ENABLE_REGWRITE_BUFFER(ah);

S
Sujith 已提交
2309 2310
	REG_WRITE(ah, AR_RX_FILTER, bits);

S
Sujith 已提交
2311 2312 2313 2314 2315 2316
	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);
2317

S
Sujith 已提交
2318
	if (phybits)
2319
		REG_SET_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2320
	else
2321
		REG_CLR_BIT(ah, AR_RXCFG, AR_RXCFG_ZLFDMA);
S
Sujith 已提交
2322 2323

	REGWRITE_BUFFER_FLUSH(ah);
S
Sujith 已提交
2324
}
2325
EXPORT_SYMBOL(ath9k_hw_setrxfilter);
2326

2327
bool ath9k_hw_phy_disable(struct ath_hw *ah)
S
Sujith 已提交
2328
{
2329 2330 2331 2332 2333
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_WARM))
		return false;

	ath9k_hw_init_pll(ah, NULL);
	return true;
S
Sujith 已提交
2334
}
2335
EXPORT_SYMBOL(ath9k_hw_phy_disable);
2336

2337
bool ath9k_hw_disable(struct ath_hw *ah)
S
Sujith 已提交
2338
{
2339
	if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE))
S
Sujith 已提交
2340
		return false;
2341

2342 2343 2344 2345 2346
	if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_COLD))
		return false;

	ath9k_hw_init_pll(ah, NULL);
	return true;
2347
}
2348
EXPORT_SYMBOL(ath9k_hw_disable);
2349

2350
void ath9k_hw_set_txpowerlimit(struct ath_hw *ah, u32 limit, bool test)
2351
{
2352
	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
2353
	struct ath9k_channel *chan = ah->curchan;
2354
	struct ieee80211_channel *channel = chan->chan;
2355

2356
	regulatory->power_limit = min(limit, (u32) MAX_RATE_POWER);
2357

2358
	ah->eep_ops->set_txpower(ah, chan,
2359
				 ath9k_regd_get_ctl(regulatory, chan),
2360 2361 2362
				 channel->max_antenna_gain * 2,
				 channel->max_power * 2,
				 min((u32) MAX_RATE_POWER,
2363
				 (u32) regulatory->power_limit), test);
2364
}
2365
EXPORT_SYMBOL(ath9k_hw_set_txpowerlimit);
2366

2367
void ath9k_hw_setopmode(struct ath_hw *ah)
2368
{
2369
	ath9k_hw_set_operating_mode(ah, ah->opmode);
2370
}
2371
EXPORT_SYMBOL(ath9k_hw_setopmode);
2372

2373
void ath9k_hw_setmcastfilter(struct ath_hw *ah, u32 filter0, u32 filter1)
2374
{
S
Sujith 已提交
2375 2376
	REG_WRITE(ah, AR_MCAST_FIL0, filter0);
	REG_WRITE(ah, AR_MCAST_FIL1, filter1);
2377
}
2378
EXPORT_SYMBOL(ath9k_hw_setmcastfilter);
2379

2380
void ath9k_hw_write_associd(struct ath_hw *ah)
2381
{
2382 2383 2384 2385 2386
	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));
2387
}
2388
EXPORT_SYMBOL(ath9k_hw_write_associd);
2389

2390 2391
#define ATH9K_MAX_TSF_READ 10

2392
u64 ath9k_hw_gettsf64(struct ath_hw *ah)
2393
{
2394 2395 2396 2397 2398 2399 2400 2401 2402 2403 2404
	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;
	}
2405

2406
	WARN_ON( i == ATH9K_MAX_TSF_READ );
2407

2408
	return (((u64)tsf_upper1 << 32) | tsf_lower);
S
Sujith 已提交
2409
}
2410
EXPORT_SYMBOL(ath9k_hw_gettsf64);
2411

2412
void ath9k_hw_settsf64(struct ath_hw *ah, u64 tsf64)
2413 2414
{
	REG_WRITE(ah, AR_TSF_L32, tsf64 & 0xffffffff);
A
Alina Friedrichsen 已提交
2415
	REG_WRITE(ah, AR_TSF_U32, (tsf64 >> 32) & 0xffffffff);
2416
}
2417
EXPORT_SYMBOL(ath9k_hw_settsf64);
2418

2419
void ath9k_hw_reset_tsf(struct ath_hw *ah)
S
Sujith 已提交
2420
{
2421 2422
	if (!ath9k_hw_wait(ah, AR_SLP32_MODE, AR_SLP32_TSF_WRITE_STATUS, 0,
			   AH_TSF_WRITE_TIMEOUT))
J
Joe Perches 已提交
2423 2424
		ath_dbg(ath9k_hw_common(ah), ATH_DBG_RESET,
			"AR_SLP32_TSF_WRITE_STATUS limit exceeded\n");
2425

S
Sujith 已提交
2426 2427
	REG_WRITE(ah, AR_RESET_TSF, AR_RESET_TSF_ONCE);
}
2428
EXPORT_SYMBOL(ath9k_hw_reset_tsf);
2429

S
Sujith 已提交
2430
void ath9k_hw_set_tsfadjust(struct ath_hw *ah, u32 setting)
S
Sujith 已提交
2431 2432
{
	if (setting)
2433
		ah->misc_mode |= AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2434
	else
2435
		ah->misc_mode &= ~AR_PCU_TX_ADD_TSF;
S
Sujith 已提交
2436
}
2437
EXPORT_SYMBOL(ath9k_hw_set_tsfadjust);
2438

L
Luis R. Rodriguez 已提交
2439
void ath9k_hw_set11nmac2040(struct ath_hw *ah)
S
Sujith 已提交
2440
{
L
Luis R. Rodriguez 已提交
2441
	struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf;
S
Sujith 已提交
2442 2443
	u32 macmode;

L
Luis R. Rodriguez 已提交
2444
	if (conf_is_ht40(conf) && !ah->config.cwm_ignore_extcca)
S
Sujith 已提交
2445 2446 2447
		macmode = AR_2040_JOINED_RX_CLEAR;
	else
		macmode = 0;
2448

S
Sujith 已提交
2449
	REG_WRITE(ah, AR_2040_MODE, macmode);
2450
}
2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 2472 2473 2474 2475 2476 2477 2478 2479 2480 2481 2482 2483 2484 2485 2486 2487 2488 2489 2490 2491 2492 2493 2494 2495 2496

/* 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];
}

2497
u32 ath9k_hw_gettsf32(struct ath_hw *ah)
2498 2499 2500
{
	return REG_READ(ah, AR_TSF_L32);
}
2501
EXPORT_SYMBOL(ath9k_hw_gettsf32);
2502 2503 2504 2505 2506 2507 2508 2509 2510 2511 2512 2513 2514

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) {
2515 2516 2517
		ath_err(ath9k_hw_common(ah),
			"Failed to allocate memory for hw timer[%d]\n",
			timer_index);
2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529
		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;
}
2530
EXPORT_SYMBOL(ath_gen_timer_alloc);
2531

2532 2533
void ath9k_hw_gen_timer_start(struct ath_hw *ah,
			      struct ath_gen_timer *timer,
2534
			      u32 trig_timeout,
2535
			      u32 timer_period)
2536 2537
{
	struct ath_gen_timer_table *timer_table = &ah->hw_gen_timers;
2538
	u32 tsf, timer_next;
2539 2540 2541 2542 2543 2544 2545

	BUG_ON(!timer_period);

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

	tsf = ath9k_hw_gettsf32(ah);

2546 2547
	timer_next = tsf + trig_timeout;

J
Joe Perches 已提交
2548 2549 2550
	ath_dbg(ath9k_hw_common(ah), ATH_DBG_HWTIMER,
		"current tsf %x period %x timer_next %x\n",
		tsf, timer_period, timer_next);
2551 2552 2553 2554 2555 2556 2557 2558 2559 2560 2561 2562 2563 2564 2565 2566

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

	/* 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)));
}
2567
EXPORT_SYMBOL(ath9k_hw_gen_timer_start);
2568

2569
void ath9k_hw_gen_timer_stop(struct ath_hw *ah, struct ath_gen_timer *timer)
2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588
{
	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);
}
2589
EXPORT_SYMBOL(ath9k_hw_gen_timer_stop);
2590 2591 2592 2593 2594 2595 2596 2597 2598

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);
}
2599
EXPORT_SYMBOL(ath_gen_timer_free);
2600 2601 2602 2603 2604 2605 2606 2607

/*
 * 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;
2608
	struct ath_common *common = ath9k_hw_common(ah);
2609 2610 2611 2612 2613 2614 2615 2616 2617 2618 2619 2620 2621 2622
	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);
J
Joe Perches 已提交
2623 2624
		ath_dbg(common, ATH_DBG_HWTIMER,
			"TSF overflow for Gen timer %d\n", index);
2625 2626 2627 2628 2629 2630 2631
		timer->overflow(timer->arg);
	}

	while (trigger_mask) {
		index = rightmost_index(timer_table, &trigger_mask);
		timer = timer_table->timers[index];
		BUG_ON(!timer);
J
Joe Perches 已提交
2632 2633
		ath_dbg(common, ATH_DBG_HWTIMER,
			"Gen timer[%d] trigger\n", index);
2634 2635 2636
		timer->trigger(timer->arg);
	}
}
2637
EXPORT_SYMBOL(ath_gen_timer_isr);
2638

2639 2640 2641 2642 2643 2644 2645 2646 2647 2648
/********/
/* HTC  */
/********/

void ath9k_hw_htc_resetinit(struct ath_hw *ah)
{
	ah->htc_reset_init = true;
}
EXPORT_SYMBOL(ath9k_hw_htc_resetinit);

2649 2650 2651 2652 2653 2654 2655 2656 2657 2658 2659 2660
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" },
2661 2662
	{ AR_SREV_VERSION_9287,         "9287" },
	{ AR_SREV_VERSION_9271,         "9271" },
2663
	{ AR_SREV_VERSION_9300,         "9300" },
2664
	{ AR_SREV_VERSION_9330,         "9330" },
2665
	{ AR_SREV_VERSION_9485,         "9485" },
2666 2667 2668 2669 2670 2671 2672 2673 2674 2675 2676 2677 2678 2679 2680 2681 2682
};

/* 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.
 */
2683
static const char *ath9k_hw_mac_bb_name(u32 mac_bb_version)
2684 2685 2686 2687 2688 2689 2690 2691 2692 2693 2694 2695 2696 2697 2698 2699
{
	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.
 */
2700
static const char *ath9k_hw_rf_name(u16 rf_version)
2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711
{
	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 "????";
}
2712 2713 2714 2715 2716 2717

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

	/* chipsets >= AR9280 are single-chip */
2718
	if (AR_SREV_9280_20_OR_LATER(ah)) {
2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736
		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);