wifi: rtw89: pci: add PCI generation struct to reuse common flow
Ping-Ke Shih
maintainercover wifi: rtw89: pci: add PCI generation struct to reuse common flow
For WiFi 7 chips, the PCI settings are similar, but registers' names are changed, so it will be difficult to understand the code if we mix the code of two generations into one function. Therefore, we add a struct to abstract PCI generation info, and put the code used by WiFi 7 chips in pci_be.c.
Then, the struct hierarchy looks like
rtwdev
|
v
const struct rtw89_pci_info *pci_info; // per chip (e.g. 8922ae.c)
|
v
const struct rtw89_pci_gen_def *gen_def; // per generation (e.g. pci_be.c)
Ping-Ke Shih (5):
wifi: rtw89: pci: add PCI generation information to pci_info for each
chip
wifi: rtw89: pci: use gen_def pointer to configure mac_{pre,post}_init
and clear PCI ring index
wifi: rtw89: pci: implement PCI mac_pre_init for WiFi 7 chips
wifi: rtw89: pci: add LTR v2 for WiFi 7 chip
wifi: rtw89: pci: implement PCI mac_post_init for WiFi 7 chips
drivers/net/wireless/realtek/rtw89/pci.c | 16 +- drivers/net/wireless/realtek/rtw89/pci.h | 150 ++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 429 ++++++++++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 271 +++++++++++ .../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 | 2 + 9 files changed, 868 insertions(+), 4 deletions(-) create mode 100644 drivers/net/wireless/realtek/rtw89/pci_be.c
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 1/5 wifi: rtw89: pci: add PCI generation information to pci_info for each chip
In order to reuse PCI initial and configuration flows, add struct rtw89_pci_gen_def to abstract the differences between WiFi 6/7 generations.
--- drivers/net/wireless/realtek/rtw89/pci.c | 4 ++++ drivers/net/wireless/realtek/rtw89/pci.h | 6 ++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 12 ++++++++++++ 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 + drivers/net/wireless/realtek/rtw89/rtw8922ae.c | 1 + 8 files changed, 27 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtw89/pci_be.c
drivers/net/wireless/realtek/rtw89/pci.c +4 -0
@@ -3853,6 +3853,10 @@ static int __maybe_unused rtw89_pci_resume(struct device *dev)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 = { +}; +EXPORT_SYMBOL (rtw89_pci_gen_ax); +static const struct rtw89_hci_ops rtw89_pci_ops = { .tx_write = rtw89_pci_ops_tx_write, .tx_kick_off = rtw89_pci_ops_tx_kick_off,
drivers/net/wireless/realtek/rtw89/pci.h +6 -0
@@ -922,7 +922,11 @@ struct rtw89_pci_bd_ram {u8 min_num; }; +struct rtw89_pci_gen_def { +}; +struct rtw89_pci_info { +const struct rtw89_pci_gen_def *gen_def;enum mac_ax_bd_trunc_mode txbd_trunc_mode;enum mac_ax_bd_trunc_mode rxbd_trunc_mode;enum mac_ax_rxbd_mode rxbd_mode;
@@ -1229,6 +1233,8 @@ extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set_v1;extern const struct rtw89_pci_ch_dma_addr_set rtw89_pci_ch_dma_addr_set_be;extern const struct rtw89_pci_bd_ram rtw89_bd_ram_table_dual[RTW89_TXCH_NUM ];extern const struct rtw89_pci_bd_ram rtw89_bd_ram_table_single[RTW89_TXCH_NUM ]; +extern const struct rtw89_pci_gen_def rtw89_pci_gen_ax; +extern const struct rtw89_pci_gen_def rtw89_pci_gen_be;struct pci_device_id ;
drivers/net/wireless/realtek/rtw89/pci_be.c new file +12 -0
@@ -0,0 +1,12 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2023 Realtek Corporation +*/ + +#include <linux/pci.h> + +#include "pci.h" +#include "reg.h" + +const struct rtw89_pci_gen_def rtw89_pci_gen_be = { +}; +EXPORT_SYMBOL (rtw89_pci_gen_be);
drivers/net/wireless/realtek/rtw89/rtw8851be.c +1 -0
@@ -10,6 +10,7 @@#include "rtw8851b.h" static const struct rtw89_pci_info rtw8851b_pci_info = { + .gen_def = &rtw89_pci_gen_ax, .txbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_mode =MAC_AX_RXBD_PKT ,
drivers/net/wireless/realtek/rtw89/rtw8852ae.c +1 -0
@@ -10,6 +10,7 @@#include "rtw8852a.h" static const struct rtw89_pci_info rtw8852a_pci_info = { + .gen_def = &rtw89_pci_gen_ax, .txbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_mode =MAC_AX_RXBD_PKT ,
drivers/net/wireless/realtek/rtw89/rtw8852be.c +1 -0
@@ -10,6 +10,7 @@#include "rtw8852b.h" static const struct rtw89_pci_info rtw8852b_pci_info = { + .gen_def = &rtw89_pci_gen_ax, .txbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_mode =MAC_AX_RXBD_PKT ,
drivers/net/wireless/realtek/rtw89/rtw8852ce.c +1 -0
@@ -19,6 +19,7 @@ static const struct rtw89_pci_bd_idx_addr rtw8852c_bd_idx_addr_low_power = { };static const struct rtw89_pci_info rtw8852c_pci_info = { + .gen_def = &rtw89_pci_gen_ax, .txbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_mode =MAC_AX_RXBD_PKT ,
drivers/net/wireless/realtek/rtw89/rtw8922ae.c +1 -0
@@ -9,6 +9,7 @@#include "reg.h" static const struct rtw89_pci_info rtw8922a_pci_info = { + .gen_def = &rtw89_pci_gen_be, .txbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_trunc_mode =MAC_AX_BD_TRUNC , .rxbd_mode =MAC_AX_RXBD_PKT ,
Signature · 1 line
2.25.1
Re: [PATCH 1/5] wifi: rtw89: pci: add PCI generation information to pci_info for each chip
Quoted 4 lines · Ping-Ke Shih
In order to reuse PCI initial and configuration flows, add struct
rtw89_pci_gen_defto abstract the differences between WiFi 6/7 generations.Signed-off-by Ping-Ke Shih <[email protected]>
5 patches applied to wireless-next.git, thanks.
07fabde630a6 wifi: rtw89: pci: add PCI generation information to pci_info for each chip bfdcfee3659c wifi: rtw89: pci: use gen_def pointer to configure mac_{pre,post}_init and clear PCI ring index 2daafe9a0cb6 wifi: rtw89: pci: implement PCI mac_pre_init for WiFi 7 chipse24ae0f07625 wifi: rtw89: pci: add LTR v2 for WiFi 7 chip5cb0d6b878c3 wifi: rtw89: pci: implement PCI mac_post_init for WiFi 7 chips
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/5 wifi: rtw89: pci: use gen_def pointer to configure mac_{pre,post}_init and clear PCI ring index
In reply to Ping-Ke ShihUse gen_def pointer to call three WiFi 6 specific functions, and add _ax suffix to them. Then, we will implement functions for WiFi 7 chips later.
The mac_{pre,post}_init are used to initialize PCI during doing MAC initialization, and clear PCI ring index to make index consistent between driver, firmware and hardware.
--- drivers/net/wireless/realtek/rtw89/pci.c | 10 ++++++--- drivers/net/wireless/realtek/rtw89/pci.h | 28 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtw89/pci.c +7 -3
@@ -2361,7 +2361,7 @@ static void rtw89_pci_set_keep_reg(struct rtw89_dev *rtwdev) B_AX_PCIE_TXRST_KEEP_REG | B_AX_PCIE_RXRST_KEEP_REG); } -static void rtw89_pci_clr_idx_all (struct rtw89_dev *rtwdev) +static void rtw89_pci_clr_idx_all_ax (struct rtw89_dev *rtwdev) {const struct rtw89_pci_info *info = rtwdev->pci_info;enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
@@ -2549,7 +2549,7 @@ static int rtw89_pci_ops_deinit(struct rtw89_dev *rtwdev)return 0 ; } -static int rtw89_pci_ops_mac_pre_init (struct rtw89_dev *rtwdev) +static int rtw89_pci_ops_mac_pre_init_ax (struct rtw89_dev *rtwdev) {const struct rtw89_pci_info *info = rtwdev->pci_info;int ret;
@@ -2706,7 +2706,7 @@ int rtw89_pci_ltr_set_v1(struct rtw89_dev *rtwdev, bool en) }EXPORT_SYMBOL (rtw89_pci_ltr_set_v1); -static int rtw89_pci_ops_mac_post_init (struct rtw89_dev *rtwdev) +static int rtw89_pci_ops_mac_post_init_ax (struct rtw89_dev *rtwdev) {const struct rtw89_pci_info *info = rtwdev->pci_info;enum rtw89_core_chip_id chip_id = rtwdev->chip->chip_id;
@@ -3854,6 +3854,10 @@ 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 = { + .mac_pre_init = rtw89_pci_ops_mac_pre_init_ax, + .mac_post_init = rtw89_pci_ops_mac_post_init_ax, + + .clr_idx_all = rtw89_pci_clr_idx_all_ax, };EXPORT_SYMBOL (rtw89_pci_gen_ax);
drivers/net/wireless/realtek/rtw89/pci.h +28 -0
@@ -923,6 +923,10 @@ struct rtw89_pci_bd_ram { };struct rtw89_pci_gen_def { +int (*mac_pre_init)(struct rtw89_dev *rtwdev); +int (*mac_post_init)(struct rtw89_dev *rtwdev); + +void (*clr_idx_all)(struct rtw89_dev *rtwdev); };struct rtw89_pci_info {
@@ -1331,4 +1335,28 @@ void rtw89_chip_recognize_intrs(struct rtw89_dev *rtwdev, info->recognize_intrs (rtwdev, rtwpci, isrs); } +static inline int rtw89_pci_ops_mac_pre_init (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->mac_pre_init (rtwdev); +} + +static inline int rtw89_pci_ops_mac_post_init (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->mac_post_init (rtwdev); +} + +static inline void rtw89_pci_clr_idx_all (struct rtw89_dev *rtwdev) +{ +const struct rtw89_pci_info *info = rtwdev->pci_info; +const struct rtw89_pci_gen_def *gen_def = info->gen_def; + + gen_def->clr_idx_all (rtwdev); +} +#endif
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 3/5 wifi: rtw89: pci: implement PCI mac_pre_init for WiFi 7 chips
In reply to Ping-Ke ShihCall this function when doing MAC initialization at probe stage. It does partial initial registers only, because we only need basic ability to download firmware. The function to clear index is the sub-function, so set its pointer as well.
--- drivers/net/wireless/realtek/rtw89/pci.c | 2 +- drivers/net/wireless/realtek/rtw89/pci.h | 71 +++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 324 ++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 228 ++++++++++++++ 4 files changed, 624 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/pci.c +1 -1
@@ -1537,7 +1537,7 @@ static void rtw89_pci_release_tx_ring(struct rtw89_dev *rtwdev,rtw89_pci_release_pending_txwd_skb (rtwdev, tx_ring); } -static void rtw89_pci_ops_reset (struct rtw89_dev *rtwdev) +void rtw89_pci_ops_reset (struct rtw89_dev *rtwdev) {struct rtw89_pci *rtwpci = (struct rtw89_pci *)rtwdev->priv;const struct rtw89_pci_info *info = rtwdev->pci_info;
drivers/net/wireless/realtek/rtw89/pci.h +71 -0
89 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/pci_be.c +324 -0
330 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/reg.h +228 -0
264 lines not on this page · raw message
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 4/5 wifi: rtw89: pci: add LTR v2 for WiFi 7 chip
In reply to Ping-Ke ShihPCI LTR (Latency Tolerance Reporting) is a capability to yield expected power consumption, and we configure the parameters according to design.
--- drivers/net/wireless/realtek/rtw89/pci.h | 1 + drivers/net/wireless/realtek/rtw89/pci_be.c | 57 +++++++++++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 43 ++++++++++++++ .../net/wireless/realtek/rtw89/rtw8922ae.c | 1 + 4 files changed, 102 insertions(+)
drivers/net/wireless/realtek/rtw89/pci.h +1 -0
@@ -1317,6 +1317,7 @@ void rtw89_pci_remove(struct pci_dev *pdev);void rtw89_pci_ops_reset (struct rtw89_dev *rtwdev);int rtw89_pci_ltr_set (struct rtw89_dev *rtwdev,bool en);int rtw89_pci_ltr_set_v1 (struct rtw89_dev *rtwdev,bool en); +int rtw89_pci_ltr_set_v2 (struct rtw89_dev *rtwdev,bool en);u32 rtw89_pci_fill_txaddr_info (struct rtw89_dev *rtwdev,void *txaddr_info_addr,u32 total_len,dma_addr_t dma,u8 *add_info_nr);
drivers/net/wireless/realtek/rtw89/pci_be.c +57 -0
63 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/reg.h +43 -0
49 lines not on this page · raw message
drivers/net/wireless/realtek/rtw89/rtw8922ae.c +1 -0
@@ -48,6 +48,7 @@ static const struct rtw89_pci_info rtw8922a_pci_info = { .dma_addr_set = &rtw89_pci_ch_dma_addr_set_be, .bd_ram_table = NULL, + .ltr_set = rtw89_pci_ltr_set_v2, .fill_txaddr_info = rtw89_pci_fill_txaddr_info_v1, };
Signature · 1 line
2.25.1
Ping-Ke Shih
maintainerPATCH 5/5 wifi: rtw89: pci: implement PCI mac_post_init for WiFi 7 chips
In reply to Ping-Ke ShihFor normal use, we do additional settings than mac_pre_init, such as more TX/RX DMA channels, interrupt mitigation and etc.
--- drivers/net/wireless/realtek/rtw89/pci.h | 44 +++++++++++++++++++++ drivers/net/wireless/realtek/rtw89/pci_be.c | 36 +++++++++++++++++ 2 files changed, 80 insertions(+)
drivers/net/wireless/realtek/rtw89/pci.h +44 -0
@@ -708,6 +708,45 @@#define B_BE_END_PL1_CNT_MASK GENMASK(23, 16)#define B_BE_START_PL1_CNT_MASK GENMASK(7, 0) +#define R_BE_PCIE_MIT0_TMR 0x3330 +#define B_BE_PCIE_MIT0_RX_TMR_MASK GENMASK(5, 4) +#define BE_MIT0_TMR_UNIT_1MS 0 +#define BE_MIT0_TMR_UNIT_2MS 1 +#define BE_MIT0_TMR_UNIT_4MS 2 +#define BE_MIT0_TMR_UNIT_8MS 3 +#define B_BE_PCIE_MIT0_TX_TMR_MASK GENMASK(1, 0) + +#define R_BE_PCIE_MIT0_CNT 0x3334 +#define B_BE_PCIE_RX_MIT0_CNT_MASK GENMASK(31, 24) +#define B_BE_PCIE_TX_MIT0_CNT_MASK GENMASK(23, 16) +#define B_BE_PCIE_RX_MIT0_TMR_CNT_MASK GENMASK(15, 8) +#define B_BE_PCIE_TX_MIT0_TMR_CNT_MASK GENMASK(7, 0) + +#define R_BE_PCIE_MIT_CH_EN 0x3338 +#define B_BE_PCIE_MIT_RX1P1_EN BIT(23) +#define B_BE_PCIE_MIT_RX0P1_EN BIT(22) +#define B_BE_PCIE_MIT_ROQ1_EN BIT(21) +#define B_BE_PCIE_MIT_RPQ1_EN BIT(20) +#define B_BE_PCIE_MIT_RX1P2_EN BIT(19) +#define B_BE_PCIE_MIT_ROQ0_EN BIT(18) +#define B_BE_PCIE_MIT_RPQ0_EN BIT(17) +#define B_BE_PCIE_MIT_RX0P2_EN BIT(16) +#define B_BE_PCIE_MIT_TXCH14_EN BIT(14) +#define B_BE_PCIE_MIT_TXCH13_EN BIT(13) +#define B_BE_PCIE_MIT_TXCH12_EN BIT(12) +#define B_BE_PCIE_MIT_TXCH11_EN BIT(11) +#define B_BE_PCIE_MIT_TXCH10_EN BIT(10) +#define B_BE_PCIE_MIT_TXCH9_EN BIT(9) +#define B_BE_PCIE_MIT_TXCH8_EN BIT(8) +#define B_BE_PCIE_MIT_TXCH7_EN BIT(7) +#define B_BE_PCIE_MIT_TXCH6_EN BIT(6) +#define B_BE_PCIE_MIT_TXCH5_EN BIT(5) +#define B_BE_PCIE_MIT_TXCH4_EN BIT(4) +#define B_BE_PCIE_MIT_TXCH3_EN BIT(3) +#define B_BE_PCIE_MIT_TXCH2_EN BIT(2) +#define B_BE_PCIE_MIT_TXCH1_EN BIT(1) +#define B_BE_PCIE_MIT_TXCH0_EN BIT(0) +#define R_BE_SER_PL1_CTRL 0x34A8#define B_BE_PL1_SER_PL1_EN BIT(31)#define B_BE_PL1_IGNORE_HOT_RST BIT(30)
@@ -800,12 +839,15 @@#define RTW89_PCI_MULTITAG 8/* PCIE CFG register */ +#define RTW89_PCIE_CAPABILITY_SPEED 0x7C +#define RTW89_PCIE_SUPPORT_GEN_MASK GENMASK(3, 0)#define RTW89_PCIE_L1_STS_V1 0x80#define RTW89_BCFG_LINK_SPEED_MASK GENMASK(19, 16)#define RTW89_PCIE_GEN1_SPEED 0x01#define RTW89_PCIE_GEN2_SPEED 0x02#define RTW89_PCIE_PHY_RATE 0x82#define RTW89_PCIE_PHY_RATE_MASK GENMASK(1, 0) +#define RTW89_PCIE_LINK_CHANGE_SPEED 0xA0#define RTW89_PCIE_L1SS_STS_V1 0x0168#define RTW89_PCIE_BIT_ASPM_L11 BIT(3)#define RTW89_PCIE_BIT_ASPM_L12 BIT(2)
@@ -820,6 +862,8 @@#define RTW89_PCIE_BIT_CLK BIT(4)#define RTW89_PCIE_BIT_L1 BIT(3)#define RTW89_PCIE_CLK_CTRL 0x0725 +#define RTW89_PCIE_FTS 0x080C +#define RTW89_PCIE_POLLING_BIT BIT(17)#define RTW89_PCIE_RST_MSTATE 0x0B48#define RTW89_PCIE_BIT_CFG_RST_MSTATE BIT(0)
drivers/net/wireless/realtek/rtw89/pci_be.c +36 -0
@@ -385,8 +385,44 @@ int rtw89_pci_ltr_set_v2(struct rtw89_dev *rtwdev, bool en) }EXPORT_SYMBOL (rtw89_pci_ltr_set_v2); +static void rtw89_pci_configure_mit_be (struct rtw89_dev *rtwdev) +{ +u32 cnt; +u32 val; + +rtw89_write32_mask (rtwdev,R_BE_PCIE_MIT0_TMR , +B_BE_PCIE_MIT0_RX_TMR_MASK ,BE_MIT0_TMR_UNIT_1MS ); + + val =rtw89_read32 (rtwdev,R_BE_PCIE_MIT0_CNT ); + cnt =min_t (u32,U8_MAX ,RTW89_PCI_RXBD_NUM_MAX /2 ); + val =u32_replace_bits (val, cnt,B_BE_PCIE_RX_MIT0_CNT_MASK ); + val =u32_replace_bits (val,2 ,B_BE_PCIE_RX_MIT0_TMR_CNT_MASK ); +rtw89_write32 (rtwdev,R_BE_PCIE_MIT0_CNT , val); +} + +static int rtw89_pci_ops_mac_post_init_be (struct rtw89_dev *rtwdev) +{ +const struct rtw89_pci_info *info = rtwdev->pci_info; +int ret; + + ret = info->ltr_set (rtwdev, true); +if (ret) { +rtw89_err (rtwdev,"pci ltr set fail\n" ); +return ret; + } + +rtw89_pci_ctrl_trxdma_pcie_be (rtwdev,MAC_AX_PCIE_IGNORE , +MAC_AX_PCIE_IGNORE ,MAC_AX_PCIE_ENABLE ); +rtw89_pci_ctrl_wpdma_pcie_be (rtwdev, true); +rtw89_pci_ctrl_txdma_ch_be (rtwdev, true, true); +rtw89_pci_configure_mit_be (rtwdev); + +return 0 ; +} +const struct rtw89_pci_gen_def rtw89_pci_gen_be = { .mac_pre_init = rtw89_pci_ops_mac_pre_init_be, + .mac_post_init = rtw89_pci_ops_mac_post_init_be, .clr_idx_all = rtw89_pci_clr_idx_all_be, };
Signature · 1 line
2.25.1