* [PATCH rtw-next v2 01/14] wifi: rtw89: 8851b: Accept USB devices and load their MAC address
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
@ 2025-06-09 19:23 ` Bitterblue Smith
2025-06-09 19:24 ` [PATCH rtw-next v2 02/14] wifi: rtw89: Make dle_mem in rtw89_chip_info an array Bitterblue Smith
` (12 subsequent siblings)
13 siblings, 0 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:23 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Make rtw8851b_read_efuse() accept USB devices and load the MAC address
from the correct offset.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2:
- Add Acked-by.
---
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 16 +++++++---------
1 file changed, 7 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index fafa200a9c8d..c9fdf7e8e53c 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -461,14 +461,6 @@ static int rtw8851b_pwr_off_func(struct rtw89_dev *rtwdev)
return 0;
}
-static void rtw8851b_efuse_parsing(struct rtw89_efuse *efuse,
- struct rtw8851b_efuse *map)
-{
- ether_addr_copy(efuse->addr, map->e.mac_addr);
- efuse->rfe_type = map->rfe_type;
- efuse->xtal_cap = map->xtal_k;
-}
-
static void rtw8851b_efuse_parsing_tssi(struct rtw89_dev *rtwdev,
struct rtw8851b_efuse *map)
{
@@ -549,12 +541,18 @@ static int rtw8851b_read_efuse(struct rtw89_dev *rtwdev, u8 *log_map,
switch (rtwdev->hci.type) {
case RTW89_HCI_TYPE_PCIE:
- rtw8851b_efuse_parsing(efuse, map);
+ ether_addr_copy(efuse->addr, map->e.mac_addr);
+ break;
+ case RTW89_HCI_TYPE_USB:
+ ether_addr_copy(efuse->addr, map->u.mac_addr);
break;
default:
return -EOPNOTSUPP;
}
+ efuse->rfe_type = map->rfe_type;
+ efuse->xtal_cap = map->xtal_k;
+
rtw89_info(rtwdev, "chip rfe_type is %d\n", efuse->rfe_type);
return 0;
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 02/14] wifi: rtw89: Make dle_mem in rtw89_chip_info an array
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
2025-06-09 19:23 ` [PATCH rtw-next v2 01/14] wifi: rtw89: 8851b: Accept USB devices and load their MAC address Bitterblue Smith
@ 2025-06-09 19:24 ` Bitterblue Smith
2025-06-16 1:15 ` Ping-Ke Shih
2025-06-09 19:25 ` [PATCH rtw-next v2 03/14] wifi: rtw89: Make hfc_param_ini " Bitterblue Smith
` (11 subsequent siblings)
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:24 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
USB 2, USB 3, and SDIO will need different sets of values.
Add a new dle_type member in struct rtw89_hci_info and make dle_mem in
struct rtw89_chip_info an array to hold the four different sets of
values.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Make dle_mem an array instead of having (eventually) four different
dle_mem_* members.
---
drivers/net/wireless/realtek/rtw89/core.h | 12 +++++++++++-
drivers/net/wireless/realtek/rtw89/mac.c | 2 +-
drivers/net/wireless/realtek/rtw89/pci.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852b.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852bt.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8922a.c | 2 +-
9 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 1c8f3b9b7c4c..12d5727abfe9 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -132,6 +132,15 @@ enum rtw89_hci_type {
RTW89_HCI_TYPE_SDIO,
};
+enum rtw89_hci_dle_type {
+ RTW89_HCI_DLE_TYPE_PCIE,
+ RTW89_HCI_DLE_TYPE_USB2,
+ RTW89_HCI_DLE_TYPE_USB3,
+ RTW89_HCI_DLE_TYPE_SDIO,
+
+ RTW89_HCI_DLE_TYPE_NUM,
+};
+
enum rtw89_core_chip_id {
RTL8852A,
RTL8852B,
@@ -3596,6 +3605,7 @@ struct rtw89_hci_ops {
struct rtw89_hci_info {
const struct rtw89_hci_ops *ops;
enum rtw89_hci_type type;
+ enum rtw89_hci_dle_type dle_type;
u32 rpwm_addr;
u32 cpwm_addr;
bool paused;
@@ -4293,7 +4303,7 @@ struct rtw89_chip_info {
bool dis_2g_40m_ul_ofdma;
u32 rsvd_ple_ofst;
const struct rtw89_hfc_param_ini *hfc_param_ini;
- const struct rtw89_dle_mem *dle_mem;
+ const struct rtw89_dle_mem *dle_mem[RTW89_HCI_DLE_TYPE_NUM];
u8 wde_qempty_acq_grpnum;
u8 wde_qempty_mgq_grpsel;
u32 rf_base_addr[2];
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 9f0e30e75009..2ee766e37322 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -1719,7 +1719,7 @@ static const struct rtw89_dle_mem *get_dle_mem_cfg(struct rtw89_dev *rtwdev,
struct rtw89_mac_info *mac = &rtwdev->mac;
const struct rtw89_dle_mem *cfg;
- cfg = &rtwdev->chip->dle_mem[mode];
+ cfg = &rtwdev->chip->dle_mem[rtwdev->hci.dle_type][mode];
if (!cfg)
return NULL;
diff --git a/drivers/net/wireless/realtek/rtw89/pci.c b/drivers/net/wireless/realtek/rtw89/pci.c
index 064f6a940107..928cf82d3b36 100644
--- a/drivers/net/wireless/realtek/rtw89/pci.c
+++ b/drivers/net/wireless/realtek/rtw89/pci.c
@@ -4449,6 +4449,7 @@ int rtw89_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
rtwdev->pci_info = info->bus.pci;
rtwdev->hci.ops = &rtw89_pci_ops;
rtwdev->hci.type = RTW89_HCI_TYPE_PCIE;
+ rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_PCIE;
rtwdev->hci.rpwm_addr = pci_info->rpwm_addr;
rtwdev->hci.cpwm_addr = pci_info->cpwm_addr;
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index c9fdf7e8e53c..f0755afb1fdc 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -2465,7 +2465,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x2f800,
.hfc_param_ini = rtw8851b_hfc_param_ini_pcie,
- .dle_mem = rtw8851b_dle_mem_pcie,
+ .dle_mem = {rtw8851b_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
.rf_base_addr = {0xe000},
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
index cd5987fc52d7..7c631ccee8fc 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
@@ -2184,7 +2184,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x6f800,
.hfc_param_ini = rtw8852a_hfc_param_ini_pcie,
- .dle_mem = rtw8852a_dle_mem_pcie,
+ .dle_mem = {rtw8852a_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 16,
.wde_qempty_mgq_grpsel = 16,
.rf_base_addr = {0xc000, 0xd000},
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
index dacdb384de2c..a2dfdc541ce6 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
@@ -820,7 +820,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x2f800,
.hfc_param_ini = rtw8852b_hfc_param_ini_pcie,
- .dle_mem = rtw8852b_dle_mem_pcie,
+ .dle_mem = {rtw8852b_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
.rf_base_addr = {0xe000, 0xf000},
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
index 289dce688d72..96800ccdedc6 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
@@ -754,7 +754,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x6f800,
.hfc_param_ini = rtw8852bt_hfc_param_ini_pcie,
- .dle_mem = rtw8852bt_dle_mem_pcie,
+ .dle_mem = {rtw8852bt_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
.rf_base_addr = {0xe000, 0xf000},
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index 2a6143a8d256..5210f2f9124b 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -3004,7 +3004,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
.dis_2g_40m_ul_ofdma = false,
.rsvd_ple_ofst = 0x6f800,
.hfc_param_ini = rtw8852c_hfc_param_ini_pcie,
- .dle_mem = rtw8852c_dle_mem_pcie,
+ .dle_mem = {rtw8852c_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 16,
.wde_qempty_mgq_grpsel = 16,
.rf_base_addr = {0xe000, 0xf000},
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a.c b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
index 1d0f6e7df497..0517f0d27a5c 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
@@ -2817,7 +2817,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
.dis_2g_40m_ul_ofdma = false,
.rsvd_ple_ofst = 0x8f800,
.hfc_param_ini = rtw8922a_hfc_param_ini_pcie,
- .dle_mem = rtw8922a_dle_mem_pcie,
+ .dle_mem = {rtw8922a_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
.rf_base_addr = {0xe000, 0xf000},
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 02/14] wifi: rtw89: Make dle_mem in rtw89_chip_info an array
2025-06-09 19:24 ` [PATCH rtw-next v2 02/14] wifi: rtw89: Make dle_mem in rtw89_chip_info an array Bitterblue Smith
@ 2025-06-16 1:15 ` Ping-Ke Shih
0 siblings, 0 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 1:15 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> USB 2, USB 3, and SDIO will need different sets of values.
>
> Add a new dle_type member in struct rtw89_hci_info and make dle_mem in
> struct rtw89_chip_info an array to hold the four different sets of
> values.
>
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
[...]
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index 9f0e30e75009..2ee766e37322 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -1719,7 +1719,7 @@ static const struct rtw89_dle_mem *get_dle_mem_cfg(struct rtw89_dev *rtwdev,
> struct rtw89_mac_info *mac = &rtwdev->mac;
> const struct rtw89_dle_mem *cfg;
>
> - cfg = &rtwdev->chip->dle_mem[mode];
> + cfg = &rtwdev->chip->dle_mem[rtwdev->hci.dle_type][mode];
> if (!cfg)
In fact, original checking here is unnecessary, because it must not be a NULL.
Instead, checking cfg->mode later is enough.
But now, rtwdev->chip->dle_mem[rtwdev->hci.dle_type] could be NULL for some
cases, so we should check it before accessing [mode], like
const struct rtw89_dle_mem *cfg, *cfgs;
cfgs = &rtwdev->chip->dle_mem[rtwdev->hci.dle_type];
if (!cfgs)
return NULL;
cfg = &cfgs[mode];
if (cfg->mode != mode)
...
> return NULL;
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 03/14] wifi: rtw89: Make hfc_param_ini in rtw89_chip_info an array
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
2025-06-09 19:23 ` [PATCH rtw-next v2 01/14] wifi: rtw89: 8851b: Accept USB devices and load their MAC address Bitterblue Smith
2025-06-09 19:24 ` [PATCH rtw-next v2 02/14] wifi: rtw89: Make dle_mem in rtw89_chip_info an array Bitterblue Smith
@ 2025-06-09 19:25 ` Bitterblue Smith
2025-06-16 1:26 ` Ping-Ke Shih
2025-06-09 19:26 ` [PATCH rtw-next v2 04/14] wifi: rtw89: Add rtw8851b_dle_mem_usb{2,3} Bitterblue Smith
` (10 subsequent siblings)
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:25 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
USB and SDIO will need different sets of values, so make hfc_param_ini
in struct rtw89_chip_info an array.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Make hfc_param_ini an array instead of having (eventually) three
different hfc_param_ini_* members.
---
drivers/net/wireless/realtek/rtw89/core.h | 4 +++-
drivers/net/wireless/realtek/rtw89/mac.c | 5 +++--
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852a.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852b.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852bt.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8852c.c | 2 +-
drivers/net/wireless/realtek/rtw89/rtw8922a.c | 2 +-
8 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index 12d5727abfe9..d4c7b47c3ba6 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -130,6 +130,8 @@ enum rtw89_hci_type {
RTW89_HCI_TYPE_PCIE,
RTW89_HCI_TYPE_USB,
RTW89_HCI_TYPE_SDIO,
+
+ RTW89_HCI_TYPE_NUM,
};
enum rtw89_hci_dle_type {
@@ -4302,7 +4304,7 @@ struct rtw89_chip_info {
u16 max_amsdu_limit;
bool dis_2g_40m_ul_ofdma;
u32 rsvd_ple_ofst;
- const struct rtw89_hfc_param_ini *hfc_param_ini;
+ const struct rtw89_hfc_param_ini *hfc_param_ini[RTW89_HCI_TYPE_NUM];
const struct rtw89_dle_mem *dle_mem[RTW89_HCI_DLE_TYPE_NUM];
u8 wde_qempty_acq_grpnum;
u8 wde_qempty_mgq_grpsel;
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 2ee766e37322..0a3603f2e6bf 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -881,13 +881,14 @@ static int hfc_reset_param(struct rtw89_dev *rtwdev)
switch (rtwdev->hci.type) {
case RTW89_HCI_TYPE_PCIE:
- param_ini = rtwdev->chip->hfc_param_ini[qta_mode];
- param->en = 0;
break;
default:
return -EINVAL;
}
+ param_ini = rtwdev->chip->hfc_param_ini[rtwdev->hci.type][qta_mode];
+ param->en = 0;
+
if (param_ini.pub_cfg)
param->pub_cfg = *param_ini.pub_cfg;
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index f0755afb1fdc..b825b1b4ad9f 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -2464,7 +2464,7 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
.max_amsdu_limit = 3500,
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x2f800,
- .hfc_param_ini = rtw8851b_hfc_param_ini_pcie,
+ .hfc_param_ini = {rtw8851b_hfc_param_ini_pcie, NULL, NULL},
.dle_mem = {rtw8851b_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852a.c b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
index 7c631ccee8fc..4285af5c9ad4 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852a.c
@@ -2183,7 +2183,7 @@ const struct rtw89_chip_info rtw8852a_chip_info = {
.max_amsdu_limit = 3500,
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x6f800,
- .hfc_param_ini = rtw8852a_hfc_param_ini_pcie,
+ .hfc_param_ini = {rtw8852a_hfc_param_ini_pcie, NULL, NULL},
.dle_mem = {rtw8852a_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 16,
.wde_qempty_mgq_grpsel = 16,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852b.c b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
index a2dfdc541ce6..aff87cc9bffe 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852b.c
@@ -819,7 +819,7 @@ const struct rtw89_chip_info rtw8852b_chip_info = {
.max_amsdu_limit = 5000,
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x2f800,
- .hfc_param_ini = rtw8852b_hfc_param_ini_pcie,
+ .hfc_param_ini = {rtw8852b_hfc_param_ini_pcie, NULL, NULL},
.dle_mem = {rtw8852b_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
index 96800ccdedc6..e13d6beb9aa3 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852bt.c
@@ -753,7 +753,7 @@ const struct rtw89_chip_info rtw8852bt_chip_info = {
.max_amsdu_limit = 5000,
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x6f800,
- .hfc_param_ini = rtw8852bt_hfc_param_ini_pcie,
+ .hfc_param_ini = {rtw8852bt_hfc_param_ini_pcie, NULL, NULL},
.dle_mem = {rtw8852bt_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8852c.c b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
index 5210f2f9124b..f419e6ace39d 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8852c.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8852c.c
@@ -3003,7 +3003,7 @@ const struct rtw89_chip_info rtw8852c_chip_info = {
.max_amsdu_limit = 8000,
.dis_2g_40m_ul_ofdma = false,
.rsvd_ple_ofst = 0x6f800,
- .hfc_param_ini = rtw8852c_hfc_param_ini_pcie,
+ .hfc_param_ini = {rtw8852c_hfc_param_ini_pcie, NULL, NULL},
.dle_mem = {rtw8852c_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 16,
.wde_qempty_mgq_grpsel = 16,
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8922a.c b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
index 0517f0d27a5c..780d449a2140 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8922a.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8922a.c
@@ -2816,7 +2816,7 @@ const struct rtw89_chip_info rtw8922a_chip_info = {
.max_amsdu_limit = 8000,
.dis_2g_40m_ul_ofdma = false,
.rsvd_ple_ofst = 0x8f800,
- .hfc_param_ini = rtw8922a_hfc_param_ini_pcie,
+ .hfc_param_ini = {rtw8922a_hfc_param_ini_pcie, NULL, NULL},
.dle_mem = {rtw8922a_dle_mem_pcie, NULL, NULL, NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 03/14] wifi: rtw89: Make hfc_param_ini in rtw89_chip_info an array
2025-06-09 19:25 ` [PATCH rtw-next v2 03/14] wifi: rtw89: Make hfc_param_ini " Bitterblue Smith
@ 2025-06-16 1:26 ` Ping-Ke Shih
2025-06-16 16:55 ` Bitterblue Smith
0 siblings, 1 reply; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 1:26 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> USB and SDIO will need different sets of values, so make hfc_param_ini
> in struct rtw89_chip_info an array.
>
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
[...]
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index 2ee766e37322..0a3603f2e6bf 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -881,13 +881,14 @@ static int hfc_reset_param(struct rtw89_dev *rtwdev)
By the way, please help to remove the initializer of param_ini, which is weird
and unnecessary:
struct rtw89_hfc_param_ini param_ini = {NULL};
>
> switch (rtwdev->hci.type) {
> case RTW89_HCI_TYPE_PCIE:
> - param_ini = rtwdev->chip->hfc_param_ini[qta_mode];
> - param->en = 0;
> break;
> default:
> return -EINVAL;
> }
>
> + param_ini = rtwdev->chip->hfc_param_ini[rtwdev->hci.type][qta_mode];
Like patch 02/14, we can remove switch...case above, and check
rtwdev->chip->hfc_param_ini[rtwdev->hci.type] to know if we can support
certain HCI, like
param_inis = rtwdev->chip->hfc_param_ini[rtwdev->hci.type];
if (!param_inis)
return -EINVAL;
param_ini = param_inis[qta_mode];
> + param->en = 0;
> +
> if (param_ini.pub_cfg)
> param->pub_cfg = *param_ini.pub_cfg;
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 03/14] wifi: rtw89: Make hfc_param_ini in rtw89_chip_info an array
2025-06-16 1:26 ` Ping-Ke Shih
@ 2025-06-16 16:55 ` Bitterblue Smith
2025-06-17 0:19 ` Ping-Ke Shih
0 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-16 16:55 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
On 16/06/2025 04:26, Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
>> USB and SDIO will need different sets of values, so make hfc_param_ini
>> in struct rtw89_chip_info an array.
>>
>> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
>
> [...]
>
>
>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
>> index 2ee766e37322..0a3603f2e6bf 100644
>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
>> @@ -881,13 +881,14 @@ static int hfc_reset_param(struct rtw89_dev *rtwdev)
>
> By the way, please help to remove the initializer of param_ini, which is weird
> and unnecessary:
>
> struct rtw89_hfc_param_ini param_ini = {NULL};
>
>>
>> switch (rtwdev->hci.type) {
>> case RTW89_HCI_TYPE_PCIE:
>> - param_ini = rtwdev->chip->hfc_param_ini[qta_mode];
>> - param->en = 0;
>> break;
>> default:
>> return -EINVAL;
>> }
>>
>> + param_ini = rtwdev->chip->hfc_param_ini[rtwdev->hci.type][qta_mode];
>
> Like patch 02/14, we can remove switch...case above, and check
> rtwdev->chip->hfc_param_ini[rtwdev->hci.type] to know if we can support
> certain HCI, like
>
> param_inis = rtwdev->chip->hfc_param_ini[rtwdev->hci.type];
> if (!param_inis)
> return -EINVAL;
>
> param_ini = param_inis[qta_mode];
>
>
That reminds me, why make a copy? param_ini could be a pointer instead.
>> + param->en = 0;
>> +
>> if (param_ini.pub_cfg)
>> param->pub_cfg = *param_ini.pub_cfg;
>>
>
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 03/14] wifi: rtw89: Make hfc_param_ini in rtw89_chip_info an array
2025-06-16 16:55 ` Bitterblue Smith
@ 2025-06-17 0:19 ` Ping-Ke Shih
0 siblings, 0 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-17 0:19 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> On 16/06/2025 04:26, Ping-Ke Shih wrote:
> > Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> >> USB and SDIO will need different sets of values, so make hfc_param_ini
> >> in struct rtw89_chip_info an array.
> >>
> >> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
> >
> > [...]
> >
> >
> >> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> >> index 2ee766e37322..0a3603f2e6bf 100644
> >> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> >> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> >> @@ -881,13 +881,14 @@ static int hfc_reset_param(struct rtw89_dev *rtwdev)
> >
> > By the way, please help to remove the initializer of param_ini, which is weird
> > and unnecessary:
> >
> > struct rtw89_hfc_param_ini param_ini = {NULL};
> >
> >>
> >> switch (rtwdev->hci.type) {
> >> case RTW89_HCI_TYPE_PCIE:
> >> - param_ini = rtwdev->chip->hfc_param_ini[qta_mode];
> >> - param->en = 0;
> >> break;
> >> default:
> >> return -EINVAL;
> >> }
> >>
> >> + param_ini = rtwdev->chip->hfc_param_ini[rtwdev->hci.type][qta_mode];
> >
> > Like patch 02/14, we can remove switch...case above, and check
> > rtwdev->chip->hfc_param_ini[rtwdev->hci.type] to know if we can support
> > certain HCI, like
> >
> > param_inis = rtwdev->chip->hfc_param_ini[rtwdev->hci.type];
> > if (!param_inis)
> > return -EINVAL;
> >
> > param_ini = param_inis[qta_mode];
> >
> >
>
> That reminds me, why make a copy? param_ini could be a pointer instead.
I guess this is because vendor driver does, and pointer is reasonable.
>
> >> + param->en = 0;
> >> +
> >> if (param_ini.pub_cfg)
> >> param->pub_cfg = *param_ini.pub_cfg;
> >>
> >
> >
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 04/14] wifi: rtw89: Add rtw8851b_dle_mem_usb{2,3}
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (2 preceding siblings ...)
2025-06-09 19:25 ` [PATCH rtw-next v2 03/14] wifi: rtw89: Make hfc_param_ini " Bitterblue Smith
@ 2025-06-09 19:26 ` Bitterblue Smith
2025-06-16 1:28 ` Ping-Ke Shih
2025-06-09 19:27 ` [PATCH rtw-next v2 05/14] wifi: rtw89: Add rtw8851b_hfc_param_ini_usb Bitterblue Smith
` (9 subsequent siblings)
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:26 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Add rtw8851b_dle_mem_usb2 and rtw8851b_dle_mem_usb3 and their various
quotas and sizes in struct rtw89_mac_size_set.
"dle" could be "Data Link Engine" or "Double Link Engine". These are
some parameters needed for RTL8851BU.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Add space in comments before */
- Add more information in the commit message.
- Adapt to the changes in patch 2.
---
drivers/net/wireless/realtek/rtw89/mac.c | 15 +++++++++
drivers/net/wireless/realtek/rtw89/mac.h | 8 +++++
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 31 ++++++++++++++++++-
3 files changed, 53 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 0a3603f2e6bf..9ca88a293f99 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -1647,6 +1647,8 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
/* 8852C PCIE SCC */
.wde_size19 = {RTW89_WDE_PG_64, 3328, 0,},
.wde_size23 = {RTW89_WDE_PG_64, 1022, 2,},
+ /* 8852B USB2.0/USB3.0 SCC */
+ .wde_size25 = {RTW89_WDE_PG_64, 162, 94,},
/* PCIE */
.ple_size0 = {RTW89_PLE_PG_128, 1520, 16,},
.ple_size0_v1 = {RTW89_PLE_PG_128, 2688, 240, 212992,},
@@ -1662,6 +1664,10 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
.ple_size18 = {RTW89_PLE_PG_128, 2544, 16,},
/* 8852C PCIE SCC */
.ple_size19 = {RTW89_PLE_PG_128, 1904, 16,},
+ /* 8852B USB2.0 SCC */
+ .ple_size32 = {RTW89_PLE_PG_128, 620, 20,},
+ /* 8852B USB3.0 SCC */
+ .ple_size33 = {RTW89_PLE_PG_128, 632, 8,},
/* PCIE 64 */
.wde_qt0 = {3792, 196, 0, 107,},
.wde_qt0_v1 = {3302, 6, 0, 20,},
@@ -1676,6 +1682,8 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
/* 8852C PCIE SCC */
.wde_qt18 = {3228, 60, 0, 40,},
.wde_qt23 = {958, 48, 0, 16,},
+ /* 8852B USB2.0/USB3.0 SCC */
+ .wde_qt25 = {152, 2, 0, 8,},
.ple_qt0 = {320, 320, 32, 16, 13, 13, 292, 292, 64, 18, 1, 4, 0,},
.ple_qt1 = {320, 320, 32, 16, 1316, 1316, 1595, 1595, 1367, 1321, 1, 1307, 0,},
/* PCIE SCC */
@@ -1699,6 +1707,13 @@ const struct rtw89_mac_size_set rtw89_mac_size = {
/* PCIE 64 */
.ple_qt58 = {147, 0, 16, 20, 157, 13, 229, 0, 172, 14, 24, 0,},
.ple_qt59 = {147, 0, 32, 20, 1860, 13, 2025, 0, 1879, 14, 24, 0,},
+ /* USB2.0 52B SCC */
+ .ple_qt72 = {130, 0, 16, 48, 4, 13, 322, 0, 32, 14, 8, 0, 0,},
+ /* USB2.0 52B 92K */
+ .ple_qt73 = {130, 0, 32, 48, 37, 13, 355, 0, 65, 14, 24, 0, 0,},
+ /* USB3.0 52B 92K */
+ .ple_qt74 = {286, 0, 16, 48, 4, 13, 178, 0, 32, 14, 8, 0, 0,},
+ .ple_qt75 = {286, 0, 32, 48, 37, 13, 211, 0, 65, 14, 24, 0, 0,},
/* 8852A PCIE WOW */
.ple_qt_52a_wow = {264, 0, 32, 20, 64, 13, 1005, 0, 64, 128, 120,},
/* 8852B PCIE WOW */
diff --git a/drivers/net/wireless/realtek/rtw89/mac.h b/drivers/net/wireless/realtek/rtw89/mac.h
index 8013c852d5be..8e771afb6e5c 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.h
+++ b/drivers/net/wireless/realtek/rtw89/mac.h
@@ -921,6 +921,7 @@ struct rtw89_mac_size_set {
const struct rtw89_dle_size wde_size18;
const struct rtw89_dle_size wde_size19;
const struct rtw89_dle_size wde_size23;
+ const struct rtw89_dle_size wde_size25;
const struct rtw89_dle_size ple_size0;
const struct rtw89_dle_size ple_size0_v1;
const struct rtw89_dle_size ple_size3_v1;
@@ -930,6 +931,8 @@ struct rtw89_mac_size_set {
const struct rtw89_dle_size ple_size9;
const struct rtw89_dle_size ple_size18;
const struct rtw89_dle_size ple_size19;
+ const struct rtw89_dle_size ple_size32;
+ const struct rtw89_dle_size ple_size33;
const struct rtw89_wde_quota wde_qt0;
const struct rtw89_wde_quota wde_qt0_v1;
const struct rtw89_wde_quota wde_qt4;
@@ -938,6 +941,7 @@ struct rtw89_mac_size_set {
const struct rtw89_wde_quota wde_qt17;
const struct rtw89_wde_quota wde_qt18;
const struct rtw89_wde_quota wde_qt23;
+ const struct rtw89_wde_quota wde_qt25;
const struct rtw89_ple_quota ple_qt0;
const struct rtw89_ple_quota ple_qt1;
const struct rtw89_ple_quota ple_qt4;
@@ -952,6 +956,10 @@ struct rtw89_mac_size_set {
const struct rtw89_ple_quota ple_qt57;
const struct rtw89_ple_quota ple_qt58;
const struct rtw89_ple_quota ple_qt59;
+ const struct rtw89_ple_quota ple_qt72;
+ const struct rtw89_ple_quota ple_qt73;
+ const struct rtw89_ple_quota ple_qt74;
+ const struct rtw89_ple_quota ple_qt75;
const struct rtw89_ple_quota ple_qt_52a_wow;
const struct rtw89_ple_quota ple_qt_52b_wow;
const struct rtw89_ple_quota ple_qt_52bt_wow;
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index b825b1b4ad9f..cd5039e1294c 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -68,6 +68,32 @@ static const struct rtw89_dle_mem rtw8851b_dle_mem_pcie[] = {
NULL},
};
+static const struct rtw89_dle_mem rtw8851b_dle_mem_usb2[] = {
+ [RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size25,
+ &rtw89_mac_size.ple_size32, &rtw89_mac_size.wde_qt25,
+ &rtw89_mac_size.wde_qt25, &rtw89_mac_size.ple_qt72,
+ &rtw89_mac_size.ple_qt73},
+ [RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_mac_size.wde_size9,
+ &rtw89_mac_size.ple_size8, &rtw89_mac_size.wde_qt4,
+ &rtw89_mac_size.wde_qt4, &rtw89_mac_size.ple_qt13,
+ &rtw89_mac_size.ple_qt13},
+ [RTW89_QTA_INVALID] = {RTW89_QTA_INVALID, NULL, NULL, NULL, NULL, NULL,
+ NULL},
+};
+
+static const struct rtw89_dle_mem rtw8851b_dle_mem_usb3[] = {
+ [RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size25,
+ &rtw89_mac_size.ple_size33, &rtw89_mac_size.wde_qt25,
+ &rtw89_mac_size.wde_qt25, &rtw89_mac_size.ple_qt74,
+ &rtw89_mac_size.ple_qt75},
+ [RTW89_QTA_DLFW] = {RTW89_QTA_DLFW, &rtw89_mac_size.wde_size9,
+ &rtw89_mac_size.ple_size8, &rtw89_mac_size.wde_qt4,
+ &rtw89_mac_size.wde_qt4, &rtw89_mac_size.ple_qt13,
+ &rtw89_mac_size.ple_qt13},
+ [RTW89_QTA_INVALID] = {RTW89_QTA_INVALID, NULL, NULL, NULL, NULL, NULL,
+ NULL},
+};
+
static const struct rtw89_reg3_def rtw8851b_btc_preagc_en_defs[] = {
{0x46D0, GENMASK(1, 0), 0x3},
{0x4AD4, GENMASK(31, 0), 0xf},
@@ -2465,7 +2491,10 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x2f800,
.hfc_param_ini = {rtw8851b_hfc_param_ini_pcie, NULL, NULL},
- .dle_mem = {rtw8851b_dle_mem_pcie, NULL, NULL, NULL},
+ .dle_mem = {rtw8851b_dle_mem_pcie,
+ rtw8851b_dle_mem_usb2,
+ rtw8851b_dle_mem_usb3,
+ NULL},
.wde_qempty_acq_grpnum = 4,
.wde_qempty_mgq_grpsel = 4,
.rf_base_addr = {0xe000},
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 05/14] wifi: rtw89: Add rtw8851b_hfc_param_ini_usb
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (3 preceding siblings ...)
2025-06-09 19:26 ` [PATCH rtw-next v2 04/14] wifi: rtw89: Add rtw8851b_dle_mem_usb{2,3} Bitterblue Smith
@ 2025-06-09 19:27 ` Bitterblue Smith
2025-06-16 1:32 ` Ping-Ke Shih
2025-06-09 19:28 ` [PATCH rtw-next v2 06/14] wifi: rtw89: Disable deep power saving for USB/SDIO Bitterblue Smith
` (8 subsequent siblings)
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:27 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
"hfc" seems to mean "hci fc" which may be "Host Control Interface Flow
Control". These are some parameters needed for RTL8851BU.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Adapt to the changes in patch 3.
- Add more information in the commit message.
---
drivers/net/wireless/realtek/rtw89/mac.c | 1 +
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 46 ++++++++++++++++++-
2 files changed, 46 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 9ca88a293f99..7f3c816d4704 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -881,6 +881,7 @@ static int hfc_reset_param(struct rtw89_dev *rtwdev)
switch (rtwdev->hci.type) {
case RTW89_HCI_TYPE_PCIE:
+ case RTW89_HCI_TYPE_USB:
break;
default:
return -EINVAL;
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index cd5039e1294c..048e64fa1d51 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -51,6 +51,48 @@ static const struct rtw89_hfc_param_ini rtw8851b_hfc_param_ini_pcie[] = {
[RTW89_QTA_INVALID] = {NULL},
};
+static const struct rtw89_hfc_ch_cfg rtw8851b_hfc_chcfg_usb[] = {
+ {18, 152, grp_0}, /* ACH 0 */
+ {18, 152, grp_0}, /* ACH 1 */
+ {18, 152, grp_0}, /* ACH 2 */
+ {18, 152, grp_0}, /* ACH 3 */
+ {0, 0, grp_0}, /* ACH 4 */
+ {0, 0, grp_0}, /* ACH 5 */
+ {0, 0, grp_0}, /* ACH 6 */
+ {0, 0, grp_0}, /* ACH 7 */
+ {18, 152, grp_0}, /* B0MGQ */
+ {18, 152, grp_0}, /* B0HIQ */
+ {0, 0, grp_0}, /* B1MGQ */
+ {0, 0, grp_0}, /* B1HIQ */
+ {0, 0, 0} /* FWCMDQ */
+};
+
+static const struct rtw89_hfc_pub_cfg rtw8851b_hfc_pubcfg_usb = {
+ 152, /* Group 0 */
+ 0, /* Group 1 */
+ 152, /* Public Max */
+ 0 /* WP threshold */
+};
+
+static const struct rtw89_hfc_prec_cfg rtw8851b_hfc_preccfg_usb = {
+ 9, /* CH 0-11 pre-cost */
+ 32, /* H2C pre-cost */
+ 64, /* WP CH 0-7 pre-cost */
+ 24, /* WP CH 8-11 pre-cost */
+ 1, /* CH 0-11 full condition */
+ 1, /* H2C full condition */
+ 1, /* WP CH 0-7 full condition */
+ 1, /* WP CH 8-11 full condition */
+};
+
+static const struct rtw89_hfc_param_ini rtw8851b_hfc_param_ini_usb[] = {
+ [RTW89_QTA_SCC] = {rtw8851b_hfc_chcfg_usb, &rtw8851b_hfc_pubcfg_usb,
+ &rtw8851b_hfc_preccfg_usb, RTW89_HCIFC_STF},
+ [RTW89_QTA_DLFW] = {NULL, NULL,
+ &rtw8851b_hfc_preccfg_usb, RTW89_HCIFC_STF},
+ [RTW89_QTA_INVALID] = {NULL},
+};
+
static const struct rtw89_dle_mem rtw8851b_dle_mem_pcie[] = {
[RTW89_QTA_SCC] = {RTW89_QTA_SCC, &rtw89_mac_size.wde_size6,
&rtw89_mac_size.ple_size6, &rtw89_mac_size.wde_qt6,
@@ -2490,7 +2532,9 @@ const struct rtw89_chip_info rtw8851b_chip_info = {
.max_amsdu_limit = 3500,
.dis_2g_40m_ul_ofdma = true,
.rsvd_ple_ofst = 0x2f800,
- .hfc_param_ini = {rtw8851b_hfc_param_ini_pcie, NULL, NULL},
+ .hfc_param_ini = {rtw8851b_hfc_param_ini_pcie,
+ rtw8851b_hfc_param_ini_usb,
+ NULL},
.dle_mem = {rtw8851b_dle_mem_pcie,
rtw8851b_dle_mem_usb2,
rtw8851b_dle_mem_usb3,
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 05/14] wifi: rtw89: Add rtw8851b_hfc_param_ini_usb
2025-06-09 19:27 ` [PATCH rtw-next v2 05/14] wifi: rtw89: Add rtw8851b_hfc_param_ini_usb Bitterblue Smith
@ 2025-06-16 1:32 ` Ping-Ke Shih
0 siblings, 0 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 1:32 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> "hfc" seems to mean "hci fc" which may be "Host Control Interface Flow
> Control".
Yes, it is. Just mention it in certain tense.
> These are some parameters needed for RTL8851BU.
>
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
> ---
> v2:
> - Adapt to the changes in patch 3.
> - Add more information in the commit message.
> ---
> drivers/net/wireless/realtek/rtw89/mac.c | 1 +
> drivers/net/wireless/realtek/rtw89/rtw8851b.c | 46 ++++++++++++++++++-
> 2 files changed, 46 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index 9ca88a293f99..7f3c816d4704 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -881,6 +881,7 @@ static int hfc_reset_param(struct rtw89_dev *rtwdev)
>
> switch (rtwdev->hci.type) {
> case RTW89_HCI_TYPE_PCIE:
> + case RTW89_HCI_TYPE_USB:
Like I mention in patch 03/14, you will no need to add this.
> break;
> default:
> return -EINVAL;
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 06/14] wifi: rtw89: Disable deep power saving for USB/SDIO
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (4 preceding siblings ...)
2025-06-09 19:27 ` [PATCH rtw-next v2 05/14] wifi: rtw89: Add rtw8851b_hfc_param_ini_usb Bitterblue Smith
@ 2025-06-09 19:28 ` Bitterblue Smith
2025-06-16 1:42 ` Ping-Ke Shih
2025-06-09 19:28 ` [PATCH rtw-next v2 07/14] wifi: rtw89: Add extra TX headroom for USB Bitterblue Smith
` (7 subsequent siblings)
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:28 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Disable rtw89_mac_send_rpwm() for USB and SDIO because it is called in
atomic context and accessing hardware registers results in "scheduling
while atomic" errors.
Disable rtw89_mac_power_mode_change() because it prints an error message
when rtw89_mac_send_rpwm() is disabled.
Modify rtw89_ps_power_mode_change() to call
rtw89_ps_power_mode_change_with_hci() only for PCI because the latter
is probably relevant only for PCI and also because it calls
napi_schedule(), which results in dereferencing a null pointer with USB.
For USB and SDIO rtw89_ps_power_mode_change() probably needs to call
rtw89_mac_power_mode_change() instead, in case deep power saving is ever
enabled for USB or SDIO.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Disable deep power saving for SDIO also.
- Don't disable rtw89_ps_power_mode_change() for USB/SDIO.
- Disable rtw89_mac_power_mode_change() for USB/SDIO.
- Call rtw89_ps_power_mode_change_with_hci() only for PCI and call
rtw89_mac_power_mode_change() for USB/SDIO.
- Update the commit message.
---
drivers/net/wireless/realtek/rtw89/mac.c | 6 ++++++
drivers/net/wireless/realtek/rtw89/ps.c | 3 ++-
2 files changed, 8 insertions(+), 1 deletion(-)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 7f3c816d4704..2cebde9e9229 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -1336,6 +1336,9 @@ static void rtw89_mac_send_rpwm(struct rtw89_dev *rtwdev,
{
u16 request;
+ if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE)
+ return;
+
spin_lock_bh(&rtwdev->rpwm_lock);
request = rtw89_read16(rtwdev, R_AX_RPWM);
@@ -1412,6 +1415,9 @@ void rtw89_mac_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
int ret;
int i;
+ if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE)
+ return;
+
if (enter)
state = rtw89_mac_get_req_pwr_state(rtwdev);
else
diff --git a/drivers/net/wireless/realtek/rtw89/ps.c b/drivers/net/wireless/realtek/rtw89/ps.c
index 8e4fe73e7d77..9f63655b7568 100644
--- a/drivers/net/wireless/realtek/rtw89/ps.c
+++ b/drivers/net/wireless/realtek/rtw89/ps.c
@@ -57,7 +57,8 @@ static void rtw89_ps_power_mode_change_with_hci(struct rtw89_dev *rtwdev,
static void rtw89_ps_power_mode_change(struct rtw89_dev *rtwdev, bool enter)
{
if (rtwdev->chip->low_power_hci_modes & BIT(rtwdev->ps_mode) &&
- !test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags))
+ !test_bit(RTW89_FLAG_WOWLAN, rtwdev->flags) &&
+ rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
rtw89_ps_power_mode_change_with_hci(rtwdev, enter);
else
rtw89_mac_power_mode_change(rtwdev, enter);
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 06/14] wifi: rtw89: Disable deep power saving for USB/SDIO
2025-06-09 19:28 ` [PATCH rtw-next v2 06/14] wifi: rtw89: Disable deep power saving for USB/SDIO Bitterblue Smith
@ 2025-06-16 1:42 ` Ping-Ke Shih
2025-06-18 11:05 ` Bitterblue Smith
0 siblings, 1 reply; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 1:42 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> Disable rtw89_mac_send_rpwm() for USB and SDIO because it is called in
> atomic context and accessing hardware registers results in "scheduling
> while atomic" errors.
>
> Disable rtw89_mac_power_mode_change() because it prints an error message
> when rtw89_mac_send_rpwm() is disabled.
>
> Modify rtw89_ps_power_mode_change() to call
> rtw89_ps_power_mode_change_with_hci() only for PCI because the latter
> is probably relevant only for PCI and also because it calls
> napi_schedule(), which results in dereferencing a null pointer with USB.
>
> For USB and SDIO rtw89_ps_power_mode_change() probably needs to call
> rtw89_mac_power_mode_change() instead, in case deep power saving is ever
> enabled for USB or SDIO.
>
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
> ---
> v2:
> - Disable deep power saving for SDIO also.
> - Don't disable rtw89_ps_power_mode_change() for USB/SDIO.
> - Disable rtw89_mac_power_mode_change() for USB/SDIO.
> - Call rtw89_ps_power_mode_change_with_hci() only for PCI and call
> rtw89_mac_power_mode_change() for USB/SDIO.
> - Update the commit message.
> ---
> drivers/net/wireless/realtek/rtw89/mac.c | 6 ++++++
> drivers/net/wireless/realtek/rtw89/ps.c | 3 ++-
> 2 files changed, 8 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index 7f3c816d4704..2cebde9e9229 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -1336,6 +1336,9 @@ static void rtw89_mac_send_rpwm(struct rtw89_dev *rtwdev,
> {
> u16 request;
>
> + if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE)
> + return;
> +
I think we can just return RTW89_PS_MODE_NONE in rtw89_update_ps_mode()
for hci.type != RTW89_HCI_TYPE_PCIE.
If not, I would like to define a 'rtwdev->hci.can_deep_ps' for the purpose
to disable deep PS temporarily. Sometime we can support it by just removing
this flag simply. But not very prefer this way though.
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 06/14] wifi: rtw89: Disable deep power saving for USB/SDIO
2025-06-16 1:42 ` Ping-Ke Shih
@ 2025-06-18 11:05 ` Bitterblue Smith
0 siblings, 0 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-18 11:05 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
On 16/06/2025 04:42, Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
>> Disable rtw89_mac_send_rpwm() for USB and SDIO because it is called in
>> atomic context and accessing hardware registers results in "scheduling
>> while atomic" errors.
>>
>> Disable rtw89_mac_power_mode_change() because it prints an error message
>> when rtw89_mac_send_rpwm() is disabled.
>>
>> Modify rtw89_ps_power_mode_change() to call
>> rtw89_ps_power_mode_change_with_hci() only for PCI because the latter
>> is probably relevant only for PCI and also because it calls
>> napi_schedule(), which results in dereferencing a null pointer with USB.
>>
>> For USB and SDIO rtw89_ps_power_mode_change() probably needs to call
>> rtw89_mac_power_mode_change() instead, in case deep power saving is ever
>> enabled for USB or SDIO.
>>
>> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
>> ---
>> v2:
>> - Disable deep power saving for SDIO also.
>> - Don't disable rtw89_ps_power_mode_change() for USB/SDIO.
>> - Disable rtw89_mac_power_mode_change() for USB/SDIO.
>> - Call rtw89_ps_power_mode_change_with_hci() only for PCI and call
>> rtw89_mac_power_mode_change() for USB/SDIO.
>> - Update the commit message.
>> ---
>> drivers/net/wireless/realtek/rtw89/mac.c | 6 ++++++
>> drivers/net/wireless/realtek/rtw89/ps.c | 3 ++-
>> 2 files changed, 8 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
>> index 7f3c816d4704..2cebde9e9229 100644
>> --- a/drivers/net/wireless/realtek/rtw89/mac.c
>> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
>> @@ -1336,6 +1336,9 @@ static void rtw89_mac_send_rpwm(struct rtw89_dev *rtwdev,
>> {
>> u16 request;
>>
>> + if (rtwdev->hci.type != RTW89_HCI_TYPE_PCIE)
>> + return;
>> +
>
> I think we can just return RTW89_PS_MODE_NONE in rtw89_update_ps_mode()
> for hci.type != RTW89_HCI_TYPE_PCIE.
>
Yes, that works.
> If not, I would like to define a 'rtwdev->hci.can_deep_ps' for the purpose
> to disable deep PS temporarily. Sometime we can support it by just removing
> this flag simply. But not very prefer this way though.
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 07/14] wifi: rtw89: Add extra TX headroom for USB
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (5 preceding siblings ...)
2025-06-09 19:28 ` [PATCH rtw-next v2 06/14] wifi: rtw89: Disable deep power saving for USB/SDIO Bitterblue Smith
@ 2025-06-09 19:28 ` Bitterblue Smith
2025-06-09 19:29 ` [PATCH rtw-next v2 08/14] wifi: rtw89: Hide some errors when the device is unplugged Bitterblue Smith
` (6 subsequent siblings)
13 siblings, 0 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:28 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
In the case of USB the TX descriptor is transmitted in the same buffer
as the 802.11 frame, so add the required headroom.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2:
- Add Acked-by.
---
drivers/net/wireless/realtek/rtw89/core.c | 3 +++
1 file changed, 3 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/core.c b/drivers/net/wireless/realtek/rtw89/core.c
index 49447668cbf3..ce5c96eea769 100644
--- a/drivers/net/wireless/realtek/rtw89/core.c
+++ b/drivers/net/wireless/realtek/rtw89/core.c
@@ -5473,6 +5473,9 @@ static int rtw89_core_register_hw(struct rtw89_dev *rtwdev)
int ret;
int tx_headroom = IEEE80211_HT_CTL_LEN;
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
+ tx_headroom += chip->txwd_body_size + chip->txwd_info_size;
+
hw->vif_data_size = struct_size_t(struct rtw89_vif, links_inst, n);
hw->sta_data_size = struct_size_t(struct rtw89_sta, links_inst, n);
hw->txq_data_size = sizeof(struct rtw89_txq);
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 08/14] wifi: rtw89: Hide some errors when the device is unplugged
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (6 preceding siblings ...)
2025-06-09 19:28 ` [PATCH rtw-next v2 07/14] wifi: rtw89: Add extra TX headroom for USB Bitterblue Smith
@ 2025-06-09 19:29 ` Bitterblue Smith
2025-06-09 19:30 ` [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB Bitterblue Smith
` (5 subsequent siblings)
13 siblings, 0 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:29 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
A few unnecessary error messages are printed when the device is
unplugged. "read swsi busy" in particular can appear ~1000 times when
RTL8851BU is unplugged.
Add a new flag RTW89_FLAG_UNPLUGGED and print some error messages only
when this flag is not set. The new USB driver will set the flag when
the device is unplugged.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2:
- Add Acked-by.
---
drivers/net/wireless/realtek/rtw89/core.h | 1 +
drivers/net/wireless/realtek/rtw89/mac.c | 13 ++++++++-----
drivers/net/wireless/realtek/rtw89/phy.c | 3 ++-
3 files changed, 11 insertions(+), 6 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/core.h b/drivers/net/wireless/realtek/rtw89/core.h
index d4c7b47c3ba6..3f0ca65431ef 100644
--- a/drivers/net/wireless/realtek/rtw89/core.h
+++ b/drivers/net/wireless/realtek/rtw89/core.h
@@ -4927,6 +4927,7 @@ enum rtw89_flags {
RTW89_FLAG_FORBIDDEN_TRACK_WROK,
RTW89_FLAG_CHANGING_INTERFACE,
RTW89_FLAG_HW_RFKILL_STATE,
+ RTW89_FLAG_UNPLUGGED,
NUM_OF_RTW89_FLAGS,
};
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 2cebde9e9229..875c1a3c5ca8 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -88,7 +88,7 @@ int rtw89_mac_write_lte(struct rtw89_dev *rtwdev, const u32 offset, u32 val)
ret = read_poll_timeout(rtw89_read8, lte_ctrl, (lte_ctrl & BIT(5)) != 0,
50, 50000, false, rtwdev, R_AX_LTE_CTRL + 3);
- if (ret)
+ if (ret && !test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
rtw89_err(rtwdev, "[ERR]lte not ready(W)\n");
rtw89_write32(rtwdev, R_AX_LTE_WDATA, val);
@@ -104,7 +104,7 @@ int rtw89_mac_read_lte(struct rtw89_dev *rtwdev, const u32 offset, u32 *val)
ret = read_poll_timeout(rtw89_read8, lte_ctrl, (lte_ctrl & BIT(5)) != 0,
50, 50000, false, rtwdev, R_AX_LTE_CTRL + 3);
- if (ret)
+ if (ret && !test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
rtw89_err(rtwdev, "[ERR]lte not ready(W)\n");
rtw89_write32(rtwdev, R_AX_LTE_CTRL, 0x800F0000 | offset);
@@ -5885,13 +5885,15 @@ int rtw89_mac_coex_init(struct rtw89_dev *rtwdev, const struct rtw89_mac_ax_coex
ret = rtw89_mac_read_lte(rtwdev, R_AX_LTE_SW_CFG_2, &val32);
if (ret) {
- rtw89_err(rtwdev, "Read R_AX_LTE_SW_CFG_2 fail!\n");
+ if (!test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
+ rtw89_err(rtwdev, "Read R_AX_LTE_SW_CFG_2 fail!\n");
return ret;
}
val32 = val32 & B_AX_WL_RX_CTRL;
ret = rtw89_mac_write_lte(rtwdev, R_AX_LTE_SW_CFG_2, val32);
if (ret) {
- rtw89_err(rtwdev, "Write R_AX_LTE_SW_CFG_2 fail!\n");
+ if (!test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
+ rtw89_err(rtwdev, "Write R_AX_LTE_SW_CFG_2 fail!\n");
return ret;
}
@@ -6015,7 +6017,8 @@ int rtw89_mac_cfg_gnt(struct rtw89_dev *rtwdev,
ret = rtw89_mac_write_lte(rtwdev, R_AX_LTE_SW_CFG_1, val);
if (ret) {
- rtw89_err(rtwdev, "Write LTE fail!\n");
+ if (!test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
+ rtw89_err(rtwdev, "Write LTE fail!\n");
return ret;
}
diff --git a/drivers/net/wireless/realtek/rtw89/phy.c b/drivers/net/wireless/realtek/rtw89/phy.c
index 76a2e26d4a10..87dc88ea38c4 100644
--- a/drivers/net/wireless/realtek/rtw89/phy.c
+++ b/drivers/net/wireless/realtek/rtw89/phy.c
@@ -895,7 +895,8 @@ static u32 rtw89_phy_read_rf_a(struct rtw89_dev *rtwdev,
30, false, rtwdev, R_SWSI_V1,
B_SWSI_R_DATA_DONE_V1);
if (ret) {
- rtw89_err(rtwdev, "read swsi busy\n");
+ if (!test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
+ rtw89_err(rtwdev, "read swsi busy\n");
return INV_RF_DATA;
}
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (7 preceding siblings ...)
2025-06-09 19:29 ` [PATCH rtw-next v2 08/14] wifi: rtw89: Hide some errors when the device is unplugged Bitterblue Smith
@ 2025-06-09 19:30 ` Bitterblue Smith
2025-06-10 14:11 ` kernel test robot
2025-06-16 1:51 ` Ping-Ke Shih
2025-06-09 19:30 ` [PATCH rtw-next v2 10/14] wifi: rtw89: Fix rtw89_mac_power_switch() " Bitterblue Smith
` (4 subsequent siblings)
13 siblings, 2 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:30 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
There are a few differences in the power on/off functions between PCIE
and USB.
While the RTL8851BU appears to work without these changes, it's
probably best to implement them, in case they are needed in some
situations.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Patch is new in v2.
---
drivers/net/wireless/realtek/rtw89/rtw8851b.c | 22 ++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851b.c b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
index 048e64fa1d51..febe9b7afe59 100644
--- a/drivers/net/wireless/realtek/rtw89/rtw8851b.c
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851b.c
@@ -385,7 +385,8 @@ static int rtw8851b_pwr_on_func(struct rtw89_dev *rtwdev)
rtw89_write8_clr(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
rtw89_write8_set(rtwdev, R_AX_PLATFORM_ENABLE, B_AX_PLATFORM_EN);
- rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+ rtw89_write32_clr(rtwdev, R_AX_SYS_SDIO_CTRL, B_AX_PCIE_CALIB_EN_V1);
ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_OFF_WEI,
XTAL_SI_OFF_WEI);
@@ -430,8 +431,9 @@ static int rtw8851b_pwr_on_func(struct rtw89_dev *rtwdev)
rtw89_write32_clr(rtwdev, R_AX_SYS_ISO_CTRL, B_AX_PWC_EV2EF_B14);
rtw89_write32_clr(rtwdev, R_AX_PMC_DBG_CTRL2, B_AX_SYSON_DIS_PMCR_AX_WRMSK);
- rtw89_write32_set(rtwdev, R_AX_GPIO0_16_EECS_EESK_LED1_PULL_LOW_EN,
- B_AX_GPIO10_PULL_LOW_EN | B_AX_GPIO16_PULL_LOW_EN_V1);
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+ rtw89_write32_set(rtwdev, R_AX_GPIO0_16_EECS_EESK_LED1_PULL_LOW_EN,
+ B_AX_GPIO10_PULL_LOW_EN | B_AX_GPIO16_PULL_LOW_EN_V1);
if (rtwdev->hal.cv == CHIP_CAV) {
ret = rtw89_read_efuse_ver(rtwdev, &val8);
@@ -515,7 +517,10 @@ static int rtw8851b_pwr_off_func(struct rtw89_dev *rtwdev)
if (ret)
return ret;
- rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
+ rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
+ else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
if (rtwdev->hal.cv == CHIP_CAV) {
rtw8851b_patch_swr_pfm2pwm(rtwdev);
@@ -524,7 +529,14 @@ static int rtw8851b_pwr_off_func(struct rtw89_dev *rtwdev)
rtw89_write32_set(rtwdev, R_AX_SPSANA_ON_CTRL1, B_AX_FPWMDELAY);
}
- rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+ if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
+ rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
+ } else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) {
+ val32 = rtw89_read32(rtwdev, R_AX_SYS_PW_CTRL);
+ val32 &= ~B_AX_AFSM_PCIE_SUS_EN;
+ val32 |= B_AX_AFSM_WLSUS_EN;
+ rtw89_write32(rtwdev, R_AX_SYS_PW_CTRL, val32);
+ }
return 0;
}
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB
2025-06-09 19:30 ` [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB Bitterblue Smith
@ 2025-06-10 14:11 ` kernel test robot
2025-06-16 1:51 ` Ping-Ke Shih
1 sibling, 0 replies; 38+ messages in thread
From: kernel test robot @ 2025-06-10 14:11 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Cc: oe-kbuild-all, Ping-Ke Shih
Hi Bitterblue,
kernel test robot noticed the following build errors:
[auto build test ERROR on wireless-next/main]
[also build test ERROR on wireless/main linus/master v6.16-rc1 next-20250610]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Bitterblue-Smith/wifi-rtw89-8851b-Accept-USB-devices-and-load-their-MAC-address/20250610-033543
base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link: https://lore.kernel.org/r/c1ff2155-ef01-466e-9c34-4437ee57656c%40gmail.com
patch subject: [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB
config: loongarch-loongson3_defconfig (https://download.01.org/0day-ci/archive/20250610/202506102119.fyp9p96Z-lkp@intel.com/config)
compiler: loongarch64-linux-gcc (GCC) 15.1.0
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250610/202506102119.fyp9p96Z-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506102119.fyp9p96Z-lkp@intel.com/
All errors (new ones prefixed by >>):
drivers/net/wireless/realtek/rtw89/rtw8851b.c: In function 'rtw8851b_pwr_off_func':
>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:61: error: 'B_AX_SOP_EDSWR' undeclared (first use in this function); did you mean 'B_BE_SOP_EDSWR'?
523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
| ^~~~~~~~~~~~~~
| B_BE_SOP_EDSWR
drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:61: note: each undeclared identifier is reported only once for each function it appears in
vim +523 drivers/net/wireless/realtek/rtw89/rtw8851b.c
477
478 static int rtw8851b_pwr_off_func(struct rtw89_dev *rtwdev)
479 {
480 u32 val32;
481 int ret;
482
483 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
484 XTAL_SI_RFC2RF);
485 if (ret)
486 return ret;
487 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_EI);
488 if (ret)
489 return ret;
490 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_WEI);
491 if (ret)
492 return ret;
493 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S0, 0, XTAL_SI_RF00);
494 if (ret)
495 return ret;
496 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_SRAM2RFC,
497 XTAL_SI_SRAM2RFC);
498 if (ret)
499 return ret;
500 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_EI);
501 if (ret)
502 return ret;
503 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_WEI);
504 if (ret)
505 return ret;
506
507 rtw89_write32_set(rtwdev, R_AX_WLAN_XTAL_SI_CONFIG,
508 B_AX_XTAL_SI_ADDR_NOT_CHK);
509 rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
510 rtw89_write32_clr(rtwdev, R_AX_WLRF_CTRL, B_AX_AFC_AFEDIG);
511 rtw89_write8_clr(rtwdev, R_AX_SYS_FUNC_EN, B_AX_FEN_BB_GLB_RSTN | B_AX_FEN_BBRSTB);
512
513 rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
514
515 ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFM_OFFMAC),
516 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
517 if (ret)
518 return ret;
519
520 if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
521 rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
522 else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
> 523 rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
524
525 if (rtwdev->hal.cv == CHIP_CAV) {
526 rtw8851b_patch_swr_pfm2pwm(rtwdev);
527 } else {
528 rtw89_write32_set(rtwdev, R_AX_SPSLDO_ON_CTRL1, B_AX_FPWMDELAY);
529 rtw89_write32_set(rtwdev, R_AX_SPSANA_ON_CTRL1, B_AX_FPWMDELAY);
530 }
531
532 if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
533 rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
534 } else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) {
535 val32 = rtw89_read32(rtwdev, R_AX_SYS_PW_CTRL);
536 val32 &= ~B_AX_AFSM_PCIE_SUS_EN;
537 val32 |= B_AX_AFSM_WLSUS_EN;
538 rtw89_write32(rtwdev, R_AX_SYS_PW_CTRL, val32);
539 }
540
541 return 0;
542 }
543
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB
2025-06-09 19:30 ` [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB Bitterblue Smith
2025-06-10 14:11 ` kernel test robot
@ 2025-06-16 1:51 ` Ping-Ke Shih
2025-06-18 13:53 ` Bitterblue Smith
1 sibling, 1 reply; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 1:51 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> There are a few differences in the power on/off functions between PCIE
> and USB.
>
> While the RTL8851BU appears to work without these changes, it's
> probably best to implement them, in case they are needed in some
> situations.
The difference between RTL8851BE and RTL8851BU is very small, so it is
reasonable to combine them with conditions of hci.type. If other chips
have much difference, please define array such as
pwr_on_func[RTW89_HCI_TYPE_NUM]
It would much easier to update the changes from vendor driver.
>
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB
2025-06-16 1:51 ` Ping-Ke Shih
@ 2025-06-18 13:53 ` Bitterblue Smith
0 siblings, 0 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-18 13:53 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
On 16/06/2025 04:51, Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
>> There are a few differences in the power on/off functions between PCIE
>> and USB.
>>
>> While the RTL8851BU appears to work without these changes, it's
>> probably best to implement them, in case they are needed in some
>> situations.
>
> The difference between RTL8851BE and RTL8851BU is very small, so it is
> reasonable to combine them with conditions of hci.type. If other chips
> have much difference, please define array such as
> pwr_on_func[RTW89_HCI_TYPE_NUM]
>
> It would much easier to update the changes from vendor driver.
>
It looks like RTL8852BU and RTL8852CU will need very similar changes.
I don't know about RTL8922AU because there is no driver yet.
>>
>> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
>
> Acked-by: Ping-Ke Shih <pkshih@realtek.com>
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 10/14] wifi: rtw89: Fix rtw89_mac_power_switch() for USB
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (8 preceding siblings ...)
2025-06-09 19:30 ` [PATCH rtw-next v2 09/14] wifi: rtw89: 8851b: Modify rtw8851b_pwr_{on,off}_func() for USB Bitterblue Smith
@ 2025-06-09 19:30 ` Bitterblue Smith
2025-06-16 2:21 ` Ping-Ke Shih
2025-06-16 9:14 ` Ping-Ke Shih
2025-06-09 19:31 ` [PATCH rtw-next v2 11/14] wifi: rtw89: Add some definitions " Bitterblue Smith
` (3 subsequent siblings)
13 siblings, 2 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:30 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Clear some bits in some registers in order to allow RTL8851BU to power
on. Also tested with RTL8832BU and RTL8832CU.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Put the new code in a function.
---
drivers/net/wireless/realtek/rtw89/mac.c | 20 ++++++++++++++++++++
drivers/net/wireless/realtek/rtw89/reg.h | 1 +
2 files changed, 21 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
index 875c1a3c5ca8..bccb504915f4 100644
--- a/drivers/net/wireless/realtek/rtw89/mac.c
+++ b/drivers/net/wireless/realtek/rtw89/mac.c
@@ -1449,6 +1449,24 @@ void rtw89_mac_notify_wake(struct rtw89_dev *rtwdev)
rtw89_mac_send_rpwm(rtwdev, state, true);
}
+static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
+{
+ u32 boot_mode;
+
+ if (rtwdev->hci.type != RTW89_HCI_TYPE_USB)
+ return;
+
+ boot_mode = rtw89_read32_mask(rtwdev, R_AX_GPIO_MUXCFG, B_AX_BOOT_MODE);
+
+ if (!boot_mode)
+ return;
+
+ rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFN_ONMAC);
+ rtw89_write32_clr(rtwdev, R_AX_SYS_STATUS1, B_AX_AUTO_WLPON);
+ rtw89_write32_clr(rtwdev, R_AX_GPIO_MUXCFG, B_AX_BOOT_MODE);
+ rtw89_write32_clr(rtwdev, R_AX_RSV_CTRL, B_AX_R_DIS_PRST);
+}
+
static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
{
#define PWR_ACT 1
@@ -1459,6 +1477,8 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
int ret;
u8 val;
+ rtw89_mac_power_switch_boot_mode(rtwdev);
+
if (on) {
cfg_seq = chip->pwr_on_seq;
cfg_func = chip->ops->pwr_on_func;
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index f05c81ae5869..9d9e1b02bfc7 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -182,6 +182,7 @@
#define R_AX_SYS_STATUS1 0x00F4
#define B_AX_SEL_0XC0_MASK GENMASK(17, 16)
+#define B_AX_AUTO_WLPON BIT(10)
#define B_AX_PAD_HCI_SEL_V2_MASK GENMASK(5, 3)
#define MAC_AX_HCI_SEL_SDIO_UART 0
#define MAC_AX_HCI_SEL_MULTI_USB 1
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 10/14] wifi: rtw89: Fix rtw89_mac_power_switch() for USB
2025-06-09 19:30 ` [PATCH rtw-next v2 10/14] wifi: rtw89: Fix rtw89_mac_power_switch() " Bitterblue Smith
@ 2025-06-16 2:21 ` Ping-Ke Shih
2025-06-16 9:14 ` Ping-Ke Shih
1 sibling, 0 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 2:21 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> Clear some bits in some registers in order to allow RTL8851BU to power
> on.
As your description, it should be called when going to power on, but called
by both power on/off.
However vendor driver did the same as yours. I'd keep it as was. Please
mention this behavior is from vendor driver in commit message.
> Also tested with RTL8832BU and RTL8832CU.
>
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
> ---
> v2:
> - Put the new code in a function.
> ---
> drivers/net/wireless/realtek/rtw89/mac.c | 20 ++++++++++++++++++++
> drivers/net/wireless/realtek/rtw89/reg.h | 1 +
> 2 files changed, 21 insertions(+)
>
> diff --git a/drivers/net/wireless/realtek/rtw89/mac.c b/drivers/net/wireless/realtek/rtw89/mac.c
> index 875c1a3c5ca8..bccb504915f4 100644
> --- a/drivers/net/wireless/realtek/rtw89/mac.c
> +++ b/drivers/net/wireless/realtek/rtw89/mac.c
> @@ -1449,6 +1449,24 @@ void rtw89_mac_notify_wake(struct rtw89_dev *rtwdev)
> rtw89_mac_send_rpwm(rtwdev, state, true);
> }
>
> +static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
> +{
> + u32 boot_mode;
> +
> + if (rtwdev->hci.type != RTW89_HCI_TYPE_USB)
I checked internal log that initiator of this change is for USB devices, but
not check the HCI type though.
> + return;
> +
> + boot_mode = rtw89_read32_mask(rtwdev, R_AX_GPIO_MUXCFG, B_AX_BOOT_MODE);
> +
No empty line between assignment and immediate checking.
> + if (!boot_mode)
> + return;
> +
> + rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFN_ONMAC);
> + rtw89_write32_clr(rtwdev, R_AX_SYS_STATUS1, B_AX_AUTO_WLPON);
> + rtw89_write32_clr(rtwdev, R_AX_GPIO_MUXCFG, B_AX_BOOT_MODE);
> + rtw89_write32_clr(rtwdev, R_AX_RSV_CTRL, B_AX_R_DIS_PRST);
> +}
> +
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 10/14] wifi: rtw89: Fix rtw89_mac_power_switch() for USB
2025-06-09 19:30 ` [PATCH rtw-next v2 10/14] wifi: rtw89: Fix rtw89_mac_power_switch() " Bitterblue Smith
2025-06-16 2:21 ` Ping-Ke Shih
@ 2025-06-16 9:14 ` Ping-Ke Shih
1 sibling, 0 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 9:14 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
> > +static void rtw89_mac_power_switch_boot_mode(struct rtw89_dev *rtwdev)
> > +{
> > + u32 boot_mode;
> > +
> > + if (rtwdev->hci.type != RTW89_HCI_TYPE_USB)
>
> I checked internal log that initiator of this change is for USB devices, but
> not check the HCI type though.
Forget to say. This is just an information for you. No need to change here.
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 11/14] wifi: rtw89: Add some definitions for USB
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (9 preceding siblings ...)
2025-06-09 19:30 ` [PATCH rtw-next v2 10/14] wifi: rtw89: Fix rtw89_mac_power_switch() " Bitterblue Smith
@ 2025-06-09 19:31 ` Bitterblue Smith
2025-06-09 19:32 ` [PATCH rtw-next v2 12/14] wifi: rtw89: Add usb.{c,h} Bitterblue Smith
` (2 subsequent siblings)
13 siblings, 0 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:31 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Add various register and bit definitions which will be used by the new
USB driver.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2:
- Add Acked-by.
---
drivers/net/wireless/realtek/rtw89/reg.h | 29 +++++++++++++++++++++++
drivers/net/wireless/realtek/rtw89/txrx.h | 1 +
2 files changed, 30 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/reg.h b/drivers/net/wireless/realtek/rtw89/reg.h
index 9d9e1b02bfc7..a3b83b1a92eb 100644
--- a/drivers/net/wireless/realtek/rtw89/reg.h
+++ b/drivers/net/wireless/realtek/rtw89/reg.h
@@ -381,6 +381,18 @@
#define B_AX_ACH1_BUSY BIT(9)
#define B_AX_ACH0_BUSY BIT(8)
+#define R_AX_USB_ENDPOINT_0 0x1060
+#define B_AX_EP_IDX GENMASK(3, 0)
+#define R_AX_USB_ENDPOINT_2 0x1068
+#define NUMP 0x1
+#define R_AX_USB_HOST_REQUEST_2 0x1078
+#define B_AX_R_USBIO_MODE BIT(4)
+#define R_AX_USB3_MAC_NPI_CONFIG_INTF_0 0x1114
+#define B_AX_SSPHY_LFPS_FILTER BIT(31)
+#define R_AX_USB_WLAN0_1 0x1174
+#define B_AX_USBRX_RST BIT(9)
+#define B_AX_USBTX_RST BIT(8)
+
#define R_AX_PCIE_DBG_CTRL 0x11C0
#define B_AX_DBG_DUMMY_MASK GENMASK(23, 16)
#define B_AX_PCIE_DBG_SEL_MASK GENMASK(15, 13)
@@ -460,6 +472,17 @@
#define R_AX_WP_PAGE_CTRL2_V1 0x17A4
#define R_AX_WP_PAGE_INFO1_V1 0x17A8
+#define R_AX_USB_ENDPOINT_0_V1 0x5060
+#define B_AX_EP_IDX_V1 GENMASK(3, 0)
+#define R_AX_USB_ENDPOINT_2_V1 0x5068
+#define R_AX_USB_HOST_REQUEST_2_V1 0x5078
+#define B_AX_R_USBIO_MODE_V1 BIT(4)
+#define R_AX_USB3_MAC_NPI_CONFIG_INTF_0_V1 0x5114
+#define B_AX_SSPHY_LFPS_FILTER_V1 BIT(31)
+#define R_AX_USB_WLAN0_1_V1 0x5174
+#define B_AX_USBRX_RST_V1 BIT(9)
+#define B_AX_USBTX_RST_V1 BIT(8)
+
#define R_AX_H2CREG_DATA0_V1 0x7140
#define R_AX_H2CREG_DATA1_V1 0x7144
#define R_AX_H2CREG_DATA2_V1 0x7148
@@ -1026,6 +1049,12 @@
#define B_AX_DISPATCHER_INTN_SEL_MASK GENMASK(7, 4)
#define B_AX_DISPATCHER_CH_SEL_MASK GENMASK(3, 0)
+#define R_AX_RXDMA_SETTING 0x8908
+#define B_AX_BULK_SIZE GENMASK(1, 0)
+#define USB11_BULKSIZE 0x2
+#define USB2_BULKSIZE 0x1
+#define USB3_BULKSIZE 0x0
+
#define R_AX_RX_FUNCTION_STOP 0x8920
#define B_AX_HDR_RX_STOP BIT(0)
diff --git a/drivers/net/wireless/realtek/rtw89/txrx.h b/drivers/net/wireless/realtek/rtw89/txrx.h
index 94f27a9ee9f7..ec01bfc363da 100644
--- a/drivers/net/wireless/realtek/rtw89/txrx.h
+++ b/drivers/net/wireless/realtek/rtw89/txrx.h
@@ -73,6 +73,7 @@ static inline u8 rtw89_get_data_nss(struct rtw89_dev *rtwdev, u16 hw_rate)
#define RTW89_TXWD_BODY0_FW_DL BIT(20)
#define RTW89_TXWD_BODY0_CHANNEL_DMA GENMASK(19, 16)
#define RTW89_TXWD_BODY0_HDR_LLC_LEN GENMASK(15, 11)
+#define RTW89_TXWD_BODY0_STF_MODE BIT(10)
#define RTW89_TXWD_BODY0_WD_PAGE BIT(7)
#define RTW89_TXWD_BODY0_HW_AMSDU BIT(5)
#define RTW89_TXWD_BODY0_HW_SSN_SEL GENMASK(3, 2)
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 12/14] wifi: rtw89: Add usb.{c,h}
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (10 preceding siblings ...)
2025-06-09 19:31 ` [PATCH rtw-next v2 11/14] wifi: rtw89: Add some definitions " Bitterblue Smith
@ 2025-06-09 19:32 ` Bitterblue Smith
2025-06-16 3:10 ` Ping-Ke Shih
2025-06-09 19:33 ` [PATCH rtw-next v2 13/14] wifi: rtw89: Add rtw8851bu.c Bitterblue Smith
2025-06-09 19:34 ` [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules Bitterblue Smith
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:32 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Add very basic USB support. No TX/RX aggregation, no TX queues, no
switching to USB 3 mode.
RTL8851BU and RTL8832BU work.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Don't do vendor requests when unplugged.
- Rename rtw89_get_usb_priv() to rtw89_usb_priv().
- Move rtw89_usb_read_port_complete() forward declaration to the top
of usb.c.
- Remove unnecessary empty lines.
- Rename "error" variable to "ret".
- Don't call usb_kill_urb() in rtw89_usb_free_rx_bufs().
- Use u32_get_bits() in rtw89_usb_vendorreq().
- Initialise rtwdev->hci.dle_type.
- Delete vendor_req_mutex.
---
drivers/net/wireless/realtek/rtw89/usb.c | 1011 ++++++++++++++++++++++
drivers/net/wireless/realtek/rtw89/usb.h | 59 ++
2 files changed, 1070 insertions(+)
create mode 100644 drivers/net/wireless/realtek/rtw89/usb.c
create mode 100644 drivers/net/wireless/realtek/rtw89/usb.h
diff --git a/drivers/net/wireless/realtek/rtw89/usb.c b/drivers/net/wireless/realtek/rtw89/usb.c
new file mode 100644
index 000000000000..004c1252620b
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/usb.c
@@ -0,0 +1,1011 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#include <linux/usb.h>
+#include "debug.h"
+#include "mac.h"
+#include "reg.h"
+#include "txrx.h"
+#include "usb.h"
+
+static void rtw89_usb_read_port_complete(struct urb *urb);
+
+static void rtw89_usb_vendorreq(struct rtw89_dev *rtwdev, u32 addr,
+ void *data, u16 len, u8 reqtype)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ struct usb_device *udev = rtwusb->udev;
+ unsigned int pipe;
+ u16 value, index;
+ int attempt, ret;
+
+ if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
+ return;
+
+ value = u32_get_bits(addr, GENMASK(15, 0));
+ index = u32_get_bits(addr, GENMASK(23, 16));
+
+ for (attempt = 0; attempt < 10; attempt++) {
+ *rtwusb->vendor_req_buf = 0;
+
+ if (reqtype == RTW89_USB_VENQT_READ) {
+ pipe = usb_rcvctrlpipe(udev, 0);
+ } else { /* RTW89_USB_VENQT_WRITE */
+ pipe = usb_sndctrlpipe(udev, 0);
+
+ memcpy(rtwusb->vendor_req_buf, data, len);
+ }
+
+ ret = usb_control_msg(udev, pipe, RTW89_USB_VENQT, reqtype,
+ value, index, rtwusb->vendor_req_buf,
+ len, 500);
+
+ if (ret == len) { /* Success */
+ atomic_set(&rtwusb->continual_io_error, 0);
+
+ if (reqtype == RTW89_USB_VENQT_READ)
+ memcpy(data, rtwusb->vendor_req_buf, len);
+
+ break;
+ }
+
+ if (ret == -ESHUTDOWN || ret == -ENODEV)
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+ else if (ret < 0)
+ rtw89_warn(rtwdev,
+ "usb %s%u 0x%x fail ret=%d value=0x%x attempt=%d\n",
+ reqtype == RTW89_USB_VENQT_READ ? "read" : "write",
+ len * 8, addr, ret,
+ le32_to_cpup(rtwusb->vendor_req_buf),
+ attempt);
+ else if (ret > 0 && reqtype == RTW89_USB_VENQT_READ)
+ memcpy(data, rtwusb->vendor_req_buf, len);
+
+ if (atomic_inc_return(&rtwusb->continual_io_error) > 4) {
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+ break;
+ }
+ }
+}
+
+static u32 rtw89_usb_read_cmac(struct rtw89_dev *rtwdev, u32 addr)
+{
+ u32 addr32, val32, shift;
+ __le32 data = 0;
+ int count;
+
+ addr32 = addr & ~0x3;
+ shift = (addr & 0x3) * 8;
+
+ for (count = 0; ; count++) {
+ rtw89_usb_vendorreq(rtwdev, addr32, &data, 4,
+ RTW89_USB_VENQT_READ);
+
+ val32 = le32_to_cpu(data);
+ if (val32 != RTW89_R32_DEAD)
+ break;
+
+ if (count >= MAC_REG_POOL_COUNT) {
+ rtw89_warn(rtwdev, "%s: addr %#x = %#x\n",
+ __func__, addr32, val32);
+ val32 = RTW89_R32_DEAD;
+ break;
+ }
+
+ rtw89_write32(rtwdev, R_AX_CK_EN, B_AX_CMAC_ALLCKEN);
+ }
+
+ return val32 >> shift;
+}
+
+static u8 rtw89_usb_ops_read8(struct rtw89_dev *rtwdev, u32 addr)
+{
+ u8 data = 0;
+
+ if (ACCESS_CMAC(addr))
+ return rtw89_usb_read_cmac(rtwdev, addr);
+
+ rtw89_usb_vendorreq(rtwdev, addr, &data, 1, RTW89_USB_VENQT_READ);
+
+ return data;
+}
+
+static u16 rtw89_usb_ops_read16(struct rtw89_dev *rtwdev, u32 addr)
+{
+ __le16 data = 0;
+
+ if (ACCESS_CMAC(addr))
+ return rtw89_usb_read_cmac(rtwdev, addr);
+
+ rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_READ);
+
+ return le16_to_cpu(data);
+}
+
+static u32 rtw89_usb_ops_read32(struct rtw89_dev *rtwdev, u32 addr)
+{
+ __le32 data = 0;
+
+ if (ACCESS_CMAC(addr))
+ return rtw89_usb_read_cmac(rtwdev, addr);
+
+ rtw89_usb_vendorreq(rtwdev, addr, &data, 4,
+ RTW89_USB_VENQT_READ);
+
+ return le32_to_cpu(data);
+}
+
+static void rtw89_usb_ops_write8(struct rtw89_dev *rtwdev, u32 addr, u8 val)
+{
+ u8 data = val;
+
+ rtw89_usb_vendorreq(rtwdev, addr, &data, 1, RTW89_USB_VENQT_WRITE);
+}
+
+static void rtw89_usb_ops_write16(struct rtw89_dev *rtwdev, u32 addr, u16 val)
+{
+ __le16 data = cpu_to_le16(val);
+
+ rtw89_usb_vendorreq(rtwdev, addr, &data, 2, RTW89_USB_VENQT_WRITE);
+}
+
+static void rtw89_usb_ops_write32(struct rtw89_dev *rtwdev, u32 addr, u32 val)
+{
+ __le32 data = cpu_to_le32(val);
+
+ rtw89_usb_vendorreq(rtwdev, addr, &data, 4, RTW89_USB_VENQT_WRITE);
+}
+
+static u32
+rtw89_usb_ops_check_and_reclaim_tx_resource(struct rtw89_dev *rtwdev,
+ u8 txch)
+{
+ if (txch == RTW89_TXCH_CH12)
+ return 1;
+
+ return 42; /* TODO some kind of calculation? */
+}
+
+static void rtw89_usb_ops_tx_kick_off(struct rtw89_dev *rtwdev, u8 txch)
+{
+ /* TODO later. for now transmit every frame right away in
+ * rtw89_usb_ops_tx_write
+ */
+}
+
+static u8 rtw89_usb_get_bulkout_id(u8 ch_dma)
+{
+ switch (ch_dma) {
+ case RTW89_DMA_ACH0:
+ return 3;
+ case RTW89_DMA_ACH1:
+ return 4;
+ case RTW89_DMA_ACH2:
+ return 5;
+ case RTW89_DMA_ACH3:
+ return 6;
+ default:
+ case RTW89_DMA_B0MG:
+ return 0;
+ case RTW89_DMA_B0HI:
+ return 1;
+ case RTW89_DMA_H2C:
+ return 2;
+ }
+}
+
+static int rtw89_usb_write_port(struct rtw89_dev *rtwdev, u8 ch_dma,
+ void *data, int len, usb_complete_t cb,
+ void *context)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ struct usb_device *usbd = rtwusb->udev;
+ struct urb *urb;
+ u8 bulkout_id = rtw89_usb_get_bulkout_id(ch_dma);
+ unsigned int pipe;
+ int ret;
+
+ if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
+ return 0;
+
+ urb = usb_alloc_urb(0, GFP_ATOMIC);
+ if (!urb)
+ return -ENOMEM;
+
+ pipe = usb_sndbulkpipe(usbd, rtwusb->out_pipe[bulkout_id]);
+
+ usb_fill_bulk_urb(urb, usbd, pipe, data, len, cb, context);
+ urb->transfer_flags |= URB_ZERO_PACKET;
+ ret = usb_submit_urb(urb, GFP_ATOMIC);
+
+ if (ret)
+ usb_free_urb(urb);
+
+ if (ret == -ENODEV)
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+
+ return ret;
+}
+
+static void rtw89_usb_write_port_complete_fwcmd(struct urb *urb)
+{
+ struct rtw89_usb_tx_ctrl_block *txcb = urb->context;
+ struct rtw89_dev *rtwdev = txcb->rtwdev;
+
+ switch (urb->status) {
+ case 0:
+ case -EPIPE:
+ case -EPROTO:
+ case -EINPROGRESS:
+ case -ENOENT:
+ case -ECONNRESET:
+ break;
+ default:
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+ break;
+ }
+
+ skb_queue_purge(&txcb->tx_ack_queue);
+ kfree(txcb);
+ usb_free_urb(urb);
+}
+
+static int rtw89_usb_fwcmd_submit(struct rtw89_dev *rtwdev,
+ struct rtw89_core_tx_request *tx_req)
+{
+ struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
+ struct rtw89_usb_tx_ctrl_block *txcb;
+ struct sk_buff *skb = tx_req->skb;
+ int txdesc_size = rtwdev->chip->h2c_desc_size;
+ void *txdesc;
+ int ret;
+
+ if (((desc_info->pkt_size + txdesc_size) % 512) == 0) {
+ rtw89_info(rtwdev, "avoiding multiple of 512\n");
+ desc_info->pkt_size += 4;
+ skb_put(skb, 4);
+ }
+
+ txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC);
+ if (!txcb)
+ return -ENOMEM;
+
+ txdesc = skb_push(skb, txdesc_size);
+ memset(txdesc, 0, txdesc_size);
+ rtw89_chip_fill_txdesc_fwcmd(rtwdev, desc_info, txdesc);
+
+ txcb->rtwdev = rtwdev;
+ skb_queue_head_init(&txcb->tx_ack_queue);
+
+ skb_queue_tail(&txcb->tx_ack_queue, skb);
+
+ ret = rtw89_usb_write_port(rtwdev, RTW89_DMA_H2C, skb->data, skb->len,
+ rtw89_usb_write_port_complete_fwcmd, txcb);
+
+ if (ret) {
+ rtw89_err(rtwdev, "%s failed: %d\n", __func__, ret);
+
+ skb_dequeue(&txcb->tx_ack_queue);
+ kfree(txcb);
+ }
+
+ return ret;
+}
+
+static void rtw89_usb_write_port_complete(struct urb *urb)
+{
+ struct rtw89_usb_tx_ctrl_block *txcb = urb->context;
+ struct rtw89_dev *rtwdev = txcb->rtwdev;
+ struct ieee80211_tx_info *info;
+ struct sk_buff *skb;
+
+ while (true) {
+ skb = skb_dequeue(&txcb->tx_ack_queue);
+ if (!skb)
+ break;
+
+ info = IEEE80211_SKB_CB(skb);
+ ieee80211_tx_info_clear_status(info);
+
+ if (urb->status == 0) {
+ if (info->flags & IEEE80211_TX_CTL_NO_ACK)
+ info->flags |= IEEE80211_TX_STAT_NOACK_TRANSMITTED;
+ else
+ info->flags |= IEEE80211_TX_STAT_ACK;
+ }
+
+ ieee80211_tx_status_irqsafe(rtwdev->hw, skb);
+ }
+
+ switch (urb->status) {
+ case 0:
+ case -EPIPE:
+ case -EPROTO:
+ case -EINPROGRESS:
+ case -ENOENT:
+ case -ECONNRESET:
+ break;
+ default:
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+ break;
+ }
+
+ kfree(txcb);
+ usb_free_urb(urb);
+}
+
+static int rtw89_usb_ops_tx_write(struct rtw89_dev *rtwdev,
+ struct rtw89_core_tx_request *tx_req)
+{
+ struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
+ const struct rtw89_chip_info *chip = rtwdev->chip;
+ struct rtw89_usb_tx_ctrl_block *txcb;
+ struct sk_buff *skb = tx_req->skb;
+ struct rtw89_txwd_body *txdesc;
+ u32 txdesc_size;
+ int ret, len;
+
+ if ((desc_info->ch_dma == RTW89_TXCH_CH12 ||
+ tx_req->tx_type == RTW89_CORE_TX_TYPE_FWCMD) &&
+ (desc_info->ch_dma != RTW89_TXCH_CH12 ||
+ tx_req->tx_type != RTW89_CORE_TX_TYPE_FWCMD)) {
+ rtw89_err(rtwdev, "dma channel %d/TX type %d mismatch\n",
+ desc_info->ch_dma, tx_req->tx_type);
+ return -EINVAL;
+ }
+
+ if (desc_info->ch_dma == RTW89_TXCH_CH12)
+ return rtw89_usb_fwcmd_submit(rtwdev, tx_req);
+
+ txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC);
+ if (!txcb)
+ return -ENOMEM;
+
+ txdesc_size = chip->txwd_body_size;
+ if (desc_info->en_wd_info)
+ txdesc_size += chip->txwd_info_size;
+
+ txdesc = (struct rtw89_txwd_body *)(skb->data - txdesc_size);
+ len = skb->len + txdesc_size;
+ memset(txdesc, 0, txdesc_size);
+ rtw89_chip_fill_txdesc(rtwdev, desc_info, txdesc);
+
+ le32p_replace_bits(&txdesc->dword0, 1, RTW89_TXWD_BODY0_STF_MODE);
+
+ txcb->rtwdev = rtwdev;
+ skb_queue_head_init(&txcb->tx_ack_queue);
+
+ skb_queue_tail(&txcb->tx_ack_queue, skb);
+
+ ret = rtw89_usb_write_port(rtwdev, desc_info->ch_dma, txdesc, len,
+ rtw89_usb_write_port_complete, txcb);
+ if (ret) {
+ rtw89_err(rtwdev, "%s failed: %d\n", __func__, ret);
+
+ skb_dequeue(&txcb->tx_ack_queue);
+ kfree(txcb);
+ }
+
+ return ret;
+}
+
+static void rtw89_usb_rx_handler(struct work_struct *work)
+{
+ struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_work);
+ struct rtw89_dev *rtwdev = rtwusb->rtwdev;
+ struct rtw89_rx_desc_info desc_info;
+ struct sk_buff *rx_skb;
+ struct sk_buff *skb;
+ u32 pkt_offset;
+ int limit;
+
+ for (limit = 0; limit < 200; limit++) {
+ rx_skb = skb_dequeue(&rtwusb->rx_queue);
+ if (!rx_skb)
+ break;
+
+ if (skb_queue_len(&rtwusb->rx_queue) >= RTW89_USB_MAX_RXQ_LEN) {
+ rtw89_warn(rtwdev, "rx_queue overflow\n");
+ dev_kfree_skb_any(rx_skb);
+ continue;
+ }
+
+ memset(&desc_info, 0, sizeof(desc_info));
+ rtw89_chip_query_rxdesc(rtwdev, &desc_info, rx_skb->data, 0);
+
+ skb = rtw89_alloc_skb_for_rx(rtwdev, desc_info.pkt_size);
+ if (!skb) {
+ rtw89_debug(rtwdev, RTW89_DBG_HCI,
+ "failed to allocate RX skb of size %u\n",
+ desc_info.pkt_size);
+ continue;
+ }
+
+ pkt_offset = desc_info.offset + desc_info.rxd_len;
+
+ skb_put_data(skb, rx_skb->data + pkt_offset,
+ desc_info.pkt_size);
+
+ rtw89_core_rx(rtwdev, &desc_info, skb);
+
+ if (skb_queue_len(&rtwusb->rx_free_queue) >= RTW89_USB_RX_SKB_NUM)
+ dev_kfree_skb_any(rx_skb);
+ else
+ skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
+ }
+
+ if (limit == 200)
+ rtw89_debug(rtwdev, RTW89_DBG_HCI,
+ "left %d rx skbs in the queue for later\n",
+ skb_queue_len(&rtwusb->rx_queue));
+}
+
+static void rtw89_usb_rx_resubmit(struct rtw89_usb *rtwusb,
+ struct rtw89_usb_rx_ctrl_block *rxcb,
+ gfp_t gfp)
+{
+ struct rtw89_dev *rtwdev = rtwusb->rtwdev;
+ struct sk_buff *rx_skb;
+ int ret;
+
+ rx_skb = skb_dequeue(&rtwusb->rx_free_queue);
+ if (!rx_skb)
+ rx_skb = alloc_skb(RTW89_USB_RECVBUF_SZ, gfp);
+
+ if (!rx_skb)
+ goto try_later;
+
+ skb_reset_tail_pointer(rx_skb);
+ rx_skb->len = 0;
+
+ rxcb->rx_skb = rx_skb;
+
+ usb_fill_bulk_urb(rxcb->rx_urb, rtwusb->udev,
+ usb_rcvbulkpipe(rtwusb->udev, rtwusb->in_pipe),
+ rxcb->rx_skb->data, RTW89_USB_RECVBUF_SZ,
+ rtw89_usb_read_port_complete, rxcb);
+
+ ret = usb_submit_urb(rxcb->rx_urb, gfp);
+ if (ret) {
+ skb_queue_tail(&rtwusb->rx_free_queue, rxcb->rx_skb);
+
+ if (ret == -ENODEV)
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+ else
+ rtw89_err(rtwdev, "Err sending rx data urb %d\n", ret);
+
+ if (ret == -ENOMEM)
+ goto try_later;
+ }
+
+ return;
+
+try_later:
+ rxcb->rx_skb = NULL;
+ queue_work(rtwusb->rxwq, &rtwusb->rx_urb_work);
+}
+
+static void rtw89_usb_rx_resubmit_work(struct work_struct *work)
+{
+ struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_urb_work);
+ struct rtw89_usb_rx_ctrl_block *rxcb;
+ int i;
+
+ for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
+ rxcb = &rtwusb->rx_cb[i];
+
+ if (!rxcb->rx_skb)
+ rtw89_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC);
+ }
+}
+
+static void rtw89_usb_read_port_complete(struct urb *urb)
+{
+ struct rtw89_usb_rx_ctrl_block *rxcb = urb->context;
+ struct rtw89_dev *rtwdev = rxcb->rtwdev;
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ struct sk_buff *skb = rxcb->rx_skb;
+
+ if (urb->status == 0) {
+ if (urb->actual_length > urb->transfer_buffer_length ||
+ urb->actual_length < sizeof(struct rtw89_rxdesc_short)) {
+ rtw89_err(rtwdev, "failed to get urb length: %d\n",
+ urb->actual_length);
+ skb_queue_tail(&rtwusb->rx_free_queue, skb);
+ } else {
+ skb_put(skb, urb->actual_length);
+ skb_queue_tail(&rtwusb->rx_queue, skb);
+ queue_work(rtwusb->rxwq, &rtwusb->rx_work);
+ }
+
+ rtw89_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC);
+ } else {
+ skb_queue_tail(&rtwusb->rx_free_queue, skb);
+
+ if (atomic_inc_return(&rtwusb->continual_io_error) > 4)
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+
+ switch (urb->status) {
+ case -EINVAL:
+ case -EPIPE:
+ case -ENODEV:
+ case -ESHUTDOWN:
+ set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
+ break;
+ case -EPROTO:
+ case -EILSEQ:
+ case -ETIME:
+ case -ECOMM:
+ case -EOVERFLOW:
+ case -ENOENT:
+ break;
+ case -EINPROGRESS:
+ rtw89_info(rtwdev, "URB is in progress\n");
+ break;
+ default:
+ rtw89_err(rtwdev, "%s status %d\n",
+ __func__, urb->status);
+ break;
+ }
+ }
+}
+
+static void rtw89_usb_cancel_rx_bufs(struct rtw89_usb *rtwusb)
+{
+ struct rtw89_usb_rx_ctrl_block *rxcb;
+ int i;
+
+ for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
+ rxcb = &rtwusb->rx_cb[i];
+ usb_kill_urb(rxcb->rx_urb);
+ }
+}
+
+static void rtw89_usb_free_rx_bufs(struct rtw89_usb *rtwusb)
+{
+ struct rtw89_usb_rx_ctrl_block *rxcb;
+ int i;
+
+ for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
+ rxcb = &rtwusb->rx_cb[i];
+ usb_free_urb(rxcb->rx_urb);
+ }
+}
+
+static int rtw89_usb_alloc_rx_bufs(struct rtw89_usb *rtwusb)
+{
+ struct rtw89_usb_rx_ctrl_block *rxcb;
+ int i;
+
+ for (i = 0; i < RTW89_USB_RXCB_NUM; i++) {
+ rxcb = &rtwusb->rx_cb[i];
+
+ rxcb->rtwdev = rtwusb->rtwdev;
+ rxcb->rx_urb = usb_alloc_urb(0, GFP_KERNEL);
+ if (!rxcb->rx_urb) {
+ rtw89_usb_free_rx_bufs(rtwusb);
+ return -ENOMEM;
+ }
+ }
+
+ return 0;
+}
+
+static int rtw89_usb_init_rx(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ struct sk_buff *rx_skb;
+ int i;
+
+ rtwusb->rxwq = alloc_workqueue("rtw89_usb: rx wq", WQ_BH, 0);
+ if (!rtwusb->rxwq) {
+ rtw89_err(rtwdev, "failed to create RX work queue\n");
+ return -ENOMEM;
+ }
+
+ skb_queue_head_init(&rtwusb->rx_queue);
+ skb_queue_head_init(&rtwusb->rx_free_queue);
+
+ INIT_WORK(&rtwusb->rx_work, rtw89_usb_rx_handler);
+ INIT_WORK(&rtwusb->rx_urb_work, rtw89_usb_rx_resubmit_work);
+
+ for (i = 0; i < RTW89_USB_RX_SKB_NUM; i++) {
+ rx_skb = alloc_skb(RTW89_USB_RECVBUF_SZ, GFP_KERNEL);
+ if (rx_skb)
+ skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
+ }
+
+ return 0;
+}
+
+static void rtw89_usb_deinit_rx(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+
+ skb_queue_purge(&rtwusb->rx_queue);
+
+ destroy_workqueue(rtwusb->rxwq);
+
+ skb_queue_purge(&rtwusb->rx_free_queue);
+}
+
+static void rtw89_usb_start_rx(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ int i;
+
+ for (i = 0; i < RTW89_USB_RXCB_NUM; i++)
+ rtw89_usb_rx_resubmit(rtwusb, &rtwusb->rx_cb[i], GFP_KERNEL);
+}
+
+static void rtw89_usb_ops_reset(struct rtw89_dev *rtwdev)
+{
+ /* TODO: anything to do here? */
+}
+
+static int rtw89_usb_ops_start(struct rtw89_dev *rtwdev)
+{
+ return 0; /* Nothing to do. */
+}
+
+static void rtw89_usb_ops_stop(struct rtw89_dev *rtwdev)
+{
+ /* Nothing to do. */
+}
+
+static void rtw89_usb_ops_pause(struct rtw89_dev *rtwdev, bool pause)
+{
+ /* Nothing to do? */
+}
+
+static void rtw89_usb_ops_switch_mode(struct rtw89_dev *rtwdev, bool low_power)
+{
+ /* Nothing to do. */
+}
+
+static int rtw89_usb_ops_deinit(struct rtw89_dev *rtwdev)
+{
+ return 0; /* Nothing to do. */
+}
+
+static int rtw89_usb_ops_mac_pre_init(struct rtw89_dev *rtwdev)
+{
+ u32 val32;
+
+ rtw89_write32_set(rtwdev, R_AX_USB_HOST_REQUEST_2, B_AX_R_USBIO_MODE);
+
+ /* fix USB IO hang suggest by chihhanli@realtek.com */
+ rtw89_write32_clr(rtwdev, R_AX_USB_WLAN0_1,
+ B_AX_USBRX_RST | B_AX_USBTX_RST);
+
+ val32 = rtw89_read32(rtwdev, R_AX_HCI_FUNC_EN);
+ val32 &= ~(B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN);
+ rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32);
+
+ val32 |= B_AX_HCI_RXDMA_EN | B_AX_HCI_TXDMA_EN;
+ rtw89_write32(rtwdev, R_AX_HCI_FUNC_EN, val32);
+ /* fix USB TRX hang suggest by chihhanli@realtek.com */
+
+ return 0;
+}
+
+static int rtw89_usb_ops_mac_pre_deinit(struct rtw89_dev *rtwdev)
+{
+ return 0; /* Nothing to do. */
+}
+
+static int rtw89_usb_ops_mac_post_init(struct rtw89_dev *rtwdev)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ enum usb_device_speed speed;
+ u32 ep;
+
+ rtw89_write32_clr(rtwdev, R_AX_USB3_MAC_NPI_CONFIG_INTF_0,
+ B_AX_SSPHY_LFPS_FILTER);
+
+ speed = rtwusb->udev->speed;
+
+ if (speed == USB_SPEED_SUPER)
+ rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB3_BULKSIZE);
+ else if (speed == USB_SPEED_HIGH)
+ rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB2_BULKSIZE);
+ else
+ rtw89_write8(rtwdev, R_AX_RXDMA_SETTING, USB11_BULKSIZE);
+
+ for (ep = 5; ep <= 12; ep++) {
+ if (ep == 8)
+ continue;
+
+ rtw89_write8_mask(rtwdev, R_AX_USB_ENDPOINT_0,
+ B_AX_EP_IDX, ep);
+ rtw89_write8(rtwdev, R_AX_USB_ENDPOINT_2 + 1, NUMP);
+ }
+
+ return 0;
+}
+
+static void rtw89_usb_ops_recalc_int_mit(struct rtw89_dev *rtwdev)
+{
+ /* Nothing to do. */
+}
+
+static int rtw89_usb_ops_mac_lv1_rcvy(struct rtw89_dev *rtwdev,
+ enum rtw89_lv1_rcvy_step step)
+{
+ u32 reg, mask;
+
+ switch (rtwdev->chip->chip_id) {
+ case RTL8851B:
+ case RTL8852A:
+ case RTL8852B:
+ reg = R_AX_USB_WLAN0_1;
+ mask = B_AX_USBRX_RST | B_AX_USBTX_RST;
+ break;
+ case RTL8852C:
+ reg = R_AX_USB_WLAN0_1_V1;
+ mask = B_AX_USBRX_RST_V1 | B_AX_USBTX_RST_V1;
+ break;
+ default:
+ rtw89_err(rtwdev, "%s: fix me\n", __func__);
+ return -EOPNOTSUPP;
+ }
+
+ switch (step) {
+ case RTW89_LV1_RCVY_STEP_1:
+ rtw89_write32_set(rtwdev, reg, mask);
+
+ msleep(30);
+ break;
+ case RTW89_LV1_RCVY_STEP_2:
+ rtw89_write32_clr(rtwdev, reg, mask);
+ break;
+ default:
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static void rtw89_usb_ops_dump_err_status(struct rtw89_dev *rtwdev)
+{
+ rtw89_warn(rtwdev, "%s TODO\n", __func__);
+}
+
+static const struct rtw89_hci_ops rtw89_usb_ops = {
+ .tx_write = rtw89_usb_ops_tx_write,
+ .tx_kick_off = rtw89_usb_ops_tx_kick_off,
+ .flush_queues = NULL, /* Not needed? */
+ .reset = rtw89_usb_ops_reset,
+ .start = rtw89_usb_ops_start,
+ .stop = rtw89_usb_ops_stop,
+ .pause = rtw89_usb_ops_pause,
+ .switch_mode = rtw89_usb_ops_switch_mode,
+ .recalc_int_mit = rtw89_usb_ops_recalc_int_mit,
+
+ .read8 = rtw89_usb_ops_read8,
+ .read16 = rtw89_usb_ops_read16,
+ .read32 = rtw89_usb_ops_read32,
+ .write8 = rtw89_usb_ops_write8,
+ .write16 = rtw89_usb_ops_write16,
+ .write32 = rtw89_usb_ops_write32,
+
+ .mac_pre_init = rtw89_usb_ops_mac_pre_init,
+ .mac_pre_deinit = rtw89_usb_ops_mac_pre_deinit,
+ .mac_post_init = rtw89_usb_ops_mac_post_init,
+ .deinit = rtw89_usb_ops_deinit,
+
+ .check_and_reclaim_tx_resource = rtw89_usb_ops_check_and_reclaim_tx_resource,
+ .mac_lv1_rcvy = rtw89_usb_ops_mac_lv1_rcvy,
+ .dump_err_status = rtw89_usb_ops_dump_err_status,
+ .napi_poll = NULL,
+
+ .recovery_start = NULL,
+ .recovery_complete = NULL,
+
+ .ctrl_txdma_ch = NULL,
+ .ctrl_txdma_fw_ch = NULL,
+ .ctrl_trxhci = NULL,
+ .poll_txdma_ch_idle = NULL,
+
+ .clr_idx_all = NULL,
+ .clear = NULL,
+ .disable_intr = NULL,
+ .enable_intr = NULL,
+ .rst_bdram = NULL,
+};
+
+static int rtw89_usb_parse(struct rtw89_dev *rtwdev,
+ struct usb_interface *intf)
+{
+ struct usb_host_interface *host_interface = &intf->altsetting[0];
+ struct usb_interface_descriptor *intf_desc = &host_interface->desc;
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ struct usb_endpoint_descriptor *endpoint;
+ int num_out_pipes = 0;
+ u8 num;
+ int i;
+
+ if (intf_desc->bNumEndpoints > RTW89_MAX_ENDPOINT_NUM) {
+ rtw89_err(rtwdev, "found %d endpoints, expected %d max\n",
+ intf_desc->bNumEndpoints, RTW89_MAX_ENDPOINT_NUM);
+ return -EINVAL;
+ }
+
+ for (i = 0; i < intf_desc->bNumEndpoints; i++) {
+ endpoint = &host_interface->endpoint[i].desc;
+ num = usb_endpoint_num(endpoint);
+
+ if (usb_endpoint_dir_in(endpoint) &&
+ usb_endpoint_xfer_bulk(endpoint)) {
+ if (rtwusb->in_pipe) {
+ rtw89_err(rtwdev,
+ "found more than 1 bulk in endpoint\n");
+ return -EINVAL;
+ }
+
+ rtwusb->in_pipe = num;
+ }
+
+ if (usb_endpoint_dir_out(endpoint) &&
+ usb_endpoint_xfer_bulk(endpoint)) {
+ if (num_out_pipes >= RTW89_MAX_BULKOUT_NUM) {
+ rtw89_err(rtwdev,
+ "found more than %d bulk out endpoints\n",
+ RTW89_MAX_BULKOUT_NUM);
+ return -EINVAL;
+ }
+
+ rtwusb->out_pipe[num_out_pipes++] = num;
+ }
+ }
+
+ if (num_out_pipes < 1) {
+ rtw89_err(rtwdev, "no bulk out endpoints found\n");
+ return -EINVAL;
+ }
+
+ return 0;
+}
+
+static int rtw89_usb_intf_init(struct rtw89_dev *rtwdev,
+ struct usb_interface *intf)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+ int ret;
+
+ ret = rtw89_usb_parse(rtwdev, intf);
+ if (ret)
+ return ret;
+
+ rtwusb->vendor_req_buf = kmalloc(sizeof(u32), GFP_KERNEL);
+ if (!rtwusb->vendor_req_buf)
+ return -ENOMEM;
+
+ rtwusb->udev = usb_get_dev(interface_to_usbdev(intf));
+
+ usb_set_intfdata(intf, rtwdev->hw);
+
+ SET_IEEE80211_DEV(rtwdev->hw, &intf->dev);
+
+ return 0;
+}
+
+static void rtw89_usb_intf_deinit(struct rtw89_dev *rtwdev,
+ struct usb_interface *intf)
+{
+ struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
+
+ usb_put_dev(rtwusb->udev);
+ kfree(rtwusb->vendor_req_buf);
+ usb_set_intfdata(intf, NULL);
+}
+
+int rtw89_usb_probe(struct usb_interface *intf,
+ const struct usb_device_id *id)
+{
+ const struct rtw89_driver_info *info;
+ struct rtw89_dev *rtwdev;
+ struct rtw89_usb *rtwusb;
+ int ret;
+
+ info = (const struct rtw89_driver_info *)id->driver_info;
+
+ rtwdev = rtw89_alloc_ieee80211_hw(&intf->dev,
+ sizeof(struct rtw89_usb),
+ info->chip, info->variant);
+ if (!rtwdev) {
+ dev_err(&intf->dev, "failed to allocate hw\n");
+ return -ENOMEM;
+ }
+
+ rtwusb = rtw89_usb_priv(rtwdev);
+ rtwusb->rtwdev = rtwdev;
+
+ rtwdev->hci.ops = &rtw89_usb_ops;
+ rtwdev->hci.type = RTW89_HCI_TYPE_USB;
+
+ ret = rtw89_usb_intf_init(rtwdev, intf);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to initialise intf: %d\n", ret);
+ goto err_free_hw;
+ }
+
+ if (rtwusb->udev->speed == USB_SPEED_SUPER)
+ rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB3;
+ else
+ rtwdev->hci.dle_type = RTW89_HCI_DLE_TYPE_USB2;
+
+ ret = rtw89_usb_alloc_rx_bufs(rtwusb);
+ if (ret)
+ goto err_intf_deinit;
+
+ ret = rtw89_usb_init_rx(rtwdev);
+ if (ret)
+ goto err_free_rx_bufs;
+
+ ret = rtw89_core_init(rtwdev);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to initialise core: %d\n", ret);
+ goto err_deinit_rx;
+ }
+
+ ret = rtw89_chip_info_setup(rtwdev);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to setup chip information\n");
+ goto err_core_deinit;
+ }
+
+ ret = rtw89_core_register(rtwdev);
+ if (ret) {
+ rtw89_err(rtwdev, "failed to register core\n");
+ goto err_core_deinit;
+ }
+
+ rtw89_usb_start_rx(rtwdev);
+
+ set_bit(RTW89_FLAG_PROBE_DONE, rtwdev->flags);
+
+ return 0;
+
+err_core_deinit:
+ rtw89_core_deinit(rtwdev);
+err_deinit_rx:
+ rtw89_usb_deinit_rx(rtwdev);
+err_free_rx_bufs:
+ rtw89_usb_free_rx_bufs(rtwusb);
+err_intf_deinit:
+ rtw89_usb_intf_deinit(rtwdev, intf);
+err_free_hw:
+ rtw89_free_ieee80211_hw(rtwdev);
+
+ return ret;
+}
+EXPORT_SYMBOL(rtw89_usb_probe);
+
+void rtw89_usb_disconnect(struct usb_interface *intf)
+{
+ struct ieee80211_hw *hw = usb_get_intfdata(intf);
+ struct rtw89_dev *rtwdev;
+ struct rtw89_usb *rtwusb;
+
+ if (!hw)
+ return;
+
+ rtwdev = hw->priv;
+ rtwusb = rtw89_usb_priv(rtwdev);
+
+ rtw89_usb_cancel_rx_bufs(rtwusb);
+
+ rtw89_core_unregister(rtwdev);
+ rtw89_core_deinit(rtwdev);
+ rtw89_usb_deinit_rx(rtwdev);
+ rtw89_usb_free_rx_bufs(rtwusb);
+ rtw89_usb_intf_deinit(rtwdev, intf);
+ rtw89_free_ieee80211_hw(rtwdev);
+}
+EXPORT_SYMBOL(rtw89_usb_disconnect);
+
+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
+MODULE_DESCRIPTION("Realtek USB 802.11ax wireless driver");
+MODULE_LICENSE("Dual BSD/GPL");
diff --git a/drivers/net/wireless/realtek/rtw89/usb.h b/drivers/net/wireless/realtek/rtw89/usb.h
new file mode 100644
index 000000000000..30f90abb1c9d
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/usb.h
@@ -0,0 +1,59 @@
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#ifndef __RTW89_USB_H__
+#define __RTW89_USB_H__
+
+#define RTW89_USB_VENQT 0x05
+#define RTW89_USB_VENQT_READ 0xc0
+#define RTW89_USB_VENQT_WRITE 0x40
+
+#define RTW89_USB_RECVBUF_SZ 20480
+#define RTW89_USB_RXCB_NUM 8
+#define RTW89_USB_RX_SKB_NUM 16
+#define RTW89_USB_MAX_RXQ_LEN 512
+
+#define RTW89_MAX_ENDPOINT_NUM 9
+#define RTW89_MAX_BULKOUT_NUM 7
+
+struct rtw89_usb_rx_ctrl_block {
+ struct rtw89_dev *rtwdev;
+ struct urb *rx_urb;
+ struct sk_buff *rx_skb;
+};
+
+struct rtw89_usb_tx_ctrl_block {
+ struct rtw89_dev *rtwdev;
+ struct sk_buff_head tx_ack_queue;
+};
+
+struct rtw89_usb {
+ struct rtw89_dev *rtwdev;
+ struct usb_device *udev;
+
+ __le32 *vendor_req_buf;
+
+ atomic_t continual_io_error;
+
+ u8 in_pipe;
+ u8 out_pipe[RTW89_MAX_BULKOUT_NUM];
+
+ struct workqueue_struct *rxwq;
+ struct rtw89_usb_rx_ctrl_block rx_cb[RTW89_USB_RXCB_NUM];
+ struct sk_buff_head rx_queue;
+ struct sk_buff_head rx_free_queue;
+ struct work_struct rx_work;
+ struct work_struct rx_urb_work;
+};
+
+static inline struct rtw89_usb *rtw89_usb_priv(struct rtw89_dev *rtwdev)
+{
+ return (struct rtw89_usb *)rtwdev->priv;
+}
+
+int rtw89_usb_probe(struct usb_interface *intf,
+ const struct usb_device_id *id);
+void rtw89_usb_disconnect(struct usb_interface *intf);
+
+#endif
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 12/14] wifi: rtw89: Add usb.{c,h}
2025-06-09 19:32 ` [PATCH rtw-next v2 12/14] wifi: rtw89: Add usb.{c,h} Bitterblue Smith
@ 2025-06-16 3:10 ` Ping-Ke Shih
2025-06-18 11:06 ` Bitterblue Smith
0 siblings, 1 reply; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 3:10 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> Add very basic USB support. No TX/RX aggregation, no TX queues, no
> switching to USB 3 mode.
>
> RTL8851BU and RTL8832BU work.
>
> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Some minor suggestions.
[...]
> +static void rtw89_usb_vendorreq(struct rtw89_dev *rtwdev, u32 addr,
> + void *data, u16 len, u8 reqtype)
> +{
> + struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
> + struct usb_device *udev = rtwusb->udev;
> + unsigned int pipe;
> + u16 value, index;
> + int attempt, ret;
> +
> + if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
> + return;
> +
> + value = u32_get_bits(addr, GENMASK(15, 0));
> + index = u32_get_bits(addr, GENMASK(23, 16));
> +
> + for (attempt = 0; attempt < 10; attempt++) {
> + *rtwusb->vendor_req_buf = 0;
> +
> + if (reqtype == RTW89_USB_VENQT_READ) {
> + pipe = usb_rcvctrlpipe(udev, 0);
> + } else { /* RTW89_USB_VENQT_WRITE */
> + pipe = usb_sndctrlpipe(udev, 0);
> +
> + memcpy(rtwusb->vendor_req_buf, data, len);
> + }
> +
> + ret = usb_control_msg(udev, pipe, RTW89_USB_VENQT, reqtype,
> + value, index, rtwusb->vendor_req_buf,
> + len, 500);
> +
> + if (ret == len) { /* Success */
> + atomic_set(&rtwusb->continual_io_error, 0);
> +
> + if (reqtype == RTW89_USB_VENQT_READ)
> + memcpy(data, rtwusb->vendor_req_buf, len);
> +
> + break;
> + }
> +
> + if (ret == -ESHUTDOWN || ret == -ENODEV)
> + set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
> + else if (ret < 0)
> + rtw89_warn(rtwdev,
> + "usb %s%u 0x%x fail ret=%d value=0x%x attempt=%d\n",
> + reqtype == RTW89_USB_VENQT_READ ? "read" : "write",
> + len * 8, addr, ret,
> + le32_to_cpup(rtwusb->vendor_req_buf),
vendor_req_buf isn't always set fully (4 bytes), it would print out partially
incorrect value. Would you like `%*ph` format with variable length? Like
"value=%*ph", len, rtwusb->vendor_req_buf
> + attempt);
> + else if (ret > 0 && reqtype == RTW89_USB_VENQT_READ)
> + memcpy(data, rtwusb->vendor_req_buf, len);
> +
> + if (atomic_inc_return(&rtwusb->continual_io_error) > 4) {
> + set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
> + break;
> + }
> + }
> +}
> +
[...]
> +
> +static int rtw89_usb_fwcmd_submit(struct rtw89_dev *rtwdev,
> + struct rtw89_core_tx_request *tx_req)
> +{
> + struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
> + struct rtw89_usb_tx_ctrl_block *txcb;
> + struct sk_buff *skb = tx_req->skb;
> + int txdesc_size = rtwdev->chip->h2c_desc_size;
> + void *txdesc;
> + int ret;
> +
> + if (((desc_info->pkt_size + txdesc_size) % 512) == 0) {
> + rtw89_info(rtwdev, "avoiding multiple of 512\n");
> + desc_info->pkt_size += 4;
> + skb_put(skb, 4);
> + }
> +
> + txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC);
> + if (!txcb)
> + return -ENOMEM;
> +
> + txdesc = skb_push(skb, txdesc_size);
> + memset(txdesc, 0, txdesc_size);
> + rtw89_chip_fill_txdesc_fwcmd(rtwdev, desc_info, txdesc);
> +
> + txcb->rtwdev = rtwdev;
> + skb_queue_head_init(&txcb->tx_ack_queue);
> +
> + skb_queue_tail(&txcb->tx_ack_queue, skb);
> +
> + ret = rtw89_usb_write_port(rtwdev, RTW89_DMA_H2C, skb->data, skb->len,
> + rtw89_usb_write_port_complete_fwcmd, txcb);
> +
nit: no need empty line
> + if (ret) {
> + rtw89_err(rtwdev, "%s failed: %d\n", __func__, ret);
> +
> + skb_dequeue(&txcb->tx_ack_queue);
> + kfree(txcb);
> + }
> +
> + return ret;
> +}
> +
[...]
> +
> +static void rtw89_usb_rx_handler(struct work_struct *work)
> +{
> + struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_work);
> + struct rtw89_dev *rtwdev = rtwusb->rtwdev;
> + struct rtw89_rx_desc_info desc_info;
> + struct sk_buff *rx_skb;
> + struct sk_buff *skb;
> + u32 pkt_offset;
> + int limit;
> +
> + for (limit = 0; limit < 200; limit++) {
> + rx_skb = skb_dequeue(&rtwusb->rx_queue);
> + if (!rx_skb)
> + break;
> +
> + if (skb_queue_len(&rtwusb->rx_queue) >= RTW89_USB_MAX_RXQ_LEN) {
> + rtw89_warn(rtwdev, "rx_queue overflow\n");
> + dev_kfree_skb_any(rx_skb);
> + continue;
> + }
> +
> + memset(&desc_info, 0, sizeof(desc_info));
> + rtw89_chip_query_rxdesc(rtwdev, &desc_info, rx_skb->data, 0);
> +
> + skb = rtw89_alloc_skb_for_rx(rtwdev, desc_info.pkt_size);
> + if (!skb) {
> + rtw89_debug(rtwdev, RTW89_DBG_HCI,
> + "failed to allocate RX skb of size %u\n",
> + desc_info.pkt_size);
> + continue;
> + }
> +
> + pkt_offset = desc_info.offset + desc_info.rxd_len;
> +
> + skb_put_data(skb, rx_skb->data + pkt_offset,
> + desc_info.pkt_size);
> +
> + rtw89_core_rx(rtwdev, &desc_info, skb);
> +
> + if (skb_queue_len(&rtwusb->rx_free_queue) >= RTW89_USB_RX_SKB_NUM)
> + dev_kfree_skb_any(rx_skb);
> + else
> + skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
> + }
> +
> + if (limit == 200)
Not sure if it is worth to reschedule itself again under this condition?
> + rtw89_debug(rtwdev, RTW89_DBG_HCI,
> + "left %d rx skbs in the queue for later\n",
> + skb_queue_len(&rtwusb->rx_queue));
> +}
> +
[...]
> +static int rtw89_usb_intf_init(struct rtw89_dev *rtwdev,
> + struct usb_interface *intf)
> +{
> + struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
> + int ret;
> +
> + ret = rtw89_usb_parse(rtwdev, intf);
> + if (ret)
> + return ret;
> +
> + rtwusb->vendor_req_buf = kmalloc(sizeof(u32), GFP_KERNEL);
sizeof(*rtwusb->vendor_req_buf) or sizeof(__le32)
> + if (!rtwusb->vendor_req_buf)
> + return -ENOMEM;
> +
> + rtwusb->udev = usb_get_dev(interface_to_usbdev(intf));
> +
> + usb_set_intfdata(intf, rtwdev->hw);
> +
> + SET_IEEE80211_DEV(rtwdev->hw, &intf->dev);
> +
> + return 0;
> +}
> +
[...]
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 12/14] wifi: rtw89: Add usb.{c,h}
2025-06-16 3:10 ` Ping-Ke Shih
@ 2025-06-18 11:06 ` Bitterblue Smith
0 siblings, 0 replies; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-18 11:06 UTC (permalink / raw)
To: Ping-Ke Shih, linux-wireless@vger.kernel.org
On 16/06/2025 06:10, Ping-Ke Shih wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
>> Add very basic USB support. No TX/RX aggregation, no TX queues, no
>> switching to USB 3 mode.
>>
>> RTL8851BU and RTL8832BU work.
>>
>> Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
>
> Some minor suggestions.
>
> [...]
>
>> +static void rtw89_usb_vendorreq(struct rtw89_dev *rtwdev, u32 addr,
>> + void *data, u16 len, u8 reqtype)
>> +{
>> + struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
>> + struct usb_device *udev = rtwusb->udev;
>> + unsigned int pipe;
>> + u16 value, index;
>> + int attempt, ret;
>> +
>> + if (test_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags))
>> + return;
>> +
>> + value = u32_get_bits(addr, GENMASK(15, 0));
>> + index = u32_get_bits(addr, GENMASK(23, 16));
>> +
>> + for (attempt = 0; attempt < 10; attempt++) {
>> + *rtwusb->vendor_req_buf = 0;
>> +
>> + if (reqtype == RTW89_USB_VENQT_READ) {
>> + pipe = usb_rcvctrlpipe(udev, 0);
>> + } else { /* RTW89_USB_VENQT_WRITE */
>> + pipe = usb_sndctrlpipe(udev, 0);
>> +
>> + memcpy(rtwusb->vendor_req_buf, data, len);
>> + }
>> +
>> + ret = usb_control_msg(udev, pipe, RTW89_USB_VENQT, reqtype,
>> + value, index, rtwusb->vendor_req_buf,
>> + len, 500);
>> +
>> + if (ret == len) { /* Success */
>> + atomic_set(&rtwusb->continual_io_error, 0);
>> +
>> + if (reqtype == RTW89_USB_VENQT_READ)
>> + memcpy(data, rtwusb->vendor_req_buf, len);
>> +
>> + break;
>> + }
>> +
>> + if (ret == -ESHUTDOWN || ret == -ENODEV)
>> + set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
>> + else if (ret < 0)
>> + rtw89_warn(rtwdev,
>> + "usb %s%u 0x%x fail ret=%d value=0x%x attempt=%d\n",
>> + reqtype == RTW89_USB_VENQT_READ ? "read" : "write",
>> + len * 8, addr, ret,
>> + le32_to_cpup(rtwusb->vendor_req_buf),
>
> vendor_req_buf isn't always set fully (4 bytes), it would print out partially
> incorrect value. Would you like `%*ph` format with variable length? Like
> "value=%*ph", len, rtwusb->vendor_req_buf
>
I think it's fine the way it is because vendor_req_buf is zeroed
at the beginning of the for loop.
>> + attempt);
>> + else if (ret > 0 && reqtype == RTW89_USB_VENQT_READ)
>> + memcpy(data, rtwusb->vendor_req_buf, len);
>> +
>> + if (atomic_inc_return(&rtwusb->continual_io_error) > 4) {
>> + set_bit(RTW89_FLAG_UNPLUGGED, rtwdev->flags);
>> + break;
>> + }
>> + }
>> +}
>> +
>
> [...]
>
>> +
>> +static int rtw89_usb_fwcmd_submit(struct rtw89_dev *rtwdev,
>> + struct rtw89_core_tx_request *tx_req)
>> +{
>> + struct rtw89_tx_desc_info *desc_info = &tx_req->desc_info;
>> + struct rtw89_usb_tx_ctrl_block *txcb;
>> + struct sk_buff *skb = tx_req->skb;
>> + int txdesc_size = rtwdev->chip->h2c_desc_size;
>> + void *txdesc;
>> + int ret;
>> +
>> + if (((desc_info->pkt_size + txdesc_size) % 512) == 0) {
>> + rtw89_info(rtwdev, "avoiding multiple of 512\n");
>> + desc_info->pkt_size += 4;
>> + skb_put(skb, 4);
>> + }
>> +
>> + txcb = kmalloc(sizeof(*txcb), GFP_ATOMIC);
>> + if (!txcb)
>> + return -ENOMEM;
>> +
>> + txdesc = skb_push(skb, txdesc_size);
>> + memset(txdesc, 0, txdesc_size);
>> + rtw89_chip_fill_txdesc_fwcmd(rtwdev, desc_info, txdesc);
>> +
>> + txcb->rtwdev = rtwdev;
>> + skb_queue_head_init(&txcb->tx_ack_queue);
>> +
>> + skb_queue_tail(&txcb->tx_ack_queue, skb);
>> +
>> + ret = rtw89_usb_write_port(rtwdev, RTW89_DMA_H2C, skb->data, skb->len,
>> + rtw89_usb_write_port_complete_fwcmd, txcb);
>> +
>
> nit: no need empty line
>
>> + if (ret) {
>> + rtw89_err(rtwdev, "%s failed: %d\n", __func__, ret);
>> +
>> + skb_dequeue(&txcb->tx_ack_queue);
>> + kfree(txcb);
>> + }
>> +
>> + return ret;
>> +}
>> +
>
> [...]
>
>> +
>> +static void rtw89_usb_rx_handler(struct work_struct *work)
>> +{
>> + struct rtw89_usb *rtwusb = container_of(work, struct rtw89_usb, rx_work);
>> + struct rtw89_dev *rtwdev = rtwusb->rtwdev;
>> + struct rtw89_rx_desc_info desc_info;
>> + struct sk_buff *rx_skb;
>> + struct sk_buff *skb;
>> + u32 pkt_offset;
>> + int limit;
>> +
>> + for (limit = 0; limit < 200; limit++) {
>> + rx_skb = skb_dequeue(&rtwusb->rx_queue);
>> + if (!rx_skb)
>> + break;
>> +
>> + if (skb_queue_len(&rtwusb->rx_queue) >= RTW89_USB_MAX_RXQ_LEN) {
>> + rtw89_warn(rtwdev, "rx_queue overflow\n");
>> + dev_kfree_skb_any(rx_skb);
>> + continue;
>> + }
>> +
>> + memset(&desc_info, 0, sizeof(desc_info));
>> + rtw89_chip_query_rxdesc(rtwdev, &desc_info, rx_skb->data, 0);
>> +
>> + skb = rtw89_alloc_skb_for_rx(rtwdev, desc_info.pkt_size);
>> + if (!skb) {
>> + rtw89_debug(rtwdev, RTW89_DBG_HCI,
>> + "failed to allocate RX skb of size %u\n",
>> + desc_info.pkt_size);
>> + continue;
>> + }
>> +
>> + pkt_offset = desc_info.offset + desc_info.rxd_len;
>> +
>> + skb_put_data(skb, rx_skb->data + pkt_offset,
>> + desc_info.pkt_size);
>> +
>> + rtw89_core_rx(rtwdev, &desc_info, skb);
>> +
>> + if (skb_queue_len(&rtwusb->rx_free_queue) >= RTW89_USB_RX_SKB_NUM)
>> + dev_kfree_skb_any(rx_skb);
>> + else
>> + skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
>> + }
>> +
>> + if (limit == 200)
>
> Not sure if it is worth to reschedule itself again under this condition?
>
I guess it can't hurt.
>> + rtw89_debug(rtwdev, RTW89_DBG_HCI,
>> + "left %d rx skbs in the queue for later\n",
>> + skb_queue_len(&rtwusb->rx_queue));
>> +}
>> +
>
> [...]
>
>> +static int rtw89_usb_intf_init(struct rtw89_dev *rtwdev,
>> + struct usb_interface *intf)
>> +{
>> + struct rtw89_usb *rtwusb = rtw89_usb_priv(rtwdev);
>> + int ret;
>> +
>> + ret = rtw89_usb_parse(rtwdev, intf);
>> + if (ret)
>> + return ret;
>> +
>> + rtwusb->vendor_req_buf = kmalloc(sizeof(u32), GFP_KERNEL);
>
> sizeof(*rtwusb->vendor_req_buf) or sizeof(__le32)
>
>> + if (!rtwusb->vendor_req_buf)
>> + return -ENOMEM;
>> +
>> + rtwusb->udev = usb_get_dev(interface_to_usbdev(intf));
>> +
>> + usb_set_intfdata(intf, rtwdev->hw);
>> +
>> + SET_IEEE80211_DEV(rtwdev->hw, &intf->dev);
>> +
>> + return 0;
>> +}
>> +
>
>
> [...]
>
^ permalink raw reply [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 13/14] wifi: rtw89: Add rtw8851bu.c
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (11 preceding siblings ...)
2025-06-09 19:32 ` [PATCH rtw-next v2 12/14] wifi: rtw89: Add usb.{c,h} Bitterblue Smith
@ 2025-06-09 19:33 ` Bitterblue Smith
2025-06-16 3:11 ` Ping-Ke Shih
2025-06-09 19:34 ` [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules Bitterblue Smith
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:33 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
This is the entry point for the new rtw89_8851bu module.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
---
v2:
- Add USB ID 3625:010b for TP-Link Archer TX10UB Nano.
- Add USB ID 7392:e611 for Edimax EW-7611UXB.
---
.../net/wireless/realtek/rtw89/rtw8851bu.c | 39 +++++++++++++++++++
1 file changed, 39 insertions(+)
create mode 100644 drivers/net/wireless/realtek/rtw89/rtw8851bu.c
diff --git a/drivers/net/wireless/realtek/rtw89/rtw8851bu.c b/drivers/net/wireless/realtek/rtw89/rtw8851bu.c
new file mode 100644
index 000000000000..c3722547c6b0
--- /dev/null
+++ b/drivers/net/wireless/realtek/rtw89/rtw8851bu.c
@@ -0,0 +1,39 @@
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
+/* Copyright(c) 2025 Realtek Corporation
+ */
+
+#include <linux/module.h>
+#include <linux/usb.h>
+#include "rtw8851b.h"
+#include "usb.h"
+
+static const struct rtw89_driver_info rtw89_8851bu_info = {
+ .chip = &rtw8851b_chip_info,
+ .variant = NULL,
+ .quirks = NULL,
+};
+
+static const struct usb_device_id rtw_8851bu_id_table[] = {
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0bda, 0xb851, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&rtw89_8851bu_info },
+ /* TP-Link Archer TX10UB Nano */
+ { USB_DEVICE_AND_INTERFACE_INFO(0x3625, 0x010b, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&rtw89_8851bu_info },
+ /* Edimax EW-7611UXB */
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xe611, 0xff, 0xff, 0xff),
+ .driver_info = (kernel_ulong_t)&rtw89_8851bu_info },
+ {},
+};
+MODULE_DEVICE_TABLE(usb, rtw_8851bu_id_table);
+
+static struct usb_driver rtw_8851bu_driver = {
+ .name = KBUILD_MODNAME,
+ .id_table = rtw_8851bu_id_table,
+ .probe = rtw89_usb_probe,
+ .disconnect = rtw89_usb_disconnect,
+};
+module_usb_driver(rtw_8851bu_driver);
+
+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
+MODULE_DESCRIPTION("Realtek 802.11ax wireless 8851BU driver");
+MODULE_LICENSE("Dual BSD/GPL");
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-09 19:22 [PATCH rtw-next v2 00/14] wifi: rtw89: Add support for USB devices Bitterblue Smith
` (12 preceding siblings ...)
2025-06-09 19:33 ` [PATCH rtw-next v2 13/14] wifi: rtw89: Add rtw8851bu.c Bitterblue Smith
@ 2025-06-09 19:34 ` Bitterblue Smith
2025-06-10 11:55 ` kernel test robot
13 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-09 19:34 UTC (permalink / raw)
To: linux-wireless@vger.kernel.org; +Cc: Ping-Ke Shih
Enable compilation of the new rtw89_usb and rtw89_8851bu modules.
Tested mostly in station mode, and a little bit in AP mode.
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
---
v2:
- Add Acked-by.
- Add more information in the commit message.
---
drivers/net/wireless/realtek/rtw89/Kconfig | 14 ++++++++++++++
drivers/net/wireless/realtek/rtw89/Makefile | 6 ++++++
2 files changed, 20 insertions(+)
diff --git a/drivers/net/wireless/realtek/rtw89/Kconfig b/drivers/net/wireless/realtek/rtw89/Kconfig
index 205d7ecca7d7..bd180f3369c3 100644
--- a/drivers/net/wireless/realtek/rtw89/Kconfig
+++ b/drivers/net/wireless/realtek/rtw89/Kconfig
@@ -17,6 +17,9 @@ config RTW89_CORE
config RTW89_PCI
tristate
+config RTW89_USB
+ tristate
+
config RTW89_8851B
tristate
@@ -49,6 +52,17 @@ config RTW89_8851BE
802.11ax PCIe wireless network (Wi-Fi 6) adapter
+config RTW89_8851BU
+ tristate "Realtek 8851BU USB wireless network (Wi-Fi 6) adapter"
+ depends on USB
+ select RTW89_CORE
+ select RTW89_USB
+ select RTW89_8851B
+ help
+ Select this option will enable support for 8851BU chipset
+
+ 802.11ax USB wireless network (Wi-Fi 6) adapter
+
config RTW89_8852AE
tristate "Realtek 8852AE PCI wireless network (Wi-Fi 6) adapter"
depends on PCI
diff --git a/drivers/net/wireless/realtek/rtw89/Makefile b/drivers/net/wireless/realtek/rtw89/Makefile
index c751013e811e..891e2d55c335 100644
--- a/drivers/net/wireless/realtek/rtw89/Makefile
+++ b/drivers/net/wireless/realtek/rtw89/Makefile
@@ -31,6 +31,9 @@ rtw89_8851b-objs := rtw8851b.o \
obj-$(CONFIG_RTW89_8851BE) += rtw89_8851be.o
rtw89_8851be-objs := rtw8851be.o
+obj-$(CONFIG_RTW89_8851BU) += rtw89_8851bu.o
+rtw89_8851bu-objs := rtw8851bu.o
+
obj-$(CONFIG_RTW89_8852A) += rtw89_8852a.o
rtw89_8852a-objs := rtw8852a.o \
rtw8852a_table.o \
@@ -81,3 +84,6 @@ rtw89_core-$(CONFIG_RTW89_DEBUG) += debug.o
obj-$(CONFIG_RTW89_PCI) += rtw89_pci.o
rtw89_pci-y := pci.o pci_be.o
+obj-$(CONFIG_RTW89_USB) += rtw89_usb.o
+rtw89_usb-y := usb.o
+
--
2.49.0
^ permalink raw reply related [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-09 19:34 ` [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules Bitterblue Smith
@ 2025-06-10 11:55 ` kernel test robot
2025-06-10 13:33 ` Bitterblue Smith
0 siblings, 1 reply; 38+ messages in thread
From: kernel test robot @ 2025-06-10 11:55 UTC (permalink / raw)
To: Bitterblue Smith, linux-wireless@vger.kernel.org
Cc: llvm, oe-kbuild-all, Ping-Ke Shih
Hi Bitterblue,
kernel test robot noticed the following build errors:
[auto build test ERROR on wireless-next/main]
[also build test ERROR on wireless/main linus/master v6.16-rc1 next-20250610]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Bitterblue-Smith/wifi-rtw89-8851b-Accept-USB-devices-and-load-their-MAC-address/20250610-033543
base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
patch link: https://lore.kernel.org/r/663044d3-0816-4b1b-874d-776835e774e9%40gmail.com
patch subject: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20250610/202506101956.cNXM2Qvb-lkp@intel.com/config)
compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250610/202506101956.cNXM2Qvb-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202506101956.cNXM2Qvb-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:47: error: use of undeclared identifier 'B_AX_SOP_EDSWR'
523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
| ^
1 error generated.
vim +/B_AX_SOP_EDSWR +523 drivers/net/wireless/realtek/rtw89/rtw8851b.c
31df6df89f9394 Ping-Ke Shih 2023-05-12 477
31df6df89f9394 Ping-Ke Shih 2023-05-12 478 static int rtw8851b_pwr_off_func(struct rtw89_dev *rtwdev)
31df6df89f9394 Ping-Ke Shih 2023-05-12 479 {
31df6df89f9394 Ping-Ke Shih 2023-05-12 480 u32 val32;
66595e31988626 Ping-Ke Shih 2024-10-09 481 int ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 482
31df6df89f9394 Ping-Ke Shih 2023-05-12 483 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_RFC2RF,
31df6df89f9394 Ping-Ke Shih 2023-05-12 484 XTAL_SI_RFC2RF);
31df6df89f9394 Ping-Ke Shih 2023-05-12 485 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 486 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 487 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_EI);
31df6df89f9394 Ping-Ke Shih 2023-05-12 488 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 489 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 490 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_OFF_WEI);
31df6df89f9394 Ping-Ke Shih 2023-05-12 491 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 492 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 493 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_WL_RFC_S0, 0, XTAL_SI_RF00);
31df6df89f9394 Ping-Ke Shih 2023-05-12 494 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 495 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 496 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, XTAL_SI_SRAM2RFC,
31df6df89f9394 Ping-Ke Shih 2023-05-12 497 XTAL_SI_SRAM2RFC);
31df6df89f9394 Ping-Ke Shih 2023-05-12 498 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 499 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 500 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_EI);
31df6df89f9394 Ping-Ke Shih 2023-05-12 501 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 502 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 503 ret = rtw89_mac_write_xtal_si(rtwdev, XTAL_SI_ANAPAR_WL, 0, XTAL_SI_PON_WEI);
31df6df89f9394 Ping-Ke Shih 2023-05-12 504 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 505 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 506
31df6df89f9394 Ping-Ke Shih 2023-05-12 507 rtw89_write32_set(rtwdev, R_AX_WLAN_XTAL_SI_CONFIG,
31df6df89f9394 Ping-Ke Shih 2023-05-12 508 B_AX_XTAL_SI_ADDR_NOT_CHK);
31df6df89f9394 Ping-Ke Shih 2023-05-12 509 rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_EN_WLON);
31df6df89f9394 Ping-Ke Shih 2023-05-12 510 rtw89_write32_clr(rtwdev, R_AX_WLRF_CTRL, B_AX_AFC_AFEDIG);
31df6df89f9394 Ping-Ke Shih 2023-05-12 511 rtw89_write8_clr(rtwdev, R_AX_SYS_FUNC_EN, B_AX_FEN_BB_GLB_RSTN | B_AX_FEN_BBRSTB);
31df6df89f9394 Ping-Ke Shih 2023-05-12 512
31df6df89f9394 Ping-Ke Shih 2023-05-12 513 rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_OFFMAC);
31df6df89f9394 Ping-Ke Shih 2023-05-12 514
31df6df89f9394 Ping-Ke Shih 2023-05-12 515 ret = read_poll_timeout(rtw89_read32, val32, !(val32 & B_AX_APFM_OFFMAC),
31df6df89f9394 Ping-Ke Shih 2023-05-12 516 1000, 20000, false, rtwdev, R_AX_SYS_PW_CTRL);
31df6df89f9394 Ping-Ke Shih 2023-05-12 517 if (ret)
31df6df89f9394 Ping-Ke Shih 2023-05-12 518 return ret;
31df6df89f9394 Ping-Ke Shih 2023-05-12 519
cb97e6b5232342 Bitterblue Smith 2025-06-09 520 if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE)
31df6df89f9394 Ping-Ke Shih 2023-05-12 521 rtw89_write32(rtwdev, R_AX_WLLPS_CTRL, SW_LPS_OPTION);
cb97e6b5232342 Bitterblue Smith 2025-06-09 522 else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB)
cb97e6b5232342 Bitterblue Smith 2025-06-09 @523 rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
31df6df89f9394 Ping-Ke Shih 2023-05-12 524
31df6df89f9394 Ping-Ke Shih 2023-05-12 525 if (rtwdev->hal.cv == CHIP_CAV) {
31df6df89f9394 Ping-Ke Shih 2023-05-12 526 rtw8851b_patch_swr_pfm2pwm(rtwdev);
31df6df89f9394 Ping-Ke Shih 2023-05-12 527 } else {
31df6df89f9394 Ping-Ke Shih 2023-05-12 528 rtw89_write32_set(rtwdev, R_AX_SPSLDO_ON_CTRL1, B_AX_FPWMDELAY);
31df6df89f9394 Ping-Ke Shih 2023-05-12 529 rtw89_write32_set(rtwdev, R_AX_SPSANA_ON_CTRL1, B_AX_FPWMDELAY);
31df6df89f9394 Ping-Ke Shih 2023-05-12 530 }
31df6df89f9394 Ping-Ke Shih 2023-05-12 531
cb97e6b5232342 Bitterblue Smith 2025-06-09 532 if (rtwdev->hci.type == RTW89_HCI_TYPE_PCIE) {
31df6df89f9394 Ping-Ke Shih 2023-05-12 533 rtw89_write32_set(rtwdev, R_AX_SYS_PW_CTRL, B_AX_APFM_SWLPS);
cb97e6b5232342 Bitterblue Smith 2025-06-09 534 } else if (rtwdev->hci.type == RTW89_HCI_TYPE_USB) {
cb97e6b5232342 Bitterblue Smith 2025-06-09 535 val32 = rtw89_read32(rtwdev, R_AX_SYS_PW_CTRL);
cb97e6b5232342 Bitterblue Smith 2025-06-09 536 val32 &= ~B_AX_AFSM_PCIE_SUS_EN;
cb97e6b5232342 Bitterblue Smith 2025-06-09 537 val32 |= B_AX_AFSM_WLSUS_EN;
cb97e6b5232342 Bitterblue Smith 2025-06-09 538 rtw89_write32(rtwdev, R_AX_SYS_PW_CTRL, val32);
cb97e6b5232342 Bitterblue Smith 2025-06-09 539 }
31df6df89f9394 Ping-Ke Shih 2023-05-12 540
31df6df89f9394 Ping-Ke Shih 2023-05-12 541 return 0;
31df6df89f9394 Ping-Ke Shih 2023-05-12 542 }
31df6df89f9394 Ping-Ke Shih 2023-05-12 543
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-10 11:55 ` kernel test robot
@ 2025-06-10 13:33 ` Bitterblue Smith
2025-06-11 0:32 ` Ping-Ke Shih
0 siblings, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-10 13:33 UTC (permalink / raw)
To: kernel test robot, linux-wireless@vger.kernel.org
Cc: llvm, oe-kbuild-all, Ping-Ke Shih
On 10/06/2025 14:55, kernel test robot wrote:
> Hi Bitterblue,
>
> kernel test robot noticed the following build errors:
>
> [auto build test ERROR on wireless-next/main]
> [also build test ERROR on wireless/main linus/master v6.16-rc1 next-20250610]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Bitterblue-Smith/wifi-rtw89-8851b-Accept-USB-devices-and-load-their-MAC-address/20250610-033543
> base: https://git.kernel.org/pub/scm/linux/kernel/git/wireless/wireless-next.git main
> patch link: https://lore.kernel.org/r/663044d3-0816-4b1b-874d-776835e774e9%40gmail.com
> patch subject: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
> config: hexagon-allmodconfig (https://download.01.org/0day-ci/archive/20250610/202506101956.cNXM2Qvb-lkp@intel.com/config)
> compiler: clang version 17.0.6 (https://github.com/llvm/llvm-project 6009708b4367171ccdbf4b5905cb6a803753fe18)
> reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20250610/202506101956.cNXM2Qvb-lkp@intel.com/reproduce)
>
> If you fix the issue in a separate patch/commit (i.e. not just a new version of
> the same patch/commit), kindly add following tags
> | Reported-by: kernel test robot <lkp@intel.com>
> | Closes: https://lore.kernel.org/oe-kbuild-all/202506101956.cNXM2Qvb-lkp@intel.com/
>
> All errors (new ones prefixed by >>):
>
>>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:47: error: use of undeclared identifier 'B_AX_SOP_EDSWR'
> 523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
> | ^
> 1 error generated.
>
Oops, I'll add that to reg.h in v3.
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-10 13:33 ` Bitterblue Smith
@ 2025-06-11 0:32 ` Ping-Ke Shih
2025-06-11 0:33 ` Ping-Ke Shih
2025-06-11 12:37 ` Bitterblue Smith
0 siblings, 2 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-11 0:32 UTC (permalink / raw)
To: Bitterblue Smith, kernel test robot,
linux-wireless@vger.kernel.org
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
> >
> >>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:47: error: use of undeclared identifier
> 'B_AX_SOP_EDSWR'
> > 523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
> > | ^
> > 1 error generated.
> >
> Oops, I'll add that to reg.h in v3.
The NAPI also reported the same things [1] [2].
Not sure if you will send v3 right away. If so, I will ignore v2.
[1] http://wifibot.sipsolutions.net/results/969980/14111187/build_32bit/stderr
[2] https://patchwork.kernel.org/project/linux-wireless/list/?series=969980
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-11 0:32 ` Ping-Ke Shih
@ 2025-06-11 0:33 ` Ping-Ke Shih
2025-06-11 12:37 ` Bitterblue Smith
1 sibling, 0 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-11 0:33 UTC (permalink / raw)
To: Bitterblue Smith, kernel test robot,
linux-wireless@vger.kernel.org
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
> > >
> > >>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:47: error: use of undeclared identifier
> > 'B_AX_SOP_EDSWR'
> > > 523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
> > > | ^
> > > 1 error generated.
> > >
> > Oops, I'll add that to reg.h in v3.
>
> The NAPI also reported the same things [1] [2].
Sorry. I meant NIPA instead.
>
> Not sure if you will send v3 right away. If so, I will ignore v2.
>
> [1] http://wifibot.sipsolutions.net/results/969980/14111187/build_32bit/stderr
> [2] https://patchwork.kernel.org/project/linux-wireless/list/?series=969980
^ permalink raw reply [flat|nested] 38+ messages in thread
* Re: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-11 0:32 ` Ping-Ke Shih
2025-06-11 0:33 ` Ping-Ke Shih
@ 2025-06-11 12:37 ` Bitterblue Smith
2025-06-12 1:27 ` Ping-Ke Shih
1 sibling, 1 reply; 38+ messages in thread
From: Bitterblue Smith @ 2025-06-11 12:37 UTC (permalink / raw)
To: Ping-Ke Shih, kernel test robot, linux-wireless@vger.kernel.org
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
On 11/06/2025 03:32, Ping-Ke Shih wrote:
>>>
>>>>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:47: error: use of undeclared identifier
>> 'B_AX_SOP_EDSWR'
>>> 523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
>>> | ^
>>> 1 error generated.
>>>
>> Oops, I'll add that to reg.h in v3.
>
> The NAPI also reported the same things [1] [2].
>
> Not sure if you will send v3 right away. If so, I will ignore v2.
>
> [1] http://wifibot.sipsolutions.net/results/969980/14111187/build_32bit/stderr
> [2] https://patchwork.kernel.org/project/linux-wireless/list/?series=969980
>
I would prefer to wait for your review. Is that okay?
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-11 12:37 ` Bitterblue Smith
@ 2025-06-12 1:27 ` Ping-Ke Shih
2025-06-16 3:15 ` Ping-Ke Shih
0 siblings, 1 reply; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-12 1:27 UTC (permalink / raw)
To: Bitterblue Smith, kernel test robot,
linux-wireless@vger.kernel.org
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> On 11/06/2025 03:32, Ping-Ke Shih wrote:
> >>>
> >>>>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:47: error: use of undeclared identifier
> >> 'B_AX_SOP_EDSWR'
> >>> 523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
> >>> | ^
> >>> 1 error generated.
> >>>
> >> Oops, I'll add that to reg.h in v3.
> >
> > The NAPI also reported the same things [1] [2].
> >
> > Not sure if you will send v3 right away. If so, I will ignore v2.
> >
> > [1] http://wifibot.sipsolutions.net/results/969980/14111187/build_32bit/stderr
> > [2] https://patchwork.kernel.org/project/linux-wireless/list/?series=969980
> >
>
> I would prefer to wait for your review. Is that okay?
Yes. I will review v2.
^ permalink raw reply [flat|nested] 38+ messages in thread
* RE: [PATCH rtw-next v2 14/14] wifi: rtw89: Enable the new USB modules
2025-06-12 1:27 ` Ping-Ke Shih
@ 2025-06-16 3:15 ` Ping-Ke Shih
0 siblings, 0 replies; 38+ messages in thread
From: Ping-Ke Shih @ 2025-06-16 3:15 UTC (permalink / raw)
To: Bitterblue Smith, kernel test robot,
linux-wireless@vger.kernel.org
Cc: llvm@lists.linux.dev, oe-kbuild-all@lists.linux.dev
Ping-Ke Shih <pkshih@realtek.com> wrote:
> Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> > On 11/06/2025 03:32, Ping-Ke Shih wrote:
> > >>>
> > >>>>> drivers/net/wireless/realtek/rtw89/rtw8851b.c:523:47: error: use of undeclared identifier
> > >> 'B_AX_SOP_EDSWR'
> > >>> 523 | rtw89_write32_clr(rtwdev, R_AX_SYS_PW_CTRL, B_AX_SOP_EDSWR);
> > >>> | ^
> > >>> 1 error generated.
> > >>>
> > >> Oops, I'll add that to reg.h in v3.
> > >
> > > The NAPI also reported the same things [1] [2].
> > >
> > > Not sure if you will send v3 right away. If so, I will ignore v2.
> > >
> > > [1] http://wifibot.sipsolutions.net/results/969980/14111187/build_32bit/stderr
> > > [2] https://patchwork.kernel.org/project/linux-wireless/list/?series=969980
> > >
> >
> > I would prefer to wait for your review. Is that okay?
>
> Yes. I will review v2.
I have reviewed v2. Since compiler errors exist, I can't build this patchset
with sparse/smatch locally. Please do it yourself before sending v3.
^ permalink raw reply [flat|nested] 38+ messages in thread