wifi: rtw89: pci: add PCI DMA and interrupt stuff for WiFi 7 chips
Ping-Ke Shih
maintainercover wifi: rtw89: pci: add PCI DMA and interrupt stuff for WiFi 7 chips
The PCI flow of WiFi 6 and 7 chips are almost the same, so abstract register definition to reuse them.
Patches 1-3 are to add new functions to configure WiFi 7 chips; patches 4-5 are to refine interrupt handlers. Then, refine the frequent interrupts by the last two patches that can largely reduce interrupts.
Ping-Ke Shih (5):
wifi: rtw89: pci: add pre_deinit to be called after probe complete
wifi: rtw89: pci: generalize interrupt status bits of interrupt
handlers
wifi: rtw89: 8922ae: add v2 interrupt handlers for 8922AE
wifi: rtw89: pci: correct interrupt mitigation register for 8852CE
wifi: rtw89: pci: update interrupt mitigation register for 8922AE
Zong-Zhe Yang (2):
wifi: rtw89: pci: reset BDRAM according to chip gen
wifi: rtw89: pci: stop/start DMA for level 1 recovery according to
chip gen
drivers/net/wireless/realtek/rtw89/core.c | 2 + drivers/net/wireless/realtek/rtw89/core.h | 6 + drivers/net/wireless/realtek/rtw89/pci.c | 177 ++++++++++++---- drivers/net/wireless/realtek/rtw89/pci.h | 197 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 80 +++++++ drivers/net/wireless/realtek/rtw89/reg.h | 63 ++++++ .../net/wireless/realtek/rtw89/rtw8851be.c | 1 + .../net/wireless/realtek/rtw89/rtw8852ae.c | 1 + .../net/wireless/realtek/rtw89/rtw8852be.c | 1 + .../net/wireless/realtek/rtw89/rtw8852ce.c | 1 + .../net/wireless/realtek/rtw89/rtw8922ae.c | 5 + drivers/net/wireless/realtek/rtw89/ser.c | 6 + 12 files changed, 495 insertions(+), 45 deletions(-)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/7 wifi: rtw89: pci: reset BDRAM according to chip gen
From: Zong-Zhe Yang <[email protected]>
Configure callback of reset BDRAM (buffer descriptor RAM) by chip gen. Refine the one of 802.11ax chip gen and drop a redundant duplicate of it in 802.11ax chip gen. Then, assign right callback of rst_bdram for HCI ops which needs to do callback according to chip gen.
--- drivers/net/wireless/realtek/rtw89/pci.c | 33 +++++---------------- drivers/net/wireless/realtek/rtw89/pci.h | 9 ++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 1 + 3 files changed, 17 insertions(+), 26 deletions(-)
drivers/net/wireless/realtek/rtw89/pci.c +7 -26
@@ -19,22 +19,18 @@ MODULE_PARM_DESC(disable_clkreq, "Set Y to disable PCI clkreq support");MODULE_PARM_DESC (disable_aspm_l1,"Set Y to disable PCI ASPM L1 support" );MODULE_PARM_DESC (disable_aspm_l1ss,"Set Y to disable PCI L1SS support" ); -static int rtw89_pci_rst_bdram_pcie (struct rtw89_dev *rtwdev) +static int rtw89_pci_rst_bdram_ax (struct rtw89_dev *rtwdev) {u32 val;int ret; -rtw89_write32 (rtwdev,R_AX_PCIE_INIT_CFG1 , -rtw89_read32 (rtwdev,R_AX_PCIE_INIT_CFG1 ) |B_AX_RST_BDRAM ); +rtw89_write32_set (rtwdev,R_AX_PCIE_INIT_CFG1 ,B_AX_RST_BDRAM ); ret =read_poll_timeout_atomic (rtw89_read32, val, !(val &B_AX_RST_BDRAM ),1 ,RTW89_PCI_POLL_BDRAM_RST_CNT , false, rtwdev,R_AX_PCIE_INIT_CFG1 ); -if (ret) -return -EBUSY ; - -return 0 ; +return ret; } static u32 rtw89_pci_dma_recalc(struct rtw89_dev *rtwdev,
@@ -2608,7 +2604,7 @@ static int rtw89_pci_ops_mac_pre_init_ax(struct rtw89_dev *rtwdev)/* fill TRX BD indexes */ rtw89_pci_ops_reset (rtwdev); - ret =rtw89_pci_rst_bdram_pcie (rtwdev); + ret =rtw89_pci_rst_bdram_ax (rtwdev);if (ret) {rtw89_warn (rtwdev,"reset bdram busy\n" );return ret;
@@ -3691,22 +3687,6 @@ static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)return ret; } - - -static int rtw89_pci_rst_bdram (struct rtw89_dev *rtwdev) -{ -int ret =0 ; -u32 val32, sts; - - val32 =B_AX_RST_BDRAM ; -rtw89_write32_set (rtwdev,R_AX_PCIE_INIT_CFG1 , val32); - - ret =read_poll_timeout_atomic (rtw89_read32, sts, - (sts &B_AX_RST_BDRAM ) ==0x0 ,1 ,100 , - true, rtwdev,R_AX_PCIE_INIT_CFG1 ); -return ret; -} -static int rtw89_pci_lv1rst_start_dma (struct rtw89_dev *rtwdev) {u32 ret;
@@ -3718,7 +3698,7 @@ static int rtw89_pci_lv1rst_start_dma(struct rtw89_dev *rtwdev)rtw89_mac_ctrl_hci_dma_trx (rtwdev, true);rtw89_pci_clr_idx_all (rtwdev); - ret =rtw89_pci_rst_bdram (rtwdev); + ret =rtw89_pci_rst_bdram_ax (rtwdev);if (ret)return ret;
@@ -3858,6 +3838,7 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = { .mac_post_init = rtw89_pci_ops_mac_post_init_ax, .clr_idx_all = rtw89_pci_clr_idx_all_ax, + .rst_bdram = rtw89_pci_rst_bdram_ax, };EXPORT_SYMBOL (rtw89_pci_gen_ax);
@@ -3899,7 +3880,7 @@ static const struct rtw89_hci_ops rtw89_pci_ops = { .clear = rtw89_pci_clear_resource, .disable_intr = rtw89_pci_disable_intr_lock, .enable_intr = rtw89_pci_enable_intr_lock, - .rst_bdram = rtw89_pci_rst_bdram_pcie, + .rst_bdram = rtw89_pci_reset_bdram, };int rtw89_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id)
drivers/net/wireless/realtek/rtw89/pci.h +9 -0
@@ -1041,6 +1041,7 @@ struct rtw89_pci_gen_def {int (*mac_post_init)(struct rtw89_dev *rtwdev);void (*clr_idx_all)(struct rtw89_dev *rtwdev); +int (*rst_bdram)(struct rtw89_dev *rtwdev); };struct rtw89_pci_info {
@@ -1475,4 +1476,12 @@ static inline void rtw89_pci_clr_idx_all(struct rtw89_dev *rtwdev) gen_def->clr_idx_all(rtwdev); } +static inline int rtw89_pci_reset_bdram (struct rtw89_dev *rtwdev) +{ +const struct rtw89_pci_info *info = rtwdev->pci_info; +const struct rtw89_pci_gen_def *gen_def = info->gen_def; + +return gen_def->rst_bdram (rtwdev); +} +#endif
drivers/net/wireless/realtek/rtw89/pci_be.c +1 -0
@@ -425,5 +425,6 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_be = { .mac_post_init = rtw89_pci_ops_mac_post_init_be, .clr_idx_all = rtw89_pci_clr_idx_all_be, + .rst_bdram = rtw89_pci_rst_bdram_be, };EXPORT_SYMBOL (rtw89_pci_gen_be);
Signature · 1 line
2.25.1
Re: [PATCH 1/7] wifi: rtw89: pci: reset BDRAM according to chip gen
Quoted 9 lines · Ping-Ke Shih
From: Zong-Zhe Yang <[email protected]>
Configure callback of reset BDRAM (buffer descriptor RAM) by chip gen. Refine the one of 802.11ax chip gen and drop a redundant duplicate of it in 802.11ax chip gen. Then, assign right callback of
rst_bdramfor HCI ops which needs to do callback according to chip gen.Signed-off-by Zong-Zhe Yang <[email protected]>Signed-off-by Ping-Ke Shih <[email protected]>
7 patches applied to wireless-next.git, thanks.
d5d717a77640 wifi: rtw89: pci: reset BDRAM according to chip gen d720cca762ed wifi: rtw89: pci: stop/start DMA for level 1 recovery according to chip gen 9e1aff437a56 wifi: rtw89: pci: add pre_deinit to be called after probe complete aa70f76120ee wifi: rtw89: pci: generalize interrupt status bits of interrupt handlers d8872fb60e72 wifi: rtw89: 8922ae: add v2 interrupt handlers for 8922AE 9f08c77b7769 wifi: rtw89: pci: correct interrupt mitigation register for 8852CE 0a78bb64a499 wifi: rtw89: pci: update interrupt mitigation register for 8922AE
Signature · 3 lines
https://patchwork.kernel.org/project/linux-wireless/patch/[email protected]/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
Ping-Ke Shih
maintainerPATCH 2/7 wifi: rtw89: pci: stop/start DMA for level 1 recovery according to chip gen
In reply to Ping-Ke ShihFrom: Zong-Zhe Yang <[email protected]>
Level 1 recovery is to recover TX/RX rings, so it needs PCI to stop/start DMA. But, different chip gen have different implementations, either register address/mask or function flow. So, configure callback of stop/start DMA by chip gen.
--- drivers/net/wireless/realtek/rtw89/pci.c | 21 +++++--- drivers/net/wireless/realtek/rtw89/pci.h | 4 ++ drivers/net/wireless/realtek/rtw89/pci_be.c | 55 +++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/ser.c | 6 +++ 4 files changed, 78 insertions(+), 8 deletions(-)
drivers/net/wireless/realtek/rtw89/pci.c +13 -8
@@ -1755,7 +1755,7 @@ static void rtw89_pci_ctrl_dma_io(struct rtw89_dev *rtwdev, bool enable)rtw89_write32_set (rtwdev, reg->addr, reg->mask); } -static void rtw89_pci_ctrl_dma_all (struct rtw89_dev *rtwdev,bool enable) +void rtw89_pci_ctrl_dma_all (struct rtw89_dev *rtwdev,bool enable) {rtw89_pci_ctrl_dma_io (rtwdev, enable);rtw89_pci_ctrl_dma_trx (rtwdev, enable);
@@ -3640,7 +3640,7 @@ static void rtw89_pci_l1ss_cfg(struct rtw89_dev *rtwdev)rtw89_pci_l1ss_set (rtwdev, true); } -static int rtw89_pci_poll_io_idle (struct rtw89_dev *rtwdev) +static int rtw89_pci_poll_io_idle_ax (struct rtw89_dev *rtwdev) {int ret =0 ;u32 sts;
@@ -3657,7 +3657,7 @@ static int rtw89_pci_poll_io_idle(struct rtw89_dev *rtwdev)return ret; } -static int rtw89_pci_lv1rst_stop_dma (struct rtw89_dev *rtwdev) +static int rtw89_pci_lv1rst_stop_dma_ax (struct rtw89_dev *rtwdev) {u32 val;int ret;
@@ -3666,7 +3666,7 @@ static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)return 0 ;rtw89_pci_ctrl_dma_all (rtwdev, false); - ret =rtw89_pci_poll_io_idle (rtwdev); + ret =rtw89_pci_poll_io_idle_ax (rtwdev);if (ret) { val =rtw89_read32 (rtwdev,R_AX_DBG_ERR_FLAG ); rtw89_debug(rtwdev, RTW89_DBG_HCI,
@@ -3677,7 +3677,7 @@ static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)if (val &B_AX_RX_STUCK )rtw89_mac_ctrl_hci_dma_rx (rtwdev, false);rtw89_mac_ctrl_hci_dma_trx (rtwdev, true); - ret =rtw89_pci_poll_io_idle (rtwdev); + ret =rtw89_pci_poll_io_idle_ax (rtwdev); val =rtw89_read32 (rtwdev,R_AX_DBG_ERR_FLAG ); rtw89_debug(rtwdev, RTW89_DBG_HCI, "[PCIe] poll_io_idle fail, after 0x%08x: 0x%08x\n",
@@ -3687,7 +3687,7 @@ static int rtw89_pci_lv1rst_stop_dma(struct rtw89_dev *rtwdev)return ret; } -static int rtw89_pci_lv1rst_start_dma (struct rtw89_dev *rtwdev) +static int rtw89_pci_lv1rst_start_dma_ax (struct rtw89_dev *rtwdev) {u32 ret;
@@ -3709,18 +3709,20 @@ static int rtw89_pci_lv1rst_start_dma(struct rtw89_dev *rtwdev)static int rtw89_pci_ops_mac_lv1_recovery (struct rtw89_dev *rtwdev,enum rtw89_lv1_rcvy_step step) { +const struct rtw89_pci_info *info = rtwdev->pci_info; +const struct rtw89_pci_gen_def *gen_def = info->gen_def;int ret;switch (step) {case RTW89_LV1_RCVY_STEP_1 : - ret =rtw89_pci_lv1rst_stop_dma (rtwdev); + ret = gen_def->lv1rst_stop_dma (rtwdev);if (ret)rtw89_err (rtwdev,"lv1 rcvy pci stop dma fail\n" );break ;case RTW89_LV1_RCVY_STEP_2 : - ret =rtw89_pci_lv1rst_start_dma (rtwdev); + ret = gen_def->lv1rst_start_dma (rtwdev);if (ret)rtw89_err (rtwdev,"lv1 rcvy pci start dma fail\n" );break ;
@@ -3839,6 +3841,9 @@ const struct rtw89_pci_gen_def rtw89_pci_gen_ax = { .clr_idx_all = rtw89_pci_clr_idx_all_ax, .rst_bdram = rtw89_pci_rst_bdram_ax, + + .lv1rst_stop_dma = rtw89_pci_lv1rst_stop_dma_ax, + .lv1rst_start_dma = rtw89_pci_lv1rst_start_dma_ax, };EXPORT_SYMBOL (rtw89_pci_gen_ax);
drivers/net/wireless/realtek/rtw89/pci.h +4 -0
@@ -1042,6 +1042,9 @@ struct rtw89_pci_gen_def {void (*clr_idx_all)(struct rtw89_dev *rtwdev);int (*rst_bdram)(struct rtw89_dev *rtwdev); + +int (*lv1rst_stop_dma)(struct rtw89_dev *rtwdev); +int (*lv1rst_start_dma)(struct rtw89_dev *rtwdev); };struct rtw89_pci_info {
@@ -1369,6 +1372,7 @@ u32 rtw89_pci_fill_txaddr_info(struct rtw89_dev *rtwdev,u32 rtw89_pci_fill_txaddr_info_v1 (struct rtw89_dev *rtwdev,void *txaddr_info_addr,u32 total_len,dma_addr_t dma,u8 *add_info_nr); +void rtw89_pci_ctrl_dma_all (struct rtw89_dev *rtwdev,bool enable);void rtw89_pci_config_intr_mask (struct rtw89_dev *rtwdev);void rtw89_pci_config_intr_mask_v1 (struct rtw89_dev *rtwdev);void rtw89_pci_enable_intr (struct rtw89_dev *rtwdev,struct rtw89_pci *rtwpci);
drivers/net/wireless/realtek/rtw89/pci_be.c +55 -0
72 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/ser.c +6 -0
@@ -361,6 +361,9 @@ static int hal_enable_dma(struct rtw89_ser *ser) ret = rtwdev->hci.ops->mac_lv1_rcvy (rtwdev,RTW89_LV1_RCVY_STEP_2 );if (!ret)clear_bit (RTW89_SER_HAL_STOP_DMA , ser->flags); +else +rtw89_debug (rtwdev,RTW89_DBG_SER , +"lv1 rcvy fail to start dma: %d\n" , ret);return ret; }
@@ -376,6 +379,9 @@ static int hal_stop_dma(struct rtw89_ser *ser) ret = rtwdev->hci.ops->mac_lv1_rcvy (rtwdev,RTW89_LV1_RCVY_STEP_1 );if (!ret)set_bit (RTW89_SER_HAL_STOP_DMA , ser->flags); +else +rtw89_debug (rtwdev,RTW89_DBG_SER , +"lv1 rcvy fail to stop dma: %d\n" , ret);return ret; }
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/7 wifi: rtw89: pci: add pre_deinit to be called after probe complete
In reply to Ping-Ke ShihAt probe stage, we only do partial initialization to enable ability to download firmware and read capabilities. After that, we use this pre_deinit to disable HCI to save power.
--- drivers/net/wireless/realtek/rtw89/core.c | 2 ++ drivers/net/wireless/realtek/rtw89/core.h | 6 ++++++ drivers/net/wireless/realtek/rtw89/pci.c | 2 ++ drivers/net/wireless/realtek/rtw89/pci.h | 12 ++++++++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 18 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 9 +++++++++ 6 files changed, 49 insertions(+)
drivers/net/wireless/realtek/rtw89/core.c +2 -0
@@ -4236,6 +4236,8 @@ static int rtw89_chip_efuse_info_setup(struct rtw89_dev *rtwdev)rtw89_core_setup_phycap (rtwdev); +rtw89_hci_mac_pre_deinit (rtwdev); +rtw89_mac_pwr_off (rtwdev);return 0 ;
drivers/net/wireless/realtek/rtw89/core.h +6 -0
@@ -3064,6 +3064,7 @@ struct rtw89_hci_ops {void (*write32)(struct rtw89_dev *rtwdev,u32 addr,u32 data);int (*mac_pre_init)(struct rtw89_dev *rtwdev); +int (*mac_pre_deinit)(struct rtw89_dev *rtwdev);int (*mac_post_init)(struct rtw89_dev *rtwdev);int (*deinit)(struct rtw89_dev *rtwdev);
@@ -4803,6 +4804,11 @@ static inline void rtw89_hci_tx_kick_off(struct rtw89_dev *rtwdev, u8 txch)return rtwdev->hci.ops->tx_kick_off (rtwdev, txch); } +static inline int rtw89_hci_mac_pre_deinit (struct rtw89_dev *rtwdev) +{ +return rtwdev->hci.ops->mac_pre_deinit (rtwdev); +} +static inline void rtw89_hci_flush_queues (struct rtw89_dev *rtwdev,u32 queues,bool drop) {
drivers/net/wireless/realtek/rtw89/pci.c +2 -0
@@ -3837,6 +3837,7 @@ EXPORT_SYMBOL(rtw89_pm_ops);const struct rtw89_pci_gen_def rtw89_pci_gen_ax = { .mac_pre_init = rtw89_pci_ops_mac_pre_init_ax, + .mac_pre_deinit =NULL , .mac_post_init = rtw89_pci_ops_mac_post_init_ax, .clr_idx_all = rtw89_pci_clr_idx_all_ax,
@@ -3866,6 +3867,7 @@ static const struct rtw89_hci_ops rtw89_pci_ops = { .write32 = rtw89_pci_ops_write32, .mac_pre_init = rtw89_pci_ops_mac_pre_init, + .mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit, .mac_post_init = rtw89_pci_ops_mac_post_init, .deinit = rtw89_pci_ops_deinit,
drivers/net/wireless/realtek/rtw89/pci.h +12 -0
@@ -1038,6 +1038,7 @@ struct rtw89_pci_bd_ram {struct rtw89_pci_gen_def {int (*mac_pre_init)(struct rtw89_dev *rtwdev); +int (*mac_pre_deinit)(struct rtw89_dev *rtwdev);int (*mac_post_init)(struct rtw89_dev *rtwdev);void (*clr_idx_all)(struct rtw89_dev *rtwdev);
@@ -1464,6 +1465,17 @@ static inline int rtw89_pci_ops_mac_pre_init(struct rtw89_dev *rtwdev)return gen_def->mac_pre_init (rtwdev); } +static inline int rtw89_pci_ops_mac_pre_deinit (struct rtw89_dev *rtwdev) +{ +const struct rtw89_pci_info *info = rtwdev->pci_info; +const struct rtw89_pci_gen_def *gen_def = info->gen_def; + +if (!gen_def->mac_pre_deinit) +return 0 ; + +return gen_def->mac_pre_deinit (rtwdev); +} +static inline int rtw89_pci_ops_mac_post_init (struct rtw89_dev *rtwdev) {const struct rtw89_pci_info *info = rtwdev->pci_info;
drivers/net/wireless/realtek/rtw89/pci_be.c +18 -0
@@ -329,6 +329,23 @@ static int rtw89_pci_ops_mac_pre_init_be(struct rtw89_dev *rtwdev)return 0 ; } +static int rtw89_pci_ops_mac_pre_deinit_be (struct rtw89_dev *rtwdev) +{ +u32 val; + +_patch_pcie_power_wake_be (rtwdev, false); + + val =rtw89_read32_mask (rtwdev,R_BE_IC_PWR_STATE ,B_BE_WLMAC_PWR_STE_MASK ); +if (val ==0 ) +return 0 ; + +rtw89_pci_ctrl_trxdma_pcie_be (rtwdev,MAC_AX_PCIE_DISABLE , +MAC_AX_PCIE_DISABLE ,MAC_AX_PCIE_DISABLE ); +rtw89_pci_clr_idx_all_be (rtwdev); + +return 0 ; +} +int rtw89_pci_ltr_set_v2 (struct rtw89_dev *rtwdev,bool en) {u32 ctrl0, cfg0, cfg1, dec_ctrl, idle_ltcy, act_ltcy, dis_ltcy;
@@ -474,6 +491,7 @@ static int rtw89_pci_lv1rst_start_dma_be(struct rtw89_dev *rtwdev)const struct rtw89_pci_gen_def rtw89_pci_gen_be = { .mac_pre_init = rtw89_pci_ops_mac_pre_init_be, + .mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit_be, .mac_post_init = rtw89_pci_ops_mac_post_init_be, .clr_idx_all = rtw89_pci_clr_idx_all_be,
drivers/net/wireless/realtek/rtw89/reg.h +9 -0
@@ -3871,6 +3871,15 @@#define R_BE_UDM2 0x01F8#define B_BE_UDM2_EPC_RA_MASK GENMASK(31, 0) +#define R_BE_IC_PWR_STATE 0x03F0 +#define B_BE_WHOLE_SYS_PWR_STE_MASK GENMASK(25, 16) +#define MAC_AX_SYS_ACT 0x220 +#define B_BE_WLMAC_PWR_STE_MASK GENMASK(9, 8) +#define B_BE_UART_HCISYS_PWR_STE_MASK GENMASK(7, 6) +#define B_BE_SDIO_HCISYS_PWR_STE_MASK GENMASK(5, 4) +#define B_BE_USB_HCISYS_PWR_STE_MASK GENMASK(3, 2) +#define B_BE_PCIE_HCISYS_PWR_STE_MASK GENMASK(1, 0) +#define R_BE_DCPU_PLATFORM_ENABLE 0x0888#define B_BE_DCPU_SYM_DPLT_MEM_MUX_EN BIT(10)#define B_BE_DCPU_WARM_EN BIT(9)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 4/7 wifi: rtw89: pci: generalize interrupt status bits of interrupt handlers
In reply to Ping-Ke ShihFor WiFi 7, interrupt status registers and their definitions are changed a lot, but the logic is still the same, so define fields to reuse the code.
--- drivers/net/wireless/realtek/rtw89/pci.c | 27 +++++---- drivers/net/wireless/realtek/rtw89/pci.h | 62 +++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 6 ++ drivers/net/wireless/realtek/rtw89/reg.h | 27 +++++++++ 4 files changed, 111 insertions(+), 11 deletions(-)
drivers/net/wireless/realtek/rtw89/pci.c +16 -11
@@ -696,12 +696,6 @@ void rtw89_pci_recognize_intrs_v1(struct rtw89_dev *rtwdev, }EXPORT_SYMBOL (rtw89_pci_recognize_intrs_v1); -static void rtw89_pci_clear_isr0 (struct rtw89_dev *rtwdev,u32 isr00) -{ -/* write 1 clear */ -rtw89_write32 (rtwdev,R_AX_PCIE_HISR00 , isr00); -} -void rtw89_pci_enable_intr (struct rtw89_dev *rtwdev,struct rtw89_pci *rtwpci) {rtw89_write32 (rtwdev,R_AX_HIMR0 , rtwpci->halt_c2h_intrs);
@@ -773,6 +767,8 @@ static irqreturn_t rtw89_pci_interrupt_threadfn(int irq, void *dev) {struct rtw89_dev *rtwdev = dev;struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; +const struct rtw89_pci_info *info = rtwdev->pci_info; +const struct rtw89_pci_gen_def *gen_def = info->gen_def;struct rtw89_pci_isrs isrs;unsigned long flags;
@@ -780,13 +776,13 @@ static irqreturn_t rtw89_pci_interrupt_threadfn(int irq, void *dev)rtw89_chip_recognize_intrs (rtwdev, rtwpci, &isrs);spin_unlock_irqrestore (&rtwpci->irq_lock, flags); -if (unlikely (isrs.isrs[0 ] &B_AX_RDU_INT )) +if (unlikely (isrs.isrs[0 ] & gen_def->isr_rdu))rtw89_pci_isr_rxd_unavail (rtwdev, rtwpci); -if (unlikely (isrs.halt_c2h_isrs &B_AX_HALT_C2H_INT_EN )) +if (unlikely (isrs.halt_c2h_isrs & gen_def->isr_halt_c2h))rtw89_ser_notify (rtwdev,rtw89_mac_get_err_status (rtwdev)); -if (unlikely (isrs.halt_c2h_isrs &B_AX_WDT_TIMEOUT_INT_EN )) +if (unlikely (isrs.halt_c2h_isrs & gen_def->isr_wdt_timeout))rtw89_ser_notify (rtwdev,MAC_AX_ERR_L2_ERR_WDT_TIMEOUT_INT );if (unlikely (rtwpci->under_recovery))
@@ -3748,17 +3744,19 @@ static int rtw89_pci_napi_poll(struct napi_struct *napi, int budget) { struct rtw89_dev *rtwdev = container_of(napi, struct rtw89_dev, napi);struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; +const struct rtw89_pci_info *info = rtwdev->pci_info; +const struct rtw89_pci_gen_def *gen_def = info->gen_def;unsigned long flags;int work_done; rtwdev->napi_budget_countdown = budget; -rtw89_pci_clear_isr0 (rtwdev,B_AX_RPQDMA_INT |B_AX_RPQBD_FULL_INT ); +rtw89_write32 (rtwdev, gen_def->isr_clear_rpq.addr, gen_def->isr_clear_rpq.data); work_done =rtw89_pci_poll_rpq_dma (rtwdev, rtwpci, rtwdev->napi_budget_countdown);if (work_done == budget)return budget; -rtw89_pci_clear_isr0 (rtwdev,B_AX_RXP1DMA_INT |B_AX_RXDMA_INT |B_AX_RDU_INT ); +rtw89_write32 (rtwdev, gen_def->isr_clear_rxq.addr, gen_def->isr_clear_rxq.data); work_done +=rtw89_pci_poll_rxq_dma (rtwdev, rtwpci, rtwdev->napi_budget_countdown);if (work_done < budget &&napi_complete_done (napi, work_done)) {spin_lock_irqsave (&rtwpci->irq_lock, flags);
@@ -3836,6 +3834,13 @@ SIMPLE_DEV_PM_OPS(rtw89_pm_ops, rtw89_pci_suspend, rtw89_pci_resume);EXPORT_SYMBOL (rtw89_pm_ops);const struct rtw89_pci_gen_def rtw89_pci_gen_ax = { + .isr_rdu =B_AX_RDU_INT , + .isr_halt_c2h =B_AX_HALT_C2H_INT_EN , + .isr_wdt_timeout =B_AX_WDT_TIMEOUT_INT_EN , + .isr_clear_rpq = {R_AX_PCIE_HISR00 ,B_AX_RPQDMA_INT |B_AX_RPQBD_FULL_INT }, + .isr_clear_rxq = {R_AX_PCIE_HISR00 ,B_AX_RXP1DMA_INT |B_AX_RXDMA_INT | +B_AX_RDU_INT }, + .mac_pre_init = rtw89_pci_ops_mac_pre_init_ax, .mac_pre_deinit =NULL , .mac_post_init = rtw89_pci_ops_mac_post_init_ax,
drivers/net/wireless/realtek/rtw89/pci.h +62 -0
74 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/pci_be.c +6 -0
@@ -490,6 +490,12 @@ static int rtw89_pci_lv1rst_start_dma_be(struct rtw89_dev *rtwdev) }const struct rtw89_pci_gen_def rtw89_pci_gen_be = { + .isr_rdu =B_BE_RDU_CH1_INT |B_BE_RDU_CH0_INT , + .isr_halt_c2h =B_BE_HALT_C2H_INT , + .isr_wdt_timeout =B_BE_WDT_TIMEOUT_INT , + .isr_clear_rpq = {R_BE_PCIE_DMA_ISR ,B_BE_PCIE_RX_RPQ0_ISR_V1 }, + .isr_clear_rxq = {R_BE_PCIE_DMA_ISR ,B_BE_PCIE_RX_RX0P2_ISR_V1 }, + .mac_pre_init = rtw89_pci_ops_mac_pre_init_be, .mac_pre_deinit = rtw89_pci_ops_mac_pre_deinit_be, .mac_post_init = rtw89_pci_ops_mac_post_init_be,
drivers/net/wireless/realtek/rtw89/reg.h +27 -0
@@ -3826,6 +3826,33 @@#define B_BE_FS_GPIO17_INT_EN BIT(1)#define B_BE_FS_GPIO16_INT_EN BIT(0) +#define R_BE_HISR0 0x01A4 +#define B_BE_WDT_DATACPU_TIMEOUT_INT BIT(25) +#define B_BE_HALT_D2H_INT BIT(24) +#define B_BE_WDT_TIMEOUT_INT BIT(22) +#define B_BE_HALT_C2H_INT BIT(21) +#define B_BE_RON_INT BIT(20) +#define B_BE_PDNINT BIT(19) +#define B_BE_SPSANA_OCP_INT BIT(18) +#define B_BE_SPS_OCP_INT BIT(17) +#define B_BE_BTON_STS_UPDATE_INT BIT(16) +#define B_BE_GPIOF_INT BIT(15) +#define B_BE_GPIOE_INT BIT(14) +#define B_BE_GPIOD_INT BIT(13) +#define B_BE_GPIOC_INT BIT(12) +#define B_BE_GPIOB_INT BIT(11) +#define B_BE_GPIOA_INT BIT(10) +#define B_BE_GPIO9_INT BIT(9) +#define B_BE_GPIO8_INT BIT(8) +#define B_BE_GPIO7_INT BIT(7) +#define B_BE_GPIO6_INT BIT(6) +#define B_BE_GPIO5_INT BIT(5) +#define B_BE_GPIO4_INT BIT(4) +#define B_BE_GPIO3_INT BIT(3) +#define B_BE_GPIO2_INT BIT(2) +#define B_BE_GPIO1_INT BIT(1) +#define B_BE_GPIO0_INT BIT(0) +#define R_BE_WCPU_FW_CTRL 0x01E0#define B_BE_RUN_ENV_MASK GENMASK(31, 30)#define B_BE_WCPU_FWDL_STATUS_MASK GENMASK(29, 26)
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 5/7 wifi: rtw89: 8922ae: add v2 interrupt handlers for 8922AE
In reply to Ping-Ke ShihThe handlers include three parts -- 1) configure interrupt mask;
2) enable/disable interrupt; 3) recognize (read) interrupt status.
--- drivers/net/wireless/realtek/rtw89/pci.c | 86 +++++++++++++++ drivers/net/wireless/realtek/rtw89/pci.h | 102 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 27 +++++ .../net/wireless/realtek/rtw89/rtw8922ae.c | 4 + 4 files changed, 219 insertions(+)
drivers/net/wireless/realtek/rtw89/pci.c +86 -0
@@ -696,6 +696,27 @@ void rtw89_pci_recognize_intrs_v1(struct rtw89_dev *rtwdev, }EXPORT_SYMBOL (rtw89_pci_recognize_intrs_v1); +void rtw89_pci_recognize_intrs_v2 (struct rtw89_dev *rtwdev, +struct rtw89_pci *rtwpci, +struct rtw89_pci_isrs *isrs) +{ + isrs->ind_isrs =rtw89_read32 (rtwdev,R_BE_PCIE_HISR ) & rtwpci->ind_intrs; + isrs->halt_c2h_isrs = isrs->ind_isrs &B_BE_HS0ISR_IND_INT ? +rtw89_read32 (rtwdev,R_BE_HISR0 ) & rtwpci->halt_c2h_intrs :0 ; + isrs->isrs[0 ] = isrs->ind_isrs &B_BE_HCI_AXIDMA_INT ? +rtw89_read32 (rtwdev,R_BE_HAXI_HISR00 ) & rtwpci->intrs[0 ] :0 ; + isrs->isrs[1 ] =rtw89_read32 (rtwdev,R_BE_PCIE_DMA_ISR ); + +if (isrs->halt_c2h_isrs) +rtw89_write32 (rtwdev,R_BE_HISR0 , isrs->halt_c2h_isrs); +if (isrs->isrs[0 ]) +rtw89_write32 (rtwdev,R_BE_HAXI_HISR00 , isrs->isrs[0 ]); +if (isrs->isrs[1 ]) +rtw89_write32 (rtwdev,R_BE_PCIE_DMA_ISR , isrs->isrs[1 ]); +rtw89_write32 (rtwdev,R_BE_PCIE_HISR , isrs->ind_isrs); +} +EXPORT_SYMBOL (rtw89_pci_recognize_intrs_v2); +void rtw89_pci_enable_intr (struct rtw89_dev *rtwdev,struct rtw89_pci *rtwpci) {rtw89_write32 (rtwdev,R_AX_HIMR0 , rtwpci->halt_c2h_intrs);
@@ -727,6 +748,22 @@ void rtw89_pci_disable_intr_v1(struct rtw89_dev *rtwdev, struct rtw89_pci *rtwpc }EXPORT_SYMBOL (rtw89_pci_disable_intr_v1); +void rtw89_pci_enable_intr_v2 (struct rtw89_dev *rtwdev,struct rtw89_pci *rtwpci) +{ +rtw89_write32 (rtwdev,R_BE_HIMR0 , rtwpci->halt_c2h_intrs); +rtw89_write32 (rtwdev,R_BE_HAXI_HIMR00 , rtwpci->intrs[0 ]); +rtw89_write32 (rtwdev,R_BE_PCIE_DMA_IMR_0_V1 , rtwpci->intrs[1 ]); +rtw89_write32 (rtwdev,R_BE_PCIE_HIMR0 , rtwpci->ind_intrs); +} +EXPORT_SYMBOL (rtw89_pci_enable_intr_v2); + +void rtw89_pci_disable_intr_v2 (struct rtw89_dev *rtwdev,struct rtw89_pci *rtwpci) +{ +rtw89_write32 (rtwdev,R_BE_PCIE_HIMR0 ,0 ); +rtw89_write32 (rtwdev,R_BE_PCIE_DMA_IMR_0_V1 ,0 ); +} +EXPORT_SYMBOL (rtw89_pci_disable_intr_v2); +static void rtw89_pci_ops_recovery_start (struct rtw89_dev *rtwdev) {struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;
@@ -3343,6 +3380,55 @@ void rtw89_pci_config_intr_mask_v1(struct rtw89_dev *rtwdev) }EXPORT_SYMBOL (rtw89_pci_config_intr_mask_v1); +static void rtw89_pci_recovery_intr_mask_v2 (struct rtw89_dev *rtwdev) +{ +struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; + + rtwpci->ind_intrs =B_BE_HS0_IND_INT_EN0 ; + rtwpci->halt_c2h_intrs =B_BE_HALT_C2H_INT_EN |B_BE_WDT_TIMEOUT_INT_EN ; + rtwpci->intrs[0 ] =0 ; + rtwpci->intrs[1 ] =B_BE_PCIE_RX_RX0P2_IMR0_V1 | +B_BE_PCIE_RX_RPQ0_IMR0_V1 ; +} + +static void rtw89_pci_default_intr_mask_v2 (struct rtw89_dev *rtwdev) +{ +struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; + + rtwpci->ind_intrs =B_BE_HCI_AXIDMA_INT_EN0 | +B_BE_HS0_IND_INT_EN0 ; + rtwpci->halt_c2h_intrs =B_BE_HALT_C2H_INT_EN |B_BE_WDT_TIMEOUT_INT_EN ; + rtwpci->intrs[0 ] =B_BE_RDU_CH1_INT_IMR_V1 | +B_BE_RDU_CH0_INT_IMR_V1 ; + rtwpci->intrs[1 ] =B_BE_PCIE_RX_RX0P2_IMR0_V1 | +B_BE_PCIE_RX_RPQ0_IMR0_V1 ; +} + +static void rtw89_pci_low_power_intr_mask_v2 (struct rtw89_dev *rtwdev) +{ +struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; + + rtwpci->ind_intrs =B_BE_HS0_IND_INT_EN0 | +B_BE_HS1_IND_INT_EN0 ; + rtwpci->halt_c2h_intrs =B_BE_HALT_C2H_INT_EN |B_BE_WDT_TIMEOUT_INT_EN ; + rtwpci->intrs[0 ] =0 ; + rtwpci->intrs[1 ] =B_BE_PCIE_RX_RX0P2_IMR0_V1 | +B_BE_PCIE_RX_RPQ0_IMR0_V1 ; +} + +void rtw89_pci_config_intr_mask_v2 (struct rtw89_dev *rtwdev) +{ +struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv; + +if (rtwpci->under_recovery) +rtw89_pci_recovery_intr_mask_v2 (rtwdev); +else if (rtwpci->low_power) +rtw89_pci_low_power_intr_mask_v2 (rtwdev); +else +rtw89_pci_default_intr_mask_v2 (rtwdev); +} +EXPORT_SYMBOL (rtw89_pci_config_intr_mask_v2); +static int rtw89_pci_request_irq (struct rtw89_dev *rtwdev,struct pci_dev *pdev) {
drivers/net/wireless/realtek/rtw89/pci.h +102 -0
130 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/reg.h +27 -0
@@ -3826,6 +3826,33 @@#define B_BE_FS_GPIO17_INT_EN BIT(1)#define B_BE_FS_GPIO16_INT_EN BIT(0) +#define R_BE_HIMR0 0x01A0 +#define B_BE_WDT_DATACPU_TIMEOUT_INT_EN BIT(25) +#define B_BE_HALT_D2H_INT_EN BIT(24) +#define B_BE_WDT_TIMEOUT_INT_EN BIT(22) +#define B_BE_HALT_C2H_INT_EN BIT(21) +#define B_BE_RON_INT_EN BIT(20) +#define B_BE_PDNINT_EN BIT(19) +#define B_BE_SPSANA_OCP_INT_EN BIT(18) +#define B_BE_SPS_OCP_INT_EN BIT(17) +#define B_BE_BTON_STS_UPDATE_INT_EN BIT(16) +#define B_BE_GPIOF_INT_EN BIT(15) +#define B_BE_GPIOE_INT_EN BIT(14) +#define B_BE_GPIOD_INT_EN BIT(13) +#define B_BE_GPIOC_INT_EN BIT(12) +#define B_BE_GPIOB_INT_EN BIT(11) +#define B_BE_GPIOA_INT_EN BIT(10) +#define B_BE_GPIO9_INT_EN BIT(9) +#define B_BE_GPIO8_INT_EN BIT(8) +#define B_BE_GPIO7_INT_EN BIT(7) +#define B_BE_GPIO6_INT_EN BIT(6) +#define B_BE_GPIO5_INT_EN BIT(5) +#define B_BE_GPIO4_INT_EN BIT(4) +#define B_BE_GPIO3_INT_EN BIT(3) +#define B_BE_GPIO2_INT_EN BIT(2) +#define B_BE_GPIO1_INT_EN BIT(1) +#define B_BE_GPIO0_INT_EN BIT(0) +#define R_BE_HISR0 0x01A4#define B_BE_WDT_DATACPU_TIMEOUT_INT BIT(25)#define B_BE_HALT_D2H_INT BIT(24)
drivers/net/wireless/realtek/rtw89/rtw8922ae.c +4 -0
@@ -50,6 +50,10 @@ static const struct rtw89_pci_info rtw8922a_pci_info = { .ltr_set = rtw89_pci_ltr_set_v2, .fill_txaddr_info = rtw89_pci_fill_txaddr_info_v1, + .config_intr_mask = rtw89_pci_config_intr_mask_v2, + .enable_intr = rtw89_pci_enable_intr_v2, + .disable_intr = rtw89_pci_disable_intr_v2, + .recognize_intrs = rtw89_pci_recognize_intrs_v2, };static const struct rtw89_driver_info rtw89_8922ae_info = {
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 6/7 wifi: rtw89: pci: correct interrupt mitigation register for 8852CE
In reply to Ping-Ke ShihTo reduce interrupt count, configure mitigation register with thresholds of time and packet count. We missed that 8852CE uses different register address, so correct it. Then, interrupt counts down to 30,763 from 229,825 during stress test in 20 seconds.
--- drivers/net/wireless/realtek/rtw89/pci.c | 3 ++- drivers/net/wireless/realtek/rtw89/pci.h | 8 ++++++++ drivers/net/wireless/realtek/rtw89/rtw8851be.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852ae.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852be.c | 1 + drivers/net/wireless/realtek/rtw89/rtw8852ce.c | 1 + 6 files changed, 14 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/pci.c +2 -1
@@ -3620,6 +3620,7 @@ static void rtw89_pci_aspm_set(struct rtw89_dev *rtwdev, bool enable)static void rtw89_pci_recalc_int_mit (struct rtw89_dev *rtwdev) { +const struct rtw89_pci_info *info = rtwdev->pci_info;struct rtw89_traffic_stats *stats = &rtwdev->stats;enum rtw89_tfc_lv tx_tfc_lv = stats->tx_tfc_lv;enum rtw89_tfc_lv rx_tfc_lv = stats->rx_tfc_lv;
@@ -3632,7 +3633,7 @@ static void rtw89_pci_recalc_int_mit(struct rtw89_dev *rtwdev)FIELD_PREP (B_AX_RXTIMER_UNIT_MASK ,AX_RXTIMER_UNIT_64US ) |FIELD_PREP (B_AX_RXTIMER_MATCH_MASK ,2048 /64 ); -rtw89_write32 (rtwdev,R_AX_INT_MIT_RX , val); +rtw89_write32 (rtwdev, info->mit_addr, val); }static void rtw89_pci_link_cfg (struct rtw89_dev *rtwdev)
drivers/net/wireless/realtek/rtw89/pci.h +8 -0
@@ -812,6 +812,13 @@#define B_AX_RXCOUNTER_MATCH_MASK GENMASK(15, 8)#define B_AX_RXTIMER_MATCH_MASK GENMASK(7, 0) +#define R_AX_INT_MIT_RX_V1 0x1184 +#define B_AX_RXMIT_RXP2_SEL_V1 BIT(19) +#define B_AX_RXMIT_RXP1_SEL_V1 BIT(18) +#define B_AX_MIT_RXTIMER_UNIT_MASK GENMASK(17, 16) +#define B_AX_MIT_RXCOUNTER_MATCH_MASK GENMASK(15, 8) +#define B_AX_MIT_RXTIMER_MATCH_MASK GENMASK(7, 0) +#define R_AX_DBG_ERR_FLAG 0x11C4#define B_AX_PCIE_RPQ_FULL BIT(29)#define B_AX_PCIE_RXQ_FULL BIT(28)
@@ -1241,6 +1248,7 @@ struct rtw89_pci_info {u32 rpwm_addr;u32 cpwm_addr; +u32 mit_addr;u32 tx_dma_ch_mask;const struct rtw89_pci_bd_idx_addr *bd_idx_addr_low_power;const struct rtw89_pci_ch_dma_addr_set *dma_addr_set;
drivers/net/wireless/realtek/rtw89/rtw8851be.c +1 -0
@@ -43,6 +43,7 @@ static const struct rtw89_pci_info rtw8851b_pci_info = { .rpwm_addr = R_AX_PCIE_HRPWM, .cpwm_addr = R_AX_CPWM, + .mit_addr = R_AX_INT_MIT_RX, .tx_dma_ch_mask =BIT (RTW89_TXCH_ACH4 ) |BIT (RTW89_TXCH_ACH5 ) |BIT (RTW89_TXCH_ACH6 ) |BIT (RTW89_TXCH_ACH7 ) | BIT(RTW89_TXCH_CH10) | BIT(RTW89_TXCH_CH11),
drivers/net/wireless/realtek/rtw89/rtw8852ae.c +1 -0
@@ -44,6 +44,7 @@ static const struct rtw89_pci_info rtw8852a_pci_info = { .rpwm_addr = R_AX_PCIE_HRPWM, .cpwm_addr = R_AX_CPWM, + .mit_addr = R_AX_INT_MIT_RX, .tx_dma_ch_mask = 0, .bd_idx_addr_low_power = NULL, .dma_addr_set = &rtw89_pci_ch_dma_addr_set,
drivers/net/wireless/realtek/rtw89/rtw8852be.c +1 -0
@@ -44,6 +44,7 @@ static const struct rtw89_pci_info rtw8852b_pci_info = { .rpwm_addr = R_AX_PCIE_HRPWM, .cpwm_addr = R_AX_CPWM, + .mit_addr = R_AX_INT_MIT_RX, .tx_dma_ch_mask =BIT (RTW89_TXCH_ACH4 ) |BIT (RTW89_TXCH_ACH5 ) |BIT (RTW89_TXCH_ACH6 ) |BIT (RTW89_TXCH_ACH7 ) | BIT(RTW89_TXCH_CH10) | BIT(RTW89_TXCH_CH11),
drivers/net/wireless/realtek/rtw89/rtw8852ce.c +1 -0
@@ -53,6 +53,7 @@ static const struct rtw89_pci_info rtw8852c_pci_info = { .rpwm_addr = R_AX_PCIE_HRPWM_V1, .cpwm_addr = R_AX_PCIE_CRPWM, + .mit_addr = R_AX_INT_MIT_RX_V1, .tx_dma_ch_mask = 0, .bd_idx_addr_low_power = &rtw8852c_bd_idx_addr_low_power, .dma_addr_set = &rtw89_pci_ch_dma_addr_set_v1,
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 7/7 wifi: rtw89: pci: update interrupt mitigation register for 8922AE
In reply to Ping-Ke ShihTo reduce interrupts, configure the mitigation setting of 8922AE when bringing interface up, and then check situations to decide turning on or off the function. With this, interrupt count decreases to 20,141 from 202,141 in period of 20 seconds.
--- drivers/net/wireless/realtek/rtw89/pci.c | 11 +++++++++-- drivers/net/wireless/realtek/rtw89/rtw8922ae.c | 1 + 2 files changed, 10 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw89/pci.c +9 -2
@@ -3620,19 +3620,26 @@ static void rtw89_pci_aspm_set(struct rtw89_dev *rtwdev, bool enable)static void rtw89_pci_recalc_int_mit (struct rtw89_dev *rtwdev) { +enum rtw89_chip_gen chip_gen = rtwdev->chip->chip_gen;const struct rtw89_pci_info *info = rtwdev->pci_info;struct rtw89_traffic_stats *stats = &rtwdev->stats;enum rtw89_tfc_lv tx_tfc_lv = stats->tx_tfc_lv;enum rtw89_tfc_lv rx_tfc_lv = stats->rx_tfc_lv;u32 val =0 ; -if (!rtwdev->scanning && - (tx_tfc_lv >=RTW89_TFC_HIGH || rx_tfc_lv >=RTW89_TFC_HIGH )) +if (rtwdev->scanning || + (tx_tfc_lv <RTW89_TFC_HIGH && rx_tfc_lv <RTW89_TFC_HIGH )) + goto out; + +if (chip_gen ==RTW89_CHIP_BE ) + val =B_BE_PCIE_MIT_RX0P2_EN |B_BE_PCIE_MIT_RX0P1_EN ; +else val =B_AX_RXMIT_RXP2_SEL |B_AX_RXMIT_RXP1_SEL |FIELD_PREP (B_AX_RXCOUNTER_MATCH_MASK ,RTW89_PCI_RXBD_NUM_MAX /2 ) |FIELD_PREP (B_AX_RXTIMER_UNIT_MASK ,AX_RXTIMER_UNIT_64US ) |FIELD_PREP (B_AX_RXTIMER_MATCH_MASK ,2048 /64 ); +out:rtw89_write32 (rtwdev, info->mit_addr, val); }
drivers/net/wireless/realtek/rtw89/rtw8922ae.c +1 -0
@@ -43,6 +43,7 @@ static const struct rtw89_pci_info rtw8922a_pci_info = { .rpwm_addr = R_BE_PCIE_HRPWM, .cpwm_addr = R_BE_PCIE_CRPWM, + .mit_addr = R_BE_PCIE_MIT_CH_EN, .tx_dma_ch_mask = 0, .bd_idx_addr_low_power = NULL, .dma_addr_set = &rtw89_pci_ch_dma_addr_set_be,
Signature · 1 line
2.25.1