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