wifi: rtw89: mac: add an entry to enable MAC function in preinit

The preinit is to initialize partial MAC hardware needed before
downloading firmware, and then does post-init after firmware runs.

For RTL8922D, initialize some DMAC and CMAC at this step.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20260108120320.2217402-13-pkshih@realtek.com
This commit is contained in:
Ping-Ke Shih 2026-01-08 20:03:19 +08:00
parent c16673247b
commit 6996a4c97a
3 changed files with 82 additions and 0 deletions

View File

@ -4223,12 +4223,19 @@ int rtw89_mac_partial_init(struct rtw89_dev *rtwdev, bool include_bb)
int rtw89_mac_preinit(struct rtw89_dev *rtwdev)
{
const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
int ret;
ret = rtw89_mac_pwr_on(rtwdev);
if (ret)
return ret;
if (mac->mac_func_en) {
ret = mac->mac_func_en(rtwdev);
if (ret)
return ret;
}
return 0;
}
@ -7292,6 +7299,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_ax = {
.trx_init = trx_init_ax,
.preload_init = preload_init_set_ax,
.err_imr_ctrl = err_imr_ctrl_ax,
.mac_func_en = NULL,
.hci_func_en = rtw89_mac_hci_func_en_ax,
.dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_ax,
.dle_func_en = dle_func_en_ax,

View File

@ -1040,6 +1040,7 @@ struct rtw89_mac_gen_def {
int (*preload_init)(struct rtw89_dev *rtwdev, u8 mac_idx,
enum rtw89_qta_mode mode);
void (*err_imr_ctrl)(struct rtw89_dev *rtwdev, bool en);
int (*mac_func_en)(struct rtw89_dev *rtwdev);
void (*hci_func_en)(struct rtw89_dev *rtwdev);
void (*dmac_func_pre_en)(struct rtw89_dev *rtwdev);
void (*dle_func_en)(struct rtw89_dev *rtwdev, bool enable);

View File

@ -751,6 +751,37 @@ static int rtw89_fwdl_check_path_ready_be(struct rtw89_dev *rtwdev,
static int dmac_func_en_be(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
if (chip->chip_id == RTL8922A)
return 0;
rtw89_write32_set(rtwdev, R_BE_DMAC_FUNC_EN,
B_BE_MAC_FUNC_EN | B_BE_DMAC_FUNC_EN |
B_BE_MPDU_PROC_EN | B_BE_WD_RLS_EN |
B_BE_DLE_WDE_EN | B_BE_TXPKT_CTRL_EN |
B_BE_STA_SCH_EN | B_BE_DLE_PLE_EN |
B_BE_PKT_BUF_EN | B_BE_DMAC_TBL_EN |
B_BE_PKT_IN_EN | B_BE_DLE_CPUIO_EN |
B_BE_DISPATCHER_EN | B_BE_BBRPT_EN |
B_BE_MAC_SEC_EN | B_BE_H_AXIDMA_EN |
B_BE_DMAC_MLO_EN | B_BE_PLRLS_EN |
B_BE_P_AXIDMA_EN | B_BE_DLE_DATACPUIO_EN);
return 0;
}
static int cmac_share_func_en_be(struct rtw89_dev *rtwdev)
{
const struct rtw89_chip_info *chip = rtwdev->chip;
if (chip->chip_id == RTL8922A)
return 0;
rtw89_write32_set(rtwdev, R_BE_CMAC_SHARE_FUNC_EN,
B_BE_CMAC_SHARE_EN | B_BE_RESPBA_EN |
B_BE_ADDRSRCH_EN | B_BE_BTCOEX_EN);
return 0;
}
@ -865,6 +896,10 @@ static int sys_init_be(struct rtw89_dev *rtwdev)
if (ret)
return ret;
ret = cmac_share_func_en_be(rtwdev);
if (ret)
return ret;
ret = cmac_pwr_en_be(rtwdev, RTW89_MAC_0, true);
if (ret)
return ret;
@ -880,6 +915,43 @@ static int sys_init_be(struct rtw89_dev *rtwdev)
return ret;
}
static int mac_func_en_be(struct rtw89_dev *rtwdev)
{
u32 val;
int ret;
ret = dmac_func_en_be(rtwdev);
if (ret)
return ret;
ret = cmac_share_func_en_be(rtwdev);
if (ret)
return ret;
val = rtw89_read32(rtwdev, R_BE_FEN_RST_ENABLE);
if (val & B_BE_CMAC0_FEN) {
ret = cmac_pwr_en_be(rtwdev, RTW89_MAC_0, true);
if (ret)
return ret;
ret = cmac_func_en_be(rtwdev, RTW89_MAC_0, true);
if (ret)
return ret;
}
if (val & B_BE_CMAC1_FEN) {
ret = cmac_pwr_en_be(rtwdev, RTW89_MAC_1, true);
if (ret)
return ret;
ret = cmac_func_en_be(rtwdev, RTW89_MAC_1, true);
if (ret)
return ret;
}
return 0;
}
static int sta_sch_init_be(struct rtw89_dev *rtwdev)
{
u32 p_val;
@ -2911,6 +2983,7 @@ const struct rtw89_mac_gen_def rtw89_mac_gen_be = {
.trx_init = trx_init_be,
.preload_init = preload_init_be,
.err_imr_ctrl = err_imr_ctrl_be,
.mac_func_en = mac_func_en_be,
.hci_func_en = rtw89_mac_hci_func_en_be,
.dmac_func_pre_en = rtw89_mac_dmac_func_pre_en_be,
.dle_func_en = dle_func_en_be,