1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause 2 /* Copyright(c) 2019-2020 Realtek Corporation 3 */ 4 5 #include "debug.h" 6 #include "efuse.h" 7 #include "fw.h" 8 #include "mac.h" 9 #include "reg.h" 10 11 static const u32 rtw89_mac_mem_base_addrs_be[RTW89_MAC_MEM_NUM] = { 12 [RTW89_MAC_MEM_AXIDMA] = AXIDMA_BASE_ADDR_BE, 13 [RTW89_MAC_MEM_SHARED_BUF] = SHARED_BUF_BASE_ADDR_BE, 14 [RTW89_MAC_MEM_DMAC_TBL] = DMAC_TBL_BASE_ADDR_BE, 15 [RTW89_MAC_MEM_SHCUT_MACHDR] = SHCUT_MACHDR_BASE_ADDR_BE, 16 [RTW89_MAC_MEM_STA_SCHED] = STA_SCHED_BASE_ADDR_BE, 17 [RTW89_MAC_MEM_RXPLD_FLTR_CAM] = RXPLD_FLTR_CAM_BASE_ADDR_BE, 18 [RTW89_MAC_MEM_SECURITY_CAM] = SEC_CAM_BASE_ADDR_BE, 19 [RTW89_MAC_MEM_WOW_CAM] = WOW_CAM_BASE_ADDR_BE, 20 [RTW89_MAC_MEM_CMAC_TBL] = CMAC_TBL_BASE_ADDR_BE, 21 [RTW89_MAC_MEM_ADDR_CAM] = ADDR_CAM_BASE_ADDR_BE, 22 [RTW89_MAC_MEM_BA_CAM] = BA_CAM_BASE_ADDR_BE, 23 [RTW89_MAC_MEM_BCN_IE_CAM0] = BCN_IE_CAM0_BASE_ADDR_BE, 24 [RTW89_MAC_MEM_BCN_IE_CAM1] = BCN_IE_CAM1_BASE_ADDR_BE, 25 [RTW89_MAC_MEM_TXD_FIFO_0] = TXD_FIFO_0_BASE_ADDR_BE, 26 [RTW89_MAC_MEM_TXD_FIFO_1] = TXD_FIFO_1_BASE_ADDR_BE, 27 [RTW89_MAC_MEM_TXDATA_FIFO_0] = TXDATA_FIFO_0_BASE_ADDR_BE, 28 [RTW89_MAC_MEM_TXDATA_FIFO_1] = TXDATA_FIFO_1_BASE_ADDR_BE, 29 [RTW89_MAC_MEM_CPU_LOCAL] = CPU_LOCAL_BASE_ADDR_BE, 30 [RTW89_MAC_MEM_BSSID_CAM] = BSSID_CAM_BASE_ADDR_BE, 31 [RTW89_MAC_MEM_WD_PAGE] = WD_PAGE_BASE_ADDR_BE, 32 }; 33 34 static const struct rtw89_port_reg rtw89_port_base_be = { 35 .port_cfg = R_BE_PORT_CFG_P0, 36 .tbtt_prohib = R_BE_TBTT_PROHIB_P0, 37 .bcn_area = R_BE_BCN_AREA_P0, 38 .bcn_early = R_BE_BCNERLYINT_CFG_P0, 39 .tbtt_early = R_BE_TBTTERLYINT_CFG_P0, 40 .tbtt_agg = R_BE_TBTT_AGG_P0, 41 .bcn_space = R_BE_BCN_SPACE_CFG_P0, 42 .bcn_forcetx = R_BE_BCN_FORCETX_P0, 43 .bcn_err_cnt = R_BE_BCN_ERR_CNT_P0, 44 .bcn_err_flag = R_BE_BCN_ERR_FLAG_P0, 45 .dtim_ctrl = R_BE_DTIM_CTRL_P0, 46 .tbtt_shift = R_BE_TBTT_SHIFT_P0, 47 .bcn_cnt_tmr = R_BE_BCN_CNT_TMR_P0, 48 .tsftr_l = R_BE_TSFTR_LOW_P0, 49 .tsftr_h = R_BE_TSFTR_HIGH_P0, 50 .md_tsft = R_BE_WMTX_MOREDATA_TSFT_STMP_CTL, 51 .bss_color = R_BE_PTCL_BSS_COLOR_0, 52 .mbssid = R_BE_MBSSID_CTRL, 53 .mbssid_drop = R_BE_MBSSID_DROP_0, 54 .tsf_sync = R_BE_PORT_0_TSF_SYNC, 55 .ptcl_dbg = R_BE_PTCL_DBG, 56 .ptcl_dbg_info = R_BE_PTCL_DBG_INFO, 57 .bcn_drop_all = R_BE_BCN_DROP_ALL0, 58 .hiq_win = {R_BE_P0MB_HGQ_WINDOW_CFG_0, R_BE_PORT_HGQ_WINDOW_CFG, 59 R_BE_PORT_HGQ_WINDOW_CFG + 1, R_BE_PORT_HGQ_WINDOW_CFG + 2, 60 R_BE_PORT_HGQ_WINDOW_CFG + 3}, 61 }; 62 63 static int rtw89_mac_check_mac_en_be(struct rtw89_dev *rtwdev, u8 mac_idx, 64 enum rtw89_mac_hwmod_sel sel) 65 { 66 if (sel == RTW89_DMAC_SEL && 67 test_bit(RTW89_FLAG_DMAC_FUNC, rtwdev->flags)) 68 return 0; 69 if (sel == RTW89_CMAC_SEL && mac_idx == RTW89_MAC_0 && 70 test_bit(RTW89_FLAG_CMAC0_FUNC, rtwdev->flags)) 71 return 0; 72 if (sel == RTW89_CMAC_SEL && mac_idx == RTW89_MAC_1 && 73 test_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags)) 74 return 0; 75 76 return -EFAULT; 77 } 78 79 static bool is_qta_poh(struct rtw89_dev *rtwdev) 80 { 81 return rtwdev->hci.type == RTW89_HCI_TYPE_PCIE; 82 } 83 84 static void hfc_get_mix_info_be(struct rtw89_dev *rtwdev) 85 { 86 struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param; 87 struct rtw89_hfc_prec_cfg *prec_cfg = ¶m->prec_cfg; 88 struct rtw89_hfc_pub_cfg *pub_cfg = ¶m->pub_cfg; 89 struct rtw89_hfc_pub_info *info = ¶m->pub_info; 90 u32 val; 91 92 val = rtw89_read32(rtwdev, R_BE_PUB_PAGE_INFO1); 93 info->g0_used = u32_get_bits(val, B_BE_G0_USE_PG_MASK); 94 info->g1_used = u32_get_bits(val, B_BE_G1_USE_PG_MASK); 95 96 val = rtw89_read32(rtwdev, R_BE_PUB_PAGE_INFO3); 97 info->g0_aval = u32_get_bits(val, B_BE_G0_AVAL_PG_MASK); 98 info->g1_aval = u32_get_bits(val, B_BE_G1_AVAL_PG_MASK); 99 info->pub_aval = u32_get_bits(rtw89_read32(rtwdev, R_BE_PUB_PAGE_INFO2), 100 B_BE_PUB_AVAL_PG_MASK); 101 info->wp_aval = u32_get_bits(rtw89_read32(rtwdev, R_BE_WP_PAGE_INFO1), 102 B_BE_WP_AVAL_PG_MASK); 103 104 val = rtw89_read32(rtwdev, R_BE_HCI_FC_CTRL); 105 param->en = !!(val & B_BE_HCI_FC_EN); 106 param->h2c_en = !!(val & B_BE_HCI_FC_CH12_EN); 107 param->mode = u32_get_bits(val, B_BE_HCI_FC_MODE_MASK); 108 prec_cfg->ch011_full_cond = u32_get_bits(val, B_BE_HCI_FC_WD_FULL_COND_MASK); 109 prec_cfg->h2c_full_cond = u32_get_bits(val, B_BE_HCI_FC_CH12_FULL_COND_MASK); 110 prec_cfg->wp_ch07_full_cond = 111 u32_get_bits(val, B_BE_HCI_FC_WP_CH07_FULL_COND_MASK); 112 prec_cfg->wp_ch811_full_cond = 113 u32_get_bits(val, B_BE_HCI_FC_WP_CH811_FULL_COND_MASK); 114 115 val = rtw89_read32(rtwdev, R_BE_CH_PAGE_CTRL); 116 prec_cfg->ch011_prec = u32_get_bits(val, B_BE_PREC_PAGE_CH011_V1_MASK); 117 prec_cfg->h2c_prec = u32_get_bits(val, B_BE_PREC_PAGE_CH12_V1_MASK); 118 119 val = rtw89_read32(rtwdev, R_BE_PUB_PAGE_CTRL2); 120 pub_cfg->pub_max = u32_get_bits(val, B_BE_PUBPG_ALL_MASK); 121 122 val = rtw89_read32(rtwdev, R_BE_WP_PAGE_CTRL1); 123 prec_cfg->wp_ch07_prec = u32_get_bits(val, B_BE_PREC_PAGE_WP_CH07_MASK); 124 prec_cfg->wp_ch811_prec = u32_get_bits(val, B_BE_PREC_PAGE_WP_CH811_MASK); 125 126 val = rtw89_read32(rtwdev, R_BE_WP_PAGE_CTRL2); 127 pub_cfg->wp_thrd = u32_get_bits(val, B_BE_WP_THRD_MASK); 128 129 val = rtw89_read32(rtwdev, R_BE_PUB_PAGE_CTRL1); 130 pub_cfg->grp0 = u32_get_bits(val, B_BE_PUBPG_G0_MASK); 131 pub_cfg->grp1 = u32_get_bits(val, B_BE_PUBPG_G1_MASK); 132 } 133 134 static void hfc_h2c_cfg_be(struct rtw89_dev *rtwdev) 135 { 136 struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param; 137 const struct rtw89_hfc_prec_cfg *prec_cfg = ¶m->prec_cfg; 138 u32 val; 139 140 val = u32_encode_bits(prec_cfg->h2c_prec, B_BE_PREC_PAGE_CH12_V1_MASK); 141 rtw89_write32(rtwdev, R_BE_CH_PAGE_CTRL, val); 142 } 143 144 static void hfc_mix_cfg_be(struct rtw89_dev *rtwdev) 145 { 146 struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param; 147 const struct rtw89_hfc_prec_cfg *prec_cfg = ¶m->prec_cfg; 148 const struct rtw89_hfc_pub_cfg *pub_cfg = ¶m->pub_cfg; 149 u32 val; 150 151 val = u32_encode_bits(prec_cfg->ch011_prec, B_BE_PREC_PAGE_CH011_V1_MASK) | 152 u32_encode_bits(prec_cfg->h2c_prec, B_BE_PREC_PAGE_CH12_V1_MASK); 153 rtw89_write32(rtwdev, R_BE_CH_PAGE_CTRL, val); 154 155 val = u32_encode_bits(pub_cfg->pub_max, B_BE_PUBPG_ALL_MASK); 156 rtw89_write32(rtwdev, R_BE_PUB_PAGE_CTRL2, val); 157 158 val = u32_encode_bits(prec_cfg->wp_ch07_prec, B_BE_PREC_PAGE_WP_CH07_MASK) | 159 u32_encode_bits(prec_cfg->wp_ch811_prec, B_BE_PREC_PAGE_WP_CH811_MASK); 160 rtw89_write32(rtwdev, R_BE_WP_PAGE_CTRL1, val); 161 162 val = u32_replace_bits(rtw89_read32(rtwdev, R_BE_HCI_FC_CTRL), 163 param->mode, B_BE_HCI_FC_MODE_MASK); 164 val = u32_replace_bits(val, prec_cfg->ch011_full_cond, 165 B_BE_HCI_FC_WD_FULL_COND_MASK); 166 val = u32_replace_bits(val, prec_cfg->h2c_full_cond, 167 B_BE_HCI_FC_CH12_FULL_COND_MASK); 168 val = u32_replace_bits(val, prec_cfg->wp_ch07_full_cond, 169 B_BE_HCI_FC_WP_CH07_FULL_COND_MASK); 170 val = u32_replace_bits(val, prec_cfg->wp_ch811_full_cond, 171 B_BE_HCI_FC_WP_CH811_FULL_COND_MASK); 172 rtw89_write32(rtwdev, R_BE_HCI_FC_CTRL, val); 173 } 174 175 static void hfc_func_en_be(struct rtw89_dev *rtwdev, bool en, bool h2c_en) 176 { 177 struct rtw89_hfc_param *param = &rtwdev->mac.hfc_param; 178 u32 val; 179 180 val = rtw89_read32(rtwdev, R_BE_HCI_FC_CTRL); 181 param->en = en; 182 param->h2c_en = h2c_en; 183 val = en ? (val | B_BE_HCI_FC_EN) : (val & ~B_BE_HCI_FC_EN); 184 val = h2c_en ? (val | B_BE_HCI_FC_CH12_EN) : 185 (val & ~B_BE_HCI_FC_CH12_EN); 186 rtw89_write32(rtwdev, R_BE_HCI_FC_CTRL, val); 187 } 188 189 static void dle_func_en_be(struct rtw89_dev *rtwdev, bool enable) 190 { 191 if (enable) 192 rtw89_write32_set(rtwdev, R_BE_DMAC_FUNC_EN, 193 B_BE_DLE_WDE_EN | B_BE_DLE_PLE_EN); 194 else 195 rtw89_write32_clr(rtwdev, R_BE_DMAC_FUNC_EN, 196 B_BE_DLE_WDE_EN | B_BE_DLE_PLE_EN); 197 } 198 199 static void dle_clk_en_be(struct rtw89_dev *rtwdev, bool enable) 200 { 201 if (enable) 202 rtw89_write32_set(rtwdev, R_BE_DMAC_CLK_EN, 203 B_BE_DLE_WDE_CLK_EN | B_BE_DLE_PLE_CLK_EN); 204 else 205 rtw89_write32_clr(rtwdev, R_BE_DMAC_CLK_EN, 206 B_BE_DLE_WDE_CLK_EN | B_BE_DLE_PLE_CLK_EN); 207 } 208 209 static int dle_mix_cfg_be(struct rtw89_dev *rtwdev, const struct rtw89_dle_mem *cfg) 210 { 211 const struct rtw89_dle_size *wde_size_cfg, *ple_size_cfg; 212 u32 bound; 213 u32 val; 214 215 wde_size_cfg = cfg->wde_size; 216 ple_size_cfg = cfg->ple_size; 217 218 val = rtw89_read32(rtwdev, R_BE_WDE_PKTBUF_CFG); 219 220 switch (wde_size_cfg->pge_size) { 221 default: 222 case RTW89_WDE_PG_64: 223 val = u32_replace_bits(val, S_AX_WDE_PAGE_SEL_64, 224 B_BE_WDE_PAGE_SEL_MASK); 225 break; 226 case RTW89_WDE_PG_128: 227 val = u32_replace_bits(val, S_AX_WDE_PAGE_SEL_128, 228 B_BE_WDE_PAGE_SEL_MASK); 229 break; 230 case RTW89_WDE_PG_256: 231 rtw89_err(rtwdev, "[ERR]WDE DLE doesn't support 256 byte!\n"); 232 return -EINVAL; 233 } 234 235 bound = wde_size_cfg->srt_ofst / DLE_BOUND_UNIT; 236 val = u32_replace_bits(val, bound, B_BE_WDE_START_BOUND_MASK); 237 val = u32_replace_bits(val, wde_size_cfg->lnk_pge_num, 238 B_BE_WDE_FREE_PAGE_NUM_MASK); 239 rtw89_write32(rtwdev, R_BE_WDE_PKTBUF_CFG, val); 240 241 val = rtw89_read32(rtwdev, R_BE_PLE_PKTBUF_CFG); 242 243 switch (ple_size_cfg->pge_size) { 244 default: 245 case RTW89_PLE_PG_64: 246 rtw89_err(rtwdev, "[ERR]PLE DLE doesn't support 64 byte!\n"); 247 return -EINVAL; 248 case RTW89_PLE_PG_128: 249 val = u32_replace_bits(val, S_AX_PLE_PAGE_SEL_128, 250 B_BE_PLE_PAGE_SEL_MASK); 251 break; 252 case RTW89_PLE_PG_256: 253 val = u32_replace_bits(val, S_AX_PLE_PAGE_SEL_256, 254 B_BE_PLE_PAGE_SEL_MASK); 255 break; 256 } 257 258 bound = ple_size_cfg->srt_ofst / DLE_BOUND_UNIT; 259 val = u32_replace_bits(val, bound, B_BE_PLE_START_BOUND_MASK); 260 val = u32_replace_bits(val, ple_size_cfg->lnk_pge_num, 261 B_BE_PLE_FREE_PAGE_NUM_MASK); 262 rtw89_write32(rtwdev, R_BE_PLE_PKTBUF_CFG, val); 263 264 return 0; 265 } 266 267 static int chk_dle_rdy_be(struct rtw89_dev *rtwdev, bool wde_or_ple) 268 { 269 u32 reg, mask; 270 u32 ini; 271 272 if (wde_or_ple) { 273 reg = R_AX_WDE_INI_STATUS; 274 mask = WDE_MGN_INI_RDY; 275 } else { 276 reg = R_AX_PLE_INI_STATUS; 277 mask = PLE_MGN_INI_RDY; 278 } 279 280 return read_poll_timeout(rtw89_read32, ini, (ini & mask) == mask, 1, 281 2000, false, rtwdev, reg); 282 } 283 284 #define INVALID_QT_WCPU U16_MAX 285 #define SET_QUOTA_VAL(_min_x, _max_x, _module, _idx) \ 286 do { \ 287 val = u32_encode_bits(_min_x, B_BE_ ## _module ## _Q ## _idx ## _MIN_SIZE_MASK) | \ 288 u32_encode_bits(_max_x, B_BE_ ## _module ## _Q ## _idx ## _MAX_SIZE_MASK); \ 289 rtw89_write32(rtwdev, \ 290 R_BE_ ## _module ## _QTA ## _idx ## _CFG, \ 291 val); \ 292 } while (0) 293 #define SET_QUOTA(_x, _module, _idx) \ 294 SET_QUOTA_VAL(min_cfg->_x, max_cfg->_x, _module, _idx) 295 296 static void wde_quota_cfg_be(struct rtw89_dev *rtwdev, 297 const struct rtw89_wde_quota *min_cfg, 298 const struct rtw89_wde_quota *max_cfg, 299 u16 ext_wde_min_qt_wcpu) 300 { 301 u16 min_qt_wcpu = ext_wde_min_qt_wcpu != INVALID_QT_WCPU ? 302 ext_wde_min_qt_wcpu : min_cfg->wcpu; 303 u16 max_qt_wcpu = max(max_cfg->wcpu, min_qt_wcpu); 304 u32 val; 305 306 SET_QUOTA(hif, WDE, 0); 307 SET_QUOTA_VAL(min_qt_wcpu, max_qt_wcpu, WDE, 1); 308 SET_QUOTA_VAL(0, 0, WDE, 2); 309 SET_QUOTA(pkt_in, WDE, 3); 310 SET_QUOTA(cpu_io, WDE, 4); 311 } 312 313 static void ple_quota_cfg_be(struct rtw89_dev *rtwdev, 314 const struct rtw89_ple_quota *min_cfg, 315 const struct rtw89_ple_quota *max_cfg) 316 { 317 u32 val; 318 319 SET_QUOTA(cma0_tx, PLE, 0); 320 SET_QUOTA(cma1_tx, PLE, 1); 321 SET_QUOTA(c2h, PLE, 2); 322 SET_QUOTA(h2c, PLE, 3); 323 SET_QUOTA(wcpu, PLE, 4); 324 SET_QUOTA(mpdu_proc, PLE, 5); 325 SET_QUOTA(cma0_dma, PLE, 6); 326 SET_QUOTA(cma1_dma, PLE, 7); 327 SET_QUOTA(bb_rpt, PLE, 8); 328 SET_QUOTA(wd_rel, PLE, 9); 329 SET_QUOTA(cpu_io, PLE, 10); 330 SET_QUOTA(tx_rpt, PLE, 11); 331 SET_QUOTA(h2d, PLE, 12); 332 } 333 334 static void rtw89_mac_hci_func_en_be(struct rtw89_dev *rtwdev) 335 { 336 rtw89_write32_set(rtwdev, R_BE_HCI_FUNC_EN, B_BE_HCI_TXDMA_EN | 337 B_BE_HCI_RXDMA_EN); 338 } 339 340 static void rtw89_mac_dmac_func_pre_en_be(struct rtw89_dev *rtwdev) 341 { 342 u32 val; 343 344 val = rtw89_read32(rtwdev, R_BE_HAXI_INIT_CFG1); 345 346 switch (rtwdev->hci.type) { 347 case RTW89_HCI_TYPE_PCIE: 348 val = u32_replace_bits(val, S_BE_DMA_MOD_PCIE_NO_DATA_CPU, 349 B_BE_DMA_MODE_MASK); 350 break; 351 case RTW89_HCI_TYPE_USB: 352 val = u32_replace_bits(val, S_BE_DMA_MOD_USB, B_BE_DMA_MODE_MASK); 353 val = (val & ~B_BE_STOP_AXI_MST) | B_BE_TXDMA_EN | B_BE_RXDMA_EN; 354 break; 355 case RTW89_HCI_TYPE_SDIO: 356 val = u32_replace_bits(val, S_BE_DMA_MOD_SDIO, B_BE_DMA_MODE_MASK); 357 val = (val & ~B_BE_STOP_AXI_MST) | B_BE_TXDMA_EN | B_BE_RXDMA_EN; 358 break; 359 default: 360 return; 361 } 362 363 rtw89_write32(rtwdev, R_BE_HAXI_INIT_CFG1, val); 364 365 rtw89_write32_clr(rtwdev, R_BE_HAXI_DMA_STOP1, 366 B_BE_STOP_CH0 | B_BE_STOP_CH1 | B_BE_STOP_CH2 | 367 B_BE_STOP_CH3 | B_BE_STOP_CH4 | B_BE_STOP_CH5 | 368 B_BE_STOP_CH6 | B_BE_STOP_CH7 | B_BE_STOP_CH8 | 369 B_BE_STOP_CH9 | B_BE_STOP_CH10 | B_BE_STOP_CH11 | 370 B_BE_STOP_CH12 | B_BE_STOP_CH13 | B_BE_STOP_CH14); 371 372 rtw89_write32_set(rtwdev, R_BE_DMAC_TABLE_CTRL, B_BE_DMAC_ADDR_MODE); 373 } 374 375 static 376 int rtw89_mac_write_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 val, u8 mask) 377 { 378 u32 val32; 379 int ret; 380 381 val32 = u32_encode_bits(offset, B_BE_WL_XTAL_SI_ADDR_MASK) | 382 u32_encode_bits(val, B_BE_WL_XTAL_SI_DATA_MASK) | 383 u32_encode_bits(mask, B_BE_WL_XTAL_SI_BITMASK_MASK) | 384 u32_encode_bits(XTAL_SI_NORMAL_WRITE, B_BE_WL_XTAL_SI_MODE_MASK) | 385 u32_encode_bits(0, B_BE_WL_XTAL_SI_CHIPID_MASK) | 386 B_BE_WL_XTAL_SI_CMD_POLL; 387 rtw89_write32(rtwdev, R_BE_WLAN_XTAL_SI_CTRL, val32); 388 389 ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_BE_WL_XTAL_SI_CMD_POLL), 390 50, 50000, false, rtwdev, R_BE_WLAN_XTAL_SI_CTRL); 391 if (ret) { 392 rtw89_warn(rtwdev, "xtal si not ready(W): offset=%x val=%x mask=%x\n", 393 offset, val, mask); 394 return ret; 395 } 396 397 return 0; 398 } 399 400 static 401 int rtw89_mac_read_xtal_si_be(struct rtw89_dev *rtwdev, u8 offset, u8 *val) 402 { 403 u32 val32; 404 int ret; 405 406 val32 = u32_encode_bits(offset, B_BE_WL_XTAL_SI_ADDR_MASK) | 407 u32_encode_bits(0x0, B_BE_WL_XTAL_SI_DATA_MASK) | 408 u32_encode_bits(0x0, B_BE_WL_XTAL_SI_BITMASK_MASK) | 409 u32_encode_bits(XTAL_SI_NORMAL_READ, B_BE_WL_XTAL_SI_MODE_MASK) | 410 u32_encode_bits(0, B_BE_WL_XTAL_SI_CHIPID_MASK) | 411 B_BE_WL_XTAL_SI_CMD_POLL; 412 rtw89_write32(rtwdev, R_BE_WLAN_XTAL_SI_CTRL, val32); 413 414 ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_BE_WL_XTAL_SI_CMD_POLL), 415 50, 50000, false, rtwdev, R_BE_WLAN_XTAL_SI_CTRL); 416 if (ret) { 417 rtw89_warn(rtwdev, "xtal si not ready(R): offset=%x\n", offset); 418 return ret; 419 } 420 421 *val = rtw89_read8(rtwdev, R_BE_WLAN_XTAL_SI_CTRL + 1); 422 423 return 0; 424 } 425 426 static void rtw89_mac_disable_cpu_be(struct rtw89_dev *rtwdev) 427 { 428 u32 val32; 429 430 clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags); 431 432 rtw89_write32_clr(rtwdev, R_BE_PLATFORM_ENABLE, B_BE_WCPU_EN); 433 rtw89_write32_set(rtwdev, R_BE_PLATFORM_ENABLE, B_BE_HOLD_AFTER_RESET); 434 rtw89_write32_set(rtwdev, R_BE_PLATFORM_ENABLE, B_BE_WCPU_EN); 435 436 val32 = rtw89_read32(rtwdev, R_BE_WCPU_FW_CTRL); 437 val32 &= B_BE_RUN_ENV_MASK; 438 rtw89_write32(rtwdev, R_BE_WCPU_FW_CTRL, val32); 439 440 rtw89_write32_set(rtwdev, R_BE_DCPU_PLATFORM_ENABLE, B_BE_DCPU_PLATFORM_EN); 441 442 rtw89_write32(rtwdev, R_BE_UDM0, 0); 443 rtw89_write32(rtwdev, R_BE_HALT_C2H, 0); 444 rtw89_write32(rtwdev, R_BE_UDM2, 0); 445 } 446 447 static void set_cpu_en(struct rtw89_dev *rtwdev, bool include_bb) 448 { 449 u32 set = B_BE_WLANCPU_FWDL_EN; 450 451 if (include_bb) 452 set |= B_BE_BBMCU0_FWDL_EN; 453 454 rtw89_write32_set(rtwdev, R_BE_WCPU_FW_CTRL, set); 455 } 456 457 static int wcpu_on(struct rtw89_dev *rtwdev, u8 boot_reason, bool dlfw) 458 { 459 u32 val32; 460 int ret; 461 462 val32 = rtw89_read32(rtwdev, R_BE_HALT_C2H); 463 if (val32) { 464 rtw89_warn(rtwdev, "[SER] AON L2 Debug register not empty before Boot.\n"); 465 rtw89_warn(rtwdev, "[SER] %s: R_BE_HALT_C2H = 0x%x\n", __func__, val32); 466 } 467 val32 = rtw89_read32(rtwdev, R_BE_UDM1); 468 if (val32) { 469 rtw89_warn(rtwdev, "[SER] AON L2 Debug register not empty before Boot.\n"); 470 rtw89_warn(rtwdev, "[SER] %s: R_BE_UDM1 = 0x%x\n", __func__, val32); 471 } 472 val32 = rtw89_read32(rtwdev, R_BE_UDM2); 473 if (val32) { 474 rtw89_warn(rtwdev, "[SER] AON L2 Debug register not empty before Boot.\n"); 475 rtw89_warn(rtwdev, "[SER] %s: R_BE_UDM2 = 0x%x\n", __func__, val32); 476 } 477 478 rtw89_write32(rtwdev, R_BE_UDM1, 0); 479 rtw89_write32(rtwdev, R_BE_UDM2, 0); 480 rtw89_write32(rtwdev, R_BE_HALT_H2C, 0); 481 rtw89_write32(rtwdev, R_BE_HALT_C2H, 0); 482 rtw89_write32(rtwdev, R_BE_HALT_H2C_CTRL, 0); 483 rtw89_write32(rtwdev, R_BE_HALT_C2H_CTRL, 0); 484 485 val32 = rtw89_read32(rtwdev, R_BE_HISR0); 486 rtw89_write32(rtwdev, R_BE_HISR0, B_BE_HALT_C2H_INT); 487 rtw89_debug(rtwdev, RTW89_DBG_SER, "HISR0=0x%x\n", val32); 488 489 rtw89_write32_set(rtwdev, R_BE_SYS_CLK_CTRL, B_BE_CPU_CLK_EN); 490 rtw89_write32_clr(rtwdev, R_BE_SYS_CFG5, 491 B_BE_WDT_WAKE_PCIE_EN | B_BE_WDT_WAKE_USB_EN); 492 rtw89_write32_clr(rtwdev, R_BE_WCPU_FW_CTRL, 493 B_BE_WDT_PLT_RST_EN | B_BE_WCPU_ROM_CUT_GET); 494 495 rtw89_write16_mask(rtwdev, R_BE_BOOT_REASON, B_BE_BOOT_REASON_MASK, boot_reason); 496 rtw89_write32_clr(rtwdev, R_BE_PLATFORM_ENABLE, B_BE_WCPU_EN); 497 rtw89_write32_clr(rtwdev, R_BE_PLATFORM_ENABLE, B_BE_HOLD_AFTER_RESET); 498 rtw89_write32_set(rtwdev, R_BE_PLATFORM_ENABLE, B_BE_WCPU_EN); 499 500 if (!dlfw) { 501 ret = rtw89_fw_check_rdy(rtwdev, RTW89_FWDL_CHECK_FREERTOS_DONE); 502 if (ret) 503 return ret; 504 } 505 506 return 0; 507 } 508 509 static int rtw89_mac_fwdl_enable_wcpu_be(struct rtw89_dev *rtwdev, 510 u8 boot_reason, bool dlfw, 511 bool include_bb) 512 { 513 set_cpu_en(rtwdev, include_bb); 514 515 return wcpu_on(rtwdev, boot_reason, dlfw); 516 } 517 518 static const u8 fwdl_status_map[] = { 519 [0] = RTW89_FWDL_INITIAL_STATE, 520 [1] = RTW89_FWDL_FWDL_ONGOING, 521 [4] = RTW89_FWDL_CHECKSUM_FAIL, 522 [5] = RTW89_FWDL_SECURITY_FAIL, 523 [6] = RTW89_FWDL_SECURITY_FAIL, 524 [7] = RTW89_FWDL_CV_NOT_MATCH, 525 [8] = RTW89_FWDL_RSVD0, 526 [2] = RTW89_FWDL_WCPU_FWDL_RDY, 527 [3] = RTW89_FWDL_WCPU_FW_INIT_RDY, 528 [9] = RTW89_FWDL_RSVD0, 529 }; 530 531 static u8 fwdl_get_status_be(struct rtw89_dev *rtwdev, enum rtw89_fwdl_check_type type) 532 { 533 bool check_pass = false; 534 u32 val32; 535 u8 st; 536 537 val32 = rtw89_read32(rtwdev, R_BE_WCPU_FW_CTRL); 538 539 switch (type) { 540 case RTW89_FWDL_CHECK_WCPU_FWDL_DONE: 541 check_pass = !(val32 & B_BE_WLANCPU_FWDL_EN); 542 break; 543 case RTW89_FWDL_CHECK_DCPU_FWDL_DONE: 544 check_pass = !(val32 & B_BE_DATACPU_FWDL_EN); 545 break; 546 case RTW89_FWDL_CHECK_BB0_FWDL_DONE: 547 check_pass = !(val32 & B_BE_BBMCU0_FWDL_EN); 548 break; 549 case RTW89_FWDL_CHECK_BB1_FWDL_DONE: 550 check_pass = !(val32 & B_BE_BBMCU1_FWDL_EN); 551 break; 552 default: 553 break; 554 } 555 556 if (check_pass) 557 return RTW89_FWDL_WCPU_FW_INIT_RDY; 558 559 st = u32_get_bits(val32, B_BE_WCPU_FWDL_STATUS_MASK); 560 if (st < ARRAY_SIZE(fwdl_status_map)) 561 return fwdl_status_map[st]; 562 563 return st; 564 } 565 566 static int rtw89_fwdl_check_path_ready_be(struct rtw89_dev *rtwdev, 567 bool h2c_or_fwdl) 568 { 569 u32 check = h2c_or_fwdl ? B_BE_H2C_PATH_RDY : B_BE_DLFW_PATH_RDY; 570 u32 val; 571 572 return read_poll_timeout_atomic(rtw89_read32, val, val & check, 573 1, 1000000, false, 574 rtwdev, R_BE_WCPU_FW_CTRL); 575 } 576 577 static int dmac_func_en_be(struct rtw89_dev *rtwdev) 578 { 579 return 0; 580 } 581 582 static int cmac_func_en_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool en) 583 { 584 u32 reg; 585 586 if (mac_idx > RTW89_MAC_1) 587 return -EINVAL; 588 589 if (mac_idx == RTW89_MAC_0) 590 return 0; 591 592 if (en) { 593 rtw89_write32_set(rtwdev, R_BE_AFE_CTRL1, B_BE_AFE_CTRL1_SET); 594 rtw89_write32_clr(rtwdev, R_BE_SYS_ISO_CTRL_EXTEND, B_BE_R_SYM_ISO_CMAC12PP); 595 rtw89_write32_set(rtwdev, R_BE_FEN_RST_ENABLE, B_BE_CMAC1_FEN); 596 597 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CK_EN, mac_idx); 598 rtw89_write32_set(rtwdev, reg, B_BE_CK_EN_SET); 599 600 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CMAC_FUNC_EN, mac_idx); 601 rtw89_write32_set(rtwdev, reg, B_BE_CMAC_FUNC_EN_SET); 602 603 set_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags); 604 } else { 605 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CMAC_FUNC_EN, mac_idx); 606 rtw89_write32_clr(rtwdev, reg, B_BE_CMAC_FUNC_EN_SET); 607 608 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CK_EN, mac_idx); 609 rtw89_write32_clr(rtwdev, reg, B_BE_CK_EN_SET); 610 611 rtw89_write32_clr(rtwdev, R_BE_FEN_RST_ENABLE, B_BE_CMAC1_FEN); 612 rtw89_write32_set(rtwdev, R_BE_SYS_ISO_CTRL_EXTEND, B_BE_R_SYM_ISO_CMAC12PP); 613 rtw89_write32_clr(rtwdev, R_BE_AFE_CTRL1, B_BE_AFE_CTRL1_SET); 614 615 clear_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags); 616 } 617 618 return 0; 619 } 620 621 static int chip_func_en_be(struct rtw89_dev *rtwdev) 622 { 623 return 0; 624 } 625 626 static int sys_init_be(struct rtw89_dev *rtwdev) 627 { 628 int ret; 629 630 ret = dmac_func_en_be(rtwdev); 631 if (ret) 632 return ret; 633 634 ret = cmac_func_en_be(rtwdev, RTW89_MAC_0, true); 635 if (ret) 636 return ret; 637 638 ret = chip_func_en_be(rtwdev); 639 if (ret) 640 return ret; 641 642 return ret; 643 } 644 645 static int sta_sch_init_be(struct rtw89_dev *rtwdev) 646 { 647 u32 p_val; 648 int ret; 649 650 ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 651 if (ret) 652 return ret; 653 654 rtw89_write8_set(rtwdev, R_BE_SS_CTRL, B_BE_SS_EN); 655 656 ret = read_poll_timeout(rtw89_read32, p_val, p_val & B_BE_SS_INIT_DONE, 657 1, TRXCFG_WAIT_CNT, false, rtwdev, R_BE_SS_CTRL); 658 if (ret) { 659 rtw89_err(rtwdev, "[ERR]STA scheduler init\n"); 660 return ret; 661 } 662 663 rtw89_write32_set(rtwdev, R_BE_SS_CTRL, B_BE_WARM_INIT); 664 rtw89_write32_clr(rtwdev, R_BE_SS_CTRL, B_BE_BAND_TRIG_EN | B_BE_BAND1_TRIG_EN); 665 666 return 0; 667 } 668 669 static int mpdu_proc_init_be(struct rtw89_dev *rtwdev) 670 { 671 u32 val32; 672 int ret; 673 674 ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 675 if (ret) 676 return ret; 677 678 rtw89_write32_set(rtwdev, R_BE_MPDU_PROC, B_BE_APPEND_FCS); 679 rtw89_write32(rtwdev, R_BE_CUT_AMSDU_CTRL, TRXCFG_MPDU_PROC_CUT_CTRL); 680 681 val32 = rtw89_read32(rtwdev, R_BE_HDR_SHCUT_SETTING); 682 val32 |= (B_BE_TX_HW_SEQ_EN | B_BE_TX_HW_ACK_POLICY_EN | B_BE_TX_MAC_MPDU_PROC_EN); 683 val32 &= ~B_BE_TX_ADDR_MLD_TO_LIK; 684 rtw89_write32_set(rtwdev, R_BE_HDR_SHCUT_SETTING, val32); 685 686 rtw89_write32(rtwdev, R_BE_RX_HDRTRNS, TRXCFG_MPDU_PROC_RX_HDR_CONV); 687 688 val32 = rtw89_read32(rtwdev, R_BE_DISP_FWD_WLAN_0); 689 val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_0_DATA_MASK); 690 val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_0_MNG_MASK); 691 val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_0_CTL_MASK); 692 val32 = u32_replace_bits(val32, 1, B_BE_FWD_WLAN_CPU_TYPE_1_MASK); 693 rtw89_write32(rtwdev, R_BE_DISP_FWD_WLAN_0, val32); 694 695 return 0; 696 } 697 698 static int sec_eng_init_be(struct rtw89_dev *rtwdev) 699 { 700 u32 val32; 701 int ret; 702 703 ret = rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 704 if (ret) 705 return ret; 706 707 val32 = rtw89_read32(rtwdev, R_BE_SEC_ENG_CTRL); 708 val32 |= B_BE_CLK_EN_CGCMP | B_BE_CLK_EN_WAPI | B_BE_CLK_EN_WEP_TKIP | 709 B_BE_SEC_TX_ENC | B_BE_SEC_RX_DEC | 710 B_BE_MC_DEC | B_BE_BC_DEC | 711 B_BE_BMC_MGNT_DEC | B_BE_UC_MGNT_DEC; 712 val32 &= ~B_BE_SEC_PRE_ENQUE_TX; 713 rtw89_write32(rtwdev, R_BE_SEC_ENG_CTRL, val32); 714 715 rtw89_write32_set(rtwdev, R_BE_SEC_MPDU_PROC, B_BE_APPEND_ICV | B_BE_APPEND_MIC); 716 717 return 0; 718 } 719 720 static int txpktctrl_init_be(struct rtw89_dev *rtwdev) 721 { 722 struct rtw89_mac_dle_rsvd_qt_cfg qt_cfg; 723 u32 val32; 724 int ret; 725 726 ret = rtw89_mac_get_dle_rsvd_qt_cfg(rtwdev, DLE_RSVD_QT_MPDU_INFO, &qt_cfg); 727 if (ret) { 728 rtw89_err(rtwdev, "get dle rsvd qt %d cfg fail %d\n", 729 DLE_RSVD_QT_MPDU_INFO, ret); 730 return ret; 731 } 732 733 val32 = rtw89_read32(rtwdev, R_BE_TXPKTCTL_MPDUINFO_CFG); 734 val32 = u32_replace_bits(val32, qt_cfg.pktid, B_BE_MPDUINFO_PKTID_MASK); 735 val32 = u32_replace_bits(val32, MPDU_INFO_B1_OFST, B_BE_MPDUINFO_B1_BADDR_MASK); 736 val32 |= B_BE_MPDUINFO_FEN; 737 rtw89_write32(rtwdev, R_BE_TXPKTCTL_MPDUINFO_CFG, val32); 738 739 return 0; 740 } 741 742 static int mlo_init_be(struct rtw89_dev *rtwdev) 743 { 744 u32 val32; 745 int ret; 746 747 val32 = rtw89_read32(rtwdev, R_BE_MLO_INIT_CTL); 748 749 val32 |= B_BE_MLO_TABLE_REINIT; 750 rtw89_write32(rtwdev, R_BE_MLO_INIT_CTL, val32); 751 val32 &= ~B_BE_MLO_TABLE_REINIT; 752 rtw89_write32(rtwdev, R_BE_MLO_INIT_CTL, val32); 753 754 ret = read_poll_timeout_atomic(rtw89_read32, val32, 755 val32 & B_BE_MLO_TABLE_INIT_DONE, 756 1, 1000, false, rtwdev, R_BE_MLO_INIT_CTL); 757 if (ret) 758 rtw89_err(rtwdev, "[MLO]%s: MLO init polling timeout\n", __func__); 759 760 rtw89_write32_set(rtwdev, R_BE_SS_CTRL, B_BE_MLO_HW_CHGLINK_EN); 761 rtw89_write32_set(rtwdev, R_BE_CMAC_SHARE_ACQCHK_CFG_0, B_BE_R_MACID_ACQ_CHK_EN); 762 763 return ret; 764 } 765 766 static int dmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 767 { 768 int ret; 769 770 ret = rtw89_mac_dle_init(rtwdev, rtwdev->mac.qta_mode, RTW89_QTA_INVALID); 771 if (ret) { 772 rtw89_err(rtwdev, "[ERR]DLE init %d\n", ret); 773 return ret; 774 } 775 776 ret = rtw89_mac_preload_init(rtwdev, RTW89_MAC_0, rtwdev->mac.qta_mode); 777 if (ret) { 778 rtw89_err(rtwdev, "[ERR]preload init %d\n", ret); 779 return ret; 780 } 781 782 ret = rtw89_mac_hfc_init(rtwdev, true, true, true); 783 if (ret) { 784 rtw89_err(rtwdev, "[ERR]HCI FC init %d\n", ret); 785 return ret; 786 } 787 788 ret = sta_sch_init_be(rtwdev); 789 if (ret) { 790 rtw89_err(rtwdev, "[ERR]STA SCH init %d\n", ret); 791 return ret; 792 } 793 794 ret = mpdu_proc_init_be(rtwdev); 795 if (ret) { 796 rtw89_err(rtwdev, "[ERR]MPDU Proc init %d\n", ret); 797 return ret; 798 } 799 800 ret = sec_eng_init_be(rtwdev); 801 if (ret) { 802 rtw89_err(rtwdev, "[ERR]Security Engine init %d\n", ret); 803 return ret; 804 } 805 806 ret = txpktctrl_init_be(rtwdev); 807 if (ret) { 808 rtw89_err(rtwdev, "[ERR]TX pkt ctrl init %d\n", ret); 809 return ret; 810 } 811 812 ret = mlo_init_be(rtwdev); 813 if (ret) { 814 rtw89_err(rtwdev, "[ERR]MLO init %d\n", ret); 815 return ret; 816 } 817 818 return ret; 819 } 820 821 static int scheduler_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 822 { 823 u32 val32; 824 u32 reg; 825 int ret; 826 827 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 828 if (ret) 829 return ret; 830 831 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_HE_CTN_CHK_CCA_NAV, mac_idx); 832 val32 = B_BE_HE_CTN_CHK_CCA_P20 | B_BE_HE_CTN_CHK_EDCCA_P20 | 833 B_BE_HE_CTN_CHK_CCA_BITMAP | B_BE_HE_CTN_CHK_EDCCA_BITMAP | 834 B_BE_HE_CTN_CHK_NO_GNT_WL | B_BE_HE_CTN_CHK_BASIC_NAV | 835 B_BE_HE_CTN_CHK_INTRA_NAV | B_BE_HE_CTN_CHK_TX_NAV; 836 rtw89_write32(rtwdev, reg, val32); 837 838 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_HE_SIFS_CHK_CCA_NAV, mac_idx); 839 val32 = B_BE_HE_SIFS_CHK_EDCCA_P20 | B_BE_HE_SIFS_CHK_EDCCA_BITMAP | 840 B_BE_HE_SIFS_CHK_NO_GNT_WL; 841 rtw89_write32(rtwdev, reg, val32); 842 843 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TB_CHK_CCA_NAV, mac_idx); 844 val32 = B_BE_TB_CHK_EDCCA_BITMAP | B_BE_TB_CHK_NO_GNT_WL | B_BE_TB_CHK_BASIC_NAV; 845 rtw89_write32(rtwdev, reg, val32); 846 847 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CCA_CFG_0, mac_idx); 848 rtw89_write32_clr(rtwdev, reg, B_BE_NO_GNT_WL_EN); 849 850 if (is_qta_poh(rtwdev)) { 851 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PREBKF_CFG_0, mac_idx); 852 rtw89_write32_mask(rtwdev, reg, B_BE_PREBKF_TIME_MASK, 853 SCH_PREBKF_24US); 854 855 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CTN_CFG_0, mac_idx); 856 rtw89_write32_mask(rtwdev, reg, B_BE_PREBKF_TIME_NONAC_MASK, 857 SCH_PREBKF_24US); 858 } 859 860 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_EDCA_BCNQ_PARAM, mac_idx); 861 rtw89_write32_mask(rtwdev, reg, B_BE_BCNQ_CW_MASK, 0x32); 862 rtw89_write32_mask(rtwdev, reg, B_BE_BCNQ_AIFS_MASK, BCN_IFS_25US); 863 864 return 0; 865 } 866 867 static int addr_cam_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 868 { 869 u32 val32; 870 u16 val16; 871 u32 reg; 872 int ret; 873 874 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 875 if (ret) 876 return ret; 877 878 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_ADDR_CAM_CTRL, mac_idx); 879 val32 = rtw89_read32(rtwdev, reg); 880 val32 = u32_replace_bits(val32, ADDR_CAM_SERCH_RANGE, B_BE_ADDR_CAM_RANGE_MASK); 881 val32 |= B_BE_ADDR_CAM_EN; 882 if (mac_idx == RTW89_MAC_0) 883 val32 |= B_BE_ADDR_CAM_CLR; 884 rtw89_write32(rtwdev, reg, val32); 885 886 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_ADDR_CAM_CTRL, mac_idx); 887 ret = read_poll_timeout_atomic(rtw89_read16, val16, !(val16 & B_BE_ADDR_CAM_CLR), 888 1, TRXCFG_WAIT_CNT, false, rtwdev, reg); 889 if (ret) 890 rtw89_err(rtwdev, "[ERR]ADDR_CAM reset\n"); 891 892 return ret; 893 } 894 895 static int rtw89_mac_typ_fltr_opt_be(struct rtw89_dev *rtwdev, 896 enum rtw89_machdr_frame_type type, 897 enum rtw89_mac_fwd_target fwd_target, 898 u8 mac_idx) 899 { 900 u32 reg; 901 u32 val; 902 903 switch (fwd_target) { 904 case RTW89_FWD_DONT_CARE: 905 val = RX_FLTR_FRAME_DROP_BE; 906 break; 907 case RTW89_FWD_TO_HOST: 908 case RTW89_FWD_TO_WLAN_CPU: 909 val = RX_FLTR_FRAME_ACCEPT_BE; 910 break; 911 default: 912 rtw89_err(rtwdev, "[ERR]set rx filter fwd target err\n"); 913 return -EINVAL; 914 } 915 916 switch (type) { 917 case RTW89_MGNT: 918 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_MGNT_FLTR, mac_idx); 919 break; 920 case RTW89_CTRL: 921 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CTRL_FLTR, mac_idx); 922 break; 923 case RTW89_DATA: 924 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_DATA_FLTR, mac_idx); 925 break; 926 default: 927 rtw89_err(rtwdev, "[ERR]set rx filter type err\n"); 928 return -EINVAL; 929 } 930 rtw89_write32(rtwdev, reg, val); 931 932 return 0; 933 } 934 935 static int rx_fltr_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 936 { 937 u32 reg; 938 u32 val; 939 940 rtw89_mac_typ_fltr_opt_be(rtwdev, RTW89_MGNT, RTW89_FWD_TO_HOST, mac_idx); 941 rtw89_mac_typ_fltr_opt_be(rtwdev, RTW89_CTRL, RTW89_FWD_TO_HOST, mac_idx); 942 rtw89_mac_typ_fltr_opt_be(rtwdev, RTW89_DATA, RTW89_FWD_TO_HOST, mac_idx); 943 944 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_FLTR_OPT, mac_idx); 945 val = B_BE_A_BC_CAM_MATCH | B_BE_A_UC_CAM_MATCH | B_BE_A_MC | 946 B_BE_A_BC | B_BE_A_A1_MATCH | B_BE_SNIFFER_MODE | 947 u32_encode_bits(15, B_BE_UID_FILTER_MASK); 948 rtw89_write32(rtwdev, reg, val); 949 u32p_replace_bits(&rtwdev->hal.rx_fltr, 15, B_BE_UID_FILTER_MASK); 950 951 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PLCP_HDR_FLTR, mac_idx); 952 val = B_BE_HE_SIGB_CRC_CHK | B_BE_VHT_MU_SIGB_CRC_CHK | 953 B_BE_VHT_SU_SIGB_CRC_CHK | B_BE_SIGA_CRC_CHK | 954 B_BE_LSIG_PARITY_CHK_EN | B_BE_CCK_SIG_CHK | B_BE_CCK_CRC_CHK; 955 rtw89_write16(rtwdev, reg, val); 956 957 return 0; 958 } 959 960 static int cca_ctrl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 961 { 962 return 0; 963 } 964 965 static int nav_ctrl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 966 { 967 u32 val32; 968 u32 reg; 969 970 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_NAV_CTL, mac_idx); 971 972 val32 = rtw89_read32(rtwdev, reg); 973 val32 &= ~B_BE_WMAC_PLCP_UP_NAV_EN; 974 val32 |= B_BE_WMAC_TF_UP_NAV_EN | B_BE_WMAC_NAV_UPPER_EN; 975 val32 = u32_replace_bits(val32, NAV_25MS, B_BE_WMAC_NAV_UPPER_MASK); 976 977 rtw89_write32(rtwdev, reg, val32); 978 979 return 0; 980 } 981 982 static int spatial_reuse_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 983 { 984 u32 reg; 985 int ret; 986 987 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 988 if (ret) 989 return ret; 990 991 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_SR_CTRL, mac_idx); 992 rtw89_write8_clr(rtwdev, reg, B_BE_SR_EN | B_BE_SR_CTRL_PLCP_EN); 993 994 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_BSSID_SRC_CTRL, mac_idx); 995 rtw89_write8_set(rtwdev, reg, B_BE_PLCP_SRC_EN); 996 997 return 0; 998 } 999 1000 static int tmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1001 { 1002 u32 reg; 1003 1004 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TB_PPDU_CTRL, mac_idx); 1005 rtw89_write32_clr(rtwdev, reg, B_BE_QOSNULL_UPD_MUEDCA_EN); 1006 1007 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMTX_TCR_BE_4, mac_idx); 1008 rtw89_write32_mask(rtwdev, reg, B_BE_EHT_HE_PPDU_4XLTF_ZLD_USTIMER_MASK, 0x12); 1009 rtw89_write32_mask(rtwdev, reg, B_BE_EHT_HE_PPDU_2XLTF_ZLD_USTIMER_MASK, 0xe); 1010 1011 return 0; 1012 } 1013 1014 static int trxptcl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1015 { 1016 const struct rtw89_chip_info *chip = rtwdev->chip; 1017 const struct rtw89_rrsr_cfgs *rrsr = chip->rrsr_cfgs; 1018 struct rtw89_hal *hal = &rtwdev->hal; 1019 u32 val32; 1020 u32 reg; 1021 int ret; 1022 1023 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1024 if (ret) 1025 return ret; 1026 1027 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_MAC_LOOPBACK, mac_idx); 1028 val32 = rtw89_read32(rtwdev, reg); 1029 val32 = u32_replace_bits(val32, S_BE_MACLBK_PLCP_DLY_DEF, 1030 B_BE_MACLBK_PLCP_DLY_MASK); 1031 val32 &= ~B_BE_MACLBK_EN; 1032 rtw89_write32(rtwdev, reg, val32); 1033 1034 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_0, mac_idx); 1035 val32 = rtw89_read32(rtwdev, reg); 1036 val32 = u32_replace_bits(val32, WMAC_SPEC_SIFS_CCK, 1037 B_BE_WMAC_SPEC_SIFS_CCK_MASK); 1038 val32 = u32_replace_bits(val32, WMAC_SPEC_SIFS_OFDM_1115E, 1039 B_BE_WMAC_SPEC_SIFS_OFDM_MASK); 1040 rtw89_write32(rtwdev, reg, val32); 1041 1042 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_ACK_BA_RESP_LEGACY, mac_idx); 1043 rtw89_write32_clr(rtwdev, reg, B_BE_ACK_BA_RESP_LEGACY_CHK_EDCCA); 1044 1045 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_ACK_BA_RESP_HE, mac_idx); 1046 rtw89_write32_clr(rtwdev, reg, B_BE_ACK_BA_RESP_HE_CHK_EDCCA); 1047 1048 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_WMAC_ACK_BA_RESP_EHT_LEG_PUNC, mac_idx); 1049 rtw89_write32_clr(rtwdev, reg, B_BE_ACK_BA_EHT_LEG_PUNC_CHK_EDCCA); 1050 1051 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RXTRIG_TEST_USER_2, mac_idx); 1052 rtw89_write32_set(rtwdev, reg, B_BE_RXTRIG_FCSCHK_EN); 1053 1054 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_1, mac_idx); 1055 val32 = rtw89_read32(rtwdev, reg); 1056 val32 &= B_BE_FTM_RRSR_RATE_EN_MASK | B_BE_WMAC_RESP_DOPPLEB_BE_EN | 1057 B_BE_WMAC_RESP_DCM_EN | B_BE_WMAC_RESP_REF_RATE_MASK; 1058 rtw89_write32(rtwdev, reg, val32); 1059 rtw89_write32_mask(rtwdev, reg, rrsr->ref_rate.mask, rrsr->ref_rate.data); 1060 1061 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_RRSR1, mac_idx); 1062 val32 = rtw89_read32(rtwdev, reg); 1063 val32 &= B_BE_RRSR_RATE_EN_MASK | B_BE_RRSR_CCK_MASK | B_BE_RSC_MASK; 1064 rtw89_write32(rtwdev, reg, val32); 1065 1066 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_RRSR0, mac_idx); 1067 val32 = rtw89_read32(rtwdev, reg); 1068 val32 &= B_BE_RRSR_OFDM_MASK | B_BE_RRSR_HT_MASK | B_BE_RRSR_VHT_MASK | 1069 B_BE_RRSR_HE_MASK; 1070 rtw89_write32(rtwdev, reg, val32); 1071 1072 if (chip->chip_id == RTL8922A && hal->cv == CHIP_CAV) { 1073 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_RRSR1, mac_idx); 1074 rtw89_write32_mask(rtwdev, reg, B_BE_RSC_MASK, 1); 1075 } 1076 1077 return 0; 1078 } 1079 1080 static int rst_bacam_be(struct rtw89_dev *rtwdev) 1081 { 1082 u32 val; 1083 int ret; 1084 1085 rtw89_write32_mask(rtwdev, R_BE_RESPBA_CAM_CTRL, B_BE_BACAM_RST_MASK, 1086 S_BE_BACAM_RST_ALL); 1087 1088 ret = read_poll_timeout_atomic(rtw89_read32_mask, val, val == S_BE_BACAM_RST_DONE, 1089 1, 1000, false, 1090 rtwdev, R_BE_RESPBA_CAM_CTRL, B_BE_BACAM_RST_MASK); 1091 if (ret) 1092 rtw89_err(rtwdev, "[ERR]bacam rst timeout\n"); 1093 1094 return ret; 1095 } 1096 1097 #define PLD_RLS_MAX_PG 127 1098 #define RX_MAX_LEN_UNIT 512 1099 #define RX_SPEC_MAX_LEN (11454 + RX_MAX_LEN_UNIT) 1100 1101 static int rmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1102 { 1103 u32 rx_min_qta, rx_max_len, rx_max_pg; 1104 u16 val16; 1105 u32 reg; 1106 int ret; 1107 1108 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1109 if (ret) 1110 return ret; 1111 1112 if (mac_idx == RTW89_MAC_0) { 1113 ret = rst_bacam_be(rtwdev); 1114 if (ret) 1115 return ret; 1116 } 1117 1118 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_DLK_PROTECT_CTL, mac_idx); 1119 val16 = rtw89_read16(rtwdev, reg); 1120 val16 = u16_replace_bits(val16, TRXCFG_RMAC_DATA_TO, B_BE_RX_DLK_DATA_TIME_MASK); 1121 val16 = u16_replace_bits(val16, TRXCFG_RMAC_CCA_TO, B_BE_RX_DLK_CCA_TIME_MASK); 1122 val16 |= B_BE_RX_DLK_RST_EN; 1123 rtw89_write16(rtwdev, reg, val16); 1124 1125 if (mac_idx == RTW89_MAC_0) 1126 rx_min_qta = rtwdev->mac.dle_info.c0_rx_qta; 1127 else 1128 rx_min_qta = rtwdev->mac.dle_info.c1_rx_qta; 1129 rx_max_pg = min_t(u32, rx_min_qta, PLD_RLS_MAX_PG); 1130 rx_max_len = rx_max_pg * rtwdev->mac.dle_info.ple_pg_size; 1131 rx_max_len = min_t(u32, rx_max_len, RX_SPEC_MAX_LEN); 1132 rx_max_len /= RX_MAX_LEN_UNIT; 1133 1134 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_FLTR_OPT, mac_idx); 1135 rtw89_write32_mask(rtwdev, reg, B_BE_RX_MPDU_MAX_LEN_MASK, rx_max_len); 1136 1137 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PLCP_HDR_FLTR, mac_idx); 1138 rtw89_write8_clr(rtwdev, reg, B_BE_VHT_SU_SIGB_CRC_CHK); 1139 1140 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RCR, mac_idx); 1141 rtw89_write16_set(rtwdev, reg, B_BE_BUSY_CHKSN); 1142 1143 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_PLCP_EXT_OPTION_1, mac_idx); 1144 rtw89_write16_set(rtwdev, reg, B_BE_PLCP_SU_PSDU_LEN_SRC); 1145 1146 return 0; 1147 } 1148 1149 static int resp_pktctl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1150 { 1151 struct rtw89_mac_dle_rsvd_qt_cfg qt_cfg; 1152 enum rtw89_mac_dle_rsvd_qt_type type; 1153 u32 reg; 1154 int ret; 1155 1156 if (mac_idx == RTW89_MAC_1) 1157 type = DLE_RSVD_QT_B1_CSI; 1158 else 1159 type = DLE_RSVD_QT_B0_CSI; 1160 1161 ret = rtw89_mac_get_dle_rsvd_qt_cfg(rtwdev, type, &qt_cfg); 1162 if (ret) { 1163 rtw89_err(rtwdev, "get dle rsvd qt %d cfg fail %d\n", type, ret); 1164 return ret; 1165 } 1166 1167 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RESP_CSI_RESERVED_PAGE, mac_idx); 1168 rtw89_write32_mask(rtwdev, reg, B_BE_CSI_RESERVED_START_PAGE_MASK, qt_cfg.pktid); 1169 rtw89_write32_mask(rtwdev, reg, B_BE_CSI_RESERVED_PAGE_NUM_MASK, qt_cfg.pg_num); 1170 1171 return 0; 1172 } 1173 1174 static int cmac_com_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1175 { 1176 u32 val32; 1177 int ret; 1178 1179 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1180 if (ret) 1181 return ret; 1182 1183 if (mac_idx == RTW89_MAC_0) { 1184 val32 = rtw89_read32(rtwdev, R_BE_TX_SUB_BAND_VALUE); 1185 val32 = u32_replace_bits(val32, S_BE_TXSB_20M_8, B_BE_TXSB_20M_MASK); 1186 val32 = u32_replace_bits(val32, S_BE_TXSB_40M_4, B_BE_TXSB_40M_MASK); 1187 val32 = u32_replace_bits(val32, S_BE_TXSB_80M_2, B_BE_TXSB_80M_MASK); 1188 val32 = u32_replace_bits(val32, S_BE_TXSB_160M_1, B_BE_TXSB_160M_MASK); 1189 rtw89_write32(rtwdev, R_BE_TX_SUB_BAND_VALUE, val32); 1190 } else { 1191 val32 = rtw89_read32(rtwdev, R_BE_TX_SUB_BAND_VALUE_C1); 1192 val32 = u32_replace_bits(val32, S_BE_TXSB_20M_2, B_BE_TXSB_20M_MASK); 1193 val32 = u32_replace_bits(val32, S_BE_TXSB_40M_1, B_BE_TXSB_40M_MASK); 1194 val32 = u32_replace_bits(val32, S_BE_TXSB_80M_0, B_BE_TXSB_80M_MASK); 1195 val32 = u32_replace_bits(val32, S_BE_TXSB_160M_0, B_BE_TXSB_160M_MASK); 1196 rtw89_write32(rtwdev, R_BE_TX_SUB_BAND_VALUE_C1, val32); 1197 } 1198 1199 return 0; 1200 } 1201 1202 static int ptcl_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1203 { 1204 u32 val32; 1205 u8 val8; 1206 u32 reg; 1207 int ret; 1208 1209 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1210 if (ret) 1211 return ret; 1212 1213 if (is_qta_poh(rtwdev)) { 1214 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_SIFS_SETTING, mac_idx); 1215 val32 = rtw89_read32(rtwdev, reg); 1216 val32 = u32_replace_bits(val32, S_AX_CTS2S_TH_1K, 1217 B_BE_HW_CTS2SELF_PKT_LEN_TH_MASK); 1218 val32 = u32_replace_bits(val32, S_AX_CTS2S_TH_SEC_256B, 1219 B_BE_HW_CTS2SELF_PKT_LEN_TH_TWW_MASK); 1220 val32 |= B_BE_HW_CTS2SELF_EN; 1221 rtw89_write32(rtwdev, reg, val32); 1222 1223 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_FSM_MON, mac_idx); 1224 val32 = rtw89_read32(rtwdev, reg); 1225 val32 = u32_replace_bits(val32, S_AX_PTCL_TO_2MS, 1226 B_BE_PTCL_TX_ARB_TO_THR_MASK); 1227 val32 &= ~B_BE_PTCL_TX_ARB_TO_MODE; 1228 rtw89_write32(rtwdev, reg, val32); 1229 } 1230 1231 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_COMMON_SETTING_0, mac_idx); 1232 val8 = rtw89_read8(rtwdev, reg); 1233 val8 |= B_BE_CMAC_TX_MODE_0 | B_BE_CMAC_TX_MODE_1; 1234 val8 &= ~(B_BE_PTCL_TRIGGER_SS_EN_0 | 1235 B_BE_PTCL_TRIGGER_SS_EN_1 | 1236 B_BE_PTCL_TRIGGER_SS_EN_UL); 1237 rtw89_write8(rtwdev, reg, val8); 1238 1239 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_AMPDU_AGG_LIMIT, mac_idx); 1240 rtw89_write32_mask(rtwdev, reg, B_BE_AMPDU_MAX_TIME_MASK, AMPDU_MAX_TIME); 1241 1242 return 0; 1243 } 1244 1245 static int cmac_dma_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1246 { 1247 u32 val32; 1248 u32 reg; 1249 int ret; 1250 1251 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1252 if (ret) 1253 return ret; 1254 1255 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_RX_CTRL_1, mac_idx); 1256 1257 val32 = rtw89_read32(rtwdev, reg); 1258 val32 = u32_replace_bits(val32, WLCPU_RXCH2_QID, 1259 B_BE_RXDMA_TXRPT_QUEUE_ID_SW_MASK); 1260 val32 = u32_replace_bits(val32, WLCPU_RXCH2_QID, 1261 B_BE_RXDMA_F2PCMDRPT_QUEUE_ID_SW_MASK); 1262 rtw89_write32(rtwdev, reg, val32); 1263 1264 return 0; 1265 } 1266 1267 static int cmac_init_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1268 { 1269 int ret; 1270 1271 ret = scheduler_init_be(rtwdev, mac_idx); 1272 if (ret) { 1273 rtw89_err(rtwdev, "[ERR]CMAC%d SCH init %d\n", mac_idx, ret); 1274 return ret; 1275 } 1276 1277 ret = addr_cam_init_be(rtwdev, mac_idx); 1278 if (ret) { 1279 rtw89_err(rtwdev, "[ERR]CMAC%d ADDR_CAM reset %d\n", mac_idx, 1280 ret); 1281 return ret; 1282 } 1283 1284 ret = rx_fltr_init_be(rtwdev, mac_idx); 1285 if (ret) { 1286 rtw89_err(rtwdev, "[ERR]CMAC%d RX filter init %d\n", mac_idx, 1287 ret); 1288 return ret; 1289 } 1290 1291 ret = cca_ctrl_init_be(rtwdev, mac_idx); 1292 if (ret) { 1293 rtw89_err(rtwdev, "[ERR]CMAC%d CCA CTRL init %d\n", mac_idx, 1294 ret); 1295 return ret; 1296 } 1297 1298 ret = nav_ctrl_init_be(rtwdev, mac_idx); 1299 if (ret) { 1300 rtw89_err(rtwdev, "[ERR]CMAC%d NAV CTRL init %d\n", mac_idx, 1301 ret); 1302 return ret; 1303 } 1304 1305 ret = spatial_reuse_init_be(rtwdev, mac_idx); 1306 if (ret) { 1307 rtw89_err(rtwdev, "[ERR]CMAC%d Spatial Reuse init %d\n", 1308 mac_idx, ret); 1309 return ret; 1310 } 1311 1312 ret = tmac_init_be(rtwdev, mac_idx); 1313 if (ret) { 1314 rtw89_err(rtwdev, "[ERR]CMAC%d TMAC init %d\n", mac_idx, ret); 1315 return ret; 1316 } 1317 1318 ret = trxptcl_init_be(rtwdev, mac_idx); 1319 if (ret) { 1320 rtw89_err(rtwdev, "[ERR]CMAC%d TRXPTCL init %d\n", mac_idx, ret); 1321 return ret; 1322 } 1323 1324 ret = rmac_init_be(rtwdev, mac_idx); 1325 if (ret) { 1326 rtw89_err(rtwdev, "[ERR]CMAC%d RMAC init %d\n", mac_idx, ret); 1327 return ret; 1328 } 1329 1330 ret = resp_pktctl_init_be(rtwdev, mac_idx); 1331 if (ret) { 1332 rtw89_err(rtwdev, "[ERR]CMAC%d resp pktctl init %d\n", mac_idx, ret); 1333 return ret; 1334 } 1335 1336 ret = cmac_com_init_be(rtwdev, mac_idx); 1337 if (ret) { 1338 rtw89_err(rtwdev, "[ERR]CMAC%d Com init %d\n", mac_idx, ret); 1339 return ret; 1340 } 1341 1342 ret = ptcl_init_be(rtwdev, mac_idx); 1343 if (ret) { 1344 rtw89_err(rtwdev, "[ERR]CMAC%d PTCL init %d\n", mac_idx, ret); 1345 return ret; 1346 } 1347 1348 ret = cmac_dma_init_be(rtwdev, mac_idx); 1349 if (ret) { 1350 rtw89_err(rtwdev, "[ERR]CMAC%d DMA init %d\n", mac_idx, ret); 1351 return ret; 1352 } 1353 1354 return ret; 1355 } 1356 1357 static int tx_idle_poll_band_be(struct rtw89_dev *rtwdev, u8 mac_idx) 1358 { 1359 u32 reg; 1360 u8 val8; 1361 int ret; 1362 1363 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1364 if (ret) 1365 return ret; 1366 1367 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PTCL_TX_CTN_SEL, mac_idx); 1368 1369 ret = read_poll_timeout_atomic(rtw89_read8, val8, !(val8 & B_BE_PTCL_BUSY), 1370 30, 66000, false, rtwdev, reg); 1371 1372 return ret; 1373 } 1374 1375 static int dle_buf_req_be(struct rtw89_dev *rtwdev, u16 buf_len, bool wd, u16 *pkt_id) 1376 { 1377 u32 val, reg; 1378 int ret; 1379 1380 reg = wd ? R_BE_WD_BUF_REQ : R_BE_PL_BUF_REQ; 1381 val = buf_len; 1382 val |= B_BE_WD_BUF_REQ_EXEC; 1383 rtw89_write32(rtwdev, reg, val); 1384 1385 reg = wd ? R_BE_WD_BUF_STATUS : R_BE_PL_BUF_STATUS; 1386 1387 ret = read_poll_timeout(rtw89_read32, val, val & B_BE_WD_BUF_STAT_DONE, 1388 1, 2000, false, rtwdev, reg); 1389 if (ret) 1390 return ret; 1391 1392 *pkt_id = u32_get_bits(val, B_BE_WD_BUF_STAT_PKTID_MASK); 1393 if (*pkt_id == S_WD_BUF_STAT_PKTID_INVALID) 1394 return -ENOENT; 1395 1396 return 0; 1397 } 1398 1399 static int set_cpuio_be(struct rtw89_dev *rtwdev, 1400 struct rtw89_cpuio_ctrl *ctrl_para, bool wd) 1401 { 1402 u32 val_op0, val_op1, val_op2, val_op3; 1403 u32 val, cmd_type, reg; 1404 int ret; 1405 1406 cmd_type = ctrl_para->cmd_type; 1407 1408 reg = wd ? R_BE_WD_CPUQ_OP_3 : R_BE_PL_CPUQ_OP_3; 1409 val_op3 = u32_replace_bits(0, ctrl_para->start_pktid, 1410 B_BE_WD_CPUQ_OP_STRT_PKTID_MASK); 1411 val_op3 = u32_replace_bits(val_op3, ctrl_para->end_pktid, 1412 B_BE_WD_CPUQ_OP_END_PKTID_MASK); 1413 rtw89_write32(rtwdev, reg, val_op3); 1414 1415 reg = wd ? R_BE_WD_CPUQ_OP_1 : R_BE_PL_CPUQ_OP_1; 1416 val_op1 = u32_replace_bits(0, ctrl_para->src_pid, 1417 B_BE_WD_CPUQ_OP_SRC_PID_MASK); 1418 val_op1 = u32_replace_bits(val_op1, ctrl_para->src_qid, 1419 B_BE_WD_CPUQ_OP_SRC_QID_MASK); 1420 val_op1 = u32_replace_bits(val_op1, ctrl_para->macid, 1421 B_BE_WD_CPUQ_OP_SRC_MACID_MASK); 1422 rtw89_write32(rtwdev, reg, val_op1); 1423 1424 reg = wd ? R_BE_WD_CPUQ_OP_2 : R_BE_PL_CPUQ_OP_2; 1425 val_op2 = u32_replace_bits(0, ctrl_para->dst_pid, 1426 B_BE_WD_CPUQ_OP_DST_PID_MASK); 1427 val_op2 = u32_replace_bits(val_op2, ctrl_para->dst_qid, 1428 B_BE_WD_CPUQ_OP_DST_QID_MASK); 1429 val_op2 = u32_replace_bits(val_op2, ctrl_para->macid, 1430 B_BE_WD_CPUQ_OP_DST_MACID_MASK); 1431 rtw89_write32(rtwdev, reg, val_op2); 1432 1433 reg = wd ? R_BE_WD_CPUQ_OP_0 : R_BE_PL_CPUQ_OP_0; 1434 val_op0 = u32_replace_bits(0, cmd_type, 1435 B_BE_WD_CPUQ_OP_CMD_TYPE_MASK); 1436 val_op0 = u32_replace_bits(val_op0, ctrl_para->pkt_num, 1437 B_BE_WD_CPUQ_OP_PKTNUM_MASK); 1438 val_op0 |= B_BE_WD_CPUQ_OP_EXEC; 1439 rtw89_write32(rtwdev, reg, val_op0); 1440 1441 reg = wd ? R_BE_WD_CPUQ_OP_STATUS : R_BE_PL_CPUQ_OP_STATUS; 1442 1443 ret = read_poll_timeout(rtw89_read32, val, val & B_BE_WD_CPUQ_OP_STAT_DONE, 1444 1, 2000, false, rtwdev, reg); 1445 if (ret) { 1446 rtw89_err(rtwdev, "[ERR]set cpuio wd timeout\n"); 1447 rtw89_err(rtwdev, "[ERR]op_0=0x%X, op_1=0x%X, op_2=0x%X\n", 1448 val_op0, val_op1, val_op2); 1449 return ret; 1450 } 1451 1452 if (cmd_type == CPUIO_OP_CMD_GET_NEXT_PID || 1453 cmd_type == CPUIO_OP_CMD_GET_1ST_PID) 1454 ctrl_para->pktid = u32_get_bits(val, B_BE_WD_CPUQ_OP_PKTID_MASK); 1455 1456 return 0; 1457 } 1458 1459 static int dle_upd_qta_aval_page_be(struct rtw89_dev *rtwdev, 1460 enum rtw89_mac_dle_ctrl_type type, 1461 enum rtw89_mac_dle_ple_quota_id quota_id) 1462 { 1463 u32 val; 1464 1465 if (type == DLE_CTRL_TYPE_WDE) { 1466 rtw89_write32_mask(rtwdev, R_BE_WDE_BUFMGN_CTL, 1467 B_BE_WDE_AVAL_UPD_QTAID_MASK, quota_id); 1468 rtw89_write32_set(rtwdev, R_BE_WDE_BUFMGN_CTL, B_BE_WDE_AVAL_UPD_REQ); 1469 1470 return read_poll_timeout(rtw89_read32, val, 1471 !(val & B_BE_WDE_AVAL_UPD_REQ), 1472 1, 2000, false, rtwdev, R_BE_WDE_BUFMGN_CTL); 1473 } else if (type == DLE_CTRL_TYPE_PLE) { 1474 rtw89_write32_mask(rtwdev, R_BE_PLE_BUFMGN_CTL, 1475 B_BE_PLE_AVAL_UPD_QTAID_MASK, quota_id); 1476 rtw89_write32_set(rtwdev, R_BE_PLE_BUFMGN_CTL, B_BE_PLE_AVAL_UPD_REQ); 1477 1478 return read_poll_timeout(rtw89_read32, val, 1479 !(val & B_BE_PLE_AVAL_UPD_REQ), 1480 1, 2000, false, rtwdev, R_BE_PLE_BUFMGN_CTL); 1481 } 1482 1483 rtw89_warn(rtwdev, "%s wrong type %d\n", __func__, type); 1484 return -EINVAL; 1485 } 1486 1487 static int dle_quota_change_be(struct rtw89_dev *rtwdev, bool band1_en) 1488 { 1489 int ret; 1490 1491 if (band1_en) { 1492 ret = dle_upd_qta_aval_page_be(rtwdev, DLE_CTRL_TYPE_PLE, 1493 PLE_QTAID_B0_TXPL); 1494 if (ret) { 1495 rtw89_err(rtwdev, "update PLE B0 TX avail page fail %d\n", ret); 1496 return ret; 1497 } 1498 1499 ret = dle_upd_qta_aval_page_be(rtwdev, DLE_CTRL_TYPE_PLE, 1500 PLE_QTAID_CMAC0_RX); 1501 if (ret) { 1502 rtw89_err(rtwdev, "update PLE CMAC0 RX avail page fail %d\n", ret); 1503 return ret; 1504 } 1505 } else { 1506 ret = dle_upd_qta_aval_page_be(rtwdev, DLE_CTRL_TYPE_PLE, 1507 PLE_QTAID_B1_TXPL); 1508 if (ret) { 1509 rtw89_err(rtwdev, "update PLE B1 TX avail page fail %d\n", ret); 1510 return ret; 1511 } 1512 1513 ret = dle_upd_qta_aval_page_be(rtwdev, DLE_CTRL_TYPE_PLE, 1514 PLE_QTAID_CMAC1_RX); 1515 if (ret) { 1516 rtw89_err(rtwdev, "update PLE CMAC1 RX avail page fail %d\n", ret); 1517 return ret; 1518 } 1519 } 1520 1521 return 0; 1522 } 1523 1524 static int preload_init_be(struct rtw89_dev *rtwdev, u8 mac_idx, 1525 enum rtw89_qta_mode mode) 1526 { 1527 u32 max_preld_size, min_rsvd_size; 1528 u32 val32; 1529 u32 reg; 1530 1531 max_preld_size = mac_idx == RTW89_MAC_0 ? 1532 PRELD_B0_ENT_NUM : PRELD_B1_ENT_NUM; 1533 max_preld_size *= PRELD_AMSDU_SIZE; 1534 1535 reg = mac_idx == RTW89_MAC_0 ? R_BE_TXPKTCTL_B0_PRELD_CFG0 : 1536 R_BE_TXPKTCTL_B1_PRELD_CFG0; 1537 val32 = rtw89_read32(rtwdev, reg); 1538 val32 = u32_replace_bits(val32, max_preld_size, B_BE_B0_PRELD_USEMAXSZ_MASK); 1539 val32 |= B_BE_B0_PRELD_FEN; 1540 rtw89_write32(rtwdev, reg, val32); 1541 1542 min_rsvd_size = PRELD_AMSDU_SIZE; 1543 reg = mac_idx == RTW89_MAC_0 ? R_BE_TXPKTCTL_B0_PRELD_CFG1 : 1544 R_BE_TXPKTCTL_B1_PRELD_CFG1; 1545 val32 = rtw89_read32(rtwdev, reg); 1546 val32 = u32_replace_bits(val32, PRELD_NEXT_WND, B_BE_B0_PRELD_NXT_TXENDWIN_MASK); 1547 val32 = u32_replace_bits(val32, min_rsvd_size, B_BE_B0_PRELD_NXT_RSVMINSZ_MASK); 1548 rtw89_write32(rtwdev, reg, val32); 1549 1550 return 0; 1551 } 1552 1553 static int dbcc_bb_ctrl_be(struct rtw89_dev *rtwdev, bool bb1_en) 1554 { 1555 u32 set = B_BE_FEN_BB1PLAT_RSTB | B_BE_FEN_BB1_IP_RSTN; 1556 1557 if (bb1_en) 1558 rtw89_write32_set(rtwdev, R_BE_FEN_RST_ENABLE, set); 1559 else 1560 rtw89_write32_clr(rtwdev, R_BE_FEN_RST_ENABLE, set); 1561 1562 return 0; 1563 } 1564 1565 static int enable_imr_be(struct rtw89_dev *rtwdev, u8 mac_idx, 1566 enum rtw89_mac_hwmod_sel sel) 1567 { 1568 const struct rtw89_chip_info *chip = rtwdev->chip; 1569 const struct rtw89_imr_table *table; 1570 const struct rtw89_reg_imr *reg; 1571 u32 addr; 1572 u32 val; 1573 int i; 1574 1575 if (sel == RTW89_DMAC_SEL) 1576 table = chip->imr_dmac_table; 1577 else if (sel == RTW89_CMAC_SEL) 1578 table = chip->imr_cmac_table; 1579 else 1580 return -EINVAL; 1581 1582 for (i = 0; i < table->n_regs; i++) { 1583 reg = &table->regs[i]; 1584 addr = rtw89_mac_reg_by_idx(rtwdev, reg->addr, mac_idx); 1585 1586 val = rtw89_read32(rtwdev, addr); 1587 val &= ~reg->clr; 1588 val |= reg->set; 1589 rtw89_write32(rtwdev, addr, val); 1590 } 1591 1592 return 0; 1593 } 1594 1595 static void err_imr_ctrl_be(struct rtw89_dev *rtwdev, bool en) 1596 { 1597 u32 v32_dmac = en ? DMAC_ERR_IMR_EN : DMAC_ERR_IMR_DIS; 1598 u32 v32_cmac0 = en ? CMAC0_ERR_IMR_EN : CMAC0_ERR_IMR_DIS; 1599 u32 v32_cmac1 = en ? CMAC1_ERR_IMR_EN : CMAC1_ERR_IMR_DIS; 1600 1601 v32_dmac &= ~B_BE_DMAC_NOTX_ERR_INT_EN; 1602 1603 rtw89_write32(rtwdev, R_BE_DMAC_ERR_IMR, v32_dmac); 1604 rtw89_write32(rtwdev, R_BE_CMAC_ERR_IMR, v32_cmac0); 1605 1606 if (rtwdev->dbcc_en) 1607 rtw89_write32(rtwdev, R_BE_CMAC_ERR_IMR_C1, v32_cmac1); 1608 } 1609 1610 static int band1_enable_be(struct rtw89_dev *rtwdev) 1611 { 1612 int ret; 1613 1614 ret = tx_idle_poll_band_be(rtwdev, RTW89_MAC_0); 1615 if (ret) { 1616 rtw89_err(rtwdev, "[ERR]tx idle poll %d\n", ret); 1617 return ret; 1618 } 1619 1620 ret = rtw89_mac_dle_quota_change(rtwdev, rtwdev->mac.qta_mode, true); 1621 if (ret) { 1622 rtw89_err(rtwdev, "[ERR]DLE quota change %d\n", ret); 1623 return ret; 1624 } 1625 1626 ret = preload_init_be(rtwdev, RTW89_MAC_1, rtwdev->mac.qta_mode); 1627 if (ret) { 1628 rtw89_err(rtwdev, "[ERR]preload init B1 %d\n", ret); 1629 return ret; 1630 } 1631 1632 ret = cmac_func_en_be(rtwdev, RTW89_MAC_1, true); 1633 if (ret) { 1634 rtw89_err(rtwdev, "[ERR]CMAC%d func en %d\n", RTW89_MAC_1, ret); 1635 return ret; 1636 } 1637 1638 ret = cmac_init_be(rtwdev, RTW89_MAC_1); 1639 if (ret) { 1640 rtw89_err(rtwdev, "[ERR]CMAC%d init %d\n", RTW89_MAC_1, ret); 1641 return ret; 1642 } 1643 1644 ret = dbcc_bb_ctrl_be(rtwdev, true); 1645 if (ret) { 1646 rtw89_err(rtwdev, "[ERR]enable bb 1 %d\n", ret); 1647 return ret; 1648 } 1649 1650 ret = enable_imr_be(rtwdev, RTW89_MAC_1, RTW89_CMAC_SEL); 1651 if (ret) { 1652 rtw89_err(rtwdev, "[ERR] enable CMAC1 IMR %d\n", ret); 1653 return ret; 1654 } 1655 1656 return 0; 1657 } 1658 1659 static int band1_disable_be(struct rtw89_dev *rtwdev) 1660 { 1661 int ret; 1662 1663 ret = dbcc_bb_ctrl_be(rtwdev, false); 1664 if (ret) { 1665 rtw89_err(rtwdev, "[ERR]disable bb 1 %d\n", ret); 1666 return ret; 1667 } 1668 1669 ret = cmac_func_en_be(rtwdev, RTW89_MAC_1, false); 1670 if (ret) { 1671 rtw89_err(rtwdev, "[ERR]CMAC%d func dis %d\n", RTW89_MAC_1, ret); 1672 return ret; 1673 } 1674 1675 ret = rtw89_mac_dle_quota_change(rtwdev, rtwdev->mac.qta_mode, false); 1676 if (ret) { 1677 rtw89_err(rtwdev, "[ERR]DLE quota change %d\n", ret); 1678 return ret; 1679 } 1680 1681 return 0; 1682 } 1683 1684 static int dbcc_enable_be(struct rtw89_dev *rtwdev, bool enable) 1685 { 1686 int ret; 1687 1688 if (enable) { 1689 ret = band1_enable_be(rtwdev); 1690 if (ret) { 1691 rtw89_err(rtwdev, "[ERR] band1_enable %d\n", ret); 1692 return ret; 1693 } 1694 1695 if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags)) { 1696 ret = rtw89_fw_h2c_notify_dbcc(rtwdev, true); 1697 if (ret) { 1698 rtw89_err(rtwdev, "%s:[ERR] notify dbcc1 fail %d\n", 1699 __func__, ret); 1700 return ret; 1701 } 1702 } 1703 } else { 1704 if (test_bit(RTW89_FLAG_FW_RDY, rtwdev->flags)) { 1705 ret = rtw89_fw_h2c_notify_dbcc(rtwdev, false); 1706 if (ret) { 1707 rtw89_err(rtwdev, "%s:[ERR] notify dbcc1 fail %d\n", 1708 __func__, ret); 1709 return ret; 1710 } 1711 } 1712 1713 ret = band1_disable_be(rtwdev); 1714 if (ret) { 1715 rtw89_err(rtwdev, "[ERR] band1_disable %d\n", ret); 1716 return ret; 1717 } 1718 } 1719 1720 return 0; 1721 } 1722 1723 static int set_host_rpr_be(struct rtw89_dev *rtwdev) 1724 { 1725 u32 val32; 1726 u32 mode; 1727 u32 fltr; 1728 bool poh; 1729 1730 poh = is_qta_poh(rtwdev); 1731 1732 if (poh) { 1733 mode = RTW89_RPR_MODE_POH; 1734 fltr = S_BE_WDRLS_FLTR_TXOK | S_BE_WDRLS_FLTR_RTYLMT | 1735 S_BE_WDRLS_FLTR_LIFTIM | S_BE_WDRLS_FLTR_MACID; 1736 } else { 1737 mode = RTW89_RPR_MODE_STF; 1738 fltr = 0; 1739 } 1740 1741 rtw89_write32_mask(rtwdev, R_BE_WDRLS_CFG, B_BE_WDRLS_MODE_MASK, mode); 1742 1743 val32 = rtw89_read32(rtwdev, R_BE_RLSRPT0_CFG1); 1744 val32 = u32_replace_bits(val32, fltr, B_BE_RLSRPT0_FLTR_MAP_MASK); 1745 val32 = u32_replace_bits(val32, 30, B_BE_RLSRPT0_AGGNUM_MASK); 1746 val32 = u32_replace_bits(val32, 255, B_BE_RLSRPT0_TO_MASK); 1747 rtw89_write32(rtwdev, R_BE_RLSRPT0_CFG1, val32); 1748 1749 return 0; 1750 } 1751 1752 static int trx_init_be(struct rtw89_dev *rtwdev) 1753 { 1754 enum rtw89_qta_mode qta_mode = rtwdev->mac.qta_mode; 1755 int ret; 1756 1757 ret = dmac_init_be(rtwdev, 0); 1758 if (ret) { 1759 rtw89_err(rtwdev, "[ERR]DMAC init %d\n", ret); 1760 return ret; 1761 } 1762 1763 ret = cmac_init_be(rtwdev, 0); 1764 if (ret) { 1765 rtw89_err(rtwdev, "[ERR]CMAC%d init %d\n", 0, ret); 1766 return ret; 1767 } 1768 1769 if (rtw89_mac_is_qta_dbcc(rtwdev, qta_mode)) { 1770 ret = dbcc_enable_be(rtwdev, true); 1771 if (ret) { 1772 rtw89_err(rtwdev, "[ERR]dbcc_enable init %d\n", ret); 1773 return ret; 1774 } 1775 } 1776 1777 ret = enable_imr_be(rtwdev, RTW89_MAC_0, RTW89_DMAC_SEL); 1778 if (ret) { 1779 rtw89_err(rtwdev, "[ERR] enable DMAC IMR %d\n", ret); 1780 return ret; 1781 } 1782 1783 ret = enable_imr_be(rtwdev, RTW89_MAC_0, RTW89_CMAC_SEL); 1784 if (ret) { 1785 rtw89_err(rtwdev, "[ERR] to enable CMAC0 IMR %d\n", ret); 1786 return ret; 1787 } 1788 1789 err_imr_ctrl_be(rtwdev, true); 1790 1791 ret = set_host_rpr_be(rtwdev); 1792 if (ret) { 1793 rtw89_err(rtwdev, "[ERR] set host rpr %d\n", ret); 1794 return ret; 1795 } 1796 1797 return 0; 1798 } 1799 1800 int rtw89_mac_cfg_gnt_v2(struct rtw89_dev *rtwdev, 1801 const struct rtw89_mac_ax_coex_gnt *gnt_cfg) 1802 { 1803 u32 val = 0; 1804 1805 if (gnt_cfg->band[0].gnt_bt) 1806 val |= B_BE_GNT_BT_BB0_VAL | B_BE_GNT_BT_RX_BB0_VAL | 1807 B_BE_GNT_BT_TX_BB0_VAL; 1808 1809 if (gnt_cfg->band[0].gnt_bt_sw_en) 1810 val |= B_BE_GNT_BT_BB0_SWCTRL | B_BE_GNT_BT_RX_BB0_SWCTRL | 1811 B_BE_GNT_BT_TX_BB0_SWCTRL; 1812 1813 if (gnt_cfg->band[0].gnt_wl) 1814 val |= B_BE_GNT_WL_BB0_VAL | B_BE_GNT_WL_RX_VAL | 1815 B_BE_GNT_WL_TX_VAL | B_BE_GNT_WL_BB_PWR_VAL; 1816 1817 if (gnt_cfg->band[0].gnt_wl_sw_en) 1818 val |= B_BE_GNT_WL_BB0_SWCTRL | B_BE_GNT_WL_RX_SWCTRL | 1819 B_BE_GNT_WL_TX_SWCTRL | B_BE_GNT_WL_BB_PWR_SWCTRL; 1820 1821 if (gnt_cfg->band[1].gnt_bt) 1822 val |= B_BE_GNT_BT_BB1_VAL | B_BE_GNT_BT_RX_BB1_VAL | 1823 B_BE_GNT_BT_TX_BB1_VAL; 1824 1825 if (gnt_cfg->band[1].gnt_bt_sw_en) 1826 val |= B_BE_GNT_BT_BB1_SWCTRL | B_BE_GNT_BT_RX_BB1_SWCTRL | 1827 B_BE_GNT_BT_TX_BB1_SWCTRL; 1828 1829 if (gnt_cfg->band[1].gnt_wl) 1830 val |= B_BE_GNT_WL_BB1_VAL | B_BE_GNT_WL_RX_VAL | 1831 B_BE_GNT_WL_TX_VAL | B_BE_GNT_WL_BB_PWR_VAL; 1832 1833 if (gnt_cfg->band[1].gnt_wl_sw_en) 1834 val |= B_BE_GNT_WL_BB1_SWCTRL | B_BE_GNT_WL_RX_SWCTRL | 1835 B_BE_GNT_WL_TX_SWCTRL | B_BE_GNT_WL_BB_PWR_SWCTRL; 1836 1837 if (gnt_cfg->bt[0].wlan_act_en) 1838 val |= B_BE_WL_ACT_SWCTRL; 1839 if (gnt_cfg->bt[0].wlan_act) 1840 val |= B_BE_WL_ACT_VAL; 1841 if (gnt_cfg->bt[1].wlan_act_en) 1842 val |= B_BE_WL_ACT2_SWCTRL; 1843 if (gnt_cfg->bt[1].wlan_act) 1844 val |= B_BE_WL_ACT2_VAL; 1845 1846 rtw89_write32(rtwdev, R_BE_GNT_SW_CTRL, val); 1847 1848 return 0; 1849 } 1850 EXPORT_SYMBOL(rtw89_mac_cfg_gnt_v2); 1851 1852 int rtw89_mac_cfg_ctrl_path_v2(struct rtw89_dev *rtwdev, bool wl) 1853 { 1854 struct rtw89_btc *btc = &rtwdev->btc; 1855 struct rtw89_btc_dm *dm = &btc->dm; 1856 struct rtw89_mac_ax_gnt *g = dm->gnt.band; 1857 struct rtw89_mac_ax_wl_act *gbt = dm->gnt.bt; 1858 int i; 1859 1860 if (wl) 1861 return 0; 1862 1863 for (i = 0; i < RTW89_PHY_MAX; i++) { 1864 g[i].gnt_bt_sw_en = 1; 1865 g[i].gnt_bt = 1; 1866 g[i].gnt_wl_sw_en = 1; 1867 g[i].gnt_wl = 0; 1868 gbt[i].wlan_act = 1; 1869 gbt[i].wlan_act_en = 0; 1870 } 1871 1872 return rtw89_mac_cfg_gnt_v2(rtwdev, &dm->gnt); 1873 } 1874 EXPORT_SYMBOL(rtw89_mac_cfg_ctrl_path_v2); 1875 1876 static 1877 int rtw89_mac_cfg_plt_be(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_plt *plt) 1878 { 1879 u32 reg; 1880 u16 val; 1881 int ret; 1882 1883 ret = rtw89_mac_check_mac_en(rtwdev, plt->band, RTW89_CMAC_SEL); 1884 if (ret) 1885 return ret; 1886 1887 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_BT_PLT, plt->band); 1888 val = (plt->tx & RTW89_MAC_AX_PLT_LTE_RX ? B_BE_TX_PLT_GNT_LTE_RX : 0) | 1889 (plt->tx & RTW89_MAC_AX_PLT_GNT_BT_TX ? B_BE_TX_PLT_GNT_BT_TX : 0) | 1890 (plt->tx & RTW89_MAC_AX_PLT_GNT_BT_RX ? B_BE_TX_PLT_GNT_BT_RX : 0) | 1891 (plt->tx & RTW89_MAC_AX_PLT_GNT_WL ? B_BE_TX_PLT_GNT_WL : 0) | 1892 (plt->rx & RTW89_MAC_AX_PLT_LTE_RX ? B_BE_RX_PLT_GNT_LTE_RX : 0) | 1893 (plt->rx & RTW89_MAC_AX_PLT_GNT_BT_TX ? B_BE_RX_PLT_GNT_BT_TX : 0) | 1894 (plt->rx & RTW89_MAC_AX_PLT_GNT_BT_RX ? B_BE_RX_PLT_GNT_BT_RX : 0) | 1895 (plt->rx & RTW89_MAC_AX_PLT_GNT_WL ? B_BE_RX_PLT_GNT_WL : 0) | 1896 B_BE_PLT_EN; 1897 rtw89_write16(rtwdev, reg, val); 1898 1899 return 0; 1900 } 1901 1902 static u16 rtw89_mac_get_plt_cnt_be(struct rtw89_dev *rtwdev, u8 band) 1903 { 1904 u32 reg; 1905 u16 cnt; 1906 1907 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_BT_PLT, band); 1908 cnt = rtw89_read32_mask(rtwdev, reg, B_BE_BT_PLT_PKT_CNT_MASK); 1909 rtw89_write16_set(rtwdev, reg, B_BE_BT_PLT_RST); 1910 1911 return cnt; 1912 } 1913 1914 static int rtw89_set_hw_sch_tx_en_v2(struct rtw89_dev *rtwdev, u8 mac_idx, 1915 u32 tx_en, u32 tx_en_mask) 1916 { 1917 u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CTN_DRV_TXEN, mac_idx); 1918 u32 val; 1919 int ret; 1920 1921 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1922 if (ret) 1923 return ret; 1924 1925 val = rtw89_read32(rtwdev, reg); 1926 val = (val & ~tx_en_mask) | (tx_en & tx_en_mask); 1927 rtw89_write32(rtwdev, reg, val); 1928 1929 return 0; 1930 } 1931 1932 int rtw89_mac_stop_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx, 1933 u32 *tx_en, enum rtw89_sch_tx_sel sel) 1934 { 1935 int ret; 1936 1937 *tx_en = rtw89_read32(rtwdev, 1938 rtw89_mac_reg_by_idx(rtwdev, R_BE_CTN_DRV_TXEN, mac_idx)); 1939 1940 switch (sel) { 1941 case RTW89_SCH_TX_SEL_ALL: 1942 ret = rtw89_set_hw_sch_tx_en_v2(rtwdev, mac_idx, 0, 1943 B_BE_CTN_TXEN_ALL_MASK); 1944 if (ret) 1945 return ret; 1946 break; 1947 case RTW89_SCH_TX_SEL_HIQ: 1948 ret = rtw89_set_hw_sch_tx_en_v2(rtwdev, mac_idx, 1949 0, B_BE_CTN_TXEN_HGQ); 1950 if (ret) 1951 return ret; 1952 break; 1953 case RTW89_SCH_TX_SEL_MG0: 1954 ret = rtw89_set_hw_sch_tx_en_v2(rtwdev, mac_idx, 1955 0, B_BE_CTN_TXEN_MGQ); 1956 if (ret) 1957 return ret; 1958 break; 1959 case RTW89_SCH_TX_SEL_MACID: 1960 ret = rtw89_set_hw_sch_tx_en_v2(rtwdev, mac_idx, 0, 1961 B_BE_CTN_TXEN_ALL_MASK); 1962 if (ret) 1963 return ret; 1964 break; 1965 default: 1966 return 0; 1967 } 1968 1969 return 0; 1970 } 1971 EXPORT_SYMBOL(rtw89_mac_stop_sch_tx_v2); 1972 1973 int rtw89_mac_resume_sch_tx_v2(struct rtw89_dev *rtwdev, u8 mac_idx, u32 tx_en) 1974 { 1975 int ret; 1976 1977 ret = rtw89_set_hw_sch_tx_en_v2(rtwdev, mac_idx, tx_en, 1978 B_BE_CTN_TXEN_ALL_MASK); 1979 if (ret) 1980 return ret; 1981 1982 return 0; 1983 } 1984 EXPORT_SYMBOL(rtw89_mac_resume_sch_tx_v2); 1985 1986 static 1987 int rtw89_mac_cfg_ppdu_status_be(struct rtw89_dev *rtwdev, u8 mac_idx, bool enable) 1988 { 1989 u32 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_PPDU_STAT, mac_idx); 1990 int ret; 1991 1992 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 1993 if (ret) 1994 return ret; 1995 1996 if (!enable) { 1997 rtw89_write32_clr(rtwdev, reg, B_BE_PPDU_STAT_RPT_EN); 1998 return 0; 1999 } 2000 2001 rtw89_write32_mask(rtwdev, R_BE_HW_PPDU_STATUS, B_BE_FWD_PPDU_STAT_MASK, 3); 2002 rtw89_write32(rtwdev, reg, B_BE_PPDU_STAT_RPT_EN | B_BE_PPDU_MAC_INFO | 2003 B_BE_APP_RX_CNT_RPT | B_BE_APP_PLCP_HDR_RPT | 2004 B_BE_PPDU_STAT_RPT_CRC32 | B_BE_PPDU_STAT_RPT_DMA); 2005 2006 return 0; 2007 } 2008 2009 static bool rtw89_mac_get_txpwr_cr_be(struct rtw89_dev *rtwdev, 2010 enum rtw89_phy_idx phy_idx, 2011 u32 reg_base, u32 *cr) 2012 { 2013 enum rtw89_qta_mode mode = rtwdev->mac.qta_mode; 2014 int ret; 2015 2016 ret = rtw89_mac_check_mac_en(rtwdev, (enum rtw89_mac_idx)phy_idx, 2017 RTW89_CMAC_SEL); 2018 if (ret) { 2019 if (test_bit(RTW89_FLAG_SER_HANDLING, rtwdev->flags)) 2020 return false; 2021 2022 rtw89_err(rtwdev, "[TXPWR] check mac enable failed\n"); 2023 return false; 2024 } 2025 2026 if (reg_base < R_BE_PWR_MODULE || reg_base > R_BE_CMAC_FUNC_EN_C1) { 2027 rtw89_err(rtwdev, "[TXPWR] reg_base=0x%x exceed txpwr cr\n", 2028 reg_base); 2029 return false; 2030 } 2031 2032 *cr = rtw89_mac_reg_by_idx(rtwdev, reg_base, phy_idx); 2033 2034 if (*cr >= CMAC1_START_ADDR_BE && *cr <= CMAC1_END_ADDR_BE) { 2035 if (mode == RTW89_QTA_SCC) { 2036 rtw89_err(rtwdev, 2037 "[TXPWR] addr=0x%x but hw not enable\n", 2038 *cr); 2039 return false; 2040 } 2041 } 2042 2043 return true; 2044 } 2045 2046 static int rtw89_mac_init_bfee_be(struct rtw89_dev *rtwdev, u8 mac_idx) 2047 { 2048 u32 reg; 2049 u32 val; 2050 int ret; 2051 2052 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 2053 if (ret) 2054 return ret; 2055 2056 rtw89_mac_bfee_ctrl(rtwdev, mac_idx, true); 2057 2058 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 2059 rtw89_write32_set(rtwdev, reg, B_BE_BFMEE_BFPARAM_SEL | 2060 B_BE_BFMEE_USE_NSTS | 2061 B_BE_BFMEE_CSI_GID_SEL | 2062 B_BE_BFMEE_CSI_FORCE_RETE_EN); 2063 rtw89_write32_mask(rtwdev, reg, B_BE_BFMEE_CSI_RSC_MASK, CSI_RX_BW_CFG); 2064 2065 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_CSIRPT_OPTION, mac_idx); 2066 rtw89_write32_set(rtwdev, reg, B_BE_CSIPRT_VHTSU_AID_EN | 2067 B_BE_CSIPRT_HESU_AID_EN | 2068 B_BE_CSIPRT_EHTSU_AID_EN); 2069 2070 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_RRSC, mac_idx); 2071 rtw89_write32(rtwdev, reg, CSI_RRSC_BMAP_BE); 2072 2073 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_1, mac_idx); 2074 rtw89_write32_mask(rtwdev, reg, B_BE_BFMEE_BE_CSI_RRSC_BITMAP_MASK, 2075 CSI_RRSC_BITMAP_CFG); 2076 2077 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_RATE, mac_idx); 2078 val = u32_encode_bits(CSI_INIT_RATE_HT, B_BE_BFMEE_HT_CSI_RATE_MASK) | 2079 u32_encode_bits(CSI_INIT_RATE_VHT, B_BE_BFMEE_VHT_CSI_RATE_MASK) | 2080 u32_encode_bits(CSI_INIT_RATE_HE, B_BE_BFMEE_HE_CSI_RATE_MASK) | 2081 u32_encode_bits(CSI_INIT_RATE_EHT, B_BE_BFMEE_EHT_CSI_RATE_MASK); 2082 2083 rtw89_write32(rtwdev, reg, val); 2084 2085 return 0; 2086 } 2087 2088 static int rtw89_mac_set_csi_para_reg_be(struct rtw89_dev *rtwdev, 2089 struct ieee80211_vif *vif, 2090 struct ieee80211_sta *sta) 2091 { 2092 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 2093 u8 nc = 1, nr = 3, ng = 0, cb = 1, cs = 1, ldpc_en = 1, stbc_en = 1; 2094 u8 mac_idx = rtwvif->mac_idx; 2095 u8 port_sel = rtwvif->port; 2096 u8 sound_dim = 3, t; 2097 u8 *phy_cap; 2098 u32 reg; 2099 u16 val; 2100 int ret; 2101 2102 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 2103 if (ret) 2104 return ret; 2105 2106 phy_cap = sta->deflink.he_cap.he_cap_elem.phy_cap_info; 2107 2108 if ((phy_cap[3] & IEEE80211_HE_PHY_CAP3_SU_BEAMFORMER) || 2109 (phy_cap[4] & IEEE80211_HE_PHY_CAP4_MU_BEAMFORMER)) { 2110 ldpc_en &= !!(phy_cap[1] & IEEE80211_HE_PHY_CAP1_LDPC_CODING_IN_PAYLOAD); 2111 stbc_en &= !!(phy_cap[2] & IEEE80211_HE_PHY_CAP2_STBC_RX_UNDER_80MHZ); 2112 t = u8_get_bits(phy_cap[5], 2113 IEEE80211_HE_PHY_CAP5_BEAMFORMEE_NUM_SND_DIM_UNDER_80MHZ_MASK); 2114 sound_dim = min(sound_dim, t); 2115 } 2116 2117 if ((sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_MU_BEAMFORMER_CAPABLE) || 2118 (sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { 2119 ldpc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXLDPC); 2120 stbc_en &= !!(sta->deflink.vht_cap.cap & IEEE80211_VHT_CAP_RXSTBC_MASK); 2121 t = u32_get_bits(sta->deflink.vht_cap.cap, 2122 IEEE80211_VHT_CAP_SOUNDING_DIMENSIONS_MASK); 2123 sound_dim = min(sound_dim, t); 2124 } 2125 2126 nc = min(nc, sound_dim); 2127 nr = min(nr, sound_dim); 2128 2129 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 2130 rtw89_write32_set(rtwdev, reg, B_BE_BFMEE_BFPARAM_SEL); 2131 2132 val = u16_encode_bits(nc, B_BE_BFMEE_CSIINFO0_NC_MASK) | 2133 u16_encode_bits(nr, B_BE_BFMEE_CSIINFO0_NR_MASK) | 2134 u16_encode_bits(ng, B_BE_BFMEE_CSIINFO0_NG_MASK) | 2135 u16_encode_bits(cb, B_BE_BFMEE_CSIINFO0_CB_MASK) | 2136 u16_encode_bits(cs, B_BE_BFMEE_CSIINFO0_CS_MASK) | 2137 u16_encode_bits(ldpc_en, B_BE_BFMEE_CSIINFO0_LDPC_EN) | 2138 u16_encode_bits(stbc_en, B_BE_BFMEE_CSIINFO0_STBC_EN); 2139 2140 if (port_sel == 0) 2141 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_0, 2142 mac_idx); 2143 else 2144 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_1, 2145 mac_idx); 2146 2147 rtw89_write16(rtwdev, reg, val); 2148 2149 return 0; 2150 } 2151 2152 static int rtw89_mac_csi_rrsc_be(struct rtw89_dev *rtwdev, 2153 struct ieee80211_vif *vif, 2154 struct ieee80211_sta *sta) 2155 { 2156 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 2157 u32 rrsc = BIT(RTW89_MAC_BF_RRSC_6M) | BIT(RTW89_MAC_BF_RRSC_24M); 2158 u8 mac_idx = rtwvif->mac_idx; 2159 int ret; 2160 u32 reg; 2161 2162 ret = rtw89_mac_check_mac_en(rtwdev, mac_idx, RTW89_CMAC_SEL); 2163 if (ret) 2164 return ret; 2165 2166 if (sta->deflink.he_cap.has_he) { 2167 rrsc |= (BIT(RTW89_MAC_BF_RRSC_HE_MSC0) | 2168 BIT(RTW89_MAC_BF_RRSC_HE_MSC3) | 2169 BIT(RTW89_MAC_BF_RRSC_HE_MSC5)); 2170 } 2171 if (sta->deflink.vht_cap.vht_supported) { 2172 rrsc |= (BIT(RTW89_MAC_BF_RRSC_VHT_MSC0) | 2173 BIT(RTW89_MAC_BF_RRSC_VHT_MSC3) | 2174 BIT(RTW89_MAC_BF_RRSC_VHT_MSC5)); 2175 } 2176 if (sta->deflink.ht_cap.ht_supported) { 2177 rrsc |= (BIT(RTW89_MAC_BF_RRSC_HT_MSC0) | 2178 BIT(RTW89_MAC_BF_RRSC_HT_MSC3) | 2179 BIT(RTW89_MAC_BF_RRSC_HT_MSC5)); 2180 } 2181 2182 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_CTRL_0, mac_idx); 2183 rtw89_write32_set(rtwdev, reg, B_BE_BFMEE_BFPARAM_SEL); 2184 rtw89_write32_clr(rtwdev, reg, B_BE_BFMEE_CSI_FORCE_RETE_EN); 2185 2186 reg = rtw89_mac_reg_by_idx(rtwdev, R_BE_TRXPTCL_RESP_CSI_RRSC, mac_idx); 2187 rtw89_write32(rtwdev, reg, rrsc); 2188 2189 return 0; 2190 } 2191 2192 static void rtw89_mac_bf_assoc_be(struct rtw89_dev *rtwdev, 2193 struct ieee80211_vif *vif, 2194 struct ieee80211_sta *sta) 2195 { 2196 struct rtw89_vif *rtwvif = (struct rtw89_vif *)vif->drv_priv; 2197 2198 if (rtw89_sta_has_beamformer_cap(sta)) { 2199 rtw89_debug(rtwdev, RTW89_DBG_BF, 2200 "initialize bfee for new association\n"); 2201 rtw89_mac_init_bfee_be(rtwdev, rtwvif->mac_idx); 2202 rtw89_mac_set_csi_para_reg_be(rtwdev, vif, sta); 2203 rtw89_mac_csi_rrsc_be(rtwdev, vif, sta); 2204 } 2205 } 2206 2207 static void dump_err_status_dispatcher_be(struct rtw89_dev *rtwdev) 2208 { 2209 rtw89_info(rtwdev, "R_BE_DISP_HOST_IMR=0x%08x ", 2210 rtw89_read32(rtwdev, R_BE_DISP_HOST_IMR)); 2211 rtw89_info(rtwdev, "R_BE_DISP_ERROR_ISR1=0x%08x\n", 2212 rtw89_read32(rtwdev, R_BE_DISP_ERROR_ISR1)); 2213 rtw89_info(rtwdev, "R_BE_DISP_CPU_IMR=0x%08x ", 2214 rtw89_read32(rtwdev, R_BE_DISP_CPU_IMR)); 2215 rtw89_info(rtwdev, "R_BE_DISP_ERROR_ISR2=0x%08x\n", 2216 rtw89_read32(rtwdev, R_BE_DISP_ERROR_ISR2)); 2217 rtw89_info(rtwdev, "R_BE_DISP_OTHER_IMR=0x%08x ", 2218 rtw89_read32(rtwdev, R_BE_DISP_OTHER_IMR)); 2219 rtw89_info(rtwdev, "R_BE_DISP_ERROR_ISR0=0x%08x\n", 2220 rtw89_read32(rtwdev, R_BE_DISP_ERROR_ISR0)); 2221 } 2222 2223 static void rtw89_mac_dump_qta_lost_be(struct rtw89_dev *rtwdev) 2224 { 2225 struct rtw89_mac_dle_dfi_qempty qempty; 2226 struct rtw89_mac_dle_dfi_quota quota; 2227 struct rtw89_mac_dle_dfi_ctrl ctrl; 2228 u32 val, not_empty, i; 2229 int ret; 2230 2231 qempty.dle_type = DLE_CTRL_TYPE_PLE; 2232 qempty.grpsel = 0; 2233 qempty.qempty = ~(u32)0; 2234 ret = rtw89_mac_dle_dfi_qempty_cfg(rtwdev, &qempty); 2235 if (ret) 2236 rtw89_warn(rtwdev, "%s: query DLE fail\n", __func__); 2237 else 2238 rtw89_info(rtwdev, "DLE group0 empty: 0x%x\n", qempty.qempty); 2239 2240 for (not_empty = ~qempty.qempty, i = 0; not_empty != 0; not_empty >>= 1, i++) { 2241 if (!(not_empty & BIT(0))) 2242 continue; 2243 ctrl.type = DLE_CTRL_TYPE_PLE; 2244 ctrl.target = DLE_DFI_TYPE_QLNKTBL; 2245 ctrl.addr = (QLNKTBL_ADDR_INFO_SEL_0 ? QLNKTBL_ADDR_INFO_SEL : 0) | 2246 u32_encode_bits(i, QLNKTBL_ADDR_TBL_IDX_MASK); 2247 ret = rtw89_mac_dle_dfi_cfg(rtwdev, &ctrl); 2248 if (ret) 2249 rtw89_warn(rtwdev, "%s: query DLE fail\n", __func__); 2250 else 2251 rtw89_info(rtwdev, "qidx%d pktcnt = %d\n", i, 2252 u32_get_bits(ctrl.out_data, 2253 QLNKTBL_DATA_SEL1_PKT_CNT_MASK)); 2254 } 2255 2256 quota.dle_type = DLE_CTRL_TYPE_PLE; 2257 quota.qtaid = 6; 2258 ret = rtw89_mac_dle_dfi_quota_cfg(rtwdev, "a); 2259 if (ret) 2260 rtw89_warn(rtwdev, "%s: query DLE fail\n", __func__); 2261 else 2262 rtw89_info(rtwdev, "quota6 rsv/use: 0x%x/0x%x\n", 2263 quota.rsv_pgnum, quota.use_pgnum); 2264 2265 val = rtw89_read32(rtwdev, R_BE_PLE_QTA6_CFG); 2266 rtw89_info(rtwdev, "[PLE][CMAC0_RX]min_pgnum=0x%x\n", 2267 u32_get_bits(val, B_BE_PLE_Q6_MIN_SIZE_MASK)); 2268 rtw89_info(rtwdev, "[PLE][CMAC0_RX]max_pgnum=0x%x\n", 2269 u32_get_bits(val, B_BE_PLE_Q6_MAX_SIZE_MASK)); 2270 val = rtw89_read32(rtwdev, R_BE_RX_FLTR_OPT); 2271 rtw89_info(rtwdev, "[PLE][CMAC0_RX]B_BE_RX_MPDU_MAX_LEN=0x%x\n", 2272 u32_get_bits(val, B_BE_RX_MPDU_MAX_LEN_MASK)); 2273 rtw89_info(rtwdev, "R_BE_RSP_CHK_SIG=0x%08x\n", 2274 rtw89_read32(rtwdev, R_BE_RSP_CHK_SIG)); 2275 rtw89_info(rtwdev, "R_BE_TRXPTCL_RESP_0=0x%08x\n", 2276 rtw89_read32(rtwdev, R_BE_TRXPTCL_RESP_0)); 2277 2278 if (!rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_1, RTW89_CMAC_SEL)) { 2279 quota.dle_type = DLE_CTRL_TYPE_PLE; 2280 quota.qtaid = 7; 2281 ret = rtw89_mac_dle_dfi_quota_cfg(rtwdev, "a); 2282 if (ret) 2283 rtw89_warn(rtwdev, "%s: query DLE fail\n", __func__); 2284 else 2285 rtw89_info(rtwdev, "quota7 rsv/use: 0x%x/0x%x\n", 2286 quota.rsv_pgnum, quota.use_pgnum); 2287 2288 val = rtw89_read32(rtwdev, R_BE_PLE_QTA7_CFG); 2289 rtw89_info(rtwdev, "[PLE][CMAC1_RX]min_pgnum=0x%x\n", 2290 u32_get_bits(val, B_BE_PLE_Q7_MIN_SIZE_MASK)); 2291 rtw89_info(rtwdev, "[PLE][CMAC1_RX]max_pgnum=0x%x\n", 2292 u32_get_bits(val, B_BE_PLE_Q7_MAX_SIZE_MASK)); 2293 val = rtw89_read32(rtwdev, R_BE_RX_FLTR_OPT_C1); 2294 rtw89_info(rtwdev, "[PLE][CMAC1_RX]B_BE_RX_MPDU_MAX_LEN=0x%x\n", 2295 u32_get_bits(val, B_BE_RX_MPDU_MAX_LEN_MASK)); 2296 rtw89_info(rtwdev, "R_BE_RSP_CHK_SIG_C1=0x%08x\n", 2297 rtw89_read32(rtwdev, R_BE_RSP_CHK_SIG_C1)); 2298 rtw89_info(rtwdev, "R_BE_TRXPTCL_RESP_0_C1=0x%08x\n", 2299 rtw89_read32(rtwdev, R_BE_TRXPTCL_RESP_0_C1)); 2300 } 2301 2302 rtw89_info(rtwdev, "R_BE_DLE_EMPTY0=0x%08x\n", 2303 rtw89_read32(rtwdev, R_BE_DLE_EMPTY0)); 2304 rtw89_info(rtwdev, "R_BE_DLE_EMPTY1=0x%08x\n", 2305 rtw89_read32(rtwdev, R_BE_DLE_EMPTY1)); 2306 2307 dump_err_status_dispatcher_be(rtwdev); 2308 } 2309 2310 static int rtw89_mac_cpu_io_rx(struct rtw89_dev *rtwdev, bool wow_enable) 2311 { 2312 struct rtw89_mac_h2c_info h2c_info = {}; 2313 struct rtw89_mac_c2h_info c2h_info = {}; 2314 u32 ret; 2315 2316 h2c_info.id = RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL; 2317 h2c_info.content_len = sizeof(h2c_info.u.hdr); 2318 h2c_info.u.hdr.w0 = u32_encode_bits(wow_enable, RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN); 2319 2320 ret = rtw89_fw_msg_reg(rtwdev, &h2c_info, &c2h_info); 2321 if (ret) 2322 return ret; 2323 2324 if (c2h_info.id != RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK) 2325 ret = -EINVAL; 2326 2327 return ret; 2328 } 2329 2330 static int rtw89_wow_config_mac_be(struct rtw89_dev *rtwdev, bool enable_wow) 2331 { 2332 if (enable_wow) { 2333 rtw89_write32_set(rtwdev, R_BE_RX_STOP, B_BE_HOST_RX_STOP); 2334 rtw89_write32_clr(rtwdev, R_BE_RX_FLTR_OPT, B_BE_SNIFFER_MODE); 2335 rtw89_mac_cpu_io_rx(rtwdev, enable_wow); 2336 rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, false); 2337 rtw89_write32(rtwdev, R_BE_FWD_ERR, 0); 2338 rtw89_write32(rtwdev, R_BE_FWD_ACTN0, 0); 2339 rtw89_write32(rtwdev, R_BE_FWD_ACTN1, 0); 2340 rtw89_write32(rtwdev, R_BE_FWD_ACTN2, 0); 2341 rtw89_write32(rtwdev, R_BE_FWD_TF0, 0); 2342 rtw89_write32(rtwdev, R_BE_FWD_TF1, 0); 2343 rtw89_write32(rtwdev, R_BE_FWD_ERR, 0); 2344 rtw89_write32(rtwdev, R_BE_HW_PPDU_STATUS, 0); 2345 rtw89_write8(rtwdev, R_BE_DBG_WOW_READY, WOWLAN_NOT_READY); 2346 } else { 2347 rtw89_mac_cpu_io_rx(rtwdev, enable_wow); 2348 rtw89_write32_clr(rtwdev, R_BE_RX_STOP, B_BE_HOST_RX_STOP); 2349 rtw89_write32_set(rtwdev, R_BE_RX_FLTR_OPT, R_BE_RX_FLTR_OPT); 2350 rtw89_mac_cfg_ppdu_status(rtwdev, RTW89_MAC_0, true); 2351 } 2352 2353 return 0; 2354 } 2355 2356 static void rtw89_mac_dump_cmac_err_status_be(struct rtw89_dev *rtwdev, 2357 u8 band) 2358 { 2359 u32 offset = 0; 2360 u32 cmac_err; 2361 int ret; 2362 2363 ret = rtw89_mac_check_mac_en(rtwdev, band, RTW89_CMAC_SEL); 2364 if (ret) { 2365 rtw89_info(rtwdev, "[CMAC] : CMAC%d not enabled\n", band); 2366 return; 2367 } 2368 2369 if (band) 2370 offset = RTW89_MAC_BE_BAND_REG_OFFSET; 2371 2372 cmac_err = rtw89_read32(rtwdev, R_BE_CMAC_ERR_ISR + offset); 2373 rtw89_info(rtwdev, "R_BE_CMAC_ERR_ISR [%d]=0x%08x\n", band, 2374 rtw89_read32(rtwdev, R_BE_CMAC_ERR_ISR + offset)); 2375 rtw89_info(rtwdev, "R_BE_CMAC_FUNC_EN [%d]=0x%08x\n", band, 2376 rtw89_read32(rtwdev, R_BE_CMAC_FUNC_EN + offset)); 2377 rtw89_info(rtwdev, "R_BE_CK_EN [%d]=0x%08x\n", band, 2378 rtw89_read32(rtwdev, R_BE_CK_EN + offset)); 2379 2380 if (cmac_err & B_BE_SCHEDULE_TOP_ERR_IND) { 2381 rtw89_info(rtwdev, "R_BE_SCHEDULE_ERR_IMR [%d]=0x%08x\n", band, 2382 rtw89_read32(rtwdev, R_BE_SCHEDULE_ERR_IMR + offset)); 2383 rtw89_info(rtwdev, "R_BE_SCHEDULE_ERR_ISR [%d]=0x%08x\n", band, 2384 rtw89_read32(rtwdev, R_BE_SCHEDULE_ERR_ISR + offset)); 2385 } 2386 2387 if (cmac_err & B_BE_PTCL_TOP_ERR_IND) { 2388 rtw89_info(rtwdev, "R_BE_PTCL_IMR0 [%d]=0x%08x\n", band, 2389 rtw89_read32(rtwdev, R_BE_PTCL_IMR0 + offset)); 2390 rtw89_info(rtwdev, "R_BE_PTCL_ISR0 [%d]=0x%08x\n", band, 2391 rtw89_read32(rtwdev, R_BE_PTCL_ISR0 + offset)); 2392 rtw89_info(rtwdev, "R_BE_PTCL_IMR1 [%d]=0x%08x\n", band, 2393 rtw89_read32(rtwdev, R_BE_PTCL_IMR1 + offset)); 2394 rtw89_info(rtwdev, "R_BE_PTCL_ISR1 [%d]=0x%08x\n", band, 2395 rtw89_read32(rtwdev, R_BE_PTCL_ISR1 + offset)); 2396 } 2397 2398 if (cmac_err & B_BE_DMA_TOP_ERR_IND) { 2399 rtw89_info(rtwdev, "R_BE_RX_ERROR_FLAG_IMR [%d]=0x%08x\n", band, 2400 rtw89_read32(rtwdev, R_BE_RX_ERROR_FLAG_IMR + offset)); 2401 rtw89_info(rtwdev, "R_BE_RX_ERROR_FLAG [%d]=0x%08x\n", band, 2402 rtw89_read32(rtwdev, R_BE_RX_ERROR_FLAG + offset)); 2403 rtw89_info(rtwdev, "R_BE_TX_ERROR_FLAG_IMR [%d]=0x%08x\n", band, 2404 rtw89_read32(rtwdev, R_BE_TX_ERROR_FLAG_IMR + offset)); 2405 rtw89_info(rtwdev, "R_BE_TX_ERROR_FLAG [%d]=0x%08x\n", band, 2406 rtw89_read32(rtwdev, R_BE_TX_ERROR_FLAG + offset)); 2407 rtw89_info(rtwdev, "R_BE_RX_ERROR_FLAG_IMR_1 [%d]=0x%08x\n", band, 2408 rtw89_read32(rtwdev, R_BE_RX_ERROR_FLAG_IMR_1 + offset)); 2409 rtw89_info(rtwdev, "R_BE_RX_ERROR_FLAG_1 [%d]=0x%08x\n", band, 2410 rtw89_read32(rtwdev, R_BE_RX_ERROR_FLAG_1 + offset)); 2411 } 2412 2413 if (cmac_err & B_BE_PHYINTF_ERR_IND) { 2414 rtw89_info(rtwdev, "R_BE_PHYINFO_ERR_IMR [%d]=0x%08x\n", band, 2415 rtw89_read32(rtwdev, R_BE_PHYINFO_ERR_IMR_V1 + offset)); 2416 rtw89_info(rtwdev, "R_BE_PHYINFO_ERR_ISR [%d]=0x%08x\n", band, 2417 rtw89_read32(rtwdev, R_BE_PHYINFO_ERR_ISR + offset)); 2418 } 2419 2420 if (cmac_err & B_AX_TXPWR_CTRL_ERR_IND) { 2421 rtw89_info(rtwdev, "R_BE_TXPWR_ERR_FLAG [%d]=0x%08x\n", band, 2422 rtw89_read32(rtwdev, R_BE_TXPWR_ERR_FLAG + offset)); 2423 rtw89_info(rtwdev, "R_BE_TXPWR_ERR_IMR [%d]=0x%08x\n", band, 2424 rtw89_read32(rtwdev, R_BE_TXPWR_ERR_IMR + offset)); 2425 } 2426 2427 if (cmac_err & (B_BE_WMAC_RX_ERR_IND | B_BE_WMAC_TX_ERR_IND | 2428 B_BE_WMAC_RX_IDLETO_IDCT | B_BE_PTCL_TX_IDLETO_IDCT)) { 2429 rtw89_info(rtwdev, "R_BE_DBGSEL_TRXPTCL [%d]=0x%08x\n", band, 2430 rtw89_read32(rtwdev, R_BE_DBGSEL_TRXPTCL + offset)); 2431 rtw89_info(rtwdev, "R_BE_TRXPTCL_ERROR_INDICA_MASK [%d]=0x%08x\n", band, 2432 rtw89_read32(rtwdev, R_BE_TRXPTCL_ERROR_INDICA_MASK + offset)); 2433 rtw89_info(rtwdev, "R_BE_TRXPTCL_ERROR_INDICA [%d]=0x%08x\n", band, 2434 rtw89_read32(rtwdev, R_BE_TRXPTCL_ERROR_INDICA + offset)); 2435 rtw89_info(rtwdev, "R_BE_RX_ERR_IMR [%d]=0x%08x\n", band, 2436 rtw89_read32(rtwdev, R_BE_RX_ERR_IMR + offset)); 2437 rtw89_info(rtwdev, "R_BE_RX_ERR_ISR [%d]=0x%08x\n", band, 2438 rtw89_read32(rtwdev, R_BE_RX_ERR_ISR + offset)); 2439 } 2440 2441 rtw89_info(rtwdev, "R_BE_CMAC_ERR_IMR [%d]=0x%08x\n", band, 2442 rtw89_read32(rtwdev, R_BE_CMAC_ERR_IMR + offset)); 2443 } 2444 2445 static void rtw89_mac_dump_err_status_be(struct rtw89_dev *rtwdev, 2446 enum mac_ax_err_info err) 2447 { 2448 if (err != MAC_AX_ERR_L1_ERR_DMAC && 2449 err != MAC_AX_ERR_L0_PROMOTE_TO_L1 && 2450 err != MAC_AX_ERR_L0_ERR_CMAC0 && 2451 err != MAC_AX_ERR_L0_ERR_CMAC1 && 2452 err != MAC_AX_ERR_RXI300) 2453 return; 2454 2455 rtw89_info(rtwdev, "--->\nerr=0x%x\n", err); 2456 rtw89_info(rtwdev, "R_BE_SER_DBG_INFO=0x%08x\n", 2457 rtw89_read32(rtwdev, R_BE_SER_DBG_INFO)); 2458 rtw89_info(rtwdev, "R_BE_SER_L0_DBG_CNT=0x%08x\n", 2459 rtw89_read32(rtwdev, R_BE_SER_L0_DBG_CNT)); 2460 rtw89_info(rtwdev, "R_BE_SER_L0_DBG_CNT1=0x%08x\n", 2461 rtw89_read32(rtwdev, R_BE_SER_L0_DBG_CNT1)); 2462 rtw89_info(rtwdev, "R_BE_SER_L0_DBG_CNT2=0x%08x\n", 2463 rtw89_read32(rtwdev, R_BE_SER_L0_DBG_CNT2)); 2464 rtw89_info(rtwdev, "R_BE_SER_L0_DBG_CNT3=0x%08x\n", 2465 rtw89_read32(rtwdev, R_BE_SER_L0_DBG_CNT3)); 2466 if (!rtw89_mac_check_mac_en(rtwdev, RTW89_MAC_1, RTW89_CMAC_SEL)) { 2467 rtw89_info(rtwdev, "R_BE_SER_L0_DBG_CNT_C1=0x%08x\n", 2468 rtw89_read32(rtwdev, R_BE_SER_L0_DBG_CNT_C1)); 2469 rtw89_info(rtwdev, "R_BE_SER_L0_DBG_CNT1_C1=0x%08x\n", 2470 rtw89_read32(rtwdev, R_BE_SER_L0_DBG_CNT1_C1)); 2471 } 2472 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_0=0x%08x\n", 2473 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_0)); 2474 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_1=0x%08x\n", 2475 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_1)); 2476 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_2=0x%08x\n", 2477 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_2)); 2478 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_3=0x%08x\n", 2479 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_3)); 2480 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_4=0x%08x\n", 2481 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_4)); 2482 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_5=0x%08x\n", 2483 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_5)); 2484 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_6=0x%08x\n", 2485 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_6)); 2486 rtw89_info(rtwdev, "R_BE_SER_L1_DBG_CNT_7=0x%08x\n", 2487 rtw89_read32(rtwdev, R_BE_SER_L1_DBG_CNT_7)); 2488 2489 rtw89_mac_dump_dmac_err_status(rtwdev); 2490 rtw89_mac_dump_cmac_err_status_be(rtwdev, RTW89_MAC_0); 2491 rtw89_mac_dump_cmac_err_status_be(rtwdev, RTW89_MAC_1); 2492 2493 rtwdev->hci.ops->dump_err_status(rtwdev); 2494 2495 if (err == MAC_AX_ERR_L0_PROMOTE_TO_L1) 2496 rtw89_mac_dump_l0_to_l1(rtwdev, err); 2497 2498 rtw89_info(rtwdev, "<---\n"); 2499 } 2500 2501 static bool mac_is_txq_empty_be(struct rtw89_dev *rtwdev) 2502 { 2503 struct rtw89_mac_dle_dfi_qempty qempty; 2504 u32 val32, msk32; 2505 u32 grpnum; 2506 int ret; 2507 int i; 2508 2509 grpnum = rtwdev->chip->wde_qempty_acq_grpnum; 2510 qempty.dle_type = DLE_CTRL_TYPE_WDE; 2511 2512 for (i = 0; i < grpnum; i++) { 2513 qempty.grpsel = i; 2514 ret = rtw89_mac_dle_dfi_qempty_cfg(rtwdev, &qempty); 2515 if (ret) { 2516 rtw89_warn(rtwdev, 2517 "%s: failed to dle dfi acq empty: %d\n", 2518 __func__, ret); 2519 return false; 2520 } 2521 2522 /* Each acq group contains 32 queues (8 macid * 4 acq), 2523 * but here, we can simply check if all bits are set. 2524 */ 2525 if (qempty.qempty != MASKDWORD) 2526 return false; 2527 } 2528 2529 qempty.grpsel = rtwdev->chip->wde_qempty_mgq_grpsel; 2530 ret = rtw89_mac_dle_dfi_qempty_cfg(rtwdev, &qempty); 2531 if (ret) { 2532 rtw89_warn(rtwdev, "%s: failed to dle dfi mgq empty: %d\n", 2533 __func__, ret); 2534 return false; 2535 } 2536 2537 msk32 = B_CMAC0_MGQ_NORMAL_BE | B_CMAC1_MGQ_NORMAL_BE; 2538 if ((qempty.qempty & msk32) != msk32) 2539 return false; 2540 2541 msk32 = B_BE_WDE_EMPTY_QUE_OTHERS; 2542 val32 = rtw89_read32(rtwdev, R_BE_DLE_EMPTY0); 2543 return (val32 & msk32) == msk32; 2544 } 2545 2546 const struct rtw89_mac_gen_def rtw89_mac_gen_be = { 2547 .band1_offset = RTW89_MAC_BE_BAND_REG_OFFSET, 2548 .filter_model_addr = R_BE_FILTER_MODEL_ADDR, 2549 .indir_access_addr = R_BE_INDIR_ACCESS_ENTRY, 2550 .mem_base_addrs = rtw89_mac_mem_base_addrs_be, 2551 .rx_fltr = R_BE_RX_FLTR_OPT, 2552 .port_base = &rtw89_port_base_be, 2553 .agg_len_ht = R_BE_AGG_LEN_HT_0, 2554 .ps_status = R_BE_WMTX_POWER_BE_BIT_CTL, 2555 2556 .muedca_ctrl = { 2557 .addr = R_BE_MUEDCA_EN, 2558 .mask = B_BE_MUEDCA_EN_0 | B_BE_SET_MUEDCATIMER_TF_0, 2559 }, 2560 .bfee_ctrl = { 2561 .addr = R_BE_BFMEE_RESP_OPTION, 2562 .mask = B_BE_BFMEE_HT_NDPA_EN | B_BE_BFMEE_VHT_NDPA_EN | 2563 B_BE_BFMEE_HE_NDPA_EN | B_BE_BFMEE_EHT_NDPA_EN, 2564 }, 2565 .narrow_bw_ru_dis = { 2566 .addr = R_BE_RXTRIG_TEST_USER_2, 2567 .mask = B_BE_RXTRIG_RU26_DIS, 2568 }, 2569 .wow_ctrl = {.addr = R_BE_WOW_CTRL, .mask = B_BE_WOW_WOWEN,}, 2570 2571 .check_mac_en = rtw89_mac_check_mac_en_be, 2572 .sys_init = sys_init_be, 2573 .trx_init = trx_init_be, 2574 .hci_func_en = rtw89_mac_hci_func_en_be, 2575 .dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_be, 2576 .dle_func_en = dle_func_en_be, 2577 .dle_clk_en = dle_clk_en_be, 2578 .bf_assoc = rtw89_mac_bf_assoc_be, 2579 2580 .typ_fltr_opt = rtw89_mac_typ_fltr_opt_be, 2581 .cfg_ppdu_status = rtw89_mac_cfg_ppdu_status_be, 2582 2583 .dle_mix_cfg = dle_mix_cfg_be, 2584 .chk_dle_rdy = chk_dle_rdy_be, 2585 .dle_buf_req = dle_buf_req_be, 2586 .hfc_func_en = hfc_func_en_be, 2587 .hfc_h2c_cfg = hfc_h2c_cfg_be, 2588 .hfc_mix_cfg = hfc_mix_cfg_be, 2589 .hfc_get_mix_info = hfc_get_mix_info_be, 2590 .wde_quota_cfg = wde_quota_cfg_be, 2591 .ple_quota_cfg = ple_quota_cfg_be, 2592 .set_cpuio = set_cpuio_be, 2593 .dle_quota_change = dle_quota_change_be, 2594 2595 .disable_cpu = rtw89_mac_disable_cpu_be, 2596 .fwdl_enable_wcpu = rtw89_mac_fwdl_enable_wcpu_be, 2597 .fwdl_get_status = fwdl_get_status_be, 2598 .fwdl_check_path_ready = rtw89_fwdl_check_path_ready_be, 2599 .parse_efuse_map = rtw89_parse_efuse_map_be, 2600 .parse_phycap_map = rtw89_parse_phycap_map_be, 2601 .cnv_efuse_state = rtw89_cnv_efuse_state_be, 2602 2603 .cfg_plt = rtw89_mac_cfg_plt_be, 2604 .get_plt_cnt = rtw89_mac_get_plt_cnt_be, 2605 2606 .get_txpwr_cr = rtw89_mac_get_txpwr_cr_be, 2607 2608 .write_xtal_si = rtw89_mac_write_xtal_si_be, 2609 .read_xtal_si = rtw89_mac_read_xtal_si_be, 2610 2611 .dump_qta_lost = rtw89_mac_dump_qta_lost_be, 2612 .dump_err_status = rtw89_mac_dump_err_status_be, 2613 2614 .is_txq_empty = mac_is_txq_empty_be, 2615 2616 .add_chan_list = rtw89_hw_scan_add_chan_list_be, 2617 .scan_offload = rtw89_fw_h2c_scan_offload_be, 2618 2619 .wow_config_mac = rtw89_wow_config_mac_be, 2620 }; 2621 EXPORT_SYMBOL(rtw89_mac_gen_be); 2622