0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <linux/kernel.h>
0010 #include <linux/etherdevice.h>
0011
0012 #include "mt76x0.h"
0013 #include "mcu.h"
0014 #include "eeprom.h"
0015 #include "phy.h"
0016 #include "initvals.h"
0017 #include "initvals_phy.h"
0018 #include "../mt76x02_phy.h"
0019
0020 static int
0021 mt76x0_rf_csr_wr(struct mt76x02_dev *dev, u32 offset, u8 value)
0022 {
0023 int ret = 0;
0024 u8 bank, reg;
0025
0026 if (test_bit(MT76_REMOVED, &dev->mphy.state))
0027 return -ENODEV;
0028
0029 bank = MT_RF_BANK(offset);
0030 reg = MT_RF_REG(offset);
0031
0032 if (WARN_ON_ONCE(reg > 127) || WARN_ON_ONCE(bank > 8))
0033 return -EINVAL;
0034
0035 mutex_lock(&dev->phy_mutex);
0036
0037 if (!mt76_poll(dev, MT_RF_CSR_CFG, MT_RF_CSR_CFG_KICK, 0, 100)) {
0038 ret = -ETIMEDOUT;
0039 goto out;
0040 }
0041
0042 mt76_wr(dev, MT_RF_CSR_CFG,
0043 FIELD_PREP(MT_RF_CSR_CFG_DATA, value) |
0044 FIELD_PREP(MT_RF_CSR_CFG_REG_BANK, bank) |
0045 FIELD_PREP(MT_RF_CSR_CFG_REG_ID, reg) |
0046 MT_RF_CSR_CFG_WR |
0047 MT_RF_CSR_CFG_KICK);
0048
0049 out:
0050 mutex_unlock(&dev->phy_mutex);
0051
0052 if (ret < 0)
0053 dev_err(dev->mt76.dev, "Error: RF write %d:%d failed:%d!!\n",
0054 bank, reg, ret);
0055
0056 return ret;
0057 }
0058
0059 static int mt76x0_rf_csr_rr(struct mt76x02_dev *dev, u32 offset)
0060 {
0061 int ret = -ETIMEDOUT;
0062 u32 val;
0063 u8 bank, reg;
0064
0065 if (test_bit(MT76_REMOVED, &dev->mphy.state))
0066 return -ENODEV;
0067
0068 bank = MT_RF_BANK(offset);
0069 reg = MT_RF_REG(offset);
0070
0071 if (WARN_ON_ONCE(reg > 127) || WARN_ON_ONCE(bank > 8))
0072 return -EINVAL;
0073
0074 mutex_lock(&dev->phy_mutex);
0075
0076 if (!mt76_poll(dev, MT_RF_CSR_CFG, MT_RF_CSR_CFG_KICK, 0, 100))
0077 goto out;
0078
0079 mt76_wr(dev, MT_RF_CSR_CFG,
0080 FIELD_PREP(MT_RF_CSR_CFG_REG_BANK, bank) |
0081 FIELD_PREP(MT_RF_CSR_CFG_REG_ID, reg) |
0082 MT_RF_CSR_CFG_KICK);
0083
0084 if (!mt76_poll(dev, MT_RF_CSR_CFG, MT_RF_CSR_CFG_KICK, 0, 100))
0085 goto out;
0086
0087 val = mt76_rr(dev, MT_RF_CSR_CFG);
0088 if (FIELD_GET(MT_RF_CSR_CFG_REG_ID, val) == reg &&
0089 FIELD_GET(MT_RF_CSR_CFG_REG_BANK, val) == bank)
0090 ret = FIELD_GET(MT_RF_CSR_CFG_DATA, val);
0091
0092 out:
0093 mutex_unlock(&dev->phy_mutex);
0094
0095 if (ret < 0)
0096 dev_err(dev->mt76.dev, "Error: RF read %d:%d failed:%d!!\n",
0097 bank, reg, ret);
0098
0099 return ret;
0100 }
0101
0102 static int
0103 mt76x0_rf_wr(struct mt76x02_dev *dev, u32 offset, u8 val)
0104 {
0105 if (mt76_is_usb(&dev->mt76)) {
0106 struct mt76_reg_pair pair = {
0107 .reg = offset,
0108 .value = val,
0109 };
0110
0111 WARN_ON_ONCE(!test_bit(MT76_STATE_MCU_RUNNING,
0112 &dev->mphy.state));
0113 return mt76_wr_rp(dev, MT_MCU_MEMMAP_RF, &pair, 1);
0114 } else {
0115 return mt76x0_rf_csr_wr(dev, offset, val);
0116 }
0117 }
0118
0119 static int mt76x0_rf_rr(struct mt76x02_dev *dev, u32 offset)
0120 {
0121 int ret;
0122 u32 val;
0123
0124 if (mt76_is_usb(&dev->mt76)) {
0125 struct mt76_reg_pair pair = {
0126 .reg = offset,
0127 };
0128
0129 WARN_ON_ONCE(!test_bit(MT76_STATE_MCU_RUNNING,
0130 &dev->mphy.state));
0131 ret = mt76_rd_rp(dev, MT_MCU_MEMMAP_RF, &pair, 1);
0132 val = pair.value;
0133 } else {
0134 ret = val = mt76x0_rf_csr_rr(dev, offset);
0135 }
0136
0137 return (ret < 0) ? ret : val;
0138 }
0139
0140 static int
0141 mt76x0_rf_rmw(struct mt76x02_dev *dev, u32 offset, u8 mask, u8 val)
0142 {
0143 int ret;
0144
0145 ret = mt76x0_rf_rr(dev, offset);
0146 if (ret < 0)
0147 return ret;
0148
0149 val |= ret & ~mask;
0150
0151 ret = mt76x0_rf_wr(dev, offset, val);
0152 return ret ? ret : val;
0153 }
0154
0155 static int
0156 mt76x0_rf_set(struct mt76x02_dev *dev, u32 offset, u8 val)
0157 {
0158 return mt76x0_rf_rmw(dev, offset, 0, val);
0159 }
0160
0161 static int
0162 mt76x0_rf_clear(struct mt76x02_dev *dev, u32 offset, u8 mask)
0163 {
0164 return mt76x0_rf_rmw(dev, offset, mask, 0);
0165 }
0166
0167 static void
0168 mt76x0_phy_rf_csr_wr_rp(struct mt76x02_dev *dev,
0169 const struct mt76_reg_pair *data,
0170 int n)
0171 {
0172 while (n-- > 0) {
0173 mt76x0_rf_csr_wr(dev, data->reg, data->value);
0174 data++;
0175 }
0176 }
0177
0178 #define RF_RANDOM_WRITE(dev, tab) do { \
0179 if (mt76_is_mmio(&dev->mt76)) \
0180 mt76x0_phy_rf_csr_wr_rp(dev, tab, ARRAY_SIZE(tab)); \
0181 else \
0182 mt76_wr_rp(dev, MT_MCU_MEMMAP_RF, tab, ARRAY_SIZE(tab));\
0183 } while (0)
0184
0185 int mt76x0_phy_wait_bbp_ready(struct mt76x02_dev *dev)
0186 {
0187 int i = 20;
0188 u32 val;
0189
0190 do {
0191 val = mt76_rr(dev, MT_BBP(CORE, 0));
0192 if (val && ~val)
0193 break;
0194 } while (--i);
0195
0196 if (!i) {
0197 dev_err(dev->mt76.dev, "Error: BBP is not ready\n");
0198 return -EIO;
0199 }
0200
0201 dev_dbg(dev->mt76.dev, "BBP version %08x\n", val);
0202 return 0;
0203 }
0204
0205 static void
0206 mt76x0_phy_set_band(struct mt76x02_dev *dev, enum nl80211_band band)
0207 {
0208 switch (band) {
0209 case NL80211_BAND_2GHZ:
0210 RF_RANDOM_WRITE(dev, mt76x0_rf_2g_channel_0_tab);
0211
0212 mt76x0_rf_wr(dev, MT_RF(5, 0), 0x45);
0213 mt76x0_rf_wr(dev, MT_RF(6, 0), 0x44);
0214
0215 mt76_wr(dev, MT_TX_ALC_VGA3, 0x00050007);
0216 mt76_wr(dev, MT_TX0_RF_GAIN_CORR, 0x003E0002);
0217 break;
0218 case NL80211_BAND_5GHZ:
0219 RF_RANDOM_WRITE(dev, mt76x0_rf_5g_channel_0_tab);
0220
0221 mt76x0_rf_wr(dev, MT_RF(5, 0), 0x44);
0222 mt76x0_rf_wr(dev, MT_RF(6, 0), 0x45);
0223
0224 mt76_wr(dev, MT_TX_ALC_VGA3, 0x00000005);
0225 mt76_wr(dev, MT_TX0_RF_GAIN_CORR, 0x01010102);
0226 break;
0227 default:
0228 break;
0229 }
0230 }
0231
0232 static void
0233 mt76x0_phy_set_chan_rf_params(struct mt76x02_dev *dev, u8 channel,
0234 u16 rf_bw_band)
0235 {
0236 const struct mt76x0_freq_item *freq_item;
0237 u16 rf_band = rf_bw_band & 0xff00;
0238 u16 rf_bw = rf_bw_band & 0x00ff;
0239 enum nl80211_band band;
0240 bool b_sdm = false;
0241 u32 mac_reg;
0242 int i;
0243
0244 for (i = 0; i < ARRAY_SIZE(mt76x0_sdm_channel); i++) {
0245 if (channel == mt76x0_sdm_channel[i]) {
0246 b_sdm = true;
0247 break;
0248 }
0249 }
0250
0251 for (i = 0; i < ARRAY_SIZE(mt76x0_frequency_plan); i++) {
0252 if (channel == mt76x0_frequency_plan[i].channel) {
0253 rf_band = mt76x0_frequency_plan[i].band;
0254
0255 if (b_sdm)
0256 freq_item = &mt76x0_sdm_frequency_plan[i];
0257 else
0258 freq_item = &mt76x0_frequency_plan[i];
0259
0260 mt76x0_rf_wr(dev, MT_RF(0, 37), freq_item->pllR37);
0261 mt76x0_rf_wr(dev, MT_RF(0, 36), freq_item->pllR36);
0262 mt76x0_rf_wr(dev, MT_RF(0, 35), freq_item->pllR35);
0263 mt76x0_rf_wr(dev, MT_RF(0, 34), freq_item->pllR34);
0264 mt76x0_rf_wr(dev, MT_RF(0, 33), freq_item->pllR33);
0265
0266 mt76x0_rf_rmw(dev, MT_RF(0, 32), 0xe0,
0267 freq_item->pllR32_b7b5);
0268
0269
0270 mt76x0_rf_rmw(dev, MT_RF(0, 32), MT_RF_PLL_DEN_MASK,
0271 freq_item->pllR32_b4b0);
0272
0273
0274 mt76x0_rf_rmw(dev, MT_RF(0, 31), 0xe0,
0275 freq_item->pllR31_b7b5);
0276
0277
0278 mt76x0_rf_rmw(dev, MT_RF(0, 31), MT_RF_PLL_K_MASK,
0279 freq_item->pllR31_b4b0);
0280
0281
0282 if (b_sdm) {
0283 mt76x0_rf_clear(dev, MT_RF(0, 30),
0284 MT_RF_SDM_RESET_MASK);
0285 mt76x0_rf_set(dev, MT_RF(0, 30),
0286 MT_RF_SDM_RESET_MASK);
0287 } else {
0288 mt76x0_rf_rmw(dev, MT_RF(0, 30),
0289 MT_RF_SDM_RESET_MASK,
0290 freq_item->pllR30_b7);
0291 }
0292
0293
0294 mt76x0_rf_rmw(dev, MT_RF(0, 30),
0295 MT_RF_SDM_MASH_PRBS_MASK,
0296 freq_item->pllR30_b6b2);
0297
0298
0299 mt76x0_rf_rmw(dev, MT_RF(0, 30), MT_RF_SDM_BP_MASK,
0300 freq_item->pllR30_b1 << 1);
0301
0302
0303 mt76x0_rf_wr(dev, MT_RF(0, 29),
0304 freq_item->pll_n & 0xff);
0305
0306 mt76x0_rf_rmw(dev, MT_RF(0, 30), 0x1,
0307 (freq_item->pll_n >> 8) & 0x1);
0308
0309
0310 mt76x0_rf_rmw(dev, MT_RF(0, 28), MT_RF_ISI_ISO_MASK,
0311 freq_item->pllR28_b7b6);
0312
0313
0314 mt76x0_rf_rmw(dev, MT_RF(0, 28), MT_RF_PFD_DLY_MASK,
0315 freq_item->pllR28_b5b4);
0316
0317
0318 mt76x0_rf_rmw(dev, MT_RF(0, 28), MT_RF_CLK_SEL_MASK,
0319 freq_item->pllR28_b3b2);
0320
0321
0322 mt76x0_rf_wr(dev, MT_RF(0, 26),
0323 freq_item->pll_sdm_k & 0xff);
0324 mt76x0_rf_wr(dev, MT_RF(0, 27),
0325 (freq_item->pll_sdm_k >> 8) & 0xff);
0326
0327 mt76x0_rf_rmw(dev, MT_RF(0, 28), 0x3,
0328 (freq_item->pll_sdm_k >> 16) & 0x3);
0329
0330
0331 mt76x0_rf_rmw(dev, MT_RF(0, 24), MT_RF_XO_DIV_MASK,
0332 freq_item->pllR24_b1b0);
0333
0334 break;
0335 }
0336 }
0337
0338 for (i = 0; i < ARRAY_SIZE(mt76x0_rf_bw_switch_tab); i++) {
0339 if (rf_bw == mt76x0_rf_bw_switch_tab[i].bw_band) {
0340 mt76x0_rf_wr(dev,
0341 mt76x0_rf_bw_switch_tab[i].rf_bank_reg,
0342 mt76x0_rf_bw_switch_tab[i].value);
0343 } else if ((rf_bw == (mt76x0_rf_bw_switch_tab[i].bw_band & 0xFF)) &&
0344 (rf_band & mt76x0_rf_bw_switch_tab[i].bw_band)) {
0345 mt76x0_rf_wr(dev,
0346 mt76x0_rf_bw_switch_tab[i].rf_bank_reg,
0347 mt76x0_rf_bw_switch_tab[i].value);
0348 }
0349 }
0350
0351 for (i = 0; i < ARRAY_SIZE(mt76x0_rf_band_switch_tab); i++) {
0352 if (mt76x0_rf_band_switch_tab[i].bw_band & rf_band) {
0353 mt76x0_rf_wr(dev,
0354 mt76x0_rf_band_switch_tab[i].rf_bank_reg,
0355 mt76x0_rf_band_switch_tab[i].value);
0356 }
0357 }
0358
0359 mt76_clear(dev, MT_RF_MISC, 0xc);
0360
0361 band = (rf_band & RF_G_BAND) ? NL80211_BAND_2GHZ : NL80211_BAND_5GHZ;
0362 if (mt76x02_ext_pa_enabled(dev, band)) {
0363
0364
0365
0366
0367
0368
0369 if (rf_band & RF_A_BAND)
0370 mt76_set(dev, MT_RF_MISC, BIT(2));
0371 else
0372 mt76_set(dev, MT_RF_MISC, BIT(3));
0373
0374
0375 for (i = 0; i < ARRAY_SIZE(mt76x0_rf_ext_pa_tab); i++)
0376 if (mt76x0_rf_ext_pa_tab[i].bw_band & rf_band)
0377 mt76x0_rf_wr(dev,
0378 mt76x0_rf_ext_pa_tab[i].rf_bank_reg,
0379 mt76x0_rf_ext_pa_tab[i].value);
0380 }
0381
0382 if (rf_band & RF_G_BAND) {
0383 mt76_wr(dev, MT_TX0_RF_GAIN_ATTEN, 0x63707400);
0384
0385 mac_reg = mt76_rr(dev, MT_TX_ALC_CFG_1);
0386 mac_reg &= 0x896400FF;
0387 mt76_wr(dev, MT_TX_ALC_CFG_1, mac_reg);
0388 } else {
0389 mt76_wr(dev, MT_TX0_RF_GAIN_ATTEN, 0x686A7800);
0390
0391
0392
0393 mac_reg = mt76_rr(dev, MT_TX_ALC_CFG_1);
0394 mac_reg &= 0x890400FF;
0395 mt76_wr(dev, MT_TX_ALC_CFG_1, mac_reg);
0396 }
0397 }
0398
0399 static void
0400 mt76x0_phy_set_chan_bbp_params(struct mt76x02_dev *dev, u16 rf_bw_band)
0401 {
0402 int i;
0403
0404 for (i = 0; i < ARRAY_SIZE(mt76x0_bbp_switch_tab); i++) {
0405 const struct mt76x0_bbp_switch_item *item = &mt76x0_bbp_switch_tab[i];
0406 const struct mt76_reg_pair *pair = &item->reg_pair;
0407
0408 if ((rf_bw_band & item->bw_band) != rf_bw_band)
0409 continue;
0410
0411 if (pair->reg == MT_BBP(AGC, 8)) {
0412 u32 val = pair->value;
0413 u8 gain;
0414
0415 gain = FIELD_GET(MT_BBP_AGC_GAIN, val);
0416 gain -= dev->cal.rx.lna_gain * 2;
0417 val &= ~MT_BBP_AGC_GAIN;
0418 val |= FIELD_PREP(MT_BBP_AGC_GAIN, gain);
0419 mt76_wr(dev, pair->reg, val);
0420 } else {
0421 mt76_wr(dev, pair->reg, pair->value);
0422 }
0423 }
0424 }
0425
0426 static void mt76x0_phy_ant_select(struct mt76x02_dev *dev)
0427 {
0428 u16 ee_ant = mt76x02_eeprom_get(dev, MT_EE_ANTENNA);
0429 u16 ee_cfg1 = mt76x02_eeprom_get(dev, MT_EE_CFG1_INIT);
0430 u16 nic_conf2 = mt76x02_eeprom_get(dev, MT_EE_NIC_CONF_2);
0431 u32 wlan, coex3;
0432 bool ant_div;
0433
0434 wlan = mt76_rr(dev, MT_WLAN_FUN_CTRL);
0435 coex3 = mt76_rr(dev, MT_COEXCFG3);
0436
0437 ee_ant &= ~(BIT(14) | BIT(12));
0438 wlan &= ~(BIT(6) | BIT(5));
0439 coex3 &= ~GENMASK(5, 2);
0440
0441 if (ee_ant & MT_EE_ANTENNA_DUAL) {
0442
0443 ant_div = !(nic_conf2 & MT_EE_NIC_CONF_2_ANT_OPT) &&
0444 (nic_conf2 & MT_EE_NIC_CONF_2_ANT_DIV);
0445 if (ant_div)
0446 ee_ant |= BIT(12);
0447 else
0448 coex3 |= BIT(4);
0449 coex3 |= BIT(3);
0450 if (dev->mphy.cap.has_2ghz)
0451 wlan |= BIT(6);
0452 } else {
0453
0454 if (dev->mphy.cap.has_5ghz) {
0455 coex3 |= BIT(3) | BIT(4);
0456 } else {
0457 wlan |= BIT(6);
0458 coex3 |= BIT(1);
0459 }
0460 }
0461
0462 if (is_mt7630(dev))
0463 ee_ant |= BIT(14) | BIT(11);
0464
0465 mt76_wr(dev, MT_WLAN_FUN_CTRL, wlan);
0466 mt76_rmw(dev, MT_CMB_CTRL, GENMASK(15, 0), ee_ant);
0467 mt76_rmw(dev, MT_CSR_EE_CFG1, GENMASK(15, 0), ee_cfg1);
0468 mt76_clear(dev, MT_COEXCFG0, BIT(2));
0469 mt76_wr(dev, MT_COEXCFG3, coex3);
0470 }
0471
0472 static void
0473 mt76x0_phy_bbp_set_bw(struct mt76x02_dev *dev, enum nl80211_chan_width width)
0474 {
0475 enum { BW_20 = 0, BW_40 = 1, BW_80 = 2, BW_10 = 4};
0476 int bw;
0477
0478 switch (width) {
0479 default:
0480 case NL80211_CHAN_WIDTH_20_NOHT:
0481 case NL80211_CHAN_WIDTH_20:
0482 bw = BW_20;
0483 break;
0484 case NL80211_CHAN_WIDTH_40:
0485 bw = BW_40;
0486 break;
0487 case NL80211_CHAN_WIDTH_80:
0488 bw = BW_80;
0489 break;
0490 case NL80211_CHAN_WIDTH_10:
0491 bw = BW_10;
0492 break;
0493 case NL80211_CHAN_WIDTH_80P80:
0494 case NL80211_CHAN_WIDTH_160:
0495 case NL80211_CHAN_WIDTH_5:
0496
0497 return;
0498 }
0499
0500 mt76x02_mcu_function_select(dev, BW_SETTING, bw);
0501 }
0502
0503 static void mt76x0_phy_tssi_dc_calibrate(struct mt76x02_dev *dev)
0504 {
0505 struct ieee80211_channel *chan = dev->mphy.chandef.chan;
0506 u32 val;
0507
0508 if (chan->band == NL80211_BAND_5GHZ)
0509 mt76x0_rf_clear(dev, MT_RF(0, 67), 0xf);
0510
0511
0512 mt76_wr(dev, MT_RF_SETTING_0, 0x60002237);
0513 mt76_wr(dev, MT_RF_BYPASS_0, 0xffffffff);
0514
0515
0516 mt76_set(dev, MT_BBP(CORE, 4), BIT(0));
0517 usleep_range(500, 1000);
0518 mt76_clear(dev, MT_BBP(CORE, 4), BIT(0));
0519
0520 val = (chan->band == NL80211_BAND_5GHZ) ? 0x80055 : 0x80050;
0521 mt76_wr(dev, MT_BBP(CORE, 34), val);
0522
0523
0524 mt76_wr(dev, MT_BBP(TXBE, 6), BIT(31));
0525
0526 mt76_poll_msec(dev, MT_BBP(CORE, 34), BIT(4), 0, 200);
0527 dev->cal.tssi_dc = mt76_rr(dev, MT_BBP(CORE, 35)) & 0xff;
0528
0529
0530 mt76_wr(dev, MT_RF_BYPASS_0, 0);
0531
0532 mt76_wr(dev, MT_BBP(TXBE, 6), 0);
0533
0534 mt76_set(dev, MT_BBP(CORE, 4), BIT(0));
0535 usleep_range(500, 1000);
0536 mt76_clear(dev, MT_BBP(CORE, 4), BIT(0));
0537
0538 if (chan->band == NL80211_BAND_5GHZ)
0539 mt76x0_rf_rmw(dev, MT_RF(0, 67), 0xf, 0x4);
0540 }
0541
0542 static int
0543 mt76x0_phy_tssi_adc_calibrate(struct mt76x02_dev *dev, s16 *ltssi,
0544 u8 *info)
0545 {
0546 struct ieee80211_channel *chan = dev->mphy.chandef.chan;
0547 u32 val;
0548
0549 val = (chan->band == NL80211_BAND_5GHZ) ? 0x80055 : 0x80050;
0550 mt76_wr(dev, MT_BBP(CORE, 34), val);
0551
0552 if (!mt76_poll_msec(dev, MT_BBP(CORE, 34), BIT(4), 0, 200)) {
0553 mt76_clear(dev, MT_BBP(CORE, 34), BIT(4));
0554 return -ETIMEDOUT;
0555 }
0556
0557 *ltssi = mt76_rr(dev, MT_BBP(CORE, 35)) & 0xff;
0558 if (chan->band == NL80211_BAND_5GHZ)
0559 *ltssi += 128;
0560
0561
0562 mt76_wr(dev, MT_BBP(CORE, 34), 0x80041);
0563 info[0] = mt76_rr(dev, MT_BBP(CORE, 35)) & 0xff;
0564
0565
0566 mt76_wr(dev, MT_BBP(CORE, 34), 0x80042);
0567 info[1] = mt76_rr(dev, MT_BBP(CORE, 35)) & 0xff;
0568
0569
0570 mt76_wr(dev, MT_BBP(CORE, 34), 0x80043);
0571 info[2] = mt76_rr(dev, MT_BBP(CORE, 35)) & 0xff;
0572
0573 return 0;
0574 }
0575
0576 static u8 mt76x0_phy_get_rf_pa_mode(struct mt76x02_dev *dev,
0577 int index, u8 tx_rate)
0578 {
0579 u32 val, reg;
0580
0581 reg = (index == 1) ? MT_RF_PA_MODE_CFG1 : MT_RF_PA_MODE_CFG0;
0582 val = mt76_rr(dev, reg);
0583 return (val & (3 << (tx_rate * 2))) >> (tx_rate * 2);
0584 }
0585
0586 static int
0587 mt76x0_phy_get_target_power(struct mt76x02_dev *dev, u8 tx_mode,
0588 u8 *info, s8 *target_power,
0589 s8 *target_pa_power)
0590 {
0591 u8 tx_rate, cur_power;
0592
0593 cur_power = mt76_rr(dev, MT_TX_ALC_CFG_0) & MT_TX_ALC_CFG_0_CH_INIT_0;
0594 switch (tx_mode) {
0595 case 0:
0596
0597 tx_rate = (info[0] & 0x60) >> 5;
0598 if (tx_rate > 3)
0599 return -EINVAL;
0600
0601 *target_power = cur_power + dev->mt76.rate_power.cck[tx_rate];
0602 *target_pa_power = mt76x0_phy_get_rf_pa_mode(dev, 0, tx_rate);
0603 break;
0604 case 1: {
0605 u8 index;
0606
0607
0608 tx_rate = (info[0] & 0xf0) >> 4;
0609 switch (tx_rate) {
0610 case 0xb:
0611 index = 0;
0612 break;
0613 case 0xf:
0614 index = 1;
0615 break;
0616 case 0xa:
0617 index = 2;
0618 break;
0619 case 0xe:
0620 index = 3;
0621 break;
0622 case 0x9:
0623 index = 4;
0624 break;
0625 case 0xd:
0626 index = 5;
0627 break;
0628 case 0x8:
0629 index = 6;
0630 break;
0631 case 0xc:
0632 index = 7;
0633 break;
0634 default:
0635 return -EINVAL;
0636 }
0637
0638 *target_power = cur_power + dev->mt76.rate_power.ofdm[index];
0639 *target_pa_power = mt76x0_phy_get_rf_pa_mode(dev, 0, index + 4);
0640 break;
0641 }
0642 case 4:
0643
0644 tx_rate = info[1] & 0xf;
0645 if (tx_rate > 9)
0646 return -EINVAL;
0647
0648 *target_power = cur_power + dev->mt76.rate_power.vht[tx_rate];
0649 *target_pa_power = mt76x0_phy_get_rf_pa_mode(dev, 1, tx_rate);
0650 break;
0651 default:
0652
0653 tx_rate = info[1] & 0x7f;
0654 if (tx_rate > 9)
0655 return -EINVAL;
0656
0657 *target_power = cur_power + dev->mt76.rate_power.ht[tx_rate];
0658 *target_pa_power = mt76x0_phy_get_rf_pa_mode(dev, 1, tx_rate);
0659 break;
0660 }
0661
0662 return 0;
0663 }
0664
0665 static s16 mt76x0_phy_lin2db(u16 val)
0666 {
0667 u32 mantissa = val << 4;
0668 int ret, data;
0669 s16 exp = -4;
0670
0671 while (mantissa < BIT(15)) {
0672 mantissa <<= 1;
0673 if (--exp < -20)
0674 return -10000;
0675 }
0676 while (mantissa > 0xffff) {
0677 mantissa >>= 1;
0678 if (++exp > 20)
0679 return -10000;
0680 }
0681
0682
0683 if (mantissa <= 47104)
0684 data = mantissa + (mantissa >> 3) + (mantissa >> 4) - 38400;
0685 else
0686 data = mantissa - (mantissa >> 3) - (mantissa >> 6) - 23040;
0687 data = max_t(int, 0, data);
0688
0689 ret = ((15 + exp) << 15) + data;
0690 ret = (ret << 2) + (ret << 1) + (ret >> 6) + (ret >> 7);
0691 return ret >> 10;
0692 }
0693
0694 static int
0695 mt76x0_phy_get_delta_power(struct mt76x02_dev *dev, u8 tx_mode,
0696 s8 target_power, s8 target_pa_power,
0697 s16 ltssi)
0698 {
0699 struct ieee80211_channel *chan = dev->mphy.chandef.chan;
0700 int tssi_target = target_power << 12, tssi_slope;
0701 int tssi_offset, tssi_db, ret;
0702 u32 data;
0703 u16 val;
0704
0705 if (chan->band == NL80211_BAND_5GHZ) {
0706 u8 bound[7];
0707 int i, err;
0708
0709 err = mt76x02_eeprom_copy(dev, MT_EE_TSSI_BOUND1, bound,
0710 sizeof(bound));
0711 if (err < 0)
0712 return err;
0713
0714 for (i = 0; i < ARRAY_SIZE(bound); i++) {
0715 if (chan->hw_value <= bound[i] || !bound[i])
0716 break;
0717 }
0718 val = mt76x02_eeprom_get(dev, MT_EE_TSSI_SLOPE_5G + i * 2);
0719
0720 tssi_offset = val >> 8;
0721 if ((tssi_offset >= 64 && tssi_offset <= 127) ||
0722 (tssi_offset & BIT(7)))
0723 tssi_offset -= BIT(8);
0724 } else {
0725 val = mt76x02_eeprom_get(dev, MT_EE_TSSI_SLOPE_2G);
0726
0727 tssi_offset = val >> 8;
0728 if (tssi_offset & BIT(7))
0729 tssi_offset -= BIT(8);
0730 }
0731 tssi_slope = val & 0xff;
0732
0733 switch (target_pa_power) {
0734 case 1:
0735 if (chan->band == NL80211_BAND_2GHZ)
0736 tssi_target += 29491;
0737 fallthrough;
0738 case 0:
0739 break;
0740 default:
0741 tssi_target += 4424;
0742 break;
0743 }
0744
0745 if (!tx_mode) {
0746 data = mt76_rr(dev, MT_BBP(CORE, 1));
0747 if (is_mt7630(dev) && mt76_is_mmio(&dev->mt76)) {
0748 int offset;
0749
0750
0751 offset = (data & BIT(5)) ? 18841 : 12288;
0752 tssi_target += offset;
0753 } else if (data & BIT(5)) {
0754
0755 tssi_target += 6554;
0756 }
0757 }
0758
0759 data = mt76_rr(dev, MT_BBP(TXBE, 4));
0760 switch (data & 0x3) {
0761 case 1:
0762 tssi_target -= 49152;
0763 break;
0764 case 2:
0765 tssi_target -= 98304;
0766 break;
0767 case 3:
0768 tssi_target += 49152;
0769 break;
0770 default:
0771 break;
0772 }
0773
0774 tssi_db = mt76x0_phy_lin2db(ltssi - dev->cal.tssi_dc) * tssi_slope;
0775 if (chan->band == NL80211_BAND_5GHZ) {
0776 tssi_db += ((tssi_offset - 50) << 10);
0777 tssi_target -= tssi_db;
0778 if (ltssi > 254 && tssi_target > 0) {
0779
0780 tssi_target = 0;
0781 }
0782 } else {
0783 tssi_db += (tssi_offset << 9);
0784 tssi_target -= tssi_db;
0785
0786 if ((ltssi > 126 && tssi_target > 0) ||
0787 ((ltssi - dev->cal.tssi_dc) < 1 && tssi_target < 0)) {
0788 tssi_target = 0;
0789 }
0790 }
0791
0792 if ((dev->cal.tssi_target ^ tssi_target) < 0 &&
0793 dev->cal.tssi_target > -4096 && dev->cal.tssi_target < 4096 &&
0794 tssi_target > -4096 && tssi_target < 4096) {
0795 if ((tssi_target < 0 &&
0796 tssi_target + dev->cal.tssi_target > 0) ||
0797 (tssi_target > 0 &&
0798 tssi_target + dev->cal.tssi_target <= 0))
0799 tssi_target = 0;
0800 else
0801 dev->cal.tssi_target = tssi_target;
0802 } else {
0803 dev->cal.tssi_target = tssi_target;
0804 }
0805
0806
0807 if (tssi_target > 0)
0808 tssi_target += 2048;
0809 else
0810 tssi_target -= 2048;
0811 tssi_target >>= 12;
0812
0813 ret = mt76_get_field(dev, MT_TX_ALC_CFG_1, MT_TX_ALC_CFG_1_TEMP_COMP);
0814 if (ret & BIT(5))
0815 ret -= BIT(6);
0816 ret += tssi_target;
0817
0818 ret = min_t(int, 31, ret);
0819 return max_t(int, -32, ret);
0820 }
0821
0822 static void mt76x0_phy_tssi_calibrate(struct mt76x02_dev *dev)
0823 {
0824 s8 target_power, target_pa_power;
0825 u8 tssi_info[3], tx_mode;
0826 s16 ltssi;
0827 s8 val;
0828
0829 if (mt76x0_phy_tssi_adc_calibrate(dev, <ssi, tssi_info) < 0)
0830 return;
0831
0832 tx_mode = tssi_info[0] & 0x7;
0833 if (mt76x0_phy_get_target_power(dev, tx_mode, tssi_info,
0834 &target_power, &target_pa_power) < 0)
0835 return;
0836
0837 val = mt76x0_phy_get_delta_power(dev, tx_mode, target_power,
0838 target_pa_power, ltssi);
0839 mt76_rmw_field(dev, MT_TX_ALC_CFG_1, MT_TX_ALC_CFG_1_TEMP_COMP, val);
0840 }
0841
0842 void mt76x0_phy_set_txpower(struct mt76x02_dev *dev)
0843 {
0844 struct mt76_rate_power *t = &dev->mt76.rate_power;
0845 s8 info;
0846
0847 mt76x0_get_tx_power_per_rate(dev, dev->mphy.chandef.chan, t);
0848 mt76x0_get_power_info(dev, dev->mphy.chandef.chan, &info);
0849
0850 mt76x02_add_rate_power_offset(t, info);
0851 mt76x02_limit_rate_power(t, dev->txpower_conf);
0852 dev->mphy.txpower_cur = mt76x02_get_max_rate_power(t);
0853 mt76x02_add_rate_power_offset(t, -info);
0854
0855 dev->target_power = info;
0856 mt76x02_phy_set_txpower(dev, info, info);
0857 }
0858
0859 void mt76x0_phy_calibrate(struct mt76x02_dev *dev, bool power_on)
0860 {
0861 struct ieee80211_channel *chan = dev->mphy.chandef.chan;
0862 int is_5ghz = (chan->band == NL80211_BAND_5GHZ) ? 1 : 0;
0863 u32 val, tx_alc, reg_val;
0864
0865 if (is_mt7630(dev))
0866 return;
0867
0868 if (power_on) {
0869 mt76x02_mcu_calibrate(dev, MCU_CAL_R, 0);
0870 mt76x02_mcu_calibrate(dev, MCU_CAL_VCO, chan->hw_value);
0871 usleep_range(10, 20);
0872
0873 if (mt76x0_tssi_enabled(dev)) {
0874 mt76_wr(dev, MT_MAC_SYS_CTRL,
0875 MT_MAC_SYS_CTRL_ENABLE_RX);
0876 mt76x0_phy_tssi_dc_calibrate(dev);
0877 mt76_wr(dev, MT_MAC_SYS_CTRL,
0878 MT_MAC_SYS_CTRL_ENABLE_TX |
0879 MT_MAC_SYS_CTRL_ENABLE_RX);
0880 }
0881 }
0882
0883 tx_alc = mt76_rr(dev, MT_TX_ALC_CFG_0);
0884 mt76_wr(dev, MT_TX_ALC_CFG_0, 0);
0885 usleep_range(500, 700);
0886
0887 reg_val = mt76_rr(dev, MT_BBP(IBI, 9));
0888 mt76_wr(dev, MT_BBP(IBI, 9), 0xffffff7e);
0889
0890 if (is_5ghz) {
0891 if (chan->hw_value < 100)
0892 val = 0x701;
0893 else if (chan->hw_value < 140)
0894 val = 0x801;
0895 else
0896 val = 0x901;
0897 } else {
0898 val = 0x600;
0899 }
0900
0901 mt76x02_mcu_calibrate(dev, MCU_CAL_FULL, val);
0902 mt76x02_mcu_calibrate(dev, MCU_CAL_LC, is_5ghz);
0903 usleep_range(15000, 20000);
0904
0905 mt76_wr(dev, MT_BBP(IBI, 9), reg_val);
0906 mt76_wr(dev, MT_TX_ALC_CFG_0, tx_alc);
0907 mt76x02_mcu_calibrate(dev, MCU_CAL_RXDCOC, 1);
0908 }
0909 EXPORT_SYMBOL_GPL(mt76x0_phy_calibrate);
0910
0911 void mt76x0_phy_set_channel(struct mt76x02_dev *dev,
0912 struct cfg80211_chan_def *chandef)
0913 {
0914 u32 ext_cca_chan[4] = {
0915 [0] = FIELD_PREP(MT_EXT_CCA_CFG_CCA0, 0) |
0916 FIELD_PREP(MT_EXT_CCA_CFG_CCA1, 1) |
0917 FIELD_PREP(MT_EXT_CCA_CFG_CCA2, 2) |
0918 FIELD_PREP(MT_EXT_CCA_CFG_CCA3, 3) |
0919 FIELD_PREP(MT_EXT_CCA_CFG_CCA_MASK, BIT(0)),
0920 [1] = FIELD_PREP(MT_EXT_CCA_CFG_CCA0, 1) |
0921 FIELD_PREP(MT_EXT_CCA_CFG_CCA1, 0) |
0922 FIELD_PREP(MT_EXT_CCA_CFG_CCA2, 2) |
0923 FIELD_PREP(MT_EXT_CCA_CFG_CCA3, 3) |
0924 FIELD_PREP(MT_EXT_CCA_CFG_CCA_MASK, BIT(1)),
0925 [2] = FIELD_PREP(MT_EXT_CCA_CFG_CCA0, 2) |
0926 FIELD_PREP(MT_EXT_CCA_CFG_CCA1, 3) |
0927 FIELD_PREP(MT_EXT_CCA_CFG_CCA2, 1) |
0928 FIELD_PREP(MT_EXT_CCA_CFG_CCA3, 0) |
0929 FIELD_PREP(MT_EXT_CCA_CFG_CCA_MASK, BIT(2)),
0930 [3] = FIELD_PREP(MT_EXT_CCA_CFG_CCA0, 3) |
0931 FIELD_PREP(MT_EXT_CCA_CFG_CCA1, 2) |
0932 FIELD_PREP(MT_EXT_CCA_CFG_CCA2, 1) |
0933 FIELD_PREP(MT_EXT_CCA_CFG_CCA3, 0) |
0934 FIELD_PREP(MT_EXT_CCA_CFG_CCA_MASK, BIT(3)),
0935 };
0936 bool scan = test_bit(MT76_SCANNING, &dev->mphy.state);
0937 int ch_group_index, freq, freq1;
0938 u8 channel;
0939 u32 val;
0940 u16 rf_bw_band;
0941
0942 freq = chandef->chan->center_freq;
0943 freq1 = chandef->center_freq1;
0944 channel = chandef->chan->hw_value;
0945 rf_bw_band = (channel <= 14) ? RF_G_BAND : RF_A_BAND;
0946
0947 switch (chandef->width) {
0948 case NL80211_CHAN_WIDTH_40:
0949 if (freq1 > freq)
0950 ch_group_index = 0;
0951 else
0952 ch_group_index = 1;
0953 channel += 2 - ch_group_index * 4;
0954 rf_bw_band |= RF_BW_40;
0955 break;
0956 case NL80211_CHAN_WIDTH_80:
0957 ch_group_index = (freq - freq1 + 30) / 20;
0958 if (WARN_ON(ch_group_index < 0 || ch_group_index > 3))
0959 ch_group_index = 0;
0960 channel += 6 - ch_group_index * 4;
0961 rf_bw_band |= RF_BW_80;
0962 break;
0963 default:
0964 ch_group_index = 0;
0965 rf_bw_band |= RF_BW_20;
0966 break;
0967 }
0968
0969 if (mt76_is_usb(&dev->mt76)) {
0970 mt76x0_phy_bbp_set_bw(dev, chandef->width);
0971 } else {
0972 if (chandef->width == NL80211_CHAN_WIDTH_80 ||
0973 chandef->width == NL80211_CHAN_WIDTH_40)
0974 val = 0x201;
0975 else
0976 val = 0x601;
0977 mt76_wr(dev, MT_TX_SW_CFG0, val);
0978 }
0979 mt76x02_phy_set_bw(dev, chandef->width, ch_group_index);
0980 mt76x02_phy_set_band(dev, chandef->chan->band,
0981 ch_group_index & 1);
0982
0983 mt76_rmw(dev, MT_EXT_CCA_CFG,
0984 (MT_EXT_CCA_CFG_CCA0 |
0985 MT_EXT_CCA_CFG_CCA1 |
0986 MT_EXT_CCA_CFG_CCA2 |
0987 MT_EXT_CCA_CFG_CCA3 |
0988 MT_EXT_CCA_CFG_CCA_MASK),
0989 ext_cca_chan[ch_group_index]);
0990
0991 mt76x0_phy_set_band(dev, chandef->chan->band);
0992 mt76x0_phy_set_chan_rf_params(dev, channel, rf_bw_band);
0993
0994
0995 if (channel == 14)
0996 mt76_set(dev, MT_BBP(CORE, 1), 0x20);
0997 else
0998 mt76_clear(dev, MT_BBP(CORE, 1), 0x20);
0999
1000 mt76x0_read_rx_gain(dev);
1001 mt76x0_phy_set_chan_bbp_params(dev, rf_bw_band);
1002
1003
1004 mt76x0_rf_set(dev, MT_RF(0, 4), BIT(7));
1005 if (scan)
1006 return;
1007
1008 mt76x02_init_agc_gain(dev);
1009 mt76x0_phy_calibrate(dev, false);
1010 mt76x0_phy_set_txpower(dev);
1011
1012 ieee80211_queue_delayed_work(dev->mt76.hw, &dev->cal_work,
1013 MT_CALIBRATE_INTERVAL);
1014 }
1015
1016 static void mt76x0_phy_temp_sensor(struct mt76x02_dev *dev)
1017 {
1018 u8 rf_b7_73, rf_b0_66, rf_b0_67;
1019 s8 val;
1020
1021 rf_b7_73 = mt76x0_rf_rr(dev, MT_RF(7, 73));
1022 rf_b0_66 = mt76x0_rf_rr(dev, MT_RF(0, 66));
1023 rf_b0_67 = mt76x0_rf_rr(dev, MT_RF(0, 67));
1024
1025 mt76x0_rf_wr(dev, MT_RF(7, 73), 0x02);
1026 mt76x0_rf_wr(dev, MT_RF(0, 66), 0x23);
1027 mt76x0_rf_wr(dev, MT_RF(0, 67), 0x01);
1028
1029 mt76_wr(dev, MT_BBP(CORE, 34), 0x00080055);
1030 if (!mt76_poll_msec(dev, MT_BBP(CORE, 34), BIT(4), 0, 200)) {
1031 mt76_clear(dev, MT_BBP(CORE, 34), BIT(4));
1032 goto done;
1033 }
1034
1035 val = mt76_rr(dev, MT_BBP(CORE, 35));
1036 val = (35 * (val - dev->cal.rx.temp_offset)) / 10 + 25;
1037
1038 if (abs(val - dev->cal.temp_vco) > 20) {
1039 mt76x02_mcu_calibrate(dev, MCU_CAL_VCO,
1040 dev->mphy.chandef.chan->hw_value);
1041 dev->cal.temp_vco = val;
1042 }
1043 if (abs(val - dev->cal.temp) > 30) {
1044 mt76x0_phy_calibrate(dev, false);
1045 dev->cal.temp = val;
1046 }
1047
1048 done:
1049 mt76x0_rf_wr(dev, MT_RF(7, 73), rf_b7_73);
1050 mt76x0_rf_wr(dev, MT_RF(0, 66), rf_b0_66);
1051 mt76x0_rf_wr(dev, MT_RF(0, 67), rf_b0_67);
1052 }
1053
1054 static void mt76x0_phy_set_gain_val(struct mt76x02_dev *dev)
1055 {
1056 u8 gain = dev->cal.agc_gain_cur[0] - dev->cal.agc_gain_adjust;
1057
1058 mt76_rmw_field(dev, MT_BBP(AGC, 8), MT_BBP_AGC_GAIN, gain);
1059
1060 if ((dev->mphy.chandef.chan->flags & IEEE80211_CHAN_RADAR) &&
1061 !is_mt7630(dev))
1062 mt76x02_phy_dfs_adjust_agc(dev);
1063 }
1064
1065 static void
1066 mt76x0_phy_update_channel_gain(struct mt76x02_dev *dev)
1067 {
1068 bool gain_change;
1069 u8 gain_delta;
1070 int low_gain;
1071
1072 dev->cal.avg_rssi_all = mt76_get_min_avg_rssi(&dev->mt76, false);
1073 if (!dev->cal.avg_rssi_all)
1074 dev->cal.avg_rssi_all = -75;
1075
1076 low_gain = (dev->cal.avg_rssi_all > mt76x02_get_rssi_gain_thresh(dev)) +
1077 (dev->cal.avg_rssi_all > mt76x02_get_low_rssi_gain_thresh(dev));
1078
1079 gain_change = dev->cal.low_gain < 0 ||
1080 (dev->cal.low_gain & 2) ^ (low_gain & 2);
1081 dev->cal.low_gain = low_gain;
1082
1083 if (!gain_change) {
1084 if (mt76x02_phy_adjust_vga_gain(dev))
1085 mt76x0_phy_set_gain_val(dev);
1086 return;
1087 }
1088
1089 dev->cal.agc_gain_adjust = (low_gain == 2) ? 0 : 10;
1090 gain_delta = (low_gain == 2) ? 10 : 0;
1091
1092 dev->cal.agc_gain_cur[0] = dev->cal.agc_gain_init[0] - gain_delta;
1093 mt76x0_phy_set_gain_val(dev);
1094
1095
1096 mt76_rr(dev, MT_RX_STAT_1);
1097 }
1098
1099 static void mt76x0_phy_calibration_work(struct work_struct *work)
1100 {
1101 struct mt76x02_dev *dev = container_of(work, struct mt76x02_dev,
1102 cal_work.work);
1103
1104 mt76x0_phy_update_channel_gain(dev);
1105 if (mt76x0_tssi_enabled(dev))
1106 mt76x0_phy_tssi_calibrate(dev);
1107 else
1108 mt76x0_phy_temp_sensor(dev);
1109
1110 ieee80211_queue_delayed_work(dev->mt76.hw, &dev->cal_work,
1111 4 * MT_CALIBRATE_INTERVAL);
1112 }
1113
1114 static void mt76x0_rf_patch_reg_array(struct mt76x02_dev *dev,
1115 const struct mt76_reg_pair *rp, int len)
1116 {
1117 int i;
1118
1119 for (i = 0; i < len; i++) {
1120 u32 reg = rp[i].reg;
1121 u8 val = rp[i].value;
1122
1123 switch (reg) {
1124 case MT_RF(0, 3):
1125 if (mt76_is_mmio(&dev->mt76)) {
1126 if (is_mt7630(dev))
1127 val = 0x70;
1128 else
1129 val = 0x63;
1130 } else {
1131 val = 0x73;
1132 }
1133 break;
1134 case MT_RF(0, 21):
1135 if (is_mt7610e(dev))
1136 val = 0x10;
1137 else
1138 val = 0x12;
1139 break;
1140 case MT_RF(5, 2):
1141 if (is_mt7630(dev))
1142 val = 0x1d;
1143 else if (is_mt7610e(dev))
1144 val = 0x00;
1145 else
1146 val = 0x0c;
1147 break;
1148 default:
1149 break;
1150 }
1151 mt76x0_rf_wr(dev, reg, val);
1152 }
1153 }
1154
1155 static void mt76x0_phy_rf_init(struct mt76x02_dev *dev)
1156 {
1157 int i;
1158
1159 mt76x0_rf_patch_reg_array(dev, mt76x0_rf_central_tab,
1160 ARRAY_SIZE(mt76x0_rf_central_tab));
1161 mt76x0_rf_patch_reg_array(dev, mt76x0_rf_2g_channel_0_tab,
1162 ARRAY_SIZE(mt76x0_rf_2g_channel_0_tab));
1163 RF_RANDOM_WRITE(dev, mt76x0_rf_5g_channel_0_tab);
1164 RF_RANDOM_WRITE(dev, mt76x0_rf_vga_channel_0_tab);
1165
1166 for (i = 0; i < ARRAY_SIZE(mt76x0_rf_bw_switch_tab); i++) {
1167 const struct mt76x0_rf_switch_item *item = &mt76x0_rf_bw_switch_tab[i];
1168
1169 if (item->bw_band == RF_BW_20)
1170 mt76x0_rf_wr(dev, item->rf_bank_reg, item->value);
1171 else if (((RF_G_BAND | RF_BW_20) & item->bw_band) ==
1172 (RF_G_BAND | RF_BW_20))
1173 mt76x0_rf_wr(dev, item->rf_bank_reg, item->value);
1174 }
1175
1176 for (i = 0; i < ARRAY_SIZE(mt76x0_rf_band_switch_tab); i++) {
1177 if (mt76x0_rf_band_switch_tab[i].bw_band & RF_G_BAND) {
1178 mt76x0_rf_wr(dev,
1179 mt76x0_rf_band_switch_tab[i].rf_bank_reg,
1180 mt76x0_rf_band_switch_tab[i].value);
1181 }
1182 }
1183
1184
1185
1186
1187
1188 mt76x0_rf_wr(dev, MT_RF(0, 22),
1189 min_t(u8, dev->cal.rx.freq_offset, 0xbf));
1190 mt76x0_rf_rr(dev, MT_RF(0, 22));
1191
1192
1193
1194
1195
1196
1197 mt76x0_rf_set(dev, MT_RF(0, 73), BIT(7));
1198 mt76x0_rf_clear(dev, MT_RF(0, 73), BIT(7));
1199 mt76x0_rf_set(dev, MT_RF(0, 73), BIT(7));
1200
1201
1202 mt76x0_rf_set(dev, MT_RF(0, 4), 0x80);
1203 }
1204
1205 void mt76x0_phy_init(struct mt76x02_dev *dev)
1206 {
1207 INIT_DELAYED_WORK(&dev->cal_work, mt76x0_phy_calibration_work);
1208
1209 mt76x0_phy_ant_select(dev);
1210 mt76x0_phy_rf_init(dev);
1211 mt76x02_phy_set_rxpath(dev);
1212 mt76x02_phy_set_txdac(dev);
1213 }