0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
0027
0028 #include <asm/unaligned.h>
0029
0030 #include <linux/pci.h> /* To determine if a card is pci-e */
0031 #include <linux/log2.h>
0032 #include <linux/platform_device.h>
0033 #include "ath5k.h"
0034 #include "reg.h"
0035 #include "debug.h"
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 int
0067 ath5k_hw_register_timeout(struct ath5k_hw *ah, u32 reg, u32 flag, u32 val,
0068 bool is_set)
0069 {
0070 int i;
0071 u32 data;
0072
0073 for (i = AR5K_TUNE_REGISTER_TIMEOUT; i > 0; i--) {
0074 data = ath5k_hw_reg_read(ah, reg);
0075 if (is_set && (data & flag))
0076 break;
0077 else if ((data & flag) == val)
0078 break;
0079 udelay(15);
0080 }
0081
0082 return (i <= 0) ? -EAGAIN : 0;
0083 }
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100 unsigned int
0101 ath5k_hw_htoclock(struct ath5k_hw *ah, unsigned int usec)
0102 {
0103 struct ath_common *common = ath5k_hw_common(ah);
0104 return usec * common->clockrate;
0105 }
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117 unsigned int
0118 ath5k_hw_clocktoh(struct ath5k_hw *ah, unsigned int clock)
0119 {
0120 struct ath_common *common = ath5k_hw_common(ah);
0121 return clock / common->clockrate;
0122 }
0123
0124
0125
0126
0127
0128
0129
0130
0131 static void
0132 ath5k_hw_init_core_clock(struct ath5k_hw *ah)
0133 {
0134 struct ieee80211_channel *channel = ah->ah_current_channel;
0135 struct ath_common *common = ath5k_hw_common(ah);
0136 u32 usec_reg, txlat, rxlat, usec, clock, sclock, txf2txs;
0137
0138
0139
0140
0141 switch (channel->hw_value) {
0142 case AR5K_MODE_11A:
0143 clock = 40;
0144 break;
0145 case AR5K_MODE_11B:
0146 clock = 22;
0147 break;
0148 case AR5K_MODE_11G:
0149 default:
0150 clock = 44;
0151 break;
0152 }
0153
0154
0155
0156 switch (ah->ah_bwmode) {
0157 case AR5K_BWMODE_40MHZ:
0158 clock *= 2;
0159 break;
0160 case AR5K_BWMODE_10MHZ:
0161 clock /= 2;
0162 break;
0163 case AR5K_BWMODE_5MHZ:
0164 clock /= 4;
0165 break;
0166 default:
0167 break;
0168 }
0169
0170 common->clockrate = clock;
0171
0172
0173
0174
0175
0176 usec = clock - 1;
0177 usec = AR5K_REG_SM(usec, AR5K_USEC_1);
0178
0179
0180 if (ah->ah_version != AR5K_AR5210)
0181 AR5K_REG_WRITE_BITS(ah, AR5K_DCU_GBL_IFS_MISC,
0182 AR5K_DCU_GBL_IFS_MISC_USEC_DUR,
0183 clock);
0184
0185
0186 if ((ah->ah_radio == AR5K_RF5112) ||
0187 (ah->ah_radio == AR5K_RF2413) ||
0188 (ah->ah_radio == AR5K_RF5413) ||
0189 (ah->ah_radio == AR5K_RF2316) ||
0190 (ah->ah_radio == AR5K_RF2317))
0191
0192 sclock = 40 - 1;
0193 else
0194 sclock = 32 - 1;
0195 sclock = AR5K_REG_SM(sclock, AR5K_USEC_32);
0196
0197
0198
0199
0200 usec_reg = ath5k_hw_reg_read(ah, AR5K_USEC_5211);
0201 txlat = AR5K_REG_MS(usec_reg, AR5K_USEC_TX_LATENCY_5211);
0202 rxlat = AR5K_REG_MS(usec_reg, AR5K_USEC_RX_LATENCY_5211);
0203
0204
0205
0206
0207 txf2txs = AR5K_INIT_TXF2TXD_START_DEFAULT;
0208
0209
0210
0211
0212
0213
0214 if (ah->ah_version == AR5K_AR5210) {
0215
0216 txlat = AR5K_INIT_TX_LATENCY_5210;
0217 rxlat = AR5K_INIT_RX_LATENCY_5210;
0218 }
0219
0220 if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
0221
0222
0223
0224
0225
0226
0227
0228 txlat = AR5K_REG_SM(txlat, AR5K_USEC_TX_LATENCY_5210);
0229 rxlat = AR5K_REG_SM(rxlat, AR5K_USEC_RX_LATENCY_5210);
0230 } else
0231 switch (ah->ah_bwmode) {
0232 case AR5K_BWMODE_10MHZ:
0233 txlat = AR5K_REG_SM(txlat * 2,
0234 AR5K_USEC_TX_LATENCY_5211);
0235 rxlat = AR5K_REG_SM(AR5K_INIT_RX_LAT_MAX,
0236 AR5K_USEC_RX_LATENCY_5211);
0237 txf2txs = AR5K_INIT_TXF2TXD_START_DELAY_10MHZ;
0238 break;
0239 case AR5K_BWMODE_5MHZ:
0240 txlat = AR5K_REG_SM(txlat * 4,
0241 AR5K_USEC_TX_LATENCY_5211);
0242 rxlat = AR5K_REG_SM(AR5K_INIT_RX_LAT_MAX,
0243 AR5K_USEC_RX_LATENCY_5211);
0244 txf2txs = AR5K_INIT_TXF2TXD_START_DELAY_5MHZ;
0245 break;
0246 case AR5K_BWMODE_40MHZ:
0247 txlat = AR5K_INIT_TX_LAT_MIN;
0248 rxlat = AR5K_REG_SM(rxlat / 2,
0249 AR5K_USEC_RX_LATENCY_5211);
0250 txf2txs = AR5K_INIT_TXF2TXD_START_DEFAULT;
0251 break;
0252 default:
0253 break;
0254 }
0255
0256 usec_reg = (usec | sclock | txlat | rxlat);
0257 ath5k_hw_reg_write(ah, usec_reg, AR5K_USEC);
0258
0259
0260 if (ah->ah_radio == AR5K_RF5112) {
0261 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_RF_CTL2,
0262 AR5K_PHY_RF_CTL2_TXF2TXD_START,
0263 txf2txs);
0264 }
0265 }
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275
0276
0277
0278
0279
0280 static void
0281 ath5k_hw_set_sleep_clock(struct ath5k_hw *ah, bool enable)
0282 {
0283 struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
0284 u32 scal, spending, sclock;
0285
0286
0287
0288 if ((AR5K_EEPROM_HAS32KHZCRYSTAL(ee->ee_misc1) ||
0289 AR5K_EEPROM_HAS32KHZCRYSTAL_OLD(ee->ee_misc1)) &&
0290 enable) {
0291
0292
0293 AR5K_REG_WRITE_BITS(ah, AR5K_USEC_5211, AR5K_USEC_32, 1);
0294
0295 AR5K_REG_WRITE_BITS(ah, AR5K_TSF_PARM, AR5K_TSF_PARM_INC, 61);
0296
0297
0298
0299 ath5k_hw_reg_write(ah, 0x1f, AR5K_PHY_SCR);
0300
0301 if ((ah->ah_radio == AR5K_RF5112) ||
0302 (ah->ah_radio == AR5K_RF5413) ||
0303 (ah->ah_radio == AR5K_RF2316) ||
0304 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4)))
0305 spending = 0x14;
0306 else
0307 spending = 0x18;
0308 ath5k_hw_reg_write(ah, spending, AR5K_PHY_SPENDING);
0309
0310 if ((ah->ah_radio == AR5K_RF5112) ||
0311 (ah->ah_radio == AR5K_RF5413) ||
0312 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))) {
0313 ath5k_hw_reg_write(ah, 0x26, AR5K_PHY_SLMT);
0314 ath5k_hw_reg_write(ah, 0x0d, AR5K_PHY_SCAL);
0315 ath5k_hw_reg_write(ah, 0x07, AR5K_PHY_SCLOCK);
0316 ath5k_hw_reg_write(ah, 0x3f, AR5K_PHY_SDELAY);
0317 AR5K_REG_WRITE_BITS(ah, AR5K_PCICFG,
0318 AR5K_PCICFG_SLEEP_CLOCK_RATE, 0x02);
0319 } else {
0320 ath5k_hw_reg_write(ah, 0x0a, AR5K_PHY_SLMT);
0321 ath5k_hw_reg_write(ah, 0x0c, AR5K_PHY_SCAL);
0322 ath5k_hw_reg_write(ah, 0x03, AR5K_PHY_SCLOCK);
0323 ath5k_hw_reg_write(ah, 0x20, AR5K_PHY_SDELAY);
0324 AR5K_REG_WRITE_BITS(ah, AR5K_PCICFG,
0325 AR5K_PCICFG_SLEEP_CLOCK_RATE, 0x03);
0326 }
0327
0328
0329 AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG,
0330 AR5K_PCICFG_SLEEP_CLOCK_EN);
0331
0332 } else {
0333
0334
0335
0336 AR5K_REG_DISABLE_BITS(ah, AR5K_PCICFG,
0337 AR5K_PCICFG_SLEEP_CLOCK_EN);
0338
0339 AR5K_REG_WRITE_BITS(ah, AR5K_PCICFG,
0340 AR5K_PCICFG_SLEEP_CLOCK_RATE, 0);
0341
0342
0343 ath5k_hw_reg_write(ah, 0x1f, AR5K_PHY_SCR);
0344 ath5k_hw_reg_write(ah, AR5K_PHY_SLMT_32MHZ, AR5K_PHY_SLMT);
0345
0346 if (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))
0347 scal = AR5K_PHY_SCAL_32MHZ_2417;
0348 else if (ee->ee_is_hb63)
0349 scal = AR5K_PHY_SCAL_32MHZ_HB63;
0350 else
0351 scal = AR5K_PHY_SCAL_32MHZ;
0352 ath5k_hw_reg_write(ah, scal, AR5K_PHY_SCAL);
0353
0354 ath5k_hw_reg_write(ah, AR5K_PHY_SCLOCK_32MHZ, AR5K_PHY_SCLOCK);
0355 ath5k_hw_reg_write(ah, AR5K_PHY_SDELAY_32MHZ, AR5K_PHY_SDELAY);
0356
0357 if ((ah->ah_radio == AR5K_RF5112) ||
0358 (ah->ah_radio == AR5K_RF5413) ||
0359 (ah->ah_radio == AR5K_RF2316) ||
0360 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4)))
0361 spending = 0x14;
0362 else
0363 spending = 0x18;
0364 ath5k_hw_reg_write(ah, spending, AR5K_PHY_SPENDING);
0365
0366
0367 AR5K_REG_WRITE_BITS(ah, AR5K_TSF_PARM, AR5K_TSF_PARM_INC, 1);
0368
0369 if ((ah->ah_radio == AR5K_RF5112) ||
0370 (ah->ah_radio == AR5K_RF5413) ||
0371 (ah->ah_radio == AR5K_RF2316) ||
0372 (ah->ah_radio == AR5K_RF2317))
0373 sclock = 40 - 1;
0374 else
0375 sclock = 32 - 1;
0376 AR5K_REG_WRITE_BITS(ah, AR5K_USEC_5211, AR5K_USEC_32, sclock);
0377 }
0378 }
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389
0390
0391
0392
0393
0394
0395
0396 static int
0397 ath5k_hw_nic_reset(struct ath5k_hw *ah, u32 val)
0398 {
0399 int ret;
0400 u32 mask = val ? val : ~0U;
0401
0402
0403 ath5k_hw_reg_read(ah, AR5K_RXDP);
0404
0405
0406
0407
0408 ath5k_hw_reg_write(ah, val, AR5K_RESET_CTL);
0409
0410
0411 usleep_range(15, 20);
0412
0413 if (ah->ah_version == AR5K_AR5210) {
0414 val &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_DMA
0415 | AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_PHY;
0416 mask &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_DMA
0417 | AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_PHY;
0418 } else {
0419 val &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_BASEBAND;
0420 mask &= AR5K_RESET_CTL_PCU | AR5K_RESET_CTL_BASEBAND;
0421 }
0422
0423 ret = ath5k_hw_register_timeout(ah, AR5K_RESET_CTL, mask, val, false);
0424
0425
0426
0427
0428
0429
0430 if ((val & AR5K_RESET_CTL_PCU) == 0)
0431 ath5k_hw_reg_write(ah, AR5K_INIT_CFG, AR5K_CFG);
0432
0433 return ret;
0434 }
0435
0436
0437
0438
0439
0440
0441
0442
0443
0444
0445 static int
0446 ath5k_hw_wisoc_reset(struct ath5k_hw *ah, u32 flags)
0447 {
0448 u32 mask = flags ? flags : ~0U;
0449 u32 __iomem *reg;
0450 u32 regval;
0451 u32 val = 0;
0452
0453
0454 if (ah->devid >= AR5K_SREV_AR2315_R6) {
0455 reg = (u32 __iomem *) AR5K_AR2315_RESET;
0456 if (mask & AR5K_RESET_CTL_PCU)
0457 val |= AR5K_AR2315_RESET_WMAC;
0458 if (mask & AR5K_RESET_CTL_BASEBAND)
0459 val |= AR5K_AR2315_RESET_BB_WARM;
0460 } else {
0461 reg = (u32 __iomem *) AR5K_AR5312_RESET;
0462 if (to_platform_device(ah->dev)->id == 0) {
0463 if (mask & AR5K_RESET_CTL_PCU)
0464 val |= AR5K_AR5312_RESET_WMAC0;
0465 if (mask & AR5K_RESET_CTL_BASEBAND)
0466 val |= AR5K_AR5312_RESET_BB0_COLD |
0467 AR5K_AR5312_RESET_BB0_WARM;
0468 } else {
0469 if (mask & AR5K_RESET_CTL_PCU)
0470 val |= AR5K_AR5312_RESET_WMAC1;
0471 if (mask & AR5K_RESET_CTL_BASEBAND)
0472 val |= AR5K_AR5312_RESET_BB1_COLD |
0473 AR5K_AR5312_RESET_BB1_WARM;
0474 }
0475 }
0476
0477
0478 regval = ioread32(reg);
0479 iowrite32(regval | val, reg);
0480 regval = ioread32(reg);
0481 udelay(100);
0482
0483
0484 iowrite32(regval & ~val, reg);
0485 regval = ioread32(reg);
0486
0487
0488
0489
0490
0491
0492 if ((flags & AR5K_RESET_CTL_PCU) == 0)
0493 ath5k_hw_reg_write(ah, AR5K_INIT_CFG, AR5K_CFG);
0494
0495 return 0;
0496 }
0497
0498
0499
0500
0501
0502
0503
0504
0505
0506
0507
0508
0509
0510
0511
0512
0513 static int
0514 ath5k_hw_set_power_mode(struct ath5k_hw *ah, enum ath5k_power_mode mode,
0515 bool set_chip, u16 sleep_duration)
0516 {
0517 unsigned int i;
0518 u32 staid, data;
0519
0520 staid = ath5k_hw_reg_read(ah, AR5K_STA_ID1);
0521
0522 switch (mode) {
0523 case AR5K_PM_AUTO:
0524 staid &= ~AR5K_STA_ID1_DEFAULT_ANTENNA;
0525 fallthrough;
0526 case AR5K_PM_NETWORK_SLEEP:
0527 if (set_chip)
0528 ath5k_hw_reg_write(ah,
0529 AR5K_SLEEP_CTL_SLE_ALLOW |
0530 sleep_duration,
0531 AR5K_SLEEP_CTL);
0532
0533 staid |= AR5K_STA_ID1_PWR_SV;
0534 break;
0535
0536 case AR5K_PM_FULL_SLEEP:
0537 if (set_chip)
0538 ath5k_hw_reg_write(ah, AR5K_SLEEP_CTL_SLE_SLP,
0539 AR5K_SLEEP_CTL);
0540
0541 staid |= AR5K_STA_ID1_PWR_SV;
0542 break;
0543
0544 case AR5K_PM_AWAKE:
0545
0546 staid &= ~AR5K_STA_ID1_PWR_SV;
0547
0548 if (!set_chip)
0549 goto commit;
0550
0551 data = ath5k_hw_reg_read(ah, AR5K_SLEEP_CTL);
0552
0553
0554
0555
0556 if (data & 0xffc00000)
0557 data = 0;
0558 else
0559
0560 data = data & ~AR5K_SLEEP_CTL_SLE;
0561
0562 ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE,
0563 AR5K_SLEEP_CTL);
0564 usleep_range(15, 20);
0565
0566 for (i = 200; i > 0; i--) {
0567
0568 if ((ath5k_hw_reg_read(ah, AR5K_PCICFG) &
0569 AR5K_PCICFG_SPWR_DN) == 0)
0570 break;
0571
0572
0573 usleep_range(50, 75);
0574 ath5k_hw_reg_write(ah, data | AR5K_SLEEP_CTL_SLE_WAKE,
0575 AR5K_SLEEP_CTL);
0576 }
0577
0578
0579 if (i == 0)
0580 return -EIO;
0581
0582 break;
0583
0584 default:
0585 return -EINVAL;
0586 }
0587
0588 commit:
0589 ath5k_hw_reg_write(ah, staid, AR5K_STA_ID1);
0590
0591 return 0;
0592 }
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606 int
0607 ath5k_hw_on_hold(struct ath5k_hw *ah)
0608 {
0609 struct pci_dev *pdev = ah->pdev;
0610 u32 bus_flags;
0611 int ret;
0612
0613 if (ath5k_get_bus_type(ah) == ATH_AHB)
0614 return 0;
0615
0616
0617 ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
0618 if (ret) {
0619 ATH5K_ERR(ah, "failed to wakeup the MAC Chip\n");
0620 return ret;
0621 }
0622
0623
0624
0625
0626
0627
0628
0629
0630
0631 bus_flags = (pdev && pci_is_pcie(pdev)) ? 0 : AR5K_RESET_CTL_PCI;
0632
0633 if (ah->ah_version == AR5K_AR5210) {
0634 ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
0635 AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA |
0636 AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI);
0637 usleep_range(2000, 2500);
0638 } else {
0639 ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
0640 AR5K_RESET_CTL_BASEBAND | bus_flags);
0641 }
0642
0643 if (ret) {
0644 ATH5K_ERR(ah, "failed to put device on warm reset\n");
0645 return -EIO;
0646 }
0647
0648
0649 ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
0650 if (ret) {
0651 ATH5K_ERR(ah, "failed to put device on hold\n");
0652 return ret;
0653 }
0654
0655 return ret;
0656 }
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668 int
0669 ath5k_hw_nic_wakeup(struct ath5k_hw *ah, struct ieee80211_channel *channel)
0670 {
0671 struct pci_dev *pdev = ah->pdev;
0672 u32 turbo, mode, clock, bus_flags;
0673 int ret;
0674
0675 turbo = 0;
0676 mode = 0;
0677 clock = 0;
0678
0679 if ((ath5k_get_bus_type(ah) != ATH_AHB) || channel) {
0680
0681 ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
0682 if (ret) {
0683 ATH5K_ERR(ah, "failed to wakeup the MAC Chip\n");
0684 return ret;
0685 }
0686 }
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696 bus_flags = (pdev && pci_is_pcie(pdev)) ? 0 : AR5K_RESET_CTL_PCI;
0697
0698 if (ah->ah_version == AR5K_AR5210) {
0699 ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
0700 AR5K_RESET_CTL_MAC | AR5K_RESET_CTL_DMA |
0701 AR5K_RESET_CTL_PHY | AR5K_RESET_CTL_PCI);
0702 usleep_range(2000, 2500);
0703 } else {
0704 if (ath5k_get_bus_type(ah) == ATH_AHB)
0705 ret = ath5k_hw_wisoc_reset(ah, AR5K_RESET_CTL_PCU |
0706 AR5K_RESET_CTL_BASEBAND);
0707 else
0708 ret = ath5k_hw_nic_reset(ah, AR5K_RESET_CTL_PCU |
0709 AR5K_RESET_CTL_BASEBAND | bus_flags);
0710 }
0711
0712 if (ret) {
0713 ATH5K_ERR(ah, "failed to reset the MAC Chip\n");
0714 return -EIO;
0715 }
0716
0717
0718 ret = ath5k_hw_set_power_mode(ah, AR5K_PM_AWAKE, true, 0);
0719 if (ret) {
0720 ATH5K_ERR(ah, "failed to resume the MAC Chip\n");
0721 return ret;
0722 }
0723
0724
0725
0726
0727 if (ath5k_get_bus_type(ah) == ATH_AHB)
0728 ret = ath5k_hw_wisoc_reset(ah, 0);
0729 else
0730 ret = ath5k_hw_nic_reset(ah, 0);
0731
0732 if (ret) {
0733 ATH5K_ERR(ah, "failed to warm reset the MAC Chip\n");
0734 return -EIO;
0735 }
0736
0737
0738
0739 if (!channel)
0740 return 0;
0741
0742 if (ah->ah_version != AR5K_AR5210) {
0743
0744
0745
0746
0747 if (ah->ah_radio >= AR5K_RF5112) {
0748 mode = AR5K_PHY_MODE_RAD_RF5112;
0749 clock = AR5K_PHY_PLL_RF5112;
0750 } else {
0751 mode = AR5K_PHY_MODE_RAD_RF5111;
0752 clock = AR5K_PHY_PLL_RF5111;
0753 }
0754
0755 if (channel->band == NL80211_BAND_2GHZ) {
0756 mode |= AR5K_PHY_MODE_FREQ_2GHZ;
0757 clock |= AR5K_PHY_PLL_44MHZ;
0758
0759 if (channel->hw_value == AR5K_MODE_11B) {
0760 mode |= AR5K_PHY_MODE_MOD_CCK;
0761 } else {
0762
0763
0764
0765
0766
0767
0768
0769 if (ah->ah_version == AR5K_AR5211)
0770 mode |= AR5K_PHY_MODE_MOD_OFDM;
0771 else
0772 mode |= AR5K_PHY_MODE_MOD_DYN;
0773 }
0774 } else if (channel->band == NL80211_BAND_5GHZ) {
0775 mode |= (AR5K_PHY_MODE_FREQ_5GHZ |
0776 AR5K_PHY_MODE_MOD_OFDM);
0777
0778
0779 if (ah->ah_radio == AR5K_RF5413)
0780 clock = AR5K_PHY_PLL_40MHZ_5413;
0781 else
0782 clock |= AR5K_PHY_PLL_40MHZ;
0783 } else {
0784 ATH5K_ERR(ah, "invalid radio frequency mode\n");
0785 return -EINVAL;
0786 }
0787
0788
0789
0790
0791 if (ah->ah_bwmode == AR5K_BWMODE_40MHZ) {
0792 turbo = AR5K_PHY_TURBO_MODE;
0793 if (ah->ah_radio != AR5K_RF2425)
0794 turbo |= AR5K_PHY_TURBO_SHORT;
0795 } else if (ah->ah_bwmode != AR5K_BWMODE_DEFAULT) {
0796 if (ah->ah_radio == AR5K_RF5413) {
0797 mode |= (ah->ah_bwmode == AR5K_BWMODE_10MHZ) ?
0798 AR5K_PHY_MODE_HALF_RATE :
0799 AR5K_PHY_MODE_QUARTER_RATE;
0800 } else if (ah->ah_version == AR5K_AR5212) {
0801 clock |= (ah->ah_bwmode == AR5K_BWMODE_10MHZ) ?
0802 AR5K_PHY_PLL_HALF_RATE :
0803 AR5K_PHY_PLL_QUARTER_RATE;
0804 }
0805 }
0806
0807 } else {
0808
0809
0810 if (ah->ah_bwmode == AR5K_BWMODE_40MHZ)
0811 ath5k_hw_reg_write(ah, AR5K_PHY_TURBO_MODE,
0812 AR5K_PHY_TURBO);
0813 }
0814
0815 if (ah->ah_version != AR5K_AR5210) {
0816
0817
0818 if (ath5k_hw_reg_read(ah, AR5K_PHY_PLL) != clock) {
0819 ath5k_hw_reg_write(ah, clock, AR5K_PHY_PLL);
0820 usleep_range(300, 350);
0821 }
0822
0823
0824 ath5k_hw_reg_write(ah, mode, AR5K_PHY_MODE);
0825 ath5k_hw_reg_write(ah, turbo, AR5K_PHY_TURBO);
0826 }
0827
0828 return 0;
0829 }
0830
0831
0832
0833
0834
0835
0836
0837
0838
0839
0840
0841
0842
0843
0844
0845
0846
0847 static void
0848 ath5k_hw_tweak_initval_settings(struct ath5k_hw *ah,
0849 struct ieee80211_channel *channel)
0850 {
0851 if (ah->ah_version == AR5K_AR5212 &&
0852 ah->ah_phy_revision >= AR5K_SREV_PHY_5212A) {
0853
0854
0855 ath5k_hw_reg_write(ah,
0856 (AR5K_REG_SM(2,
0857 AR5K_PHY_ADC_CTL_INBUFGAIN_OFF) |
0858 AR5K_REG_SM(2,
0859 AR5K_PHY_ADC_CTL_INBUFGAIN_ON) |
0860 AR5K_PHY_ADC_CTL_PWD_DAC_OFF |
0861 AR5K_PHY_ADC_CTL_PWD_ADC_OFF),
0862 AR5K_PHY_ADC_CTL);
0863
0864
0865
0866
0867 AR5K_REG_DISABLE_BITS(ah, AR5K_PHY_DAG_CCK_CTL,
0868 AR5K_PHY_DAG_CCK_CTL_EN_RSSI_THR);
0869
0870 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DAG_CCK_CTL,
0871 AR5K_PHY_DAG_CCK_CTL_RSSI_THR, 2);
0872
0873
0874 ath5k_hw_reg_write(ah, 0x0000000f, AR5K_SEQ_MASK);
0875 }
0876
0877
0878 if (ah->ah_phy_revision >= AR5K_SREV_PHY_5212B)
0879 ath5k_hw_reg_write(ah, 0, AR5K_PHY_BLUETOOTH);
0880
0881
0882 if (ah->ah_phy_revision > AR5K_SREV_PHY_5212B)
0883 AR5K_REG_DISABLE_BITS(ah, AR5K_TXCFG,
0884 AR5K_TXCFG_DCU_DBL_BUF_DIS);
0885
0886
0887 if ((ah->ah_radio == AR5K_RF5413) ||
0888 (ah->ah_radio == AR5K_RF2317) ||
0889 (ah->ah_mac_version == (AR5K_SREV_AR2417 >> 4))) {
0890 u32 fast_adc = true;
0891
0892 if (channel->center_freq == 2462 ||
0893 channel->center_freq == 2467)
0894 fast_adc = 0;
0895
0896
0897 if (ath5k_hw_reg_read(ah, AR5K_PHY_FAST_ADC) != fast_adc)
0898 ath5k_hw_reg_write(ah, fast_adc,
0899 AR5K_PHY_FAST_ADC);
0900 }
0901
0902
0903 if (ah->ah_radio == AR5K_RF5112 &&
0904 ah->ah_radio_5ghz_revision <
0905 AR5K_SREV_RAD_5112A) {
0906 u32 data;
0907 ath5k_hw_reg_write(ah, AR5K_PHY_CCKTXCTL_WORLD,
0908 AR5K_PHY_CCKTXCTL);
0909 if (channel->band == NL80211_BAND_5GHZ)
0910 data = 0xffb81020;
0911 else
0912 data = 0xffb80d20;
0913 ath5k_hw_reg_write(ah, data, AR5K_PHY_FRAME_CTL);
0914 }
0915
0916 if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
0917
0918 ath5k_hw_reg_write(ah, 0, AR5K_QCUDCU_CLKGT);
0919
0920 ath5k_hw_reg_write(ah, AR5K_PHY_SCAL_32MHZ_5311,
0921 AR5K_PHY_SCAL);
0922
0923 AR5K_REG_ENABLE_BITS(ah, AR5K_DIAG_SW_5211,
0924 AR5K_DIAG_SW_ECO_ENABLE);
0925 }
0926
0927 if (ah->ah_bwmode) {
0928
0929
0930
0931 if (ah->ah_bwmode == AR5K_BWMODE_40MHZ) {
0932
0933 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
0934 AR5K_PHY_SETTLING_AGC,
0935 AR5K_AGC_SETTLING_TURBO);
0936
0937
0938
0939
0940 if (ah->ah_version == AR5K_AR5212)
0941 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
0942 AR5K_PHY_SETTLING_SWITCH,
0943 AR5K_SWITCH_SETTLING_TURBO);
0944
0945 if (ah->ah_version == AR5K_AR5210) {
0946
0947 ath5k_hw_reg_write(ah,
0948 (AR5K_PHY_FRAME_CTL_INI |
0949 AR5K_PHY_TURBO_MODE |
0950 AR5K_PHY_TURBO_SHORT | 0x2020),
0951 AR5K_PHY_FRAME_CTL_5210);
0952 }
0953
0954 } else if ((ah->ah_mac_srev >= AR5K_SREV_AR5424) &&
0955 (ah->ah_mac_srev <= AR5K_SREV_AR5414)) {
0956 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_FRAME_CTL_5211,
0957 AR5K_PHY_FRAME_CTL_WIN_LEN,
0958 3);
0959 }
0960 } else if (ah->ah_version == AR5K_AR5210) {
0961
0962 ath5k_hw_reg_write(ah, (AR5K_PHY_FRAME_CTL_INI | 0x1020),
0963 AR5K_PHY_FRAME_CTL_5210);
0964 }
0965 }
0966
0967
0968
0969
0970
0971
0972
0973
0974
0975 static void
0976 ath5k_hw_commit_eeprom_settings(struct ath5k_hw *ah,
0977 struct ieee80211_channel *channel)
0978 {
0979 struct ath5k_eeprom_info *ee = &ah->ah_capabilities.cap_eeprom;
0980 s16 cck_ofdm_pwr_delta;
0981 u8 ee_mode;
0982
0983
0984 if (ah->ah_version == AR5K_AR5210)
0985 return;
0986
0987 ee_mode = ath5k_eeprom_mode_from_channel(ah, channel);
0988
0989
0990 if (channel->center_freq == 2484)
0991 cck_ofdm_pwr_delta =
0992 ((ee->ee_cck_ofdm_power_delta -
0993 ee->ee_scaled_cck_delta) * 2) / 10;
0994 else
0995 cck_ofdm_pwr_delta =
0996 (ee->ee_cck_ofdm_power_delta * 2) / 10;
0997
0998
0999
1000 if (ah->ah_phy_revision >= AR5K_SREV_PHY_5212A) {
1001 if (channel->hw_value == AR5K_MODE_11G)
1002 ath5k_hw_reg_write(ah,
1003 AR5K_REG_SM((ee->ee_cck_ofdm_gain_delta * -1),
1004 AR5K_PHY_TX_PWR_ADJ_CCK_GAIN_DELTA) |
1005 AR5K_REG_SM((cck_ofdm_pwr_delta * -1),
1006 AR5K_PHY_TX_PWR_ADJ_CCK_PCDAC_INDEX),
1007 AR5K_PHY_TX_PWR_ADJ);
1008 else
1009 ath5k_hw_reg_write(ah, 0, AR5K_PHY_TX_PWR_ADJ);
1010 } else {
1011
1012
1013 ah->ah_txpower.txp_cck_ofdm_pwr_delta = cck_ofdm_pwr_delta;
1014 ah->ah_txpower.txp_cck_ofdm_gainf_delta =
1015 ee->ee_cck_ofdm_gain_delta;
1016 }
1017
1018
1019
1020 ath5k_hw_set_antenna_switch(ah, ee_mode);
1021
1022
1023 ath5k_hw_reg_write(ah,
1024 AR5K_PHY_NF_SVAL(ee->ee_noise_floor_thr[ee_mode]),
1025 AR5K_PHY_NFTHRES);
1026
1027 if ((ah->ah_bwmode == AR5K_BWMODE_40MHZ) &&
1028 (ah->ah_ee_version >= AR5K_EEPROM_VERSION_5_0)) {
1029
1030 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
1031 AR5K_PHY_SETTLING_SWITCH,
1032 ee->ee_switch_settling_turbo[ee_mode]);
1033
1034
1035 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN,
1036 AR5K_PHY_GAIN_TXRX_ATTEN,
1037 ee->ee_atn_tx_rx_turbo[ee_mode]);
1038
1039
1040 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1041 AR5K_PHY_DESIRED_SIZE_ADC,
1042 ee->ee_adc_desired_size_turbo[ee_mode]);
1043
1044 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1045 AR5K_PHY_DESIRED_SIZE_PGA,
1046 ee->ee_pga_desired_size_turbo[ee_mode]);
1047
1048
1049 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN_2GHZ,
1050 AR5K_PHY_GAIN_2GHZ_MARGIN_TXRX,
1051 ee->ee_margin_tx_rx_turbo[ee_mode]);
1052
1053 } else {
1054
1055 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_SETTLING,
1056 AR5K_PHY_SETTLING_SWITCH,
1057 ee->ee_switch_settling[ee_mode]);
1058
1059
1060 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN,
1061 AR5K_PHY_GAIN_TXRX_ATTEN,
1062 ee->ee_atn_tx_rx[ee_mode]);
1063
1064
1065 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1066 AR5K_PHY_DESIRED_SIZE_ADC,
1067 ee->ee_adc_desired_size[ee_mode]);
1068
1069 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_DESIRED_SIZE,
1070 AR5K_PHY_DESIRED_SIZE_PGA,
1071 ee->ee_pga_desired_size[ee_mode]);
1072
1073
1074 if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_4_1)
1075 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_GAIN_2GHZ,
1076 AR5K_PHY_GAIN_2GHZ_MARGIN_TXRX,
1077 ee->ee_margin_tx_rx[ee_mode]);
1078 }
1079
1080
1081 ath5k_hw_reg_write(ah,
1082 (ee->ee_tx_end2xpa_disable[ee_mode] << 24) |
1083 (ee->ee_tx_end2xpa_disable[ee_mode] << 16) |
1084 (ee->ee_tx_frm2xpa_enable[ee_mode] << 8) |
1085 (ee->ee_tx_frm2xpa_enable[ee_mode]), AR5K_PHY_RF_CTL4);
1086
1087
1088 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_RF_CTL3,
1089 AR5K_PHY_RF_CTL3_TXE2XLNA_ON,
1090 ee->ee_tx_end2xlna_enable[ee_mode]);
1091
1092
1093 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_NF,
1094 AR5K_PHY_NF_THRESH62,
1095 ee->ee_thr_62[ee_mode]);
1096
1097
1098
1099
1100 if (ath5k_hw_chan_has_spur_noise(ah, channel))
1101 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_OFDM_SELFCORR,
1102 AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1,
1103 AR5K_INIT_CYCRSSI_THR1 +
1104 ee->ee_false_detect[ee_mode]);
1105 else
1106 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_OFDM_SELFCORR,
1107 AR5K_PHY_OFDM_SELFCORR_CYPWR_THR1,
1108 AR5K_INIT_CYCRSSI_THR1);
1109
1110
1111
1112 if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_4_0) {
1113 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_I_COFF,
1114 ee->ee_i_cal[ee_mode]);
1115 AR5K_REG_WRITE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_Q_Q_COFF,
1116 ee->ee_q_cal[ee_mode]);
1117 AR5K_REG_ENABLE_BITS(ah, AR5K_PHY_IQ, AR5K_PHY_IQ_CORR_ENABLE);
1118 }
1119
1120
1121 if (ah->ah_ee_version >= AR5K_EEPROM_VERSION_5_1)
1122 ath5k_hw_reg_write(ah, 0, AR5K_PHY_HEAVY_CLIP_ENABLE);
1123 }
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145 int
1146 ath5k_hw_reset(struct ath5k_hw *ah, enum nl80211_iftype op_mode,
1147 struct ieee80211_channel *channel, bool fast, bool skip_pcu)
1148 {
1149 u32 s_seq[10], s_led[3], tsf_up, tsf_lo;
1150 u8 mode;
1151 int i, ret;
1152
1153 tsf_up = 0;
1154 tsf_lo = 0;
1155 mode = 0;
1156
1157
1158
1159
1160
1161
1162 if (fast && (ah->ah_radio != AR5K_RF2413) &&
1163 (ah->ah_radio != AR5K_RF5413))
1164 fast = false;
1165
1166
1167
1168
1169 if (ah->ah_version == AR5K_AR5212)
1170 ath5k_hw_set_sleep_clock(ah, false);
1171
1172 mode = channel->hw_value;
1173 switch (mode) {
1174 case AR5K_MODE_11A:
1175 break;
1176 case AR5K_MODE_11G:
1177 if (ah->ah_version <= AR5K_AR5211) {
1178 ATH5K_ERR(ah,
1179 "G mode not available on 5210/5211");
1180 return -EINVAL;
1181 }
1182 break;
1183 case AR5K_MODE_11B:
1184 if (ah->ah_version < AR5K_AR5211) {
1185 ATH5K_ERR(ah,
1186 "B mode not available on 5210");
1187 return -EINVAL;
1188 }
1189 break;
1190 default:
1191 ATH5K_ERR(ah,
1192 "invalid channel: %d\n", channel->center_freq);
1193 return -EINVAL;
1194 }
1195
1196
1197
1198
1199
1200 if (fast) {
1201 ret = ath5k_hw_phy_init(ah, channel, mode, true);
1202 if (ret) {
1203 ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
1204 "fast chan change failed, falling back to normal reset\n");
1205
1206
1207 ret = 0;
1208 } else {
1209 ATH5K_DBG(ah, ATH5K_DEBUG_RESET,
1210 "fast chan change successful\n");
1211 return 0;
1212 }
1213 }
1214
1215
1216
1217
1218 if (ah->ah_version != AR5K_AR5210) {
1219
1220
1221
1222
1223
1224 if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
1225
1226 for (i = 0; i < 10; i++)
1227 s_seq[i] = ath5k_hw_reg_read(ah,
1228 AR5K_QUEUE_DCU_SEQNUM(i));
1229
1230 } else {
1231 s_seq[0] = ath5k_hw_reg_read(ah,
1232 AR5K_QUEUE_DCU_SEQNUM(0));
1233 }
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248 if (ah->ah_version == AR5K_AR5211) {
1249 tsf_up = ath5k_hw_reg_read(ah, AR5K_TSF_U32);
1250 tsf_lo = ath5k_hw_reg_read(ah, AR5K_TSF_L32);
1251 }
1252 }
1253
1254
1255
1256 s_led[0] = ath5k_hw_reg_read(ah, AR5K_PCICFG) &
1257 AR5K_PCICFG_LEDSTATE;
1258 s_led[1] = ath5k_hw_reg_read(ah, AR5K_GPIOCR);
1259 s_led[2] = ath5k_hw_reg_read(ah, AR5K_GPIODO);
1260
1261
1262
1263
1264
1265
1266
1267 if (ah->ah_version == AR5K_AR5212 &&
1268 (ah->ah_radio <= AR5K_RF5112)) {
1269 if (!fast && ah->ah_rf_banks != NULL)
1270 ath5k_hw_gainf_calibrate(ah);
1271 }
1272
1273
1274 ret = ath5k_hw_nic_wakeup(ah, channel);
1275 if (ret)
1276 return ret;
1277
1278
1279 if (ah->ah_mac_srev >= AR5K_SREV_AR5211)
1280 ath5k_hw_reg_write(ah, AR5K_PHY_SHIFT_5GHZ, AR5K_PHY(0));
1281 else
1282 ath5k_hw_reg_write(ah, AR5K_PHY_SHIFT_5GHZ | 0x40,
1283 AR5K_PHY(0));
1284
1285
1286 ret = ath5k_hw_write_initvals(ah, mode, skip_pcu);
1287 if (ret)
1288 return ret;
1289
1290
1291 ath5k_hw_init_core_clock(ah);
1292
1293
1294
1295
1296
1297
1298 ath5k_hw_tweak_initval_settings(ah, channel);
1299
1300
1301 ath5k_hw_commit_eeprom_settings(ah, channel);
1302
1303
1304
1305
1306
1307
1308
1309 if (ah->ah_version != AR5K_AR5210) {
1310 if (ah->ah_mac_srev < AR5K_SREV_AR5211) {
1311 for (i = 0; i < 10; i++)
1312 ath5k_hw_reg_write(ah, s_seq[i],
1313 AR5K_QUEUE_DCU_SEQNUM(i));
1314 } else {
1315 ath5k_hw_reg_write(ah, s_seq[0],
1316 AR5K_QUEUE_DCU_SEQNUM(0));
1317 }
1318
1319 if (ah->ah_version == AR5K_AR5211) {
1320 ath5k_hw_reg_write(ah, tsf_up, AR5K_TSF_U32);
1321 ath5k_hw_reg_write(ah, tsf_lo, AR5K_TSF_L32);
1322 }
1323 }
1324
1325
1326 AR5K_REG_ENABLE_BITS(ah, AR5K_PCICFG, s_led[0]);
1327
1328
1329 ath5k_hw_reg_write(ah, s_led[1], AR5K_GPIOCR);
1330 ath5k_hw_reg_write(ah, s_led[2], AR5K_GPIODO);
1331
1332
1333
1334
1335 ath5k_hw_pcu_init(ah, op_mode);
1336
1337
1338
1339
1340 ret = ath5k_hw_phy_init(ah, channel, mode, false);
1341 if (ret) {
1342 ATH5K_ERR(ah,
1343 "failed to initialize PHY (%i) !\n", ret);
1344 return ret;
1345 }
1346
1347
1348
1349
1350 ret = ath5k_hw_init_queues(ah);
1351 if (ret)
1352 return ret;
1353
1354
1355
1356
1357
1358 ath5k_hw_dma_init(ah);
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370 if (ah->ah_use_32khz_clock && ah->ah_version == AR5K_AR5212 &&
1371 op_mode != NL80211_IFTYPE_AP)
1372 ath5k_hw_set_sleep_clock(ah, true);
1373
1374
1375
1376
1377 AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE);
1378 ath5k_hw_reset_tsf(ah);
1379 return 0;
1380 }