1*1a754578SBitterblue Smith // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2*1a754578SBitterblue Smith /* Copyright(c) 2025 Realtek Corporation 3*1a754578SBitterblue Smith */ 4*1a754578SBitterblue Smith 5*1a754578SBitterblue Smith #include <linux/usb.h> 6*1a754578SBitterblue Smith #include "main.h" 7*1a754578SBitterblue Smith #include "coex.h" 8*1a754578SBitterblue Smith #include "tx.h" 9*1a754578SBitterblue Smith #include "phy.h" 10*1a754578SBitterblue Smith #include "rtw8814a.h" 11*1a754578SBitterblue Smith #include "rtw8814a_table.h" 12*1a754578SBitterblue Smith #include "rtw88xxa.h" 13*1a754578SBitterblue Smith #include "reg.h" 14*1a754578SBitterblue Smith #include "debug.h" 15*1a754578SBitterblue Smith #include "efuse.h" 16*1a754578SBitterblue Smith #include "regd.h" 17*1a754578SBitterblue Smith #include "usb.h" 18*1a754578SBitterblue Smith 19*1a754578SBitterblue Smith static void rtw8814a_efuse_grant(struct rtw_dev *rtwdev, bool on) 20*1a754578SBitterblue Smith { 21*1a754578SBitterblue Smith if (on) { 22*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_ON); 23*1a754578SBitterblue Smith 24*1a754578SBitterblue Smith rtw_write16_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_ELDR); 25*1a754578SBitterblue Smith rtw_write16_set(rtwdev, REG_SYS_CLKR, 26*1a754578SBitterblue Smith BIT_LOADER_CLK_EN | BIT_ANA8M); 27*1a754578SBitterblue Smith } else { 28*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_EFUSE_ACCESS, EFUSE_ACCESS_OFF); 29*1a754578SBitterblue Smith } 30*1a754578SBitterblue Smith } 31*1a754578SBitterblue Smith 32*1a754578SBitterblue Smith static void rtw8814a_read_rfe_type(struct rtw_dev *rtwdev) 33*1a754578SBitterblue Smith { 34*1a754578SBitterblue Smith struct rtw_efuse *efuse = &rtwdev->efuse; 35*1a754578SBitterblue Smith 36*1a754578SBitterblue Smith if (!(efuse->rfe_option & BIT(7))) 37*1a754578SBitterblue Smith return; 38*1a754578SBitterblue Smith 39*1a754578SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) 40*1a754578SBitterblue Smith efuse->rfe_option = 0; 41*1a754578SBitterblue Smith else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) 42*1a754578SBitterblue Smith efuse->rfe_option = 1; 43*1a754578SBitterblue Smith } 44*1a754578SBitterblue Smith 45*1a754578SBitterblue Smith static void rtw8814a_read_amplifier_type(struct rtw_dev *rtwdev) 46*1a754578SBitterblue Smith { 47*1a754578SBitterblue Smith struct rtw_efuse *efuse = &rtwdev->efuse; 48*1a754578SBitterblue Smith 49*1a754578SBitterblue Smith switch (efuse->rfe_option) { 50*1a754578SBitterblue Smith case 1: 51*1a754578SBitterblue Smith /* Internal 2G */ 52*1a754578SBitterblue Smith efuse->pa_type_2g = 0; 53*1a754578SBitterblue Smith efuse->lna_type_2g = 0; 54*1a754578SBitterblue Smith /* External 5G */ 55*1a754578SBitterblue Smith efuse->pa_type_5g = BIT(0); 56*1a754578SBitterblue Smith efuse->lna_type_5g = BIT(3); 57*1a754578SBitterblue Smith break; 58*1a754578SBitterblue Smith case 2 ... 5: 59*1a754578SBitterblue Smith /* External everything */ 60*1a754578SBitterblue Smith efuse->pa_type_2g = BIT(4); 61*1a754578SBitterblue Smith efuse->lna_type_2g = BIT(3); 62*1a754578SBitterblue Smith efuse->pa_type_5g = BIT(0); 63*1a754578SBitterblue Smith efuse->lna_type_5g = BIT(3); 64*1a754578SBitterblue Smith break; 65*1a754578SBitterblue Smith case 6: 66*1a754578SBitterblue Smith efuse->lna_type_5g = BIT(3); 67*1a754578SBitterblue Smith break; 68*1a754578SBitterblue Smith default: 69*1a754578SBitterblue Smith break; 70*1a754578SBitterblue Smith } 71*1a754578SBitterblue Smith } 72*1a754578SBitterblue Smith 73*1a754578SBitterblue Smith static void rtw8814a_read_rf_type(struct rtw_dev *rtwdev, 74*1a754578SBitterblue Smith struct rtw8814a_efuse *map) 75*1a754578SBitterblue Smith { 76*1a754578SBitterblue Smith struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); 77*1a754578SBitterblue Smith struct rtw_hal *hal = &rtwdev->hal; 78*1a754578SBitterblue Smith 79*1a754578SBitterblue Smith switch (map->trx_antenna_option) { 80*1a754578SBitterblue Smith case 0xff: /* 4T4R */ 81*1a754578SBitterblue Smith case 0xee: /* 3T3R */ 82*1a754578SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB && 83*1a754578SBitterblue Smith rtwusb->udev->speed != USB_SPEED_SUPER) 84*1a754578SBitterblue Smith hal->rf_type = RF_2T2R; 85*1a754578SBitterblue Smith else 86*1a754578SBitterblue Smith hal->rf_type = RF_3T3R; 87*1a754578SBitterblue Smith 88*1a754578SBitterblue Smith break; 89*1a754578SBitterblue Smith case 0x66: /* 2T2R */ 90*1a754578SBitterblue Smith case 0x6f: /* 2T4R */ 91*1a754578SBitterblue Smith default: 92*1a754578SBitterblue Smith hal->rf_type = RF_2T2R; 93*1a754578SBitterblue Smith break; 94*1a754578SBitterblue Smith } 95*1a754578SBitterblue Smith 96*1a754578SBitterblue Smith hal->rf_path_num = 4; 97*1a754578SBitterblue Smith hal->rf_phy_num = 4; 98*1a754578SBitterblue Smith 99*1a754578SBitterblue Smith if (hal->rf_type == RF_3T3R) { 100*1a754578SBitterblue Smith hal->antenna_rx = BB_PATH_ABC; 101*1a754578SBitterblue Smith hal->antenna_tx = BB_PATH_ABC; 102*1a754578SBitterblue Smith } else { 103*1a754578SBitterblue Smith hal->antenna_rx = BB_PATH_AB; 104*1a754578SBitterblue Smith hal->antenna_tx = BB_PATH_AB; 105*1a754578SBitterblue Smith } 106*1a754578SBitterblue Smith } 107*1a754578SBitterblue Smith 108*1a754578SBitterblue Smith static void rtw8814a_init_hwcap(struct rtw_dev *rtwdev) 109*1a754578SBitterblue Smith { 110*1a754578SBitterblue Smith struct rtw_efuse *efuse = &rtwdev->efuse; 111*1a754578SBitterblue Smith struct rtw_hal *hal = &rtwdev->hal; 112*1a754578SBitterblue Smith 113*1a754578SBitterblue Smith efuse->hw_cap.bw = BIT(RTW_CHANNEL_WIDTH_20) | 114*1a754578SBitterblue Smith BIT(RTW_CHANNEL_WIDTH_40) | 115*1a754578SBitterblue Smith BIT(RTW_CHANNEL_WIDTH_80); 116*1a754578SBitterblue Smith efuse->hw_cap.ptcl = EFUSE_HW_CAP_PTCL_VHT; 117*1a754578SBitterblue Smith 118*1a754578SBitterblue Smith if (hal->rf_type == RF_3T3R) 119*1a754578SBitterblue Smith efuse->hw_cap.nss = 3; 120*1a754578SBitterblue Smith else 121*1a754578SBitterblue Smith efuse->hw_cap.nss = 2; 122*1a754578SBitterblue Smith 123*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_EFUSE, 124*1a754578SBitterblue Smith "hw cap: hci=0x%02x, bw=0x%02x, ptcl=0x%02x, ant_num=%d, nss=%d\n", 125*1a754578SBitterblue Smith efuse->hw_cap.hci, efuse->hw_cap.bw, efuse->hw_cap.ptcl, 126*1a754578SBitterblue Smith efuse->hw_cap.ant_num, efuse->hw_cap.nss); 127*1a754578SBitterblue Smith } 128*1a754578SBitterblue Smith 129*1a754578SBitterblue Smith static int rtw8814a_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) 130*1a754578SBitterblue Smith { 131*1a754578SBitterblue Smith struct rtw_efuse *efuse = &rtwdev->efuse; 132*1a754578SBitterblue Smith struct rtw8814a_efuse *map; 133*1a754578SBitterblue Smith int i; 134*1a754578SBitterblue Smith 135*1a754578SBitterblue Smith if (rtw_dbg_is_enabled(rtwdev, RTW_DBG_EFUSE)) 136*1a754578SBitterblue Smith print_hex_dump(KERN_INFO, "", DUMP_PREFIX_OFFSET, 16, 1, 137*1a754578SBitterblue Smith log_map, rtwdev->chip->log_efuse_size, true); 138*1a754578SBitterblue Smith 139*1a754578SBitterblue Smith map = (struct rtw8814a_efuse *)log_map; 140*1a754578SBitterblue Smith 141*1a754578SBitterblue Smith efuse->usb_mode_switch = u8_get_bits(map->usb_mode, BIT(4)); 142*1a754578SBitterblue Smith efuse->rfe_option = map->rfe_option; 143*1a754578SBitterblue Smith efuse->rf_board_option = map->rf_board_option; 144*1a754578SBitterblue Smith efuse->crystal_cap = map->xtal_k; 145*1a754578SBitterblue Smith efuse->channel_plan = map->channel_plan; 146*1a754578SBitterblue Smith efuse->country_code[0] = map->country_code[0]; 147*1a754578SBitterblue Smith efuse->country_code[1] = map->country_code[1]; 148*1a754578SBitterblue Smith efuse->bt_setting = map->rf_bt_setting; 149*1a754578SBitterblue Smith efuse->regd = map->rf_board_option & 0x7; 150*1a754578SBitterblue Smith efuse->thermal_meter[RF_PATH_A] = map->thermal_meter; 151*1a754578SBitterblue Smith efuse->thermal_meter_k = map->thermal_meter; 152*1a754578SBitterblue Smith efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g; 153*1a754578SBitterblue Smith efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g; 154*1a754578SBitterblue Smith 155*1a754578SBitterblue Smith rtw8814a_read_rfe_type(rtwdev); 156*1a754578SBitterblue Smith rtw8814a_read_amplifier_type(rtwdev); 157*1a754578SBitterblue Smith 158*1a754578SBitterblue Smith /* Override rtw_chip_parameter_setup() */ 159*1a754578SBitterblue Smith rtw8814a_read_rf_type(rtwdev, map); 160*1a754578SBitterblue Smith 161*1a754578SBitterblue Smith rtw8814a_init_hwcap(rtwdev); 162*1a754578SBitterblue Smith 163*1a754578SBitterblue Smith for (i = 0; i < 4; i++) 164*1a754578SBitterblue Smith efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i]; 165*1a754578SBitterblue Smith 166*1a754578SBitterblue Smith switch (rtw_hci_type(rtwdev)) { 167*1a754578SBitterblue Smith case RTW_HCI_TYPE_USB: 168*1a754578SBitterblue Smith ether_addr_copy(efuse->addr, map->u.mac_addr); 169*1a754578SBitterblue Smith break; 170*1a754578SBitterblue Smith case RTW_HCI_TYPE_PCIE: 171*1a754578SBitterblue Smith ether_addr_copy(efuse->addr, map->e.mac_addr); 172*1a754578SBitterblue Smith break; 173*1a754578SBitterblue Smith case RTW_HCI_TYPE_SDIO: 174*1a754578SBitterblue Smith default: 175*1a754578SBitterblue Smith /* unsupported now */ 176*1a754578SBitterblue Smith return -EOPNOTSUPP; 177*1a754578SBitterblue Smith } 178*1a754578SBitterblue Smith 179*1a754578SBitterblue Smith return 0; 180*1a754578SBitterblue Smith } 181*1a754578SBitterblue Smith 182*1a754578SBitterblue Smith static void rtw8814a_init_rfe_reg(struct rtw_dev *rtwdev) 183*1a754578SBitterblue Smith { 184*1a754578SBitterblue Smith u8 rfe_option = rtwdev->efuse.rfe_option; 185*1a754578SBitterblue Smith 186*1a754578SBitterblue Smith if (rfe_option == 2 || rfe_option == 1) { 187*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, 0x1994, 0xf, 0xf); 188*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_GPIO_MUXCFG + 2, 0xf0); 189*1a754578SBitterblue Smith } else if (rfe_option == 0) { 190*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, 0x1994, 0xf, 0xf); 191*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_GPIO_MUXCFG + 2, 0xc0); 192*1a754578SBitterblue Smith } 193*1a754578SBitterblue Smith } 194*1a754578SBitterblue Smith 195*1a754578SBitterblue Smith #define RTW_TXSCALE_SIZE 37 196*1a754578SBitterblue Smith static const u32 rtw8814a_txscale_tbl[RTW_TXSCALE_SIZE] = { 197*1a754578SBitterblue Smith 0x081, 0x088, 0x090, 0x099, 0x0a2, 0x0ac, 0x0b6, 0x0c0, 0x0cc, 0x0d8, 198*1a754578SBitterblue Smith 0x0e5, 0x0f2, 0x101, 0x110, 0x120, 0x131, 0x143, 0x156, 0x16a, 0x180, 199*1a754578SBitterblue Smith 0x197, 0x1af, 0x1c8, 0x1e3, 0x200, 0x21e, 0x23e, 0x261, 0x285, 0x2ab, 200*1a754578SBitterblue Smith 0x2d3, 0x2fe, 0x32b, 0x35c, 0x38e, 0x3c4, 0x3fe 201*1a754578SBitterblue Smith }; 202*1a754578SBitterblue Smith 203*1a754578SBitterblue Smith static u32 rtw8814a_get_bb_swing(struct rtw_dev *rtwdev, u8 band, u8 rf_path) 204*1a754578SBitterblue Smith { 205*1a754578SBitterblue Smith static const u32 swing2setting[4] = {0x200, 0x16a, 0x101, 0x0b6}; 206*1a754578SBitterblue Smith struct rtw_efuse *efuse = &rtwdev->efuse; 207*1a754578SBitterblue Smith u8 tx_bb_swing; 208*1a754578SBitterblue Smith 209*1a754578SBitterblue Smith if (band == RTW_BAND_2G) 210*1a754578SBitterblue Smith tx_bb_swing = efuse->tx_bb_swing_setting_2g; 211*1a754578SBitterblue Smith else 212*1a754578SBitterblue Smith tx_bb_swing = efuse->tx_bb_swing_setting_5g; 213*1a754578SBitterblue Smith 214*1a754578SBitterblue Smith tx_bb_swing >>= 2 * rf_path; 215*1a754578SBitterblue Smith tx_bb_swing &= 0x3; 216*1a754578SBitterblue Smith 217*1a754578SBitterblue Smith return swing2setting[tx_bb_swing]; 218*1a754578SBitterblue Smith } 219*1a754578SBitterblue Smith 220*1a754578SBitterblue Smith static u8 rtw8814a_get_swing_index(struct rtw_dev *rtwdev) 221*1a754578SBitterblue Smith { 222*1a754578SBitterblue Smith u32 swing, table_value; 223*1a754578SBitterblue Smith u8 i; 224*1a754578SBitterblue Smith 225*1a754578SBitterblue Smith swing = rtw8814a_get_bb_swing(rtwdev, rtwdev->hal.current_band_type, 226*1a754578SBitterblue Smith RF_PATH_A); 227*1a754578SBitterblue Smith 228*1a754578SBitterblue Smith for (i = 0; i < ARRAY_SIZE(rtw8814a_txscale_tbl); i++) { 229*1a754578SBitterblue Smith table_value = rtw8814a_txscale_tbl[i]; 230*1a754578SBitterblue Smith if (swing == table_value) 231*1a754578SBitterblue Smith return i; 232*1a754578SBitterblue Smith } 233*1a754578SBitterblue Smith 234*1a754578SBitterblue Smith return 24; 235*1a754578SBitterblue Smith } 236*1a754578SBitterblue Smith 237*1a754578SBitterblue Smith static void rtw8814a_pwrtrack_init(struct rtw_dev *rtwdev) 238*1a754578SBitterblue Smith { 239*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 240*1a754578SBitterblue Smith u8 path; 241*1a754578SBitterblue Smith 242*1a754578SBitterblue Smith dm_info->default_ofdm_index = rtw8814a_get_swing_index(rtwdev); 243*1a754578SBitterblue Smith 244*1a754578SBitterblue Smith for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) { 245*1a754578SBitterblue Smith ewma_thermal_init(&dm_info->avg_thermal[path]); 246*1a754578SBitterblue Smith dm_info->delta_power_index[path] = 0; 247*1a754578SBitterblue Smith dm_info->delta_power_index_last[path] = 0; 248*1a754578SBitterblue Smith } 249*1a754578SBitterblue Smith dm_info->pwr_trk_triggered = false; 250*1a754578SBitterblue Smith dm_info->pwr_trk_init_trigger = true; 251*1a754578SBitterblue Smith dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k; 252*1a754578SBitterblue Smith } 253*1a754578SBitterblue Smith 254*1a754578SBitterblue Smith static void rtw8814a_config_trx_path(struct rtw_dev *rtwdev) 255*1a754578SBitterblue Smith { 256*1a754578SBitterblue Smith /* RX CCK disable 2R CCA */ 257*1a754578SBitterblue Smith rtw_write32_clr(rtwdev, REG_CCK0_FAREPORT, 258*1a754578SBitterblue Smith BIT_CCK0_2RX | BIT_CCK0_MRC); 259*1a754578SBitterblue Smith /* pathB tx on, path A/C/D tx off */ 260*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RX, 0xf0000000, 0x4); 261*1a754578SBitterblue Smith /* pathB rx */ 262*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0x5); 263*1a754578SBitterblue Smith } 264*1a754578SBitterblue Smith 265*1a754578SBitterblue Smith static void rtw8814a_config_cck_rx_antenna_init(struct rtw_dev *rtwdev) 266*1a754578SBitterblue Smith { 267*1a754578SBitterblue Smith /* CCK 2R CCA parameters */ 268*1a754578SBitterblue Smith 269*1a754578SBitterblue Smith /* Disable Ant diversity */ 270*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RXSB, BIT_RXSB_ANA_DIV, 0x0); 271*1a754578SBitterblue Smith /* Concurrent CCA at LSB & USB */ 272*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCA, BIT_CCA_CO, 0); 273*1a754578SBitterblue Smith /* RX path diversity enable */ 274*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_ANTSEL, BIT_ANT_BYCO, 0); 275*1a754578SBitterblue Smith /* r_en_mrc_antsel */ 276*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_PRECTRL, BIT_DIS_CO_PATHSEL, 0); 277*1a754578SBitterblue Smith /* MBC weighting */ 278*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCA_MF, BIT_MBC_WIN, 1); 279*1a754578SBitterblue Smith /* 2R CCA only */ 280*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCKTX, BIT_CMB_CCA_2R, 1); 281*1a754578SBitterblue Smith } 282*1a754578SBitterblue Smith 283*1a754578SBitterblue Smith static void rtw8814a_phy_set_param(struct rtw_dev *rtwdev) 284*1a754578SBitterblue Smith { 285*1a754578SBitterblue Smith u32 crystal_cap, val32; 286*1a754578SBitterblue Smith u8 val8, rf_path; 287*1a754578SBitterblue Smith 288*1a754578SBitterblue Smith /* power on BB/RF domain */ 289*1a754578SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) 290*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_USBA); 291*1a754578SBitterblue Smith else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) 292*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_SYS_FUNC_EN, BIT_FEN_PCIEA); 293*1a754578SBitterblue Smith 294*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_SYS_CFG3_8814A + 2, 295*1a754578SBitterblue Smith BIT_FEN_BB_GLB_RST | BIT_FEN_BB_RSTB); 296*1a754578SBitterblue Smith 297*1a754578SBitterblue Smith /* Power on RF paths A..D */ 298*1a754578SBitterblue Smith val8 = BIT_RF_EN | BIT_RF_RSTB | BIT_RF_SDM_RSTB; 299*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_RF_CTRL, val8); 300*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_RF_CTRL1, val8); 301*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_RF_CTRL2, val8); 302*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_RF_CTRL3, val8); 303*1a754578SBitterblue Smith 304*1a754578SBitterblue Smith rtw_load_table(rtwdev, rtwdev->chip->bb_tbl); 305*1a754578SBitterblue Smith rtw_load_table(rtwdev, rtwdev->chip->agc_tbl); 306*1a754578SBitterblue Smith 307*1a754578SBitterblue Smith crystal_cap = rtwdev->efuse.crystal_cap & 0x3F; 308*1a754578SBitterblue Smith crystal_cap |= crystal_cap << 6; 309*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_AFE_CTRL3, 0x07ff8000, crystal_cap); 310*1a754578SBitterblue Smith 311*1a754578SBitterblue Smith rtw8814a_config_trx_path(rtwdev); 312*1a754578SBitterblue Smith 313*1a754578SBitterblue Smith for (rf_path = 0; rf_path < rtwdev->hal.rf_path_num; rf_path++) 314*1a754578SBitterblue Smith rtw_load_table(rtwdev, rtwdev->chip->rf_tbl[rf_path]); 315*1a754578SBitterblue Smith 316*1a754578SBitterblue Smith val32 = rtw_read_rf(rtwdev, RF_PATH_A, RF_RCK1_V1, RFREG_MASK); 317*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_B, RF_RCK1_V1, RFREG_MASK, val32); 318*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_C, RF_RCK1_V1, RFREG_MASK, val32); 319*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_D, RF_RCK1_V1, RFREG_MASK, val32); 320*1a754578SBitterblue Smith 321*1a754578SBitterblue Smith rtw_write32_set(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST); 322*1a754578SBitterblue Smith 323*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_HWSEQ_CTRL, 0xFF); 324*1a754578SBitterblue Smith 325*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_BAR_MODE_CTRL, 0x0201ffff); 326*1a754578SBitterblue Smith 327*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_MISC_CTRL, BIT_DIS_SECOND_CCA); 328*1a754578SBitterblue Smith 329*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_NAV_CTRL + 2, 0); 330*1a754578SBitterblue Smith 331*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_GPIO_MUXCFG, BIT(5)); 332*1a754578SBitterblue Smith 333*1a754578SBitterblue Smith rtw8814a_config_cck_rx_antenna_init(rtwdev); 334*1a754578SBitterblue Smith 335*1a754578SBitterblue Smith rtw_phy_init(rtwdev); 336*1a754578SBitterblue Smith rtw8814a_pwrtrack_init(rtwdev); 337*1a754578SBitterblue Smith 338*1a754578SBitterblue Smith rtw8814a_init_rfe_reg(rtwdev); 339*1a754578SBitterblue Smith 340*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_QUEUE_CTRL, BIT(3)); 341*1a754578SBitterblue Smith 342*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_NAV_CTRL + 2, 235); 343*1a754578SBitterblue Smith 344*1a754578SBitterblue Smith /* enable Tx report. */ 345*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_FWHW_TXQ_CTRL + 1, 0x1F); 346*1a754578SBitterblue Smith 347*1a754578SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { 348*1a754578SBitterblue Smith /* Reset USB mode switch setting */ 349*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_SYS_SDIO_CTRL, 0x0); 350*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_ACLK_MON, 0x0); 351*1a754578SBitterblue Smith } 352*1a754578SBitterblue Smith } 353*1a754578SBitterblue Smith 354*1a754578SBitterblue Smith static void rtw8814ae_enable_rf_1_2v(struct rtw_dev *rtwdev) 355*1a754578SBitterblue Smith { 356*1a754578SBitterblue Smith /* This is for fullsize card, because GPIO7 there is floating. 357*1a754578SBitterblue Smith * We should pull GPIO7 high to enable RF 1.2V Switch Power Supply 358*1a754578SBitterblue Smith */ 359*1a754578SBitterblue Smith 360*1a754578SBitterblue Smith /* 1. set 0x40[1:0] to 0, BIT_GPIOSEL=0, select pin as GPIO */ 361*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_GPIO_MUXCFG, BIT(1) | BIT(0)); 362*1a754578SBitterblue Smith 363*1a754578SBitterblue Smith /* 2. set 0x44[31] to 0 364*1a754578SBitterblue Smith * mode=0: data port; 365*1a754578SBitterblue Smith * mode=1 and BIT_GPIO_IO_SEL=0: interrupt mode; 366*1a754578SBitterblue Smith */ 367*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_GPIO_PIN_CTRL + 3, BIT(7)); 368*1a754578SBitterblue Smith 369*1a754578SBitterblue Smith /* 3. data mode 370*1a754578SBitterblue Smith * 3.1 set 0x44[23] to 1 371*1a754578SBitterblue Smith * sel=0: input; 372*1a754578SBitterblue Smith * sel=1: output; 373*1a754578SBitterblue Smith */ 374*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_GPIO_PIN_CTRL + 2, BIT(7)); 375*1a754578SBitterblue Smith 376*1a754578SBitterblue Smith /* 3.2 set 0x44[15] to 1 377*1a754578SBitterblue Smith * output high value; 378*1a754578SBitterblue Smith */ 379*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_GPIO_PIN_CTRL + 1, BIT(7)); 380*1a754578SBitterblue Smith } 381*1a754578SBitterblue Smith 382*1a754578SBitterblue Smith static int rtw8814a_mac_init(struct rtw_dev *rtwdev) 383*1a754578SBitterblue Smith { 384*1a754578SBitterblue Smith struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); 385*1a754578SBitterblue Smith 386*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_CR, 387*1a754578SBitterblue Smith MAC_TRX_ENABLE | BIT_MAC_SEC_EN | BIT_32K_CAL_TMR_EN); 388*1a754578SBitterblue Smith 389*1a754578SBitterblue Smith rtw_load_table(rtwdev, rtwdev->chip->mac_tbl); 390*1a754578SBitterblue Smith 391*1a754578SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) 392*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_AUTO_LLT_V1 + 3, 393*1a754578SBitterblue Smith rtwdev->chip->usb_tx_agg_desc_num << 1); 394*1a754578SBitterblue Smith 395*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_HIMR0, 0); 396*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_HIMR1, 0); 397*1a754578SBitterblue Smith 398*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RRSR, 0xfffff, 0xfffff); 399*1a754578SBitterblue Smith 400*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_RETRY_LIMIT, 0x3030); 401*1a754578SBitterblue Smith 402*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_RXFLTMAP0, 0xffff); 403*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_RXFLTMAP1, 0x0400); 404*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_RXFLTMAP2, 0xffff); 405*1a754578SBitterblue Smith 406*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_MAX_AGGR_NUM, 0x36); 407*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_MAX_AGGR_NUM + 1, 0x36); 408*1a754578SBitterblue Smith 409*1a754578SBitterblue Smith /* Set Spec SIFS (used in NAV) */ 410*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_SPEC_SIFS, 0x100a); 411*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_MAC_SPEC_SIFS, 0x100a); 412*1a754578SBitterblue Smith 413*1a754578SBitterblue Smith /* Set SIFS for CCK */ 414*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_SIFS, 0x100a); 415*1a754578SBitterblue Smith 416*1a754578SBitterblue Smith /* Set SIFS for OFDM */ 417*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_SIFS + 2, 0x100a); 418*1a754578SBitterblue Smith 419*1a754578SBitterblue Smith /* TXOP */ 420*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_EDCA_BE_PARAM, 0x005EA42B); 421*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_EDCA_BK_PARAM, 0x0000A44F); 422*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_EDCA_VI_PARAM, 0x005EA324); 423*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_EDCA_VO_PARAM, 0x002FA226); 424*1a754578SBitterblue Smith 425*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_FWHW_TXQ_CTRL, BIT(7)); 426*1a754578SBitterblue Smith 427*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_ACKTO, 0x80); 428*1a754578SBitterblue Smith 429*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_BCN_CTRL, 430*1a754578SBitterblue Smith BIT_DIS_TSF_UDT | (BIT_DIS_TSF_UDT << 8)); 431*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TBTT_PROHIBIT, 0xfffff, WLAN_TBTT_TIME); 432*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_DRVERLYINT, 0x05); 433*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_BCNDMATIM, WLAN_BCN_DMA_TIME); 434*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_BCNTCFG, 0x4413); 435*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_BCN_MAX_ERR, 0xFF); 436*1a754578SBitterblue Smith 437*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_FAST_EDCA_VOVI_SETTING, 0x08070807); 438*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_FAST_EDCA_BEBK_SETTING, 0x08070807); 439*1a754578SBitterblue Smith 440*1a754578SBitterblue Smith if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB && 441*1a754578SBitterblue Smith rtwusb->udev->speed == USB_SPEED_SUPER) { 442*1a754578SBitterblue Smith /* Disable U1/U2 Mode to avoid 2.5G spur in USB3.0. */ 443*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_USB_MOD, BIT(4) | BIT(3)); 444*1a754578SBitterblue Smith /* To avoid usb 3.0 H2C fail. */ 445*1a754578SBitterblue Smith rtw_write16(rtwdev, 0xf002, 0); 446*1a754578SBitterblue Smith 447*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_SW_AMPDU_BURST_MODE_CTRL, 448*1a754578SBitterblue Smith BIT_PRE_TX_CMD); 449*1a754578SBitterblue Smith } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE) { 450*1a754578SBitterblue Smith rtw8814ae_enable_rf_1_2v(rtwdev); 451*1a754578SBitterblue Smith 452*1a754578SBitterblue Smith /* Force the antenna b to wifi. */ 453*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_PAD_CTRL1, BIT(2)); 454*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_PAD_CTRL1 + 1, BIT(0)); 455*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_LED_CFG + 3, 456*1a754578SBitterblue Smith (BIT(27) | BIT_DPDT_WL_SEL) >> 24); 457*1a754578SBitterblue Smith } 458*1a754578SBitterblue Smith 459*1a754578SBitterblue Smith return 0; 460*1a754578SBitterblue Smith } 461*1a754578SBitterblue Smith 462*1a754578SBitterblue Smith static void rtw8814a_set_rfe_reg_24g(struct rtw_dev *rtwdev) 463*1a754578SBitterblue Smith { 464*1a754578SBitterblue Smith switch (rtwdev->efuse.rfe_option) { 465*1a754578SBitterblue Smith case 2: 466*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x72707270); 467*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x72707270); 468*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x72707270); 469*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77707770); 470*1a754578SBitterblue Smith 471*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, 472*1a754578SBitterblue Smith BIT_RFE_SELSW0_D, 0x72); 473*1a754578SBitterblue Smith 474*1a754578SBitterblue Smith break; 475*1a754578SBitterblue Smith case 1: 476*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777); 477*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777); 478*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x77777777); 479*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77777777); 480*1a754578SBitterblue Smith 481*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, 482*1a754578SBitterblue Smith BIT_RFE_SELSW0_D, 0x77); 483*1a754578SBitterblue Smith 484*1a754578SBitterblue Smith break; 485*1a754578SBitterblue Smith case 0: 486*1a754578SBitterblue Smith default: 487*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777); 488*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777); 489*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x77777777); 490*1a754578SBitterblue Smith /* Is it not necessary to set REG_RFE_PINMUX_D ? */ 491*1a754578SBitterblue Smith 492*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, 493*1a754578SBitterblue Smith BIT_RFE_SELSW0_D, 0x77); 494*1a754578SBitterblue Smith 495*1a754578SBitterblue Smith break; 496*1a754578SBitterblue Smith } 497*1a754578SBitterblue Smith } 498*1a754578SBitterblue Smith 499*1a754578SBitterblue Smith static void rtw8814a_set_rfe_reg_5g(struct rtw_dev *rtwdev) 500*1a754578SBitterblue Smith { 501*1a754578SBitterblue Smith switch (rtwdev->efuse.rfe_option) { 502*1a754578SBitterblue Smith case 2: 503*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x37173717); 504*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x37173717); 505*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x37173717); 506*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77177717); 507*1a754578SBitterblue Smith 508*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, 509*1a754578SBitterblue Smith BIT_RFE_SELSW0_D, 0x37); 510*1a754578SBitterblue Smith 511*1a754578SBitterblue Smith break; 512*1a754578SBitterblue Smith case 1: 513*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x33173317); 514*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x33173317); 515*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x33173317); 516*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77177717); 517*1a754578SBitterblue Smith 518*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, 519*1a754578SBitterblue Smith BIT_RFE_SELSW0_D, 0x33); 520*1a754578SBitterblue Smith 521*1a754578SBitterblue Smith break; 522*1a754578SBitterblue Smith case 0: 523*1a754578SBitterblue Smith default: 524*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x54775477); 525*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x54775477); 526*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x54775477); 527*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x54775477); 528*1a754578SBitterblue Smith 529*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, 530*1a754578SBitterblue Smith BIT_RFE_SELSW0_D, 0x54); 531*1a754578SBitterblue Smith 532*1a754578SBitterblue Smith break; 533*1a754578SBitterblue Smith } 534*1a754578SBitterblue Smith } 535*1a754578SBitterblue Smith 536*1a754578SBitterblue Smith static void rtw8814a_set_channel_bb_swing(struct rtw_dev *rtwdev, u8 band) 537*1a754578SBitterblue Smith { 538*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXSCALE_A, BB_SWING_MASK, 539*1a754578SBitterblue Smith rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_A)); 540*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXSCALE_B, BB_SWING_MASK, 541*1a754578SBitterblue Smith rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_B)); 542*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXSCALE_C, BB_SWING_MASK, 543*1a754578SBitterblue Smith rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_C)); 544*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXSCALE_D, BB_SWING_MASK, 545*1a754578SBitterblue Smith rtw8814a_get_bb_swing(rtwdev, band, RF_PATH_D)); 546*1a754578SBitterblue Smith rtw8814a_pwrtrack_init(rtwdev); 547*1a754578SBitterblue Smith } 548*1a754578SBitterblue Smith 549*1a754578SBitterblue Smith static void rtw8814a_set_bw_reg_adc(struct rtw_dev *rtwdev, u8 bw) 550*1a754578SBitterblue Smith { 551*1a754578SBitterblue Smith u32 adc = 0; 552*1a754578SBitterblue Smith 553*1a754578SBitterblue Smith if (bw == RTW_CHANNEL_WIDTH_20) 554*1a754578SBitterblue Smith adc = 0; 555*1a754578SBitterblue Smith else if (bw == RTW_CHANNEL_WIDTH_40) 556*1a754578SBitterblue Smith adc = 1; 557*1a754578SBitterblue Smith else if (bw == RTW_CHANNEL_WIDTH_80) 558*1a754578SBitterblue Smith adc = 2; 559*1a754578SBitterblue Smith 560*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_ADCCLK, BIT(1) | BIT(0), adc); 561*1a754578SBitterblue Smith } 562*1a754578SBitterblue Smith 563*1a754578SBitterblue Smith static void rtw8814a_set_bw_reg_agc(struct rtw_dev *rtwdev, u8 new_band, u8 bw) 564*1a754578SBitterblue Smith { 565*1a754578SBitterblue Smith u32 agc = 7; 566*1a754578SBitterblue Smith 567*1a754578SBitterblue Smith if (bw == RTW_CHANNEL_WIDTH_20) { 568*1a754578SBitterblue Smith agc = 6; 569*1a754578SBitterblue Smith } else if (bw == RTW_CHANNEL_WIDTH_40) { 570*1a754578SBitterblue Smith if (new_band == RTW_BAND_5G) 571*1a754578SBitterblue Smith agc = 8; 572*1a754578SBitterblue Smith else 573*1a754578SBitterblue Smith agc = 7; 574*1a754578SBitterblue Smith } else if (bw == RTW_CHANNEL_WIDTH_80) { 575*1a754578SBitterblue Smith agc = 3; 576*1a754578SBitterblue Smith } 577*1a754578SBitterblue Smith 578*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCASEL, 0xf000, agc); 579*1a754578SBitterblue Smith } 580*1a754578SBitterblue Smith 581*1a754578SBitterblue Smith static void rtw8814a_switch_band(struct rtw_dev *rtwdev, u8 new_band, u8 bw) 582*1a754578SBitterblue Smith { 583*1a754578SBitterblue Smith /* Clear 0x1000[16], When this bit is set to 0, CCK and OFDM 584*1a754578SBitterblue Smith * are disabled, and clock are gated. Otherwise, CCK and OFDM 585*1a754578SBitterblue Smith * are enabled. 586*1a754578SBitterblue Smith */ 587*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_SYS_CFG3_8814A + 2, BIT_FEN_BB_RSTB); 588*1a754578SBitterblue Smith 589*1a754578SBitterblue Smith if (new_band == RTW_BAND_2G) { 590*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 0); 591*1a754578SBitterblue Smith 592*1a754578SBitterblue Smith rtw8814a_set_rfe_reg_24g(rtwdev); 593*1a754578SBitterblue Smith 594*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXPSEL, 0xf0, 0x2); 595*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0x5); 596*1a754578SBitterblue Smith 597*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST, 0x3); 598*1a754578SBitterblue Smith 599*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_CCK_CHECK, 0); 600*1a754578SBitterblue Smith 601*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, 0xa80, BIT(18), 0); 602*1a754578SBitterblue Smith } else { 603*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_CCK_CHECK, BIT_CHECK_CCK_EN); 604*1a754578SBitterblue Smith 605*1a754578SBitterblue Smith /* Enable CCK Tx function, even when CCK is off */ 606*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, 0xa80, BIT(18), 1); 607*1a754578SBitterblue Smith 608*1a754578SBitterblue Smith rtw8814a_set_rfe_reg_5g(rtwdev); 609*1a754578SBitterblue Smith 610*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXPSEL, 0xf0, 0x0); 611*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RX, 0x0f000000, 0xf); 612*1a754578SBitterblue Smith 613*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RXPSEL, BIT_RX_PSEL_RST, 0x2); 614*1a754578SBitterblue Smith } 615*1a754578SBitterblue Smith 616*1a754578SBitterblue Smith rtw8814a_set_channel_bb_swing(rtwdev, new_band); 617*1a754578SBitterblue Smith 618*1a754578SBitterblue Smith rtw8814a_set_bw_reg_adc(rtwdev, bw); 619*1a754578SBitterblue Smith rtw8814a_set_bw_reg_agc(rtwdev, new_band, bw); 620*1a754578SBitterblue Smith 621*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_SYS_CFG3_8814A + 2, BIT_FEN_BB_RSTB); 622*1a754578SBitterblue Smith } 623*1a754578SBitterblue Smith 624*1a754578SBitterblue Smith static void rtw8814a_switch_channel(struct rtw_dev *rtwdev, u8 channel) 625*1a754578SBitterblue Smith { 626*1a754578SBitterblue Smith struct rtw_hal *hal = &rtwdev->hal; 627*1a754578SBitterblue Smith u32 fc_area, rf_mod_ag, cfgch; 628*1a754578SBitterblue Smith u8 path; 629*1a754578SBitterblue Smith 630*1a754578SBitterblue Smith switch (channel) { 631*1a754578SBitterblue Smith case 36 ... 48: 632*1a754578SBitterblue Smith fc_area = 0x494; 633*1a754578SBitterblue Smith break; 634*1a754578SBitterblue Smith case 50 ... 64: 635*1a754578SBitterblue Smith fc_area = 0x453; 636*1a754578SBitterblue Smith break; 637*1a754578SBitterblue Smith case 100 ... 116: 638*1a754578SBitterblue Smith fc_area = 0x452; 639*1a754578SBitterblue Smith break; 640*1a754578SBitterblue Smith default: 641*1a754578SBitterblue Smith if (channel >= 118) 642*1a754578SBitterblue Smith fc_area = 0x412; 643*1a754578SBitterblue Smith else 644*1a754578SBitterblue Smith fc_area = 0x96a; 645*1a754578SBitterblue Smith break; 646*1a754578SBitterblue Smith } 647*1a754578SBitterblue Smith 648*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, fc_area); 649*1a754578SBitterblue Smith 650*1a754578SBitterblue Smith for (path = 0; path < hal->rf_path_num; path++) { 651*1a754578SBitterblue Smith switch (channel) { 652*1a754578SBitterblue Smith case 36 ... 64: 653*1a754578SBitterblue Smith rf_mod_ag = 0x101; 654*1a754578SBitterblue Smith break; 655*1a754578SBitterblue Smith case 100 ... 140: 656*1a754578SBitterblue Smith rf_mod_ag = 0x301; 657*1a754578SBitterblue Smith break; 658*1a754578SBitterblue Smith default: 659*1a754578SBitterblue Smith if (channel > 140) 660*1a754578SBitterblue Smith rf_mod_ag = 0x501; 661*1a754578SBitterblue Smith else 662*1a754578SBitterblue Smith rf_mod_ag = 0x000; 663*1a754578SBitterblue Smith break; 664*1a754578SBitterblue Smith } 665*1a754578SBitterblue Smith 666*1a754578SBitterblue Smith cfgch = (rf_mod_ag << 8) | channel; 667*1a754578SBitterblue Smith 668*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_CFGCH, 669*1a754578SBitterblue Smith RF18_RFSI_MASK | RF18_BAND_MASK | RF18_CHANNEL_MASK, cfgch); 670*1a754578SBitterblue Smith } 671*1a754578SBitterblue Smith 672*1a754578SBitterblue Smith switch (channel) { 673*1a754578SBitterblue Smith case 36 ... 64: 674*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 1); 675*1a754578SBitterblue Smith break; 676*1a754578SBitterblue Smith case 100 ... 144: 677*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 2); 678*1a754578SBitterblue Smith break; 679*1a754578SBitterblue Smith default: 680*1a754578SBitterblue Smith if (channel >= 149) 681*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_AGC_TABLE, 0x1f, 3); 682*1a754578SBitterblue Smith 683*1a754578SBitterblue Smith break; 684*1a754578SBitterblue Smith } 685*1a754578SBitterblue Smith } 686*1a754578SBitterblue Smith 687*1a754578SBitterblue Smith static void rtw8814a_24g_cck_tx_dfir(struct rtw_dev *rtwdev, u8 channel) 688*1a754578SBitterblue Smith { 689*1a754578SBitterblue Smith if (channel >= 1 && channel <= 11) { 690*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_TX_FILTER1, 0x1a1b0030); 691*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_TX_FILTER2, 0x090e1317); 692*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_DEBUG_PORT, 0x00000204); 693*1a754578SBitterblue Smith } else if (channel >= 12 && channel <= 13) { 694*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_TX_FILTER1, 0x1a1b0030); 695*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_TX_FILTER2, 0x090e1217); 696*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_DEBUG_PORT, 0x00000305); 697*1a754578SBitterblue Smith } else if (channel == 14) { 698*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_TX_FILTER1, 0x1a1b0030); 699*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_TX_FILTER2, 0x00000E17); 700*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCK0_DEBUG_PORT, 0x00000000); 701*1a754578SBitterblue Smith } 702*1a754578SBitterblue Smith } 703*1a754578SBitterblue Smith 704*1a754578SBitterblue Smith static void rtw8814a_set_bw_reg_mac(struct rtw_dev *rtwdev, u8 bw) 705*1a754578SBitterblue Smith { 706*1a754578SBitterblue Smith u16 val16 = rtw_read16(rtwdev, REG_WMAC_TRXPTCL_CTL); 707*1a754578SBitterblue Smith 708*1a754578SBitterblue Smith val16 &= ~BIT_RFMOD; 709*1a754578SBitterblue Smith if (bw == RTW_CHANNEL_WIDTH_80) 710*1a754578SBitterblue Smith val16 |= BIT_RFMOD_80M; 711*1a754578SBitterblue Smith else if (bw == RTW_CHANNEL_WIDTH_40) 712*1a754578SBitterblue Smith val16 |= BIT_RFMOD_40M; 713*1a754578SBitterblue Smith 714*1a754578SBitterblue Smith rtw_write16(rtwdev, REG_WMAC_TRXPTCL_CTL, val16); 715*1a754578SBitterblue Smith } 716*1a754578SBitterblue Smith 717*1a754578SBitterblue Smith static void rtw8814a_set_bw_rf(struct rtw_dev *rtwdev, u8 bw) 718*1a754578SBitterblue Smith { 719*1a754578SBitterblue Smith u8 path; 720*1a754578SBitterblue Smith 721*1a754578SBitterblue Smith for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) { 722*1a754578SBitterblue Smith switch (bw) { 723*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_5: 724*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_10: 725*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_20: 726*1a754578SBitterblue Smith default: 727*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 3); 728*1a754578SBitterblue Smith break; 729*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_40: 730*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 1); 731*1a754578SBitterblue Smith break; 732*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_80: 733*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_CFGCH, RF18_BW_MASK, 0); 734*1a754578SBitterblue Smith break; 735*1a754578SBitterblue Smith } 736*1a754578SBitterblue Smith } 737*1a754578SBitterblue Smith } 738*1a754578SBitterblue Smith 739*1a754578SBitterblue Smith static void rtw8814a_adc_clk(struct rtw_dev *rtwdev) 740*1a754578SBitterblue Smith { 741*1a754578SBitterblue Smith static const u32 rxiqc_reg[2][4] = { 742*1a754578SBitterblue Smith { REG_RX_IQC_AB_A, REG_RX_IQC_AB_B, 743*1a754578SBitterblue Smith REG_RX_IQC_AB_C, REG_RX_IQC_AB_D }, 744*1a754578SBitterblue Smith { REG_RX_IQC_CD_A, REG_RX_IQC_CD_B, 745*1a754578SBitterblue Smith REG_RX_IQC_CD_C, REG_RX_IQC_CD_D } 746*1a754578SBitterblue Smith }; 747*1a754578SBitterblue Smith u32 bb_reg_8fc, bb_reg_808, rxiqc[4]; 748*1a754578SBitterblue Smith u32 i = 0, mac_active = 1; 749*1a754578SBitterblue Smith u8 mac_reg_522; 750*1a754578SBitterblue Smith 751*1a754578SBitterblue Smith if (rtwdev->hal.cut_version != RTW_CHIP_VER_CUT_A) 752*1a754578SBitterblue Smith return; 753*1a754578SBitterblue Smith 754*1a754578SBitterblue Smith /* 1 Step1. MAC TX pause */ 755*1a754578SBitterblue Smith mac_reg_522 = rtw_read8(rtwdev, REG_TXPAUSE); 756*1a754578SBitterblue Smith bb_reg_8fc = rtw_read32(rtwdev, REG_DBGSEL); 757*1a754578SBitterblue Smith bb_reg_808 = rtw_read32(rtwdev, REG_RXPSEL); 758*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_TXPAUSE, 0x3f); 759*1a754578SBitterblue Smith 760*1a754578SBitterblue Smith /* 1 Step 2. Backup rxiqc & rxiqc = 0 */ 761*1a754578SBitterblue Smith for (i = 0; i < 4; i++) { 762*1a754578SBitterblue Smith rxiqc[i] = rtw_read32(rtwdev, rxiqc_reg[0][i]); 763*1a754578SBitterblue Smith rtw_write32(rtwdev, rxiqc_reg[0][i], 0x0); 764*1a754578SBitterblue Smith rtw_write32(rtwdev, rxiqc_reg[1][i], 0x0); 765*1a754578SBitterblue Smith } 766*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_PRECTRL, BIT_IQ_WGT, 0x3); 767*1a754578SBitterblue Smith i = 0; 768*1a754578SBitterblue Smith 769*1a754578SBitterblue Smith /* 1 Step 3. Monitor MAC IDLE */ 770*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_DBGSEL, 0x0); 771*1a754578SBitterblue Smith while (mac_active) { 772*1a754578SBitterblue Smith mac_active = rtw_read32(rtwdev, REG_DBGRPT) & 0x803e0008; 773*1a754578SBitterblue Smith i++; 774*1a754578SBitterblue Smith if (i > 1000) 775*1a754578SBitterblue Smith break; 776*1a754578SBitterblue Smith } 777*1a754578SBitterblue Smith 778*1a754578SBitterblue Smith /* 1 Step 4. ADC clk flow */ 779*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_RXPSEL, 0x11); 780*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_DAC_RSTB, BIT(13), 0x1); 781*1a754578SBitterblue Smith rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2) | BIT(1), 0x3); 782*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x1); 783*1a754578SBitterblue Smith 784*1a754578SBitterblue Smith /* 0xc1c/0xe1c/0x181c/0x1a1c[4] must=1 to ensure table can be 785*1a754578SBitterblue Smith * written when bbrstb=0 786*1a754578SBitterblue Smith * 0xc60/0xe60/0x1860/0x1a60[15] always = 1 after this line 787*1a754578SBitterblue Smith * 0xc60/0xe60/0x1860/0x1a60[14] always = 0 bcz its error in A-cut 788*1a754578SBitterblue Smith */ 789*1a754578SBitterblue Smith 790*1a754578SBitterblue Smith /* power_off/clk_off @ anapar_state=idle mode */ 791*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x15800002); 792*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x01808003); 793*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x15800002); 794*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x01808003); 795*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x15800002); 796*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x01808003); 797*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x15800002); 798*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x01808003); 799*1a754578SBitterblue Smith 800*1a754578SBitterblue Smith rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2), 0x0); 801*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x0); 802*1a754578SBitterblue Smith /* [19] = 1 to turn off ADC */ 803*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHA, 0x0D080058); 804*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHB, 0x0D080058); 805*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHC, 0x0D080058); 806*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHD, 0x0D080058); 807*1a754578SBitterblue Smith 808*1a754578SBitterblue Smith /* power_on/clk_off */ 809*1a754578SBitterblue Smith /* [19] = 0 to turn on ADC */ 810*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHA, 0x0D000058); 811*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHB, 0x0D000058); 812*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHC, 0x0D000058); 813*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CK_MONHD, 0x0D000058); 814*1a754578SBitterblue Smith 815*1a754578SBitterblue Smith /* power_on/clk_on @ anapar_state=BT mode */ 816*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x05808032); 817*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x05808032); 818*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x05808032); 819*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x05808032); 820*1a754578SBitterblue Smith rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2), 0x1); 821*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x1); 822*1a754578SBitterblue Smith 823*1a754578SBitterblue Smith /* recover original setting @ anapar_state=BT mode */ 824*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x05808032); 825*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x05808032); 826*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x05808032); 827*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x05808032); 828*1a754578SBitterblue Smith 829*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x05800002); 830*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x07808003); 831*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x05800002); 832*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x07808003); 833*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x05800002); 834*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x07808003); 835*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x05800002); 836*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x07808003); 837*1a754578SBitterblue Smith 838*1a754578SBitterblue Smith rtw_write8_mask(rtwdev, REG_GNT_BT, BIT(2) | BIT(1), 0x0); 839*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCK_RPT_FORMAT, BIT(2), 0x0); 840*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_DAC_RSTB, BIT(13), 0x0); 841*1a754578SBitterblue Smith 842*1a754578SBitterblue Smith /* 1 Step 5. Recover MAC TX & IQC */ 843*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_TXPAUSE, mac_reg_522); 844*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_DBGSEL, bb_reg_8fc); 845*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RXPSEL, bb_reg_808); 846*1a754578SBitterblue Smith for (i = 0; i < 4; i++) { 847*1a754578SBitterblue Smith rtw_write32(rtwdev, rxiqc_reg[0][i], rxiqc[i]); 848*1a754578SBitterblue Smith rtw_write32(rtwdev, rxiqc_reg[1][i], 0x01000000); 849*1a754578SBitterblue Smith } 850*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_PRECTRL, BIT_IQ_WGT, 0x0); 851*1a754578SBitterblue Smith } 852*1a754578SBitterblue Smith 853*1a754578SBitterblue Smith static void rtw8814a_spur_calibration_ch140(struct rtw_dev *rtwdev, u8 channel) 854*1a754578SBitterblue Smith { 855*1a754578SBitterblue Smith struct rtw_hal *hal = &rtwdev->hal; 856*1a754578SBitterblue Smith 857*1a754578SBitterblue Smith /* Add for 8814AE module ch140 MP Rx */ 858*1a754578SBitterblue Smith if (channel == 140) { 859*1a754578SBitterblue Smith if (hal->ch_param[0] == 0) 860*1a754578SBitterblue Smith hal->ch_param[0] = rtw_read32(rtwdev, REG_CCASEL); 861*1a754578SBitterblue Smith if (hal->ch_param[1] == 0) 862*1a754578SBitterblue Smith hal->ch_param[1] = rtw_read32(rtwdev, REG_PDMFTH); 863*1a754578SBitterblue Smith 864*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCASEL, 0x75438170); 865*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_PDMFTH, 0x79a18a0a); 866*1a754578SBitterblue Smith } else { 867*1a754578SBitterblue Smith if (rtw_read32(rtwdev, REG_CCASEL) == 0x75438170 && 868*1a754578SBitterblue Smith hal->ch_param[0] != 0) 869*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CCASEL, hal->ch_param[0]); 870*1a754578SBitterblue Smith 871*1a754578SBitterblue Smith if (rtw_read32(rtwdev, REG_PDMFTH) == 0x79a18a0a && 872*1a754578SBitterblue Smith hal->ch_param[1] != 0) 873*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_PDMFTH, hal->ch_param[1]); 874*1a754578SBitterblue Smith 875*1a754578SBitterblue Smith hal->ch_param[0] = rtw_read32(rtwdev, REG_CCASEL); 876*1a754578SBitterblue Smith hal->ch_param[1] = rtw_read32(rtwdev, REG_PDMFTH); 877*1a754578SBitterblue Smith } 878*1a754578SBitterblue Smith } 879*1a754578SBitterblue Smith 880*1a754578SBitterblue Smith static void rtw8814a_set_nbi_reg(struct rtw_dev *rtwdev, u32 tone_idx) 881*1a754578SBitterblue Smith { 882*1a754578SBitterblue Smith /* tone_idx X 10 */ 883*1a754578SBitterblue Smith static const u32 nbi_128[] = { 884*1a754578SBitterblue Smith 25, 55, 85, 115, 135, 885*1a754578SBitterblue Smith 155, 185, 205, 225, 245, 886*1a754578SBitterblue Smith 265, 285, 305, 335, 355, 887*1a754578SBitterblue Smith 375, 395, 415, 435, 455, 888*1a754578SBitterblue Smith 485, 505, 525, 555, 585, 615, 635 889*1a754578SBitterblue Smith }; 890*1a754578SBitterblue Smith u32 reg_idx = 0; 891*1a754578SBitterblue Smith u32 i; 892*1a754578SBitterblue Smith 893*1a754578SBitterblue Smith for (i = 0; i < ARRAY_SIZE(nbi_128); i++) { 894*1a754578SBitterblue Smith if (tone_idx < nbi_128[i]) { 895*1a754578SBitterblue Smith reg_idx = i + 1; 896*1a754578SBitterblue Smith break; 897*1a754578SBitterblue Smith } 898*1a754578SBitterblue Smith } 899*1a754578SBitterblue Smith 900*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 0xfc000, reg_idx); 901*1a754578SBitterblue Smith } 902*1a754578SBitterblue Smith 903*1a754578SBitterblue Smith static void rtw8814a_nbi_setting(struct rtw_dev *rtwdev, u32 ch, u32 f_intf) 904*1a754578SBitterblue Smith { 905*1a754578SBitterblue Smith u32 fc, int_distance, tone_idx; 906*1a754578SBitterblue Smith 907*1a754578SBitterblue Smith fc = 2412 + (ch - 1) * 5; 908*1a754578SBitterblue Smith int_distance = abs_diff(fc, f_intf); 909*1a754578SBitterblue Smith 910*1a754578SBitterblue Smith /* 10 * (int_distance / 0.3125) */ 911*1a754578SBitterblue Smith tone_idx = int_distance << 5; 912*1a754578SBitterblue Smith 913*1a754578SBitterblue Smith rtw8814a_set_nbi_reg(rtwdev, tone_idx); 914*1a754578SBitterblue Smith 915*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, BIT_NBI_ENABLE, 1); 916*1a754578SBitterblue Smith } 917*1a754578SBitterblue Smith 918*1a754578SBitterblue Smith static void rtw8814a_spur_nbi_setting(struct rtw_dev *rtwdev) 919*1a754578SBitterblue Smith { 920*1a754578SBitterblue Smith u8 primary_channel = rtwdev->hal.primary_channel; 921*1a754578SBitterblue Smith u8 rfe_type = rtwdev->efuse.rfe_option; 922*1a754578SBitterblue Smith 923*1a754578SBitterblue Smith if (rfe_type != 0 && rfe_type != 1 && rfe_type != 6 && rfe_type != 7) 924*1a754578SBitterblue Smith return; 925*1a754578SBitterblue Smith 926*1a754578SBitterblue Smith if (primary_channel == 14) 927*1a754578SBitterblue Smith rtw8814a_nbi_setting(rtwdev, primary_channel, 2480); 928*1a754578SBitterblue Smith else if (primary_channel >= 4 && primary_channel <= 8) 929*1a754578SBitterblue Smith rtw8814a_nbi_setting(rtwdev, primary_channel, 2440); 930*1a754578SBitterblue Smith else 931*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, BIT_NBI_ENABLE, 0); 932*1a754578SBitterblue Smith } 933*1a754578SBitterblue Smith 934*1a754578SBitterblue Smith /* A workaround to eliminate the 5280 MHz & 5600 MHz & 5760 MHz spur of 8814A */ 935*1a754578SBitterblue Smith static void rtw8814a_spur_calibration(struct rtw_dev *rtwdev, u8 channel, u8 bw) 936*1a754578SBitterblue Smith { 937*1a754578SBitterblue Smith u8 rfe_type = rtwdev->efuse.rfe_option; 938*1a754578SBitterblue Smith bool reset_nbi_csi = true; 939*1a754578SBitterblue Smith 940*1a754578SBitterblue Smith if (rfe_type == 0) { 941*1a754578SBitterblue Smith switch (bw) { 942*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_40: 943*1a754578SBitterblue Smith if (channel == 54 || channel == 118) { 944*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 945*1a754578SBitterblue Smith 0x000fe000, 0x3e >> 1); 946*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 947*1a754578SBitterblue Smith BIT(0), 1); 948*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0); 949*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK1, 950*1a754578SBitterblue Smith BIT(0), 1); 951*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0); 952*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0); 953*1a754578SBitterblue Smith 954*1a754578SBitterblue Smith reset_nbi_csi = false; 955*1a754578SBitterblue Smith } else if (channel == 151) { 956*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 957*1a754578SBitterblue Smith 0x000fe000, 0x1e >> 1); 958*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 959*1a754578SBitterblue Smith BIT(0), 1); 960*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK0, 961*1a754578SBitterblue Smith BIT(16), 1); 962*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 963*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0); 964*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0); 965*1a754578SBitterblue Smith 966*1a754578SBitterblue Smith reset_nbi_csi = false; 967*1a754578SBitterblue Smith } 968*1a754578SBitterblue Smith break; 969*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_80: 970*1a754578SBitterblue Smith if (channel == 58 || channel == 122) { 971*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 972*1a754578SBitterblue Smith 0x000fe000, 0x3a >> 1); 973*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 974*1a754578SBitterblue Smith BIT(0), 1); 975*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0); 976*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 977*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0); 978*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK7, 979*1a754578SBitterblue Smith BIT(0), 1); 980*1a754578SBitterblue Smith 981*1a754578SBitterblue Smith reset_nbi_csi = false; 982*1a754578SBitterblue Smith } else if (channel == 155) { 983*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 984*1a754578SBitterblue Smith 0x000fe000, 0x5a >> 1); 985*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 986*1a754578SBitterblue Smith BIT(0), 1); 987*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0); 988*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 989*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK6, 990*1a754578SBitterblue Smith BIT(16), 1); 991*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0); 992*1a754578SBitterblue Smith 993*1a754578SBitterblue Smith reset_nbi_csi = false; 994*1a754578SBitterblue Smith } 995*1a754578SBitterblue Smith break; 996*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_20: 997*1a754578SBitterblue Smith if (channel == 153) { 998*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 999*1a754578SBitterblue Smith 0x000fe000, 0x1e >> 1); 1000*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 1001*1a754578SBitterblue Smith BIT(0), 1); 1002*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0); 1003*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 1004*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0); 1005*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK7, 1006*1a754578SBitterblue Smith BIT(16), 1); 1007*1a754578SBitterblue Smith 1008*1a754578SBitterblue Smith reset_nbi_csi = false; 1009*1a754578SBitterblue Smith } 1010*1a754578SBitterblue Smith 1011*1a754578SBitterblue Smith rtw8814a_spur_calibration_ch140(rtwdev, channel); 1012*1a754578SBitterblue Smith break; 1013*1a754578SBitterblue Smith default: 1014*1a754578SBitterblue Smith break; 1015*1a754578SBitterblue Smith } 1016*1a754578SBitterblue Smith } else if (rfe_type == 1 || rfe_type == 2) { 1017*1a754578SBitterblue Smith switch (bw) { 1018*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_20: 1019*1a754578SBitterblue Smith if (channel == 153) { 1020*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 1021*1a754578SBitterblue Smith 0x000fe000, 0x1E >> 1); 1022*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 1023*1a754578SBitterblue Smith BIT(0), 1); 1024*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0); 1025*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 1026*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0); 1027*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK7, 1028*1a754578SBitterblue Smith BIT(16), 1); 1029*1a754578SBitterblue Smith 1030*1a754578SBitterblue Smith reset_nbi_csi = false; 1031*1a754578SBitterblue Smith } 1032*1a754578SBitterblue Smith break; 1033*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_40: 1034*1a754578SBitterblue Smith if (channel == 151) { 1035*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 1036*1a754578SBitterblue Smith 0x000fe000, 0x1e >> 1); 1037*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 1038*1a754578SBitterblue Smith BIT(0), 1); 1039*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK0, 1040*1a754578SBitterblue Smith BIT(16), 1); 1041*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 1042*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0); 1043*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0); 1044*1a754578SBitterblue Smith 1045*1a754578SBitterblue Smith reset_nbi_csi = false; 1046*1a754578SBitterblue Smith } 1047*1a754578SBitterblue Smith break; 1048*1a754578SBitterblue Smith case RTW_CHANNEL_WIDTH_80: 1049*1a754578SBitterblue Smith if (channel == 155) { 1050*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 1051*1a754578SBitterblue Smith 0x000fe000, 0x5a >> 1); 1052*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, 1053*1a754578SBitterblue Smith BIT(0), 1); 1054*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0); 1055*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 1056*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_FIX_MASK6, 1057*1a754578SBitterblue Smith BIT(16), 1); 1058*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0); 1059*1a754578SBitterblue Smith 1060*1a754578SBitterblue Smith reset_nbi_csi = false; 1061*1a754578SBitterblue Smith } 1062*1a754578SBitterblue Smith break; 1063*1a754578SBitterblue Smith default: 1064*1a754578SBitterblue Smith break; 1065*1a754578SBitterblue Smith } 1066*1a754578SBitterblue Smith } 1067*1a754578SBitterblue Smith 1068*1a754578SBitterblue Smith if (reset_nbi_csi) { 1069*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_NBI_SETTING, 1070*1a754578SBitterblue Smith 0x000fe000, 0xfc >> 1); 1071*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CSI_MASK_SETTING1, BIT(0), 0); 1072*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK0, 0); 1073*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK1, 0); 1074*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK6, 0); 1075*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_CSI_FIX_MASK7, 0); 1076*1a754578SBitterblue Smith } 1077*1a754578SBitterblue Smith 1078*1a754578SBitterblue Smith rtw8814a_spur_nbi_setting(rtwdev); 1079*1a754578SBitterblue Smith } 1080*1a754578SBitterblue Smith 1081*1a754578SBitterblue Smith static void rtw8814a_set_bw_mode(struct rtw_dev *rtwdev, u8 new_band, 1082*1a754578SBitterblue Smith u8 channel, u8 bw, u8 primary_chan_idx) 1083*1a754578SBitterblue Smith { 1084*1a754578SBitterblue Smith u8 txsc40 = 0, txsc20, txsc; 1085*1a754578SBitterblue Smith 1086*1a754578SBitterblue Smith rtw8814a_set_bw_reg_mac(rtwdev, bw); 1087*1a754578SBitterblue Smith 1088*1a754578SBitterblue Smith txsc20 = primary_chan_idx; 1089*1a754578SBitterblue Smith if (bw == RTW_CHANNEL_WIDTH_80) { 1090*1a754578SBitterblue Smith if (txsc20 == RTW_SC_20_UPPER || txsc20 == RTW_SC_20_UPMOST) 1091*1a754578SBitterblue Smith txsc40 = RTW_SC_40_UPPER; 1092*1a754578SBitterblue Smith else 1093*1a754578SBitterblue Smith txsc40 = RTW_SC_40_LOWER; 1094*1a754578SBitterblue Smith } 1095*1a754578SBitterblue Smith 1096*1a754578SBitterblue Smith txsc = BIT_TXSC_20M(txsc20) | BIT_TXSC_40M(txsc40); 1097*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_DATA_SC, txsc); 1098*1a754578SBitterblue Smith 1099*1a754578SBitterblue Smith rtw8814a_set_bw_reg_adc(rtwdev, bw); 1100*1a754578SBitterblue Smith rtw8814a_set_bw_reg_agc(rtwdev, new_band, bw); 1101*1a754578SBitterblue Smith 1102*1a754578SBitterblue Smith if (bw == RTW_CHANNEL_WIDTH_80) { 1103*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_ADCCLK, 0x3c, txsc); 1104*1a754578SBitterblue Smith } else if (bw == RTW_CHANNEL_WIDTH_40) { 1105*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_ADCCLK, 0x3c, txsc); 1106*1a754578SBitterblue Smith 1107*1a754578SBitterblue Smith if (txsc == RTW_SC_20_UPPER) 1108*1a754578SBitterblue Smith rtw_write32_set(rtwdev, REG_RXSB, BIT(4)); 1109*1a754578SBitterblue Smith else 1110*1a754578SBitterblue Smith rtw_write32_clr(rtwdev, REG_RXSB, BIT(4)); 1111*1a754578SBitterblue Smith } 1112*1a754578SBitterblue Smith 1113*1a754578SBitterblue Smith rtw8814a_set_bw_rf(rtwdev, bw); 1114*1a754578SBitterblue Smith 1115*1a754578SBitterblue Smith rtw8814a_adc_clk(rtwdev); 1116*1a754578SBitterblue Smith 1117*1a754578SBitterblue Smith rtw8814a_spur_calibration(rtwdev, channel, bw); 1118*1a754578SBitterblue Smith } 1119*1a754578SBitterblue Smith 1120*1a754578SBitterblue Smith static void rtw8814a_set_channel(struct rtw_dev *rtwdev, u8 channel, u8 bw, 1121*1a754578SBitterblue Smith u8 primary_chan_idx) 1122*1a754578SBitterblue Smith { 1123*1a754578SBitterblue Smith u8 old_band, new_band; 1124*1a754578SBitterblue Smith 1125*1a754578SBitterblue Smith if (rtw_read8(rtwdev, REG_CCK_CHECK) & BIT_CHECK_CCK_EN) 1126*1a754578SBitterblue Smith old_band = RTW_BAND_5G; 1127*1a754578SBitterblue Smith else 1128*1a754578SBitterblue Smith old_band = RTW_BAND_2G; 1129*1a754578SBitterblue Smith 1130*1a754578SBitterblue Smith if (channel > 14) 1131*1a754578SBitterblue Smith new_band = RTW_BAND_5G; 1132*1a754578SBitterblue Smith else 1133*1a754578SBitterblue Smith new_band = RTW_BAND_2G; 1134*1a754578SBitterblue Smith 1135*1a754578SBitterblue Smith if (new_band != old_band) 1136*1a754578SBitterblue Smith rtw8814a_switch_band(rtwdev, new_band, bw); 1137*1a754578SBitterblue Smith 1138*1a754578SBitterblue Smith rtw8814a_switch_channel(rtwdev, channel); 1139*1a754578SBitterblue Smith 1140*1a754578SBitterblue Smith rtw8814a_24g_cck_tx_dfir(rtwdev, channel); 1141*1a754578SBitterblue Smith 1142*1a754578SBitterblue Smith rtw8814a_set_bw_mode(rtwdev, new_band, channel, bw, primary_chan_idx); 1143*1a754578SBitterblue Smith } 1144*1a754578SBitterblue Smith 1145*1a754578SBitterblue Smith static s8 rtw8814a_cck_rx_pwr(u8 lna_idx, u8 vga_idx) 1146*1a754578SBitterblue Smith { 1147*1a754578SBitterblue Smith s8 rx_pwr_all = 0; 1148*1a754578SBitterblue Smith 1149*1a754578SBitterblue Smith switch (lna_idx) { 1150*1a754578SBitterblue Smith case 7: 1151*1a754578SBitterblue Smith rx_pwr_all = -38 - 2 * vga_idx; 1152*1a754578SBitterblue Smith break; 1153*1a754578SBitterblue Smith case 5: 1154*1a754578SBitterblue Smith rx_pwr_all = -28 - 2 * vga_idx; 1155*1a754578SBitterblue Smith break; 1156*1a754578SBitterblue Smith case 3: 1157*1a754578SBitterblue Smith rx_pwr_all = -8 - 2 * vga_idx; 1158*1a754578SBitterblue Smith break; 1159*1a754578SBitterblue Smith case 2: 1160*1a754578SBitterblue Smith rx_pwr_all = -1 - 2 * vga_idx; 1161*1a754578SBitterblue Smith break; 1162*1a754578SBitterblue Smith default: 1163*1a754578SBitterblue Smith break; 1164*1a754578SBitterblue Smith } 1165*1a754578SBitterblue Smith 1166*1a754578SBitterblue Smith return rx_pwr_all; 1167*1a754578SBitterblue Smith } 1168*1a754578SBitterblue Smith 1169*1a754578SBitterblue Smith static void rtw8814a_query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status, 1170*1a754578SBitterblue Smith struct rtw_rx_pkt_stat *pkt_stat) 1171*1a754578SBitterblue Smith { 1172*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1173*1a754578SBitterblue Smith struct rtw_jaguar_phy_status_rpt *rpt; 1174*1a754578SBitterblue Smith u8 gain[RTW_RF_PATH_MAX], rssi, i; 1175*1a754578SBitterblue Smith s8 rx_pwr_db, middle1, middle2; 1176*1a754578SBitterblue Smith s8 snr[RTW_RF_PATH_MAX]; 1177*1a754578SBitterblue Smith s8 evm[RTW_RF_PATH_MAX]; 1178*1a754578SBitterblue Smith u8 rfmode, subchannel; 1179*1a754578SBitterblue Smith u8 lna, vga; 1180*1a754578SBitterblue Smith s8 cfo[2]; 1181*1a754578SBitterblue Smith 1182*1a754578SBitterblue Smith rpt = (struct rtw_jaguar_phy_status_rpt *)phy_status; 1183*1a754578SBitterblue Smith 1184*1a754578SBitterblue Smith pkt_stat->bw = RTW_CHANNEL_WIDTH_20; 1185*1a754578SBitterblue Smith 1186*1a754578SBitterblue Smith if (pkt_stat->rate <= DESC_RATE11M) { 1187*1a754578SBitterblue Smith lna = le32_get_bits(rpt->w1, RTW_JGRPHY_W1_AGC_RPT_LNA_IDX); 1188*1a754578SBitterblue Smith vga = le32_get_bits(rpt->w1, RTW_JGRPHY_W1_AGC_RPT_VGA_IDX); 1189*1a754578SBitterblue Smith 1190*1a754578SBitterblue Smith rx_pwr_db = rtw8814a_cck_rx_pwr(lna, vga); 1191*1a754578SBitterblue Smith 1192*1a754578SBitterblue Smith pkt_stat->rx_power[RF_PATH_A] = rx_pwr_db; 1193*1a754578SBitterblue Smith pkt_stat->rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1); 1194*1a754578SBitterblue Smith dm_info->rssi[RF_PATH_A] = pkt_stat->rssi; 1195*1a754578SBitterblue Smith pkt_stat->signal_power = rx_pwr_db; 1196*1a754578SBitterblue Smith } else { /* OFDM rate */ 1197*1a754578SBitterblue Smith gain[RF_PATH_A] = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_GAIN_A); 1198*1a754578SBitterblue Smith gain[RF_PATH_B] = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_GAIN_B); 1199*1a754578SBitterblue Smith gain[RF_PATH_C] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_GAIN_C); 1200*1a754578SBitterblue Smith gain[RF_PATH_D] = le32_get_bits(rpt->w6, RTW_JGRPHY_W6_GAIN_D); 1201*1a754578SBitterblue Smith 1202*1a754578SBitterblue Smith snr[RF_PATH_A] = le32_get_bits(rpt->w3, RTW_JGRPHY_W3_RXSNR_A); 1203*1a754578SBitterblue Smith snr[RF_PATH_B] = le32_get_bits(rpt->w4, RTW_JGRPHY_W4_RXSNR_B); 1204*1a754578SBitterblue Smith snr[RF_PATH_C] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_RXSNR_C); 1205*1a754578SBitterblue Smith snr[RF_PATH_D] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_RXSNR_D); 1206*1a754578SBitterblue Smith 1207*1a754578SBitterblue Smith evm[RF_PATH_A] = le32_get_bits(rpt->w3, RTW_JGRPHY_W3_RXEVM_1); 1208*1a754578SBitterblue Smith evm[RF_PATH_B] = le32_get_bits(rpt->w3, RTW_JGRPHY_W3_RXEVM_2); 1209*1a754578SBitterblue Smith evm[RF_PATH_C] = le32_get_bits(rpt->w4, RTW_JGRPHY_W4_RXEVM_3); 1210*1a754578SBitterblue Smith evm[RF_PATH_D] = le32_get_bits(rpt->w5, RTW_JGRPHY_W5_RXEVM_4); 1211*1a754578SBitterblue Smith 1212*1a754578SBitterblue Smith if (pkt_stat->rate <= DESC_RATE54M) 1213*1a754578SBitterblue Smith evm[RF_PATH_A] = le32_get_bits(rpt->w6, 1214*1a754578SBitterblue Smith RTW_JGRPHY_W6_SIGEVM); 1215*1a754578SBitterblue Smith 1216*1a754578SBitterblue Smith for (i = RF_PATH_A; i < RTW_RF_PATH_MAX; i++) { 1217*1a754578SBitterblue Smith pkt_stat->rx_power[i] = gain[i] - 110; 1218*1a754578SBitterblue Smith 1219*1a754578SBitterblue Smith rssi = rtw_phy_rf_power_2_rssi(&pkt_stat->rx_power[i], 1); 1220*1a754578SBitterblue Smith dm_info->rssi[i] = rssi; 1221*1a754578SBitterblue Smith 1222*1a754578SBitterblue Smith pkt_stat->rx_snr[i] = snr[i]; 1223*1a754578SBitterblue Smith dm_info->rx_snr[i] = snr[i] >> 1; 1224*1a754578SBitterblue Smith 1225*1a754578SBitterblue Smith pkt_stat->rx_evm[i] = evm[i]; 1226*1a754578SBitterblue Smith evm[i] = max_t(s8, -127, evm[i]); 1227*1a754578SBitterblue Smith dm_info->rx_evm_dbm[i] = abs(evm[i]) >> 1; 1228*1a754578SBitterblue Smith } 1229*1a754578SBitterblue Smith 1230*1a754578SBitterblue Smith rssi = rtw_phy_rf_power_2_rssi(pkt_stat->rx_power, 1231*1a754578SBitterblue Smith RTW_RF_PATH_MAX); 1232*1a754578SBitterblue Smith pkt_stat->rssi = rssi; 1233*1a754578SBitterblue Smith 1234*1a754578SBitterblue Smith /* When power saving is enabled the hardware sometimes 1235*1a754578SBitterblue Smith * reports unbelievably high gain for paths A and C 1236*1a754578SBitterblue Smith * (e.g. one frame 64 68 68 72, the next frame 106 66 88 72, 1237*1a754578SBitterblue Smith * the next 66 66 68 72), so use the second lowest gain 1238*1a754578SBitterblue Smith * instead of the highest. 1239*1a754578SBitterblue Smith */ 1240*1a754578SBitterblue Smith middle1 = max(min(gain[RF_PATH_A], gain[RF_PATH_B]), 1241*1a754578SBitterblue Smith min(gain[RF_PATH_C], gain[RF_PATH_D])); 1242*1a754578SBitterblue Smith middle2 = min(max(gain[RF_PATH_A], gain[RF_PATH_B]), 1243*1a754578SBitterblue Smith max(gain[RF_PATH_C], gain[RF_PATH_D])); 1244*1a754578SBitterblue Smith rx_pwr_db = min(middle1, middle2); 1245*1a754578SBitterblue Smith rx_pwr_db -= 110; 1246*1a754578SBitterblue Smith pkt_stat->signal_power = rx_pwr_db; 1247*1a754578SBitterblue Smith 1248*1a754578SBitterblue Smith rfmode = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_R_RFMOD); 1249*1a754578SBitterblue Smith subchannel = le32_get_bits(rpt->w0, RTW_JGRPHY_W0_SUB_CHNL); 1250*1a754578SBitterblue Smith 1251*1a754578SBitterblue Smith if (rfmode == 1 && subchannel == 0) { 1252*1a754578SBitterblue Smith pkt_stat->bw = RTW_CHANNEL_WIDTH_40; 1253*1a754578SBitterblue Smith } else if (rfmode == 2) { 1254*1a754578SBitterblue Smith if (subchannel == 0) 1255*1a754578SBitterblue Smith pkt_stat->bw = RTW_CHANNEL_WIDTH_80; 1256*1a754578SBitterblue Smith else if (subchannel == 9 || subchannel == 10) 1257*1a754578SBitterblue Smith pkt_stat->bw = RTW_CHANNEL_WIDTH_40; 1258*1a754578SBitterblue Smith } 1259*1a754578SBitterblue Smith 1260*1a754578SBitterblue Smith cfo[RF_PATH_A] = le32_get_bits(rpt->w2, RTW_JGRPHY_W2_CFO_TAIL_A); 1261*1a754578SBitterblue Smith cfo[RF_PATH_B] = le32_get_bits(rpt->w2, RTW_JGRPHY_W2_CFO_TAIL_B); 1262*1a754578SBitterblue Smith 1263*1a754578SBitterblue Smith for (i = RF_PATH_A; i < 2; i++) { 1264*1a754578SBitterblue Smith pkt_stat->cfo_tail[i] = cfo[i]; 1265*1a754578SBitterblue Smith dm_info->cfo_tail[i] = (cfo[i] * 5) >> 1; 1266*1a754578SBitterblue Smith } 1267*1a754578SBitterblue Smith } 1268*1a754578SBitterblue Smith } 1269*1a754578SBitterblue Smith 1270*1a754578SBitterblue Smith static void 1271*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs) 1272*1a754578SBitterblue Smith { 1273*1a754578SBitterblue Smith struct rtw_hal *hal = &rtwdev->hal; 1274*1a754578SBitterblue Smith u32 txagc_table_wd; 1275*1a754578SBitterblue Smith u8 rate, pwr_index; 1276*1a754578SBitterblue Smith int j; 1277*1a754578SBitterblue Smith 1278*1a754578SBitterblue Smith for (j = 0; j < rtw_rate_size[rs]; j++) { 1279*1a754578SBitterblue Smith rate = rtw_rate_section[rs][j]; 1280*1a754578SBitterblue Smith 1281*1a754578SBitterblue Smith pwr_index = hal->tx_pwr_tbl[path][rate] + 2; 1282*1a754578SBitterblue Smith if (pwr_index > rtwdev->chip->max_power_index) 1283*1a754578SBitterblue Smith pwr_index = rtwdev->chip->max_power_index; 1284*1a754578SBitterblue Smith 1285*1a754578SBitterblue Smith txagc_table_wd = 0x00801000; 1286*1a754578SBitterblue Smith txagc_table_wd |= (pwr_index << 24) | (path << 8) | rate; 1287*1a754578SBitterblue Smith 1288*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AGC_TBL, txagc_table_wd); 1289*1a754578SBitterblue Smith 1290*1a754578SBitterblue Smith /* first time to turn on the txagc table 1291*1a754578SBitterblue Smith * second to write the addr0 1292*1a754578SBitterblue Smith */ 1293*1a754578SBitterblue Smith if (rate == DESC_RATE1M) 1294*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AGC_TBL, txagc_table_wd); 1295*1a754578SBitterblue Smith } 1296*1a754578SBitterblue Smith } 1297*1a754578SBitterblue Smith 1298*1a754578SBitterblue Smith static void rtw8814a_set_tx_power_index(struct rtw_dev *rtwdev) 1299*1a754578SBitterblue Smith { 1300*1a754578SBitterblue Smith struct rtw_hal *hal = &rtwdev->hal; 1301*1a754578SBitterblue Smith int path; 1302*1a754578SBitterblue Smith 1303*1a754578SBitterblue Smith for (path = 0; path < hal->rf_path_num; path++) { 1304*1a754578SBitterblue Smith if (hal->current_band_type == RTW_BAND_2G) 1305*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1306*1a754578SBitterblue Smith RTW_RATE_SECTION_CCK); 1307*1a754578SBitterblue Smith 1308*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1309*1a754578SBitterblue Smith RTW_RATE_SECTION_OFDM); 1310*1a754578SBitterblue Smith 1311*1a754578SBitterblue Smith if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) 1312*1a754578SBitterblue Smith continue; 1313*1a754578SBitterblue Smith 1314*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1315*1a754578SBitterblue Smith RTW_RATE_SECTION_HT_1S); 1316*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1317*1a754578SBitterblue Smith RTW_RATE_SECTION_VHT_1S); 1318*1a754578SBitterblue Smith 1319*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1320*1a754578SBitterblue Smith RTW_RATE_SECTION_HT_2S); 1321*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1322*1a754578SBitterblue Smith RTW_RATE_SECTION_VHT_2S); 1323*1a754578SBitterblue Smith 1324*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1325*1a754578SBitterblue Smith RTW_RATE_SECTION_HT_3S); 1326*1a754578SBitterblue Smith rtw8814a_set_tx_power_index_by_rate(rtwdev, path, 1327*1a754578SBitterblue Smith RTW_RATE_SECTION_VHT_3S); 1328*1a754578SBitterblue Smith } 1329*1a754578SBitterblue Smith } 1330*1a754578SBitterblue Smith 1331*1a754578SBitterblue Smith static void rtw8814a_cfg_ldo25(struct rtw_dev *rtwdev, bool enable) 1332*1a754578SBitterblue Smith { 1333*1a754578SBitterblue Smith } 1334*1a754578SBitterblue Smith 1335*1a754578SBitterblue Smith static void rtw8814a_false_alarm_statistics(struct rtw_dev *rtwdev) 1336*1a754578SBitterblue Smith { 1337*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1338*1a754578SBitterblue Smith u32 cck_fa_cnt, ofdm_fa_cnt; 1339*1a754578SBitterblue Smith u32 crc32_cnt, cca32_cnt; 1340*1a754578SBitterblue Smith u32 cck_enable; 1341*1a754578SBitterblue Smith 1342*1a754578SBitterblue Smith cck_enable = rtw_read32(rtwdev, REG_RXPSEL) & BIT(28); 1343*1a754578SBitterblue Smith cck_fa_cnt = rtw_read16(rtwdev, REG_FA_CCK); 1344*1a754578SBitterblue Smith ofdm_fa_cnt = rtw_read16(rtwdev, REG_FA_OFDM); 1345*1a754578SBitterblue Smith 1346*1a754578SBitterblue Smith dm_info->cck_fa_cnt = cck_fa_cnt; 1347*1a754578SBitterblue Smith dm_info->ofdm_fa_cnt = ofdm_fa_cnt; 1348*1a754578SBitterblue Smith dm_info->total_fa_cnt = ofdm_fa_cnt; 1349*1a754578SBitterblue Smith if (cck_enable) 1350*1a754578SBitterblue Smith dm_info->total_fa_cnt += cck_fa_cnt; 1351*1a754578SBitterblue Smith 1352*1a754578SBitterblue Smith crc32_cnt = rtw_read32(rtwdev, REG_CRC_CCK); 1353*1a754578SBitterblue Smith dm_info->cck_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD); 1354*1a754578SBitterblue Smith dm_info->cck_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD); 1355*1a754578SBitterblue Smith 1356*1a754578SBitterblue Smith crc32_cnt = rtw_read32(rtwdev, REG_CRC_OFDM); 1357*1a754578SBitterblue Smith dm_info->ofdm_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD); 1358*1a754578SBitterblue Smith dm_info->ofdm_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD); 1359*1a754578SBitterblue Smith 1360*1a754578SBitterblue Smith crc32_cnt = rtw_read32(rtwdev, REG_CRC_HT); 1361*1a754578SBitterblue Smith dm_info->ht_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD); 1362*1a754578SBitterblue Smith dm_info->ht_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD); 1363*1a754578SBitterblue Smith 1364*1a754578SBitterblue Smith crc32_cnt = rtw_read32(rtwdev, REG_CRC_VHT); 1365*1a754578SBitterblue Smith dm_info->vht_ok_cnt = u32_get_bits(crc32_cnt, MASKLWORD); 1366*1a754578SBitterblue Smith dm_info->vht_err_cnt = u32_get_bits(crc32_cnt, MASKHWORD); 1367*1a754578SBitterblue Smith 1368*1a754578SBitterblue Smith cca32_cnt = rtw_read32(rtwdev, REG_CCA_OFDM); 1369*1a754578SBitterblue Smith dm_info->ofdm_cca_cnt = u32_get_bits(cca32_cnt, MASKHWORD); 1370*1a754578SBitterblue Smith dm_info->total_cca_cnt = dm_info->ofdm_cca_cnt; 1371*1a754578SBitterblue Smith if (cck_enable) { 1372*1a754578SBitterblue Smith cca32_cnt = rtw_read32(rtwdev, REG_CCA_CCK); 1373*1a754578SBitterblue Smith dm_info->cck_cca_cnt = u32_get_bits(cca32_cnt, MASKLWORD); 1374*1a754578SBitterblue Smith dm_info->total_cca_cnt += dm_info->cck_cca_cnt; 1375*1a754578SBitterblue Smith } 1376*1a754578SBitterblue Smith 1377*1a754578SBitterblue Smith rtw_write32_set(rtwdev, REG_FAS, BIT(17)); 1378*1a754578SBitterblue Smith rtw_write32_clr(rtwdev, REG_FAS, BIT(17)); 1379*1a754578SBitterblue Smith rtw_write32_clr(rtwdev, REG_CCK0_FAREPORT, BIT(15)); 1380*1a754578SBitterblue Smith rtw_write32_set(rtwdev, REG_CCK0_FAREPORT, BIT(15)); 1381*1a754578SBitterblue Smith rtw_write32_set(rtwdev, REG_CNTRST, BIT(0)); 1382*1a754578SBitterblue Smith rtw_write32_clr(rtwdev, REG_CNTRST, BIT(0)); 1383*1a754578SBitterblue Smith } 1384*1a754578SBitterblue Smith 1385*1a754578SBitterblue Smith #define MAC_REG_NUM_8814 2 1386*1a754578SBitterblue Smith #define BB_REG_NUM_8814 14 1387*1a754578SBitterblue Smith #define RF_REG_NUM_8814 1 1388*1a754578SBitterblue Smith 1389*1a754578SBitterblue Smith static void rtw8814a_iqk_backup_mac_bb(struct rtw_dev *rtwdev, 1390*1a754578SBitterblue Smith u32 *mac_backup, u32 *bb_backup, 1391*1a754578SBitterblue Smith const u32 *mac_regs, 1392*1a754578SBitterblue Smith const u32 *bb_regs) 1393*1a754578SBitterblue Smith { 1394*1a754578SBitterblue Smith u32 i; 1395*1a754578SBitterblue Smith 1396*1a754578SBitterblue Smith /* save MACBB default value */ 1397*1a754578SBitterblue Smith for (i = 0; i < MAC_REG_NUM_8814; i++) 1398*1a754578SBitterblue Smith mac_backup[i] = rtw_read32(rtwdev, mac_regs[i]); 1399*1a754578SBitterblue Smith 1400*1a754578SBitterblue Smith for (i = 0; i < BB_REG_NUM_8814; i++) 1401*1a754578SBitterblue Smith bb_backup[i] = rtw_read32(rtwdev, bb_regs[i]); 1402*1a754578SBitterblue Smith } 1403*1a754578SBitterblue Smith 1404*1a754578SBitterblue Smith static void rtw8814a_iqk_backup_rf(struct rtw_dev *rtwdev, 1405*1a754578SBitterblue Smith u32 rf_backup[][4], const u32 *rf_regs) 1406*1a754578SBitterblue Smith { 1407*1a754578SBitterblue Smith u32 i; 1408*1a754578SBitterblue Smith 1409*1a754578SBitterblue Smith /* Save RF Parameters */ 1410*1a754578SBitterblue Smith for (i = 0; i < RF_REG_NUM_8814; i++) { 1411*1a754578SBitterblue Smith rf_backup[i][RF_PATH_A] = rtw_read_rf(rtwdev, RF_PATH_A, 1412*1a754578SBitterblue Smith rf_regs[i], RFREG_MASK); 1413*1a754578SBitterblue Smith rf_backup[i][RF_PATH_B] = rtw_read_rf(rtwdev, RF_PATH_B, 1414*1a754578SBitterblue Smith rf_regs[i], RFREG_MASK); 1415*1a754578SBitterblue Smith rf_backup[i][RF_PATH_C] = rtw_read_rf(rtwdev, RF_PATH_C, 1416*1a754578SBitterblue Smith rf_regs[i], RFREG_MASK); 1417*1a754578SBitterblue Smith rf_backup[i][RF_PATH_D] = rtw_read_rf(rtwdev, RF_PATH_D, 1418*1a754578SBitterblue Smith rf_regs[i], RFREG_MASK); 1419*1a754578SBitterblue Smith } 1420*1a754578SBitterblue Smith } 1421*1a754578SBitterblue Smith 1422*1a754578SBitterblue Smith static void rtw8814a_iqk_afe_setting(struct rtw_dev *rtwdev, bool do_iqk) 1423*1a754578SBitterblue Smith { 1424*1a754578SBitterblue Smith if (do_iqk) { 1425*1a754578SBitterblue Smith /* IQK AFE setting RX_WAIT_CCA mode */ 1426*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x0e808003); 1427*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x0e808003); 1428*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x0e808003); 1429*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x0e808003); 1430*1a754578SBitterblue Smith } else { 1431*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_A, 0x07808003); 1432*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_B, 0x07808003); 1433*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_C, 0x07808003); 1434*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_AFE_PWR1_D, 0x07808003); 1435*1a754578SBitterblue Smith } 1436*1a754578SBitterblue Smith 1437*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_DAC_RSTB, BIT(13), 0x1); 1438*1a754578SBitterblue Smith 1439*1a754578SBitterblue Smith rtw_write8_set(rtwdev, REG_GNT_BT, BIT(2) | BIT(1)); 1440*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_GNT_BT, BIT(2) | BIT(1)); 1441*1a754578SBitterblue Smith 1442*1a754578SBitterblue Smith rtw_write32_set(rtwdev, REG_CCK_RPT_FORMAT, BIT(2)); 1443*1a754578SBitterblue Smith rtw_write32_clr(rtwdev, REG_CCK_RPT_FORMAT, BIT(2)); 1444*1a754578SBitterblue Smith } 1445*1a754578SBitterblue Smith 1446*1a754578SBitterblue Smith static void rtw8814a_iqk_restore_mac_bb(struct rtw_dev *rtwdev, 1447*1a754578SBitterblue Smith u32 *mac_backup, u32 *bb_backup, 1448*1a754578SBitterblue Smith const u32 *mac_regs, 1449*1a754578SBitterblue Smith const u32 *bb_regs) 1450*1a754578SBitterblue Smith { 1451*1a754578SBitterblue Smith u32 i; 1452*1a754578SBitterblue Smith 1453*1a754578SBitterblue Smith /* Reload MacBB Parameters */ 1454*1a754578SBitterblue Smith for (i = 0; i < MAC_REG_NUM_8814; i++) 1455*1a754578SBitterblue Smith rtw_write32(rtwdev, mac_regs[i], mac_backup[i]); 1456*1a754578SBitterblue Smith 1457*1a754578SBitterblue Smith for (i = 0; i < BB_REG_NUM_8814; i++) 1458*1a754578SBitterblue Smith rtw_write32(rtwdev, bb_regs[i], bb_backup[i]); 1459*1a754578SBitterblue Smith } 1460*1a754578SBitterblue Smith 1461*1a754578SBitterblue Smith static void rtw8814a_iqk_restore_rf(struct rtw_dev *rtwdev, 1462*1a754578SBitterblue Smith const u32 rf_backup[][4], 1463*1a754578SBitterblue Smith const u32 *rf_regs) 1464*1a754578SBitterblue Smith { 1465*1a754578SBitterblue Smith u32 i; 1466*1a754578SBitterblue Smith 1467*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE, RFREG_MASK, 0x0); 1468*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_B, RF_LUTWE, RFREG_MASK, 0x0); 1469*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_C, RF_LUTWE, RFREG_MASK, 0x0); 1470*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_D, RF_LUTWE, RFREG_MASK, 0x0); 1471*1a754578SBitterblue Smith 1472*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_RXBB2, RFREG_MASK, 0x88001); 1473*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_B, RF_RXBB2, RFREG_MASK, 0x88001); 1474*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_C, RF_RXBB2, RFREG_MASK, 0x88001); 1475*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_D, RF_RXBB2, RFREG_MASK, 0x88001); 1476*1a754578SBitterblue Smith 1477*1a754578SBitterblue Smith for (i = 0; i < RF_REG_NUM_8814; i++) { 1478*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, rf_regs[i], 1479*1a754578SBitterblue Smith RFREG_MASK, rf_backup[i][RF_PATH_A]); 1480*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_B, rf_regs[i], 1481*1a754578SBitterblue Smith RFREG_MASK, rf_backup[i][RF_PATH_B]); 1482*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_C, rf_regs[i], 1483*1a754578SBitterblue Smith RFREG_MASK, rf_backup[i][RF_PATH_C]); 1484*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_D, rf_regs[i], 1485*1a754578SBitterblue Smith RFREG_MASK, rf_backup[i][RF_PATH_D]); 1486*1a754578SBitterblue Smith } 1487*1a754578SBitterblue Smith } 1488*1a754578SBitterblue Smith 1489*1a754578SBitterblue Smith static void rtw8814a_iqk_reset_nctl(struct rtw_dev *rtwdev) 1490*1a754578SBitterblue Smith { 1491*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000000); 1492*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b80, 0x00000006); 1493*1a754578SBitterblue Smith 1494*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000000); 1495*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b80, 0x00000002); 1496*1a754578SBitterblue Smith } 1497*1a754578SBitterblue Smith 1498*1a754578SBitterblue Smith static void rtw8814a_iqk_configure_mac(struct rtw_dev *rtwdev) 1499*1a754578SBitterblue Smith { 1500*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_TXPAUSE, 0x3f); 1501*1a754578SBitterblue Smith rtw_write32_clr(rtwdev, REG_BCN_CTRL, 1502*1a754578SBitterblue Smith (BIT_EN_BCN_FUNCTION << 8) | BIT_EN_BCN_FUNCTION); 1503*1a754578SBitterblue Smith 1504*1a754578SBitterblue Smith /* RX ante off */ 1505*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_RXPSEL, 0x00); 1506*1a754578SBitterblue Smith /* CCA off */ 1507*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_CCA2ND, 0xf, 0xe); 1508*1a754578SBitterblue Smith /* CCK RX path off */ 1509*1a754578SBitterblue Smith rtw_write32_set(rtwdev, REG_PRECTRL, BIT_IQ_WGT); 1510*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_A, 0x77777777); 1511*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 0x77777777); 1512*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 0x77777777); 1513*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_D, 0x77777777); 1514*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INVSEL_D, BIT_RFE_SELSW0_D, 0x77); 1515*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_PSD, BIT_PSD_INI, 0x0); 1516*1a754578SBitterblue Smith 1517*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_RFE_INV0, 0xf, 0x0); 1518*1a754578SBitterblue Smith } 1519*1a754578SBitterblue Smith 1520*1a754578SBitterblue Smith static void rtw8814a_lok_one_shot(struct rtw_dev *rtwdev, u8 path) 1521*1a754578SBitterblue Smith { 1522*1a754578SBitterblue Smith u32 lok_temp1, lok_temp2; 1523*1a754578SBitterblue Smith bool lok_ready; 1524*1a754578SBitterblue Smith u8 ii; 1525*1a754578SBitterblue Smith 1526*1a754578SBitterblue Smith /* ADC Clock source */ 1527*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_FAS, BIT(21) | BIT(20), path); 1528*1a754578SBitterblue Smith /* LOK: CMD ID = 0 1529*1a754578SBitterblue Smith * {0xf8000011, 0xf8000021, 0xf8000041, 0xf8000081} 1530*1a754578SBitterblue Smith */ 1531*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000001 | (BIT(path) << 4)); 1532*1a754578SBitterblue Smith 1533*1a754578SBitterblue Smith usleep_range(1000, 1100); 1534*1a754578SBitterblue Smith 1535*1a754578SBitterblue Smith if (read_poll_timeout(!rtw_read32_mask, lok_ready, lok_ready, 1536*1a754578SBitterblue Smith 1000, 10000, false, 1537*1a754578SBitterblue Smith rtwdev, 0x1b00, BIT(0))) { 1538*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "==>S%d LOK timed out\n", path); 1539*1a754578SBitterblue Smith 1540*1a754578SBitterblue Smith rtw8814a_iqk_reset_nctl(rtwdev); 1541*1a754578SBitterblue Smith 1542*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_DTXLOK, RFREG_MASK, 0x08400); 1543*1a754578SBitterblue Smith 1544*1a754578SBitterblue Smith return; 1545*1a754578SBitterblue Smith } 1546*1a754578SBitterblue Smith 1547*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000000 | (path << 1)); 1548*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1bd4, 0x003f0001); 1549*1a754578SBitterblue Smith 1550*1a754578SBitterblue Smith lok_temp2 = rtw_read32_mask(rtwdev, 0x1bfc, 0x003e0000); 1551*1a754578SBitterblue Smith lok_temp2 = (lok_temp2 + 0x10) & 0x1f; 1552*1a754578SBitterblue Smith 1553*1a754578SBitterblue Smith lok_temp1 = rtw_read32_mask(rtwdev, 0x1bfc, 0x0000003e); 1554*1a754578SBitterblue Smith lok_temp1 = (lok_temp1 + 0x10) & 0x1f; 1555*1a754578SBitterblue Smith 1556*1a754578SBitterblue Smith for (ii = 1; ii < 5; ii++) { 1557*1a754578SBitterblue Smith lok_temp1 += (lok_temp1 & BIT(4 - ii)) << (ii * 2); 1558*1a754578SBitterblue Smith lok_temp2 += (lok_temp2 & BIT(4 - ii)) << (ii * 2); 1559*1a754578SBitterblue Smith } 1560*1a754578SBitterblue Smith 1561*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 1562*1a754578SBitterblue Smith "path %d lok_temp1 = %#x, lok_temp2 = %#x\n", 1563*1a754578SBitterblue Smith path, lok_temp1 >> 4, lok_temp2 >> 4); 1564*1a754578SBitterblue Smith 1565*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_DTXLOK, 0x07c00, lok_temp1 >> 4); 1566*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_DTXLOK, 0xf8000, lok_temp2 >> 4); 1567*1a754578SBitterblue Smith } 1568*1a754578SBitterblue Smith 1569*1a754578SBitterblue Smith static void rtw8814a_iqk_tx_one_shot(struct rtw_dev *rtwdev, u8 path, 1570*1a754578SBitterblue Smith u32 *tx_matrix, bool *tx_ok) 1571*1a754578SBitterblue Smith { 1572*1a754578SBitterblue Smith u8 bw = rtwdev->hal.current_band_width; 1573*1a754578SBitterblue Smith u8 cal_retry; 1574*1a754578SBitterblue Smith u32 iqk_cmd; 1575*1a754578SBitterblue Smith 1576*1a754578SBitterblue Smith for (cal_retry = 0; cal_retry < 4; cal_retry++) { 1577*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_FAS, BIT(21) | BIT(20), path); 1578*1a754578SBitterblue Smith 1579*1a754578SBitterblue Smith iqk_cmd = 0xf8000001 | ((bw + 3) << 8) | (BIT(path) << 4); 1580*1a754578SBitterblue Smith 1581*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "TXK_Trigger = %#x\n", iqk_cmd); 1582*1a754578SBitterblue Smith 1583*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, iqk_cmd); 1584*1a754578SBitterblue Smith 1585*1a754578SBitterblue Smith usleep_range(10000, 11000); 1586*1a754578SBitterblue Smith 1587*1a754578SBitterblue Smith if (read_poll_timeout(!rtw_read32_mask, *tx_ok, *tx_ok, 1588*1a754578SBitterblue Smith 1000, 20000, false, 1589*1a754578SBitterblue Smith rtwdev, 0x1b00, BIT(0))) { 1590*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 1591*1a754578SBitterblue Smith "tx iqk S%d timed out\n", path); 1592*1a754578SBitterblue Smith 1593*1a754578SBitterblue Smith rtw8814a_iqk_reset_nctl(rtwdev); 1594*1a754578SBitterblue Smith } else { 1595*1a754578SBitterblue Smith *tx_ok = !rtw_read32_mask(rtwdev, 0x1b08, BIT(26)); 1596*1a754578SBitterblue Smith 1597*1a754578SBitterblue Smith if (*tx_ok) 1598*1a754578SBitterblue Smith break; 1599*1a754578SBitterblue Smith } 1600*1a754578SBitterblue Smith } 1601*1a754578SBitterblue Smith 1602*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d tx ==> 0x1b00 = 0x%x\n", 1603*1a754578SBitterblue Smith path, rtw_read32(rtwdev, 0x1b00)); 1604*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d tx ==> 0x1b08 = 0x%x\n", 1605*1a754578SBitterblue Smith path, rtw_read32(rtwdev, 0x1b08)); 1606*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d tx ==> cal_retry = %x\n", 1607*1a754578SBitterblue Smith path, cal_retry); 1608*1a754578SBitterblue Smith 1609*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000000 | (path << 1)); 1610*1a754578SBitterblue Smith 1611*1a754578SBitterblue Smith if (*tx_ok) { 1612*1a754578SBitterblue Smith *tx_matrix = rtw_read32(rtwdev, 0x1b38); 1613*1a754578SBitterblue Smith 1614*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d_IQC = 0x%x\n", 1615*1a754578SBitterblue Smith path, *tx_matrix); 1616*1a754578SBitterblue Smith } 1617*1a754578SBitterblue Smith } 1618*1a754578SBitterblue Smith 1619*1a754578SBitterblue Smith static void rtw8814a_iqk_rx_one_shot(struct rtw_dev *rtwdev, u8 path, 1620*1a754578SBitterblue Smith u32 *tx_matrix, bool *tx_ok) 1621*1a754578SBitterblue Smith { 1622*1a754578SBitterblue Smith static const u16 iqk_apply[RTW_RF_PATH_MAX] = { 1623*1a754578SBitterblue Smith REG_TXAGCIDX, REG_TX_AGC_B, REG_TX_AGC_C, REG_TX_AGC_D 1624*1a754578SBitterblue Smith }; 1625*1a754578SBitterblue Smith u8 band = rtwdev->hal.current_band_type; 1626*1a754578SBitterblue Smith u8 bw = rtwdev->hal.current_band_width; 1627*1a754578SBitterblue Smith u32 rx_matrix; 1628*1a754578SBitterblue Smith u8 cal_retry; 1629*1a754578SBitterblue Smith u32 iqk_cmd; 1630*1a754578SBitterblue Smith bool rx_ok; 1631*1a754578SBitterblue Smith 1632*1a754578SBitterblue Smith for (cal_retry = 0; cal_retry < 4; cal_retry++) { 1633*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_FAS, BIT(21) | BIT(20), path); 1634*1a754578SBitterblue Smith 1635*1a754578SBitterblue Smith if (band == RTW_BAND_2G) { 1636*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_LUTDBG, BIT(11), 0x1); 1637*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_GAINTX, 0xfffff, 0x51ce1); 1638*1a754578SBitterblue Smith 1639*1a754578SBitterblue Smith switch (path) { 1640*1a754578SBitterblue Smith case 0: 1641*1a754578SBitterblue Smith case 1: 1642*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_B, 1643*1a754578SBitterblue Smith 0x54775477); 1644*1a754578SBitterblue Smith break; 1645*1a754578SBitterblue Smith case 2: 1646*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_C, 1647*1a754578SBitterblue Smith 0x54775477); 1648*1a754578SBitterblue Smith break; 1649*1a754578SBitterblue Smith case 3: 1650*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_INVSEL_D, 0x75400000); 1651*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_RFE_PINMUX_D, 1652*1a754578SBitterblue Smith 0x77777777); 1653*1a754578SBitterblue Smith break; 1654*1a754578SBitterblue Smith } 1655*1a754578SBitterblue Smith } 1656*1a754578SBitterblue Smith 1657*1a754578SBitterblue Smith iqk_cmd = 0xf8000001 | ((9 - bw) << 8) | (BIT(path) << 4); 1658*1a754578SBitterblue Smith 1659*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "RXK_Trigger = 0x%x\n", iqk_cmd); 1660*1a754578SBitterblue Smith 1661*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, iqk_cmd); 1662*1a754578SBitterblue Smith 1663*1a754578SBitterblue Smith usleep_range(10000, 11000); 1664*1a754578SBitterblue Smith 1665*1a754578SBitterblue Smith if (read_poll_timeout(!rtw_read32_mask, rx_ok, rx_ok, 1666*1a754578SBitterblue Smith 1000, 20000, false, 1667*1a754578SBitterblue Smith rtwdev, 0x1b00, BIT(0))) { 1668*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, 1669*1a754578SBitterblue Smith "rx iqk S%d timed out\n", path); 1670*1a754578SBitterblue Smith 1671*1a754578SBitterblue Smith rtw8814a_iqk_reset_nctl(rtwdev); 1672*1a754578SBitterblue Smith } else { 1673*1a754578SBitterblue Smith rx_ok = !rtw_read32_mask(rtwdev, 0x1b08, BIT(26)); 1674*1a754578SBitterblue Smith 1675*1a754578SBitterblue Smith if (rx_ok) 1676*1a754578SBitterblue Smith break; 1677*1a754578SBitterblue Smith } 1678*1a754578SBitterblue Smith } 1679*1a754578SBitterblue Smith 1680*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d rx ==> 0x1b00 = 0x%x\n", 1681*1a754578SBitterblue Smith path, rtw_read32(rtwdev, 0x1b00)); 1682*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d rx ==> 0x1b08 = 0x%x\n", 1683*1a754578SBitterblue Smith path, rtw_read32(rtwdev, 0x1b08)); 1684*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d rx ==> cal_retry = %x\n", 1685*1a754578SBitterblue Smith path, cal_retry); 1686*1a754578SBitterblue Smith 1687*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000000 | (path << 1)); 1688*1a754578SBitterblue Smith 1689*1a754578SBitterblue Smith if (rx_ok) { 1690*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b3c, 0x20000000); 1691*1a754578SBitterblue Smith rx_matrix = rtw_read32(rtwdev, 0x1b3c); 1692*1a754578SBitterblue Smith 1693*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "S%d_IQC = 0x%x\n", 1694*1a754578SBitterblue Smith path, rx_matrix); 1695*1a754578SBitterblue Smith } 1696*1a754578SBitterblue Smith 1697*1a754578SBitterblue Smith if (*tx_ok) 1698*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b38, *tx_matrix); 1699*1a754578SBitterblue Smith else 1700*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, iqk_apply[path], BIT(0), 0x0); 1701*1a754578SBitterblue Smith 1702*1a754578SBitterblue Smith if (!rx_ok) 1703*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, iqk_apply[path], 1704*1a754578SBitterblue Smith BIT(11) | BIT(10), 0x0); 1705*1a754578SBitterblue Smith 1706*1a754578SBitterblue Smith if (band == RTW_BAND_2G) 1707*1a754578SBitterblue Smith rtw_write_rf(rtwdev, path, RF_LUTDBG, BIT(11), 0x0); 1708*1a754578SBitterblue Smith } 1709*1a754578SBitterblue Smith 1710*1a754578SBitterblue Smith static void rtw8814a_iqk(struct rtw_dev *rtwdev) 1711*1a754578SBitterblue Smith { 1712*1a754578SBitterblue Smith u8 band = rtwdev->hal.current_band_type; 1713*1a754578SBitterblue Smith u8 bw = rtwdev->hal.current_band_width; 1714*1a754578SBitterblue Smith u32 tx_matrix[RTW_RF_PATH_MAX]; 1715*1a754578SBitterblue Smith bool tx_ok[RTW_RF_PATH_MAX]; 1716*1a754578SBitterblue Smith u8 path; 1717*1a754578SBitterblue Smith 1718*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_RFK, "IQK band = %d GHz bw = %d MHz\n", 1719*1a754578SBitterblue Smith band == RTW_BAND_2G ? 2 : 5, (1 << (bw + 1)) * 10); 1720*1a754578SBitterblue Smith 1721*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_TXMOD, BIT(19), 0x1); 1722*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_B, RF_TXMOD, BIT(19), 0x1); 1723*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_C, RF_TXMOD, BIT(19), 0x1); 1724*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_D, RF_TXMOD, BIT(19), 0x1); 1725*1a754578SBitterblue Smith 1726*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TXAGCIDX, 1727*1a754578SBitterblue Smith (BIT(11) | BIT(10) | BIT(0)), 0x401); 1728*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TX_AGC_B, 1729*1a754578SBitterblue Smith (BIT(11) | BIT(10) | BIT(0)), 0x401); 1730*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TX_AGC_C, 1731*1a754578SBitterblue Smith (BIT(11) | BIT(10) | BIT(0)), 0x401); 1732*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, REG_TX_AGC_D, 1733*1a754578SBitterblue Smith (BIT(11) | BIT(10) | BIT(0)), 0x401); 1734*1a754578SBitterblue Smith 1735*1a754578SBitterblue Smith if (band == RTW_BAND_5G) 1736*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000ff1); 1737*1a754578SBitterblue Smith else 1738*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x1b00, 0xf8000ef1); 1739*1a754578SBitterblue Smith 1740*1a754578SBitterblue Smith usleep_range(1000, 1100); 1741*1a754578SBitterblue Smith 1742*1a754578SBitterblue Smith rtw_write32(rtwdev, 0x810, 0x20101063); 1743*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_DAC_RSTB, 0x0B00C000); 1744*1a754578SBitterblue Smith 1745*1a754578SBitterblue Smith for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++) 1746*1a754578SBitterblue Smith rtw8814a_lok_one_shot(rtwdev, path); 1747*1a754578SBitterblue Smith 1748*1a754578SBitterblue Smith for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++) 1749*1a754578SBitterblue Smith rtw8814a_iqk_tx_one_shot(rtwdev, path, 1750*1a754578SBitterblue Smith &tx_matrix[path], &tx_ok[path]); 1751*1a754578SBitterblue Smith 1752*1a754578SBitterblue Smith for (path = RF_PATH_A; path < RTW_RF_PATH_MAX; path++) 1753*1a754578SBitterblue Smith rtw8814a_iqk_rx_one_shot(rtwdev, path, 1754*1a754578SBitterblue Smith &tx_matrix[path], &tx_ok[path]); 1755*1a754578SBitterblue Smith } 1756*1a754578SBitterblue Smith 1757*1a754578SBitterblue Smith static void rtw8814a_do_iqk(struct rtw_dev *rtwdev) 1758*1a754578SBitterblue Smith { 1759*1a754578SBitterblue Smith static const u32 backup_mac_reg[MAC_REG_NUM_8814] = {0x520, 0x550}; 1760*1a754578SBitterblue Smith static const u32 backup_bb_reg[BB_REG_NUM_8814] = { 1761*1a754578SBitterblue Smith 0xa14, 0x808, 0x838, 0x90c, 0x810, 0xcb0, 0xeb0, 1762*1a754578SBitterblue Smith 0x18b4, 0x1ab4, 0x1abc, 0x9a4, 0x764, 0xcbc, 0x910 1763*1a754578SBitterblue Smith }; 1764*1a754578SBitterblue Smith static const u32 backup_rf_reg[RF_REG_NUM_8814] = {0x0}; 1765*1a754578SBitterblue Smith u32 rf_backup[RF_REG_NUM_8814][RTW_RF_PATH_MAX]; 1766*1a754578SBitterblue Smith u32 mac_backup[MAC_REG_NUM_8814]; 1767*1a754578SBitterblue Smith u32 bb_backup[BB_REG_NUM_8814]; 1768*1a754578SBitterblue Smith 1769*1a754578SBitterblue Smith rtw8814a_iqk_backup_mac_bb(rtwdev, mac_backup, bb_backup, 1770*1a754578SBitterblue Smith backup_mac_reg, backup_bb_reg); 1771*1a754578SBitterblue Smith rtw8814a_iqk_afe_setting(rtwdev, true); 1772*1a754578SBitterblue Smith rtw8814a_iqk_backup_rf(rtwdev, rf_backup, backup_rf_reg); 1773*1a754578SBitterblue Smith rtw8814a_iqk_configure_mac(rtwdev); 1774*1a754578SBitterblue Smith rtw8814a_iqk(rtwdev); 1775*1a754578SBitterblue Smith rtw8814a_iqk_reset_nctl(rtwdev); /* for 3-wire to BB use */ 1776*1a754578SBitterblue Smith rtw8814a_iqk_afe_setting(rtwdev, false); 1777*1a754578SBitterblue Smith rtw8814a_iqk_restore_mac_bb(rtwdev, mac_backup, bb_backup, 1778*1a754578SBitterblue Smith backup_mac_reg, backup_bb_reg); 1779*1a754578SBitterblue Smith rtw8814a_iqk_restore_rf(rtwdev, rf_backup, backup_rf_reg); 1780*1a754578SBitterblue Smith } 1781*1a754578SBitterblue Smith 1782*1a754578SBitterblue Smith static void rtw8814a_phy_calibration(struct rtw_dev *rtwdev) 1783*1a754578SBitterblue Smith { 1784*1a754578SBitterblue Smith rtw8814a_do_iqk(rtwdev); 1785*1a754578SBitterblue Smith } 1786*1a754578SBitterblue Smith 1787*1a754578SBitterblue Smith static void rtw8814a_coex_cfg_init(struct rtw_dev *rtwdev) 1788*1a754578SBitterblue Smith { 1789*1a754578SBitterblue Smith } 1790*1a754578SBitterblue Smith 1791*1a754578SBitterblue Smith static void rtw8814a_coex_cfg_ant_switch(struct rtw_dev *rtwdev, u8 ctrl_type, 1792*1a754578SBitterblue Smith u8 pos_type) 1793*1a754578SBitterblue Smith { 1794*1a754578SBitterblue Smith /* Override rtw_coex_coex_ctrl_owner(). RF path C does not 1795*1a754578SBitterblue Smith * function when BIT_LTE_MUX_CTRL_PATH is set. 1796*1a754578SBitterblue Smith */ 1797*1a754578SBitterblue Smith rtw_write8_clr(rtwdev, REG_SYS_SDIO_CTRL + 3, 1798*1a754578SBitterblue Smith BIT_LTE_MUX_CTRL_PATH >> 24); 1799*1a754578SBitterblue Smith } 1800*1a754578SBitterblue Smith 1801*1a754578SBitterblue Smith static void rtw8814a_coex_cfg_gnt_fix(struct rtw_dev *rtwdev) 1802*1a754578SBitterblue Smith { 1803*1a754578SBitterblue Smith } 1804*1a754578SBitterblue Smith 1805*1a754578SBitterblue Smith static void rtw8814a_coex_cfg_gnt_debug(struct rtw_dev *rtwdev) 1806*1a754578SBitterblue Smith { 1807*1a754578SBitterblue Smith } 1808*1a754578SBitterblue Smith 1809*1a754578SBitterblue Smith static void rtw8814a_coex_cfg_rfe_type(struct rtw_dev *rtwdev) 1810*1a754578SBitterblue Smith { 1811*1a754578SBitterblue Smith struct rtw_coex *coex = &rtwdev->coex; 1812*1a754578SBitterblue Smith struct rtw_coex_rfe *coex_rfe = &coex->rfe; 1813*1a754578SBitterblue Smith 1814*1a754578SBitterblue Smith /* Only needed to make rtw8814a_coex_cfg_ant_switch() run. */ 1815*1a754578SBitterblue Smith coex_rfe->ant_switch_exist = true; 1816*1a754578SBitterblue Smith } 1817*1a754578SBitterblue Smith 1818*1a754578SBitterblue Smith static void rtw8814a_coex_cfg_wl_tx_power(struct rtw_dev *rtwdev, u8 wl_pwr) 1819*1a754578SBitterblue Smith { 1820*1a754578SBitterblue Smith } 1821*1a754578SBitterblue Smith 1822*1a754578SBitterblue Smith static void rtw8814a_coex_cfg_wl_rx_gain(struct rtw_dev *rtwdev, bool low_gain) 1823*1a754578SBitterblue Smith { 1824*1a754578SBitterblue Smith } 1825*1a754578SBitterblue Smith 1826*1a754578SBitterblue Smith static void rtw8814a_txagc_swing_offset(struct rtw_dev *rtwdev, u8 path, 1827*1a754578SBitterblue Smith u8 tx_pwr_idx_offset, 1828*1a754578SBitterblue Smith s8 *txagc_idx, u8 *swing_idx) 1829*1a754578SBitterblue Smith { 1830*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1831*1a754578SBitterblue Smith u8 swing_upper_bound = dm_info->default_ofdm_index + 10; 1832*1a754578SBitterblue Smith s8 delta_pwr_idx = dm_info->delta_power_index[path]; 1833*1a754578SBitterblue Smith u8 swing_index = dm_info->default_ofdm_index; 1834*1a754578SBitterblue Smith u8 max_tx_pwr_idx_offset = 0xf; 1835*1a754578SBitterblue Smith u8 swing_lower_bound = 0; 1836*1a754578SBitterblue Smith s8 agc_index = 0; 1837*1a754578SBitterblue Smith 1838*1a754578SBitterblue Smith tx_pwr_idx_offset = min_t(u8, tx_pwr_idx_offset, max_tx_pwr_idx_offset); 1839*1a754578SBitterblue Smith 1840*1a754578SBitterblue Smith if (delta_pwr_idx >= 0) { 1841*1a754578SBitterblue Smith if (delta_pwr_idx <= tx_pwr_idx_offset) { 1842*1a754578SBitterblue Smith agc_index = delta_pwr_idx; 1843*1a754578SBitterblue Smith swing_index = dm_info->default_ofdm_index; 1844*1a754578SBitterblue Smith } else if (delta_pwr_idx > tx_pwr_idx_offset) { 1845*1a754578SBitterblue Smith agc_index = tx_pwr_idx_offset; 1846*1a754578SBitterblue Smith swing_index = dm_info->default_ofdm_index + 1847*1a754578SBitterblue Smith delta_pwr_idx - tx_pwr_idx_offset; 1848*1a754578SBitterblue Smith swing_index = min_t(u8, swing_index, swing_upper_bound); 1849*1a754578SBitterblue Smith } 1850*1a754578SBitterblue Smith } else { 1851*1a754578SBitterblue Smith if (dm_info->default_ofdm_index > abs(delta_pwr_idx)) 1852*1a754578SBitterblue Smith swing_index = 1853*1a754578SBitterblue Smith dm_info->default_ofdm_index + delta_pwr_idx; 1854*1a754578SBitterblue Smith else 1855*1a754578SBitterblue Smith swing_index = swing_lower_bound; 1856*1a754578SBitterblue Smith swing_index = max_t(u8, swing_index, swing_lower_bound); 1857*1a754578SBitterblue Smith 1858*1a754578SBitterblue Smith agc_index = 0; 1859*1a754578SBitterblue Smith } 1860*1a754578SBitterblue Smith 1861*1a754578SBitterblue Smith if (swing_index >= RTW_TXSCALE_SIZE) { 1862*1a754578SBitterblue Smith rtw_warn(rtwdev, "swing index overflow\n"); 1863*1a754578SBitterblue Smith swing_index = RTW_TXSCALE_SIZE - 1; 1864*1a754578SBitterblue Smith } 1865*1a754578SBitterblue Smith *txagc_idx = agc_index; 1866*1a754578SBitterblue Smith *swing_idx = swing_index; 1867*1a754578SBitterblue Smith } 1868*1a754578SBitterblue Smith 1869*1a754578SBitterblue Smith static void rtw8814a_pwrtrack_set_pwr(struct rtw_dev *rtwdev, u8 path, 1870*1a754578SBitterblue Smith u8 pwr_idx_offset) 1871*1a754578SBitterblue Smith { 1872*1a754578SBitterblue Smith static const u32 txagc_reg[RTW_RF_PATH_MAX] = { 1873*1a754578SBitterblue Smith REG_TX_AGC_A, REG_TX_AGC_B, REG_TX_AGC_C, REG_TX_AGC_D 1874*1a754578SBitterblue Smith }; 1875*1a754578SBitterblue Smith static const u32 txscale_reg[RTW_RF_PATH_MAX] = { 1876*1a754578SBitterblue Smith REG_TXSCALE_A, REG_TXSCALE_B, REG_TXSCALE_C, REG_TXSCALE_D 1877*1a754578SBitterblue Smith }; 1878*1a754578SBitterblue Smith s8 txagc_idx; 1879*1a754578SBitterblue Smith u8 swing_idx; 1880*1a754578SBitterblue Smith 1881*1a754578SBitterblue Smith rtw8814a_txagc_swing_offset(rtwdev, path, pwr_idx_offset, 1882*1a754578SBitterblue Smith &txagc_idx, &swing_idx); 1883*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, txagc_reg[path], GENMASK(29, 25), 1884*1a754578SBitterblue Smith txagc_idx); 1885*1a754578SBitterblue Smith rtw_write32_mask(rtwdev, txscale_reg[path], BB_SWING_MASK, 1886*1a754578SBitterblue Smith rtw8814a_txscale_tbl[swing_idx]); 1887*1a754578SBitterblue Smith } 1888*1a754578SBitterblue Smith 1889*1a754578SBitterblue Smith static void rtw8814a_pwrtrack_set(struct rtw_dev *rtwdev, u8 path) 1890*1a754578SBitterblue Smith { 1891*1a754578SBitterblue Smith u8 max_pwr_idx = rtwdev->chip->max_power_index; 1892*1a754578SBitterblue Smith u8 band_width = rtwdev->hal.current_band_width; 1893*1a754578SBitterblue Smith u8 channel = rtwdev->hal.current_channel; 1894*1a754578SBitterblue Smith u8 tx_rate = rtwdev->dm_info.tx_rate; 1895*1a754578SBitterblue Smith u8 regd = rtw_regd_get(rtwdev); 1896*1a754578SBitterblue Smith u8 pwr_idx_offset, tx_pwr_idx; 1897*1a754578SBitterblue Smith 1898*1a754578SBitterblue Smith tx_pwr_idx = rtw_phy_get_tx_power_index(rtwdev, path, tx_rate, 1899*1a754578SBitterblue Smith band_width, channel, regd); 1900*1a754578SBitterblue Smith 1901*1a754578SBitterblue Smith tx_pwr_idx = min_t(u8, tx_pwr_idx, max_pwr_idx); 1902*1a754578SBitterblue Smith 1903*1a754578SBitterblue Smith pwr_idx_offset = max_pwr_idx - tx_pwr_idx; 1904*1a754578SBitterblue Smith 1905*1a754578SBitterblue Smith rtw8814a_pwrtrack_set_pwr(rtwdev, path, pwr_idx_offset); 1906*1a754578SBitterblue Smith } 1907*1a754578SBitterblue Smith 1908*1a754578SBitterblue Smith static void rtw8814a_phy_pwrtrack_path(struct rtw_dev *rtwdev, 1909*1a754578SBitterblue Smith struct rtw_swing_table *swing_table, 1910*1a754578SBitterblue Smith u8 path) 1911*1a754578SBitterblue Smith { 1912*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1913*1a754578SBitterblue Smith u8 power_idx_cur, power_idx_last; 1914*1a754578SBitterblue Smith u8 delta; 1915*1a754578SBitterblue Smith 1916*1a754578SBitterblue Smith /* 8814A only has one thermal meter at PATH A */ 1917*1a754578SBitterblue Smith delta = rtw_phy_pwrtrack_get_delta(rtwdev, RF_PATH_A); 1918*1a754578SBitterblue Smith 1919*1a754578SBitterblue Smith power_idx_last = dm_info->delta_power_index[path]; 1920*1a754578SBitterblue Smith power_idx_cur = rtw_phy_pwrtrack_get_pwridx(rtwdev, swing_table, 1921*1a754578SBitterblue Smith path, RF_PATH_A, delta); 1922*1a754578SBitterblue Smith 1923*1a754578SBitterblue Smith /* if delta of power indexes are the same, just skip */ 1924*1a754578SBitterblue Smith if (power_idx_cur == power_idx_last) 1925*1a754578SBitterblue Smith return; 1926*1a754578SBitterblue Smith 1927*1a754578SBitterblue Smith dm_info->delta_power_index[path] = power_idx_cur; 1928*1a754578SBitterblue Smith rtw8814a_pwrtrack_set(rtwdev, path); 1929*1a754578SBitterblue Smith } 1930*1a754578SBitterblue Smith 1931*1a754578SBitterblue Smith static void rtw8814a_phy_pwrtrack(struct rtw_dev *rtwdev) 1932*1a754578SBitterblue Smith { 1933*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1934*1a754578SBitterblue Smith struct rtw_swing_table swing_table; 1935*1a754578SBitterblue Smith u8 thermal_value, path; 1936*1a754578SBitterblue Smith 1937*1a754578SBitterblue Smith rtw_phy_config_swing_table(rtwdev, &swing_table); 1938*1a754578SBitterblue Smith 1939*1a754578SBitterblue Smith if (rtwdev->efuse.thermal_meter[RF_PATH_A] == 0xff) 1940*1a754578SBitterblue Smith return; 1941*1a754578SBitterblue Smith 1942*1a754578SBitterblue Smith thermal_value = rtw_read_rf(rtwdev, RF_PATH_A, RF_T_METER, 0xfc00); 1943*1a754578SBitterblue Smith 1944*1a754578SBitterblue Smith rtw_phy_pwrtrack_avg(rtwdev, thermal_value, RF_PATH_A); 1945*1a754578SBitterblue Smith 1946*1a754578SBitterblue Smith if (dm_info->pwr_trk_init_trigger) 1947*1a754578SBitterblue Smith dm_info->pwr_trk_init_trigger = false; 1948*1a754578SBitterblue Smith else if (!rtw_phy_pwrtrack_thermal_changed(rtwdev, thermal_value, 1949*1a754578SBitterblue Smith RF_PATH_A)) 1950*1a754578SBitterblue Smith goto iqk; 1951*1a754578SBitterblue Smith 1952*1a754578SBitterblue Smith for (path = RF_PATH_A; path < rtwdev->hal.rf_path_num; path++) 1953*1a754578SBitterblue Smith rtw8814a_phy_pwrtrack_path(rtwdev, &swing_table, path); 1954*1a754578SBitterblue Smith 1955*1a754578SBitterblue Smith iqk: 1956*1a754578SBitterblue Smith if (rtw_phy_pwrtrack_need_iqk(rtwdev)) 1957*1a754578SBitterblue Smith rtw8814a_do_iqk(rtwdev); 1958*1a754578SBitterblue Smith } 1959*1a754578SBitterblue Smith 1960*1a754578SBitterblue Smith static void rtw8814a_pwr_track(struct rtw_dev *rtwdev) 1961*1a754578SBitterblue Smith { 1962*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1963*1a754578SBitterblue Smith 1964*1a754578SBitterblue Smith if (!dm_info->pwr_trk_triggered) { 1965*1a754578SBitterblue Smith rtw_write_rf(rtwdev, RF_PATH_A, RF_T_METER, 1966*1a754578SBitterblue Smith GENMASK(17, 16), 0x03); 1967*1a754578SBitterblue Smith dm_info->pwr_trk_triggered = true; 1968*1a754578SBitterblue Smith return; 1969*1a754578SBitterblue Smith } 1970*1a754578SBitterblue Smith 1971*1a754578SBitterblue Smith rtw8814a_phy_pwrtrack(rtwdev); 1972*1a754578SBitterblue Smith dm_info->pwr_trk_triggered = false; 1973*1a754578SBitterblue Smith } 1974*1a754578SBitterblue Smith 1975*1a754578SBitterblue Smith static void rtw8814a_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl) 1976*1a754578SBitterblue Smith { 1977*1a754578SBitterblue Smith static const u8 pd[CCK_PD_LV_MAX] = {0x40, 0x83, 0xcd, 0xdd, 0xed}; 1978*1a754578SBitterblue Smith struct rtw_dm_info *dm_info = &rtwdev->dm_info; 1979*1a754578SBitterblue Smith 1980*1a754578SBitterblue Smith /* Override rtw_phy_cck_pd_lv_link(). It implements something 1981*1a754578SBitterblue Smith * like type 2/3/4. We need type 1 here. 1982*1a754578SBitterblue Smith */ 1983*1a754578SBitterblue Smith if (rtw_is_assoc(rtwdev)) { 1984*1a754578SBitterblue Smith if (dm_info->min_rssi > 60) { 1985*1a754578SBitterblue Smith new_lvl = CCK_PD_LV3; 1986*1a754578SBitterblue Smith } else if (dm_info->min_rssi > 35) { 1987*1a754578SBitterblue Smith new_lvl = CCK_PD_LV2; 1988*1a754578SBitterblue Smith } else if (dm_info->min_rssi > 20) { 1989*1a754578SBitterblue Smith if (dm_info->cck_fa_avg > 500) 1990*1a754578SBitterblue Smith new_lvl = CCK_PD_LV2; 1991*1a754578SBitterblue Smith else if (dm_info->cck_fa_avg < 250) 1992*1a754578SBitterblue Smith new_lvl = CCK_PD_LV1; 1993*1a754578SBitterblue Smith else 1994*1a754578SBitterblue Smith return; 1995*1a754578SBitterblue Smith } else { 1996*1a754578SBitterblue Smith new_lvl = CCK_PD_LV1; 1997*1a754578SBitterblue Smith } 1998*1a754578SBitterblue Smith } 1999*1a754578SBitterblue Smith 2000*1a754578SBitterblue Smith rtw_dbg(rtwdev, RTW_DBG_PHY, "lv: (%d) -> (%d)\n", 2001*1a754578SBitterblue Smith dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A], new_lvl); 2002*1a754578SBitterblue Smith 2003*1a754578SBitterblue Smith if (dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] == new_lvl) 2004*1a754578SBitterblue Smith return; 2005*1a754578SBitterblue Smith 2006*1a754578SBitterblue Smith dm_info->cck_fa_avg = CCK_FA_AVG_RESET; 2007*1a754578SBitterblue Smith dm_info->cck_pd_lv[RTW_CHANNEL_WIDTH_20][RF_PATH_A] = new_lvl; 2008*1a754578SBitterblue Smith 2009*1a754578SBitterblue Smith rtw_write8(rtwdev, REG_CCK_PD_TH, pd[new_lvl]); 2010*1a754578SBitterblue Smith } 2011*1a754578SBitterblue Smith 2012*1a754578SBitterblue Smith static void rtw8814a_led_set(struct led_classdev *led, 2013*1a754578SBitterblue Smith enum led_brightness brightness) 2014*1a754578SBitterblue Smith { 2015*1a754578SBitterblue Smith struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev); 2016*1a754578SBitterblue Smith u32 led_gpio_cfg; 2017*1a754578SBitterblue Smith 2018*1a754578SBitterblue Smith led_gpio_cfg = rtw_read32(rtwdev, REG_GPIO_PIN_CTRL_2); 2019*1a754578SBitterblue Smith led_gpio_cfg |= BIT(16) | BIT(17) | BIT(21) | BIT(22); 2020*1a754578SBitterblue Smith 2021*1a754578SBitterblue Smith if (brightness == LED_OFF) { 2022*1a754578SBitterblue Smith led_gpio_cfg |= BIT(8) | BIT(9) | BIT(13) | BIT(14); 2023*1a754578SBitterblue Smith } else { 2024*1a754578SBitterblue Smith led_gpio_cfg &= ~(BIT(8) | BIT(9) | BIT(13) | BIT(14)); 2025*1a754578SBitterblue Smith led_gpio_cfg &= ~(BIT(0) | BIT(1) | BIT(5) | BIT(6)); 2026*1a754578SBitterblue Smith } 2027*1a754578SBitterblue Smith 2028*1a754578SBitterblue Smith rtw_write32(rtwdev, REG_GPIO_PIN_CTRL_2, led_gpio_cfg); 2029*1a754578SBitterblue Smith } 2030*1a754578SBitterblue Smith 2031*1a754578SBitterblue Smith static void rtw8814a_fill_txdesc_checksum(struct rtw_dev *rtwdev, 2032*1a754578SBitterblue Smith struct rtw_tx_pkt_info *pkt_info, 2033*1a754578SBitterblue Smith u8 *txdesc) 2034*1a754578SBitterblue Smith { 2035*1a754578SBitterblue Smith size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ 2036*1a754578SBitterblue Smith 2037*1a754578SBitterblue Smith fill_txdesc_checksum_common(txdesc, words); 2038*1a754578SBitterblue Smith } 2039*1a754578SBitterblue Smith 2040*1a754578SBitterblue Smith static const struct rtw_chip_ops rtw8814a_ops = { 2041*1a754578SBitterblue Smith .power_on = rtw_power_on, 2042*1a754578SBitterblue Smith .power_off = rtw_power_off, 2043*1a754578SBitterblue Smith .phy_set_param = rtw8814a_phy_set_param, 2044*1a754578SBitterblue Smith .read_efuse = rtw8814a_read_efuse, 2045*1a754578SBitterblue Smith .query_phy_status = rtw8814a_query_phy_status, 2046*1a754578SBitterblue Smith .set_channel = rtw8814a_set_channel, 2047*1a754578SBitterblue Smith .mac_init = rtw8814a_mac_init, 2048*1a754578SBitterblue Smith .read_rf = rtw_phy_read_rf, 2049*1a754578SBitterblue Smith .write_rf = rtw_phy_write_rf_reg_sipi, 2050*1a754578SBitterblue Smith .set_tx_power_index = rtw8814a_set_tx_power_index, 2051*1a754578SBitterblue Smith .set_antenna = NULL, 2052*1a754578SBitterblue Smith .cfg_ldo25 = rtw8814a_cfg_ldo25, 2053*1a754578SBitterblue Smith .efuse_grant = rtw8814a_efuse_grant, 2054*1a754578SBitterblue Smith .false_alarm_statistics = rtw8814a_false_alarm_statistics, 2055*1a754578SBitterblue Smith .phy_calibration = rtw8814a_phy_calibration, 2056*1a754578SBitterblue Smith .cck_pd_set = rtw8814a_phy_cck_pd_set, 2057*1a754578SBitterblue Smith .pwr_track = rtw8814a_pwr_track, 2058*1a754578SBitterblue Smith .config_bfee = NULL, 2059*1a754578SBitterblue Smith .set_gid_table = NULL, 2060*1a754578SBitterblue Smith .cfg_csi_rate = NULL, 2061*1a754578SBitterblue Smith .led_set = rtw8814a_led_set, 2062*1a754578SBitterblue Smith .fill_txdesc_checksum = rtw8814a_fill_txdesc_checksum, 2063*1a754578SBitterblue Smith 2064*1a754578SBitterblue Smith .coex_set_init = rtw8814a_coex_cfg_init, 2065*1a754578SBitterblue Smith .coex_set_ant_switch = rtw8814a_coex_cfg_ant_switch, 2066*1a754578SBitterblue Smith .coex_set_gnt_fix = rtw8814a_coex_cfg_gnt_fix, 2067*1a754578SBitterblue Smith .coex_set_gnt_debug = rtw8814a_coex_cfg_gnt_debug, 2068*1a754578SBitterblue Smith .coex_set_rfe_type = rtw8814a_coex_cfg_rfe_type, 2069*1a754578SBitterblue Smith .coex_set_wl_tx_power = rtw8814a_coex_cfg_wl_tx_power, 2070*1a754578SBitterblue Smith .coex_set_wl_rx_gain = rtw8814a_coex_cfg_wl_rx_gain, 2071*1a754578SBitterblue Smith }; 2072*1a754578SBitterblue Smith 2073*1a754578SBitterblue Smith static const struct rtw_rqpn rqpn_table_8814a[] = { 2074*1a754578SBitterblue Smith /* SDIO */ 2075*1a754578SBitterblue Smith {RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, /* vo vi */ 2076*1a754578SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, /* be bk */ 2077*1a754578SBitterblue Smith RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH}, /* mg hi */ 2078*1a754578SBitterblue Smith /* PCIE */ 2079*1a754578SBitterblue Smith {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL, 2080*1a754578SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 2081*1a754578SBitterblue Smith RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 2082*1a754578SBitterblue Smith /* USB, 2 bulk out */ 2083*1a754578SBitterblue Smith {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH, 2084*1a754578SBitterblue Smith RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL, 2085*1a754578SBitterblue Smith RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 2086*1a754578SBitterblue Smith /* USB, 3 bulk out */ 2087*1a754578SBitterblue Smith {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL, 2088*1a754578SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 2089*1a754578SBitterblue Smith RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 2090*1a754578SBitterblue Smith /* USB, 4 bulk out */ 2091*1a754578SBitterblue Smith {RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_NORMAL, 2092*1a754578SBitterblue Smith RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW, 2093*1a754578SBitterblue Smith RTW_DMA_MAPPING_HIGH, RTW_DMA_MAPPING_HIGH}, 2094*1a754578SBitterblue Smith }; 2095*1a754578SBitterblue Smith 2096*1a754578SBitterblue Smith static const struct rtw_prioq_addrs prioq_addrs_8814a = { 2097*1a754578SBitterblue Smith .prio[RTW_DMA_MAPPING_EXTRA] = { 2098*1a754578SBitterblue Smith .rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2, 2099*1a754578SBitterblue Smith }, 2100*1a754578SBitterblue Smith .prio[RTW_DMA_MAPPING_LOW] = { 2101*1a754578SBitterblue Smith .rsvd = REG_FIFOPAGE_INFO_2, .avail = REG_FIFOPAGE_INFO_2 + 2, 2102*1a754578SBitterblue Smith }, 2103*1a754578SBitterblue Smith .prio[RTW_DMA_MAPPING_NORMAL] = { 2104*1a754578SBitterblue Smith .rsvd = REG_FIFOPAGE_INFO_3, .avail = REG_FIFOPAGE_INFO_3 + 2, 2105*1a754578SBitterblue Smith }, 2106*1a754578SBitterblue Smith .prio[RTW_DMA_MAPPING_HIGH] = { 2107*1a754578SBitterblue Smith .rsvd = REG_FIFOPAGE_INFO_1, .avail = REG_FIFOPAGE_INFO_1 + 2, 2108*1a754578SBitterblue Smith }, 2109*1a754578SBitterblue Smith .wsize = true, 2110*1a754578SBitterblue Smith }; 2111*1a754578SBitterblue Smith 2112*1a754578SBitterblue Smith static const struct rtw_page_table page_table_8814a[] = { 2113*1a754578SBitterblue Smith /* SDIO */ 2114*1a754578SBitterblue Smith {0, 0, 0, 0, 0}, /* hq nq lq exq gapq */ 2115*1a754578SBitterblue Smith /* PCIE */ 2116*1a754578SBitterblue Smith {32, 32, 32, 32, 0}, 2117*1a754578SBitterblue Smith /* USB, 2 bulk out */ 2118*1a754578SBitterblue Smith {32, 32, 32, 32, 0}, 2119*1a754578SBitterblue Smith /* USB, 3 bulk out */ 2120*1a754578SBitterblue Smith {32, 32, 32, 32, 0}, 2121*1a754578SBitterblue Smith /* USB, 4 bulk out */ 2122*1a754578SBitterblue Smith {32, 32, 32, 32, 0}, 2123*1a754578SBitterblue Smith }; 2124*1a754578SBitterblue Smith 2125*1a754578SBitterblue Smith static const struct rtw_intf_phy_para_table phy_para_table_8814a = {}; 2126*1a754578SBitterblue Smith 2127*1a754578SBitterblue Smith static const struct rtw_hw_reg rtw8814a_dig[] = { 2128*1a754578SBitterblue Smith [0] = { .addr = 0xc50, .mask = 0x7f }, 2129*1a754578SBitterblue Smith [1] = { .addr = 0xe50, .mask = 0x7f }, 2130*1a754578SBitterblue Smith [2] = { .addr = 0x1850, .mask = 0x7f }, 2131*1a754578SBitterblue Smith [3] = { .addr = 0x1a50, .mask = 0x7f }, 2132*1a754578SBitterblue Smith }; 2133*1a754578SBitterblue Smith 2134*1a754578SBitterblue Smith static const struct rtw_rfe_def rtw8814a_rfe_defs[] = { 2135*1a754578SBitterblue Smith [0] = { .phy_pg_tbl = &rtw8814a_bb_pg_type0_tbl, 2136*1a754578SBitterblue Smith .txpwr_lmt_tbl = &rtw8814a_txpwr_lmt_type0_tbl, 2137*1a754578SBitterblue Smith .pwr_track_tbl = &rtw8814a_rtw_pwrtrk_type0_tbl }, 2138*1a754578SBitterblue Smith [1] = { .phy_pg_tbl = &rtw8814a_bb_pg_tbl, 2139*1a754578SBitterblue Smith .txpwr_lmt_tbl = &rtw8814a_txpwr_lmt_type1_tbl, 2140*1a754578SBitterblue Smith .pwr_track_tbl = &rtw8814a_rtw_pwrtrk_tbl }, 2141*1a754578SBitterblue Smith }; 2142*1a754578SBitterblue Smith 2143*1a754578SBitterblue Smith /* rssi in percentage % (dbm = % - 100) */ 2144*1a754578SBitterblue Smith static const u8 wl_rssi_step_8814a[] = {60, 50, 44, 30}; 2145*1a754578SBitterblue Smith static const u8 bt_rssi_step_8814a[] = {30, 30, 30, 30}; 2146*1a754578SBitterblue Smith 2147*1a754578SBitterblue Smith /* wl_tx_dec_power, bt_tx_dec_power, wl_rx_gain, bt_rx_lna_constrain */ 2148*1a754578SBitterblue Smith static const struct coex_rf_para rf_para_tx_8814a[] = { 2149*1a754578SBitterblue Smith {0, 0, false, 7}, /* for normal */ 2150*1a754578SBitterblue Smith {0, 16, false, 7}, /* for WL-CPT */ 2151*1a754578SBitterblue Smith {4, 0, true, 1}, 2152*1a754578SBitterblue Smith {3, 6, true, 1}, 2153*1a754578SBitterblue Smith {2, 9, true, 1}, 2154*1a754578SBitterblue Smith {1, 13, true, 1} 2155*1a754578SBitterblue Smith }; 2156*1a754578SBitterblue Smith 2157*1a754578SBitterblue Smith static const struct coex_rf_para rf_para_rx_8814a[] = { 2158*1a754578SBitterblue Smith {0, 0, false, 7}, /* for normal */ 2159*1a754578SBitterblue Smith {0, 16, false, 7}, /* for WL-CPT */ 2160*1a754578SBitterblue Smith {4, 0, true, 1}, 2161*1a754578SBitterblue Smith {3, 6, true, 1}, 2162*1a754578SBitterblue Smith {2, 9, true, 1}, 2163*1a754578SBitterblue Smith {1, 13, true, 1} 2164*1a754578SBitterblue Smith }; 2165*1a754578SBitterblue Smith 2166*1a754578SBitterblue Smith static_assert(ARRAY_SIZE(rf_para_tx_8814a) == ARRAY_SIZE(rf_para_rx_8814a)); 2167*1a754578SBitterblue Smith 2168*1a754578SBitterblue Smith const struct rtw_chip_info rtw8814a_hw_spec = { 2169*1a754578SBitterblue Smith .ops = &rtw8814a_ops, 2170*1a754578SBitterblue Smith .id = RTW_CHIP_TYPE_8814A, 2171*1a754578SBitterblue Smith .fw_name = "rtw88/rtw8814a_fw.bin", 2172*1a754578SBitterblue Smith .wlan_cpu = RTW_WCPU_11AC, 2173*1a754578SBitterblue Smith .tx_pkt_desc_sz = 40, 2174*1a754578SBitterblue Smith .tx_buf_desc_sz = 16, 2175*1a754578SBitterblue Smith .rx_pkt_desc_sz = 24, 2176*1a754578SBitterblue Smith .rx_buf_desc_sz = 8, 2177*1a754578SBitterblue Smith .phy_efuse_size = 1024, 2178*1a754578SBitterblue Smith .log_efuse_size = 512, 2179*1a754578SBitterblue Smith .ptct_efuse_size = 0, 2180*1a754578SBitterblue Smith .txff_size = (2048 - 10) * TX_PAGE_SIZE, 2181*1a754578SBitterblue Smith .rxff_size = 23552, 2182*1a754578SBitterblue Smith .rsvd_drv_pg_num = 8, 2183*1a754578SBitterblue Smith .band = RTW_BAND_2G | RTW_BAND_5G, 2184*1a754578SBitterblue Smith .page_size = TX_PAGE_SIZE, 2185*1a754578SBitterblue Smith .csi_buf_pg_num = 0, 2186*1a754578SBitterblue Smith .dig_min = 0x1c, 2187*1a754578SBitterblue Smith .txgi_factor = 1, 2188*1a754578SBitterblue Smith .is_pwr_by_rate_dec = true, 2189*1a754578SBitterblue Smith .rx_ldpc = true, 2190*1a754578SBitterblue Smith .max_power_index = 0x3f, 2191*1a754578SBitterblue Smith .ampdu_density = IEEE80211_HT_MPDU_DENSITY_2, 2192*1a754578SBitterblue Smith .usb_tx_agg_desc_num = 3, 2193*1a754578SBitterblue Smith .hw_feature_report = false, 2194*1a754578SBitterblue Smith .c2h_ra_report_size = 6, 2195*1a754578SBitterblue Smith .old_datarate_fb_limit = false, 2196*1a754578SBitterblue Smith .ht_supported = true, 2197*1a754578SBitterblue Smith .vht_supported = true, 2198*1a754578SBitterblue Smith .lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK), 2199*1a754578SBitterblue Smith .sys_func_en = 0xDC, 2200*1a754578SBitterblue Smith .pwr_on_seq = card_enable_flow_8814a, 2201*1a754578SBitterblue Smith .pwr_off_seq = card_disable_flow_8814a, 2202*1a754578SBitterblue Smith .rqpn_table = rqpn_table_8814a, 2203*1a754578SBitterblue Smith .prioq_addrs = &prioq_addrs_8814a, 2204*1a754578SBitterblue Smith .page_table = page_table_8814a, 2205*1a754578SBitterblue Smith .intf_table = &phy_para_table_8814a, 2206*1a754578SBitterblue Smith .dig = rtw8814a_dig, 2207*1a754578SBitterblue Smith .dig_cck = NULL, 2208*1a754578SBitterblue Smith .rf_base_addr = {0x2800, 0x2c00, 0x3800, 0x3c00}, 2209*1a754578SBitterblue Smith .rf_sipi_addr = {0xc90, 0xe90, 0x1890, 0x1a90}, 2210*1a754578SBitterblue Smith .ltecoex_addr = NULL, 2211*1a754578SBitterblue Smith .mac_tbl = &rtw8814a_mac_tbl, 2212*1a754578SBitterblue Smith .agc_tbl = &rtw8814a_agc_tbl, 2213*1a754578SBitterblue Smith .bb_tbl = &rtw8814a_bb_tbl, 2214*1a754578SBitterblue Smith .rf_tbl = {&rtw8814a_rf_a_tbl, &rtw8814a_rf_b_tbl, 2215*1a754578SBitterblue Smith &rtw8814a_rf_c_tbl, &rtw8814a_rf_d_tbl}, 2216*1a754578SBitterblue Smith .rfe_defs = rtw8814a_rfe_defs, 2217*1a754578SBitterblue Smith .rfe_defs_size = ARRAY_SIZE(rtw8814a_rfe_defs), 2218*1a754578SBitterblue Smith .iqk_threshold = 8, 2219*1a754578SBitterblue Smith .max_scan_ie_len = IEEE80211_MAX_DATA_LEN, 2220*1a754578SBitterblue Smith 2221*1a754578SBitterblue Smith .coex_para_ver = 0, 2222*1a754578SBitterblue Smith .bt_desired_ver = 0, 2223*1a754578SBitterblue Smith .scbd_support = false, 2224*1a754578SBitterblue Smith .new_scbd10_def = false, 2225*1a754578SBitterblue Smith .ble_hid_profile_support = false, 2226*1a754578SBitterblue Smith .wl_mimo_ps_support = false, 2227*1a754578SBitterblue Smith .pstdma_type = COEX_PSTDMA_FORCE_LPSOFF, 2228*1a754578SBitterblue Smith .bt_rssi_type = COEX_BTRSSI_RATIO, 2229*1a754578SBitterblue Smith .ant_isolation = 15, 2230*1a754578SBitterblue Smith .rssi_tolerance = 2, 2231*1a754578SBitterblue Smith .wl_rssi_step = wl_rssi_step_8814a, 2232*1a754578SBitterblue Smith .bt_rssi_step = bt_rssi_step_8814a, 2233*1a754578SBitterblue Smith .table_sant_num = 0, 2234*1a754578SBitterblue Smith .table_sant = NULL, 2235*1a754578SBitterblue Smith .table_nsant_num = 0, 2236*1a754578SBitterblue Smith .table_nsant = NULL, 2237*1a754578SBitterblue Smith .tdma_sant_num = 0, 2238*1a754578SBitterblue Smith .tdma_sant = NULL, 2239*1a754578SBitterblue Smith .tdma_nsant_num = 0, 2240*1a754578SBitterblue Smith .tdma_nsant = NULL, 2241*1a754578SBitterblue Smith .wl_rf_para_num = ARRAY_SIZE(rf_para_tx_8814a), 2242*1a754578SBitterblue Smith .wl_rf_para_tx = rf_para_tx_8814a, 2243*1a754578SBitterblue Smith .wl_rf_para_rx = rf_para_rx_8814a, 2244*1a754578SBitterblue Smith .bt_afh_span_bw20 = 0x24, 2245*1a754578SBitterblue Smith .bt_afh_span_bw40 = 0x36, 2246*1a754578SBitterblue Smith .afh_5g_num = 0, 2247*1a754578SBitterblue Smith .afh_5g = NULL, 2248*1a754578SBitterblue Smith .coex_info_hw_regs_num = 0, 2249*1a754578SBitterblue Smith .coex_info_hw_regs = NULL, 2250*1a754578SBitterblue Smith }; 2251*1a754578SBitterblue Smith EXPORT_SYMBOL(rtw8814a_hw_spec); 2252*1a754578SBitterblue Smith 2253*1a754578SBitterblue Smith MODULE_FIRMWARE("rtw88/rtw8814a_fw.bin"); 2254*1a754578SBitterblue Smith 2255*1a754578SBitterblue Smith MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>"); 2256*1a754578SBitterblue Smith MODULE_DESCRIPTION("Realtek 802.11ac wireless 8814a driver"); 2257*1a754578SBitterblue Smith MODULE_LICENSE("Dual BSD/GPL"); 2258