mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-30 14:16:40 +00:00
linux: add rtw88 patches
Signed-off-by: Matthias Reichl <hias@horus.com>
This commit is contained in:
parent
c10631e95a
commit
5d1274fe09
392
packages/linux/patches/rtlwifi/6.13/0001-wifi-rtw88-Constify-some-arrays-and-structs.patch
vendored
Normal file
392
packages/linux/patches/rtlwifi/6.13/0001-wifi-rtw88-Constify-some-arrays-and-structs.patch
vendored
Normal file
@ -0,0 +1,392 @@
|
||||
From c9cd7ebfe01ff6fe41e762db6a2b0f0e53ee8567 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 18 Sep 2024 01:53:55 +0300
|
||||
Subject: [PATCH 01/24] wifi: rtw88: Constify some arrays and structs
|
||||
|
||||
These are never modified, so make them const:
|
||||
|
||||
card_enable_flow_8703b
|
||||
card_disable_flow_8703b
|
||||
rtw8703b_ops
|
||||
|
||||
rtw8723d_ops
|
||||
card_enable_flow_8723d
|
||||
card_disable_flow_8723d
|
||||
|
||||
trans_carddis_to_cardemu_8821c
|
||||
trans_cardemu_to_act_8821c
|
||||
trans_act_to_cardemu_8821c
|
||||
trans_cardemu_to_carddis_8821c
|
||||
card_enable_flow_8821c
|
||||
card_disable_flow_8821c
|
||||
rtw8821c_dig
|
||||
page_table_8821c
|
||||
rqpn_table_8821c
|
||||
prioq_addrs_8821c
|
||||
rtw8821c_ops
|
||||
|
||||
card_enable_flow_8822b
|
||||
card_disable_flow_8822b
|
||||
prioq_addrs_8822b
|
||||
rtw8822b_ops
|
||||
rtw8822b_edcca_th
|
||||
|
||||
card_enable_flow_8822c
|
||||
card_disable_flow_8822c
|
||||
prioq_addrs_8822c
|
||||
rtw8822c_ops
|
||||
rtw8822c_edcca_th
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/mac.c | 4 ++--
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 8 +++----
|
||||
drivers/net/wireless/realtek/rtw88/phy.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 6 ++---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 6 ++---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 22 +++++++++----------
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 10 ++++-----
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 10 ++++-----
|
||||
9 files changed, 35 insertions(+), 35 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index b9b0114e253b..813c12148819 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -267,7 +267,7 @@ static void rtw_fw_scan_result(struct rtw_dev *rtwdev, u8 *payload,
|
||||
static void rtw_fw_adaptivity_result(struct rtw_dev *rtwdev, u8 *payload,
|
||||
u8 length)
|
||||
{
|
||||
- struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
|
||||
+ const struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
|
||||
struct rtw_c2h_adaptivity *result = (struct rtw_c2h_adaptivity *)payload;
|
||||
|
||||
rtw_dbg(rtwdev, RTW_DBG_ADAPTIVITY,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index efb1da198e74..5aa45592c2ac 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -228,7 +228,7 @@ static int rtw_sub_pwr_seq_parser(struct rtw_dev *rtwdev, u8 intf_mask,
|
||||
}
|
||||
|
||||
static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
|
||||
- const struct rtw_pwr_seq_cmd **cmd_seq)
|
||||
+ const struct rtw_pwr_seq_cmd * const *cmd_seq)
|
||||
{
|
||||
u8 cut_mask;
|
||||
u8 intf_mask;
|
||||
@@ -271,7 +271,7 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
|
||||
static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
- const struct rtw_pwr_seq_cmd **pwr_seq;
|
||||
+ const struct rtw_pwr_seq_cmd * const *pwr_seq;
|
||||
u32 imr = 0;
|
||||
u8 rpwm;
|
||||
bool cur_pwr;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index c808bb271e9d..81145f8571f3 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1167,7 +1167,7 @@ enum rtw_fwcd_item {
|
||||
|
||||
/* hardware configuration for each IC */
|
||||
struct rtw_chip_info {
|
||||
- struct rtw_chip_ops *ops;
|
||||
+ const struct rtw_chip_ops *ops;
|
||||
u8 id;
|
||||
|
||||
const char *fw_name;
|
||||
@@ -1209,8 +1209,8 @@ struct rtw_chip_info {
|
||||
|
||||
/* init values */
|
||||
u8 sys_func_en;
|
||||
- const struct rtw_pwr_seq_cmd **pwr_on_seq;
|
||||
- const struct rtw_pwr_seq_cmd **pwr_off_seq;
|
||||
+ const struct rtw_pwr_seq_cmd * const *pwr_on_seq;
|
||||
+ const struct rtw_pwr_seq_cmd * const *pwr_off_seq;
|
||||
const struct rtw_rqpn *rqpn_table;
|
||||
const struct rtw_prioq_addrs *prioq_addrs;
|
||||
const struct rtw_page_table *page_table;
|
||||
@@ -1242,7 +1242,7 @@ struct rtw_chip_info {
|
||||
u8 bfer_su_max_num;
|
||||
u8 bfer_mu_max_num;
|
||||
|
||||
- struct rtw_hw_reg_offset *edcca_th;
|
||||
+ const struct rtw_hw_reg_offset *edcca_th;
|
||||
s8 l2h_th_ini_cs;
|
||||
s8 l2h_th_ini_ad;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
index 37ef80c9091d..d57a2aabd89b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
@@ -123,7 +123,7 @@ static void rtw_phy_cck_pd_init(struct rtw_dev *rtwdev)
|
||||
|
||||
void rtw_phy_set_edcca_th(struct rtw_dev *rtwdev, u8 l2h, u8 h2l)
|
||||
{
|
||||
- struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
|
||||
+ const struct rtw_hw_reg_offset *edcca_th = rtwdev->chip->edcca_th;
|
||||
|
||||
rtw_write32_mask(rtwdev,
|
||||
edcca_th[EDCCA_TH_L2H_IDX].hw_reg.addr,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index a977aad9c650..86904cc94d6d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -481,14 +481,14 @@ static const struct rtw_pwr_seq_cmd trans_act_to_lps_8703b[] = {
|
||||
{TRANS_SEQ_END},
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_enable_flow_8703b[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8703b[] = {
|
||||
trans_pre_enable_8703b,
|
||||
trans_carddis_to_cardemu_8703b,
|
||||
trans_cardemu_to_act_8703b,
|
||||
NULL
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_disable_flow_8703b[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8703b[] = {
|
||||
trans_act_to_lps_8703b,
|
||||
trans_act_to_reset_mcu_8703b,
|
||||
trans_act_to_cardemu_8703b,
|
||||
@@ -1941,7 +1941,7 @@ static const struct coex_tdma_para tdma_sant_8703b[] = {
|
||||
{ {0x61, 0x08, 0x03, 0x11, 0x11} },
|
||||
};
|
||||
|
||||
-static struct rtw_chip_ops rtw8703b_ops = {
|
||||
+static const struct rtw_chip_ops rtw8703b_ops = {
|
||||
.mac_init = rtw8723x_mac_init,
|
||||
.dump_fw_crash = NULL,
|
||||
.shutdown = NULL,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index 3fba4054d45f..7f33e141e646 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -1430,7 +1430,7 @@ static void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
|
||||
dm_info->pwr_trk_triggered = false;
|
||||
}
|
||||
|
||||
-static struct rtw_chip_ops rtw8723d_ops = {
|
||||
+static const struct rtw_chip_ops rtw8723d_ops = {
|
||||
.phy_set_param = rtw8723d_phy_set_param,
|
||||
.read_efuse = rtw8723x_read_efuse,
|
||||
.query_rx_desc = rtw8723d_query_rx_desc,
|
||||
@@ -1788,7 +1788,7 @@ static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8723d[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_enable_flow_8723d[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8723d[] = {
|
||||
trans_carddis_to_cardemu_8723d,
|
||||
trans_cardemu_to_act_8723d,
|
||||
NULL
|
||||
@@ -2004,7 +2004,7 @@ static const struct rtw_pwr_seq_cmd trans_act_to_post_carddis_8723d[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_disable_flow_8723d[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8723d[] = {
|
||||
trans_act_to_lps_8723d,
|
||||
trans_act_to_pre_carddis_8723d,
|
||||
trans_act_to_cardemu_8723d,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 526e8de77b3e..9d21c4b1450e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1254,7 +1254,7 @@ static void rtw8821c_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
||||
fill_txdesc_checksum_common(txdesc, 16);
|
||||
}
|
||||
|
||||
-static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
|
||||
{0x0086,
|
||||
RTW_PWR_CUT_ALL_MSK,
|
||||
RTW_PWR_INTF_SDIO_MSK,
|
||||
@@ -1292,7 +1292,7 @@ static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821c[] = {
|
||||
{0x0020,
|
||||
RTW_PWR_CUT_ALL_MSK,
|
||||
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
|
||||
@@ -1396,7 +1396,7 @@ static struct rtw_pwr_seq_cmd trans_cardemu_to_act_8821c[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821c[] = {
|
||||
{0x0093,
|
||||
RTW_PWR_CUT_ALL_MSK,
|
||||
RTW_PWR_INTF_ALL_MSK,
|
||||
@@ -1454,7 +1454,7 @@ static struct rtw_pwr_seq_cmd trans_act_to_cardemu_8821c[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821c[] = {
|
||||
{0x0007,
|
||||
RTW_PWR_CUT_ALL_MSK,
|
||||
RTW_PWR_INTF_USB_MSK | RTW_PWR_INTF_SDIO_MSK,
|
||||
@@ -1567,13 +1567,13 @@ static struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8821c[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_enable_flow_8821c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8821c[] = {
|
||||
trans_carddis_to_cardemu_8821c,
|
||||
trans_cardemu_to_act_8821c,
|
||||
NULL
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_disable_flow_8821c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8821c[] = {
|
||||
trans_act_to_cardemu_8821c,
|
||||
trans_cardemu_to_carddis_8821c,
|
||||
NULL
|
||||
@@ -1629,7 +1629,7 @@ static const struct rtw_rfe_def rtw8821c_rfe_defs[] = {
|
||||
[6] = RTW_DEF_RFE(8821c, 0, 0),
|
||||
};
|
||||
|
||||
-static struct rtw_hw_reg rtw8821c_dig[] = {
|
||||
+static const struct rtw_hw_reg rtw8821c_dig[] = {
|
||||
[0] = { .addr = 0xc50, .mask = 0x7f },
|
||||
};
|
||||
|
||||
@@ -1639,7 +1639,7 @@ static const struct rtw_ltecoex_addr rtw8821c_ltecoex_addr = {
|
||||
.rdata = LTECOEX_READ_DATA,
|
||||
};
|
||||
|
||||
-static struct rtw_page_table page_table_8821c[] = {
|
||||
+static const struct rtw_page_table page_table_8821c[] = {
|
||||
/* not sure what [0] stands for */
|
||||
{16, 16, 16, 14, 1},
|
||||
{16, 16, 16, 14, 1},
|
||||
@@ -1648,7 +1648,7 @@ static struct rtw_page_table page_table_8821c[] = {
|
||||
{16, 16, 16, 14, 1},
|
||||
};
|
||||
|
||||
-static struct rtw_rqpn rqpn_table_8821c[] = {
|
||||
+static const struct rtw_rqpn rqpn_table_8821c[] = {
|
||||
/* not sure what [0] stands for */
|
||||
{RTW_DMA_MAPPING_NORMAL, RTW_DMA_MAPPING_NORMAL,
|
||||
RTW_DMA_MAPPING_LOW, RTW_DMA_MAPPING_LOW,
|
||||
@@ -1667,7 +1667,7 @@ static struct rtw_rqpn rqpn_table_8821c[] = {
|
||||
RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
|
||||
};
|
||||
|
||||
-static struct rtw_prioq_addrs prioq_addrs_8821c = {
|
||||
+static const struct rtw_prioq_addrs prioq_addrs_8821c = {
|
||||
.prio[RTW_DMA_MAPPING_EXTRA] = {
|
||||
.rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
|
||||
},
|
||||
@@ -1683,7 +1683,7 @@ static struct rtw_prioq_addrs prioq_addrs_8821c = {
|
||||
.wsize = true,
|
||||
};
|
||||
|
||||
-static struct rtw_chip_ops rtw8821c_ops = {
|
||||
+static const struct rtw_chip_ops rtw8821c_ops = {
|
||||
.phy_set_param = rtw8821c_phy_set_param,
|
||||
.read_efuse = rtw8821c_read_efuse,
|
||||
.query_rx_desc = rtw8821c_query_rx_desc,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index 4a6c0a9266a0..c9e50756655c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -1980,13 +1980,13 @@ static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822b[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_enable_flow_8822b[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8822b[] = {
|
||||
trans_carddis_to_cardemu_8822b,
|
||||
trans_cardemu_to_act_8822b,
|
||||
NULL
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_disable_flow_8822b[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8822b[] = {
|
||||
trans_act_to_cardemu_8822b,
|
||||
trans_cardemu_to_carddis_8822b,
|
||||
NULL
|
||||
@@ -2158,7 +2158,7 @@ static const struct rtw_rqpn rqpn_table_8822b[] = {
|
||||
RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
|
||||
};
|
||||
|
||||
-static struct rtw_prioq_addrs prioq_addrs_8822b = {
|
||||
+static const struct rtw_prioq_addrs prioq_addrs_8822b = {
|
||||
.prio[RTW_DMA_MAPPING_EXTRA] = {
|
||||
.rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
|
||||
},
|
||||
@@ -2174,7 +2174,7 @@ static struct rtw_prioq_addrs prioq_addrs_8822b = {
|
||||
.wsize = true,
|
||||
};
|
||||
|
||||
-static struct rtw_chip_ops rtw8822b_ops = {
|
||||
+static const struct rtw_chip_ops rtw8822b_ops = {
|
||||
.phy_set_param = rtw8822b_phy_set_param,
|
||||
.read_efuse = rtw8822b_read_efuse,
|
||||
.query_rx_desc = rtw8822b_query_rx_desc,
|
||||
@@ -2523,7 +2523,7 @@ static const struct rtw_reg_domain coex_info_hw_regs_8822b[] = {
|
||||
{0xc50, MASKBYTE0, RTW_REG_DOMAIN_MAC8},
|
||||
};
|
||||
|
||||
-static struct rtw_hw_reg_offset rtw8822b_edcca_th[] = {
|
||||
+static const struct rtw_hw_reg_offset rtw8822b_edcca_th[] = {
|
||||
[EDCCA_TH_L2H_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE0}, .offset = 0},
|
||||
[EDCCA_TH_H2L_IDX] = {{.addr = 0x8a4, .mask = MASKBYTE1}, .offset = 0},
|
||||
};
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 3157cd834233..9aae401722fb 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -4875,13 +4875,13 @@ static const struct rtw_pwr_seq_cmd trans_cardemu_to_carddis_8822c[] = {
|
||||
RTW_PWR_CMD_END, 0, 0},
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_enable_flow_8822c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_enable_flow_8822c[] = {
|
||||
trans_carddis_to_cardemu_8822c,
|
||||
trans_cardemu_to_act_8822c,
|
||||
NULL
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_seq_cmd *card_disable_flow_8822c[] = {
|
||||
+static const struct rtw_pwr_seq_cmd * const card_disable_flow_8822c[] = {
|
||||
trans_act_to_cardemu_8822c,
|
||||
trans_cardemu_to_carddis_8822c,
|
||||
NULL
|
||||
@@ -4973,7 +4973,7 @@ static const struct rtw_rqpn rqpn_table_8822c[] = {
|
||||
RTW_DMA_MAPPING_EXTRA, RTW_DMA_MAPPING_HIGH},
|
||||
};
|
||||
|
||||
-static struct rtw_prioq_addrs prioq_addrs_8822c = {
|
||||
+static const struct rtw_prioq_addrs prioq_addrs_8822c = {
|
||||
.prio[RTW_DMA_MAPPING_EXTRA] = {
|
||||
.rsvd = REG_FIFOPAGE_INFO_4, .avail = REG_FIFOPAGE_INFO_4 + 2,
|
||||
},
|
||||
@@ -4989,7 +4989,7 @@ static struct rtw_prioq_addrs prioq_addrs_8822c = {
|
||||
.wsize = true,
|
||||
};
|
||||
|
||||
-static struct rtw_chip_ops rtw8822c_ops = {
|
||||
+static const struct rtw_chip_ops rtw8822c_ops = {
|
||||
.phy_set_param = rtw8822c_phy_set_param,
|
||||
.read_efuse = rtw8822c_read_efuse,
|
||||
.query_rx_desc = rtw8822c_query_rx_desc,
|
||||
@@ -5302,7 +5302,7 @@ static const struct rtw_pwr_track_tbl rtw8822c_rtw_pwr_track_tbl = {
|
||||
.pwrtrk_2g_ccka_p = rtw8822c_pwrtrk_2g_cck_a_p,
|
||||
};
|
||||
|
||||
-static struct rtw_hw_reg_offset rtw8822c_edcca_th[] = {
|
||||
+static const struct rtw_hw_reg_offset rtw8822c_edcca_th[] = {
|
||||
[EDCCA_TH_L2H_IDX] = {
|
||||
{.addr = 0x84c, .mask = MASKBYTE2}, .offset = 0x80
|
||||
},
|
||||
--
|
||||
2.39.5
|
||||
|
582
packages/linux/patches/rtlwifi/6.13/0002-wifi-rtw88-Parse-the-RX-descriptor-with-a-single-fun.patch
vendored
Normal file
582
packages/linux/patches/rtlwifi/6.13/0002-wifi-rtw88-Parse-the-RX-descriptor-with-a-single-fun.patch
vendored
Normal file
@ -0,0 +1,582 @@
|
||||
From e88978bf9faea656241ce9b671ce76323015c896 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Fri, 20 Sep 2024 22:27:30 +0300
|
||||
Subject: [PATCH 02/24] wifi: rtw88: Parse the RX descriptor with a single
|
||||
function
|
||||
|
||||
rtw8703b_query_rx_desc(), rtw8723d_query_rx_desc(),
|
||||
rtw8821c_query_rx_desc(), rtw8822b_query_rx_desc(), and
|
||||
rtw8822c_query_rx_desc() are almost identical, so replace them all with
|
||||
a single function, rtw_rx_query_rx_desc().
|
||||
|
||||
Also, access the RX descriptor using a struct with __le32 members and
|
||||
le32_get_bits().
|
||||
|
||||
Tested with RTL8811CU, RTL8811AU, and RTL8812AU.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 5 +-
|
||||
drivers/net/wireless/realtek/rtw88/pci.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 56 +--------------
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 43 +-----------
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 43 +-----------
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 43 +-----------
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 44 +-----------
|
||||
drivers/net/wireless/realtek/rtw88/rx.c | 70 +++++++++++++++++--
|
||||
drivers/net/wireless/realtek/rtw88/rx.h | 64 ++++++++---------
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 3 +-
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 4 +-
|
||||
11 files changed, 106 insertions(+), 271 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 81145f8571f3..c9efe9d66954 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -848,9 +848,8 @@ struct rtw_chip_ops {
|
||||
void (*phy_set_param)(struct rtw_dev *rtwdev);
|
||||
void (*set_channel)(struct rtw_dev *rtwdev, u8 channel,
|
||||
u8 bandwidth, u8 primary_chan_idx);
|
||||
- void (*query_rx_desc)(struct rtw_dev *rtwdev, u8 *rx_desc,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_rx_status *rx_status);
|
||||
+ void (*query_phy_status)(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
+ struct rtw_rx_pkt_stat *pkt_stat);
|
||||
u32 (*read_rf)(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
u32 addr, u32 mask);
|
||||
bool (*write_rf)(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
index fab9bb9257dd..729b270d5851 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
@@ -1066,7 +1066,7 @@ static u32 rtw_pci_rx_napi(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
|
||||
dma_sync_single_for_cpu(rtwdev->dev, dma, RTK_PCI_RX_BUF_SIZE,
|
||||
DMA_FROM_DEVICE);
|
||||
rx_desc = skb->data;
|
||||
- chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
|
||||
+ rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
|
||||
|
||||
/* offset from rx_desc to payload */
|
||||
pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index 86904cc94d6d..fe09c23b51b5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -29,9 +29,6 @@
|
||||
#define TBTT_PROHIBIT_HOLD_TIME 0x80
|
||||
#define TBTT_PROHIBIT_HOLD_TIME_STOP_BCN 0x64
|
||||
|
||||
-/* raw pkt_stat->drv_info_sz is in unit of 8-bytes */
|
||||
-#define RX_DRV_INFO_SZ_UNIT_8703B 8
|
||||
-
|
||||
#define TRANS_SEQ_END \
|
||||
0xFFFF, \
|
||||
RTW_PWR_CUT_ALL_MSK, \
|
||||
@@ -1032,57 +1029,6 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
query_phy_status_ofdm(rtwdev, phy_status, pkt_stat);
|
||||
}
|
||||
|
||||
-static void rtw8703b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_rx_status *rx_status)
|
||||
-{
|
||||
- struct ieee80211_hdr *hdr;
|
||||
- u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
|
||||
- u8 *phy_status = NULL;
|
||||
-
|
||||
- memset(pkt_stat, 0, sizeof(*pkt_stat));
|
||||
-
|
||||
- pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
|
||||
- pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
|
||||
- pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
|
||||
- pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
|
||||
- GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
|
||||
- pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
|
||||
- pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
|
||||
- pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
|
||||
- pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
|
||||
- pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
|
||||
- pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
|
||||
- pkt_stat->ppdu_cnt = 0;
|
||||
- pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
|
||||
-
|
||||
- pkt_stat->drv_info_sz *= RX_DRV_INFO_SZ_UNIT_8703B;
|
||||
-
|
||||
- if (pkt_stat->is_c2h)
|
||||
- return;
|
||||
-
|
||||
- hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
|
||||
- pkt_stat->drv_info_sz);
|
||||
-
|
||||
- pkt_stat->bw = GET_RX_DESC_BW(rx_desc);
|
||||
-
|
||||
- if (pkt_stat->phy_status) {
|
||||
- phy_status = rx_desc + desc_sz + pkt_stat->shift;
|
||||
- query_phy_status(rtwdev, phy_status, pkt_stat);
|
||||
- }
|
||||
-
|
||||
- rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
|
||||
-
|
||||
- /* Rtl8723cs driver checks for size < 14 or size > 8192 and
|
||||
- * simply drops the packet. Maybe this should go into
|
||||
- * rtw_rx_fill_rx_status()?
|
||||
- */
|
||||
- if (pkt_stat->pkt_len == 0) {
|
||||
- rx_status->flag |= RX_FLAG_NO_PSDU;
|
||||
- rtw_dbg(rtwdev, RTW_DBG_RX, "zero length packet");
|
||||
- }
|
||||
-}
|
||||
-
|
||||
#define ADDA_ON_VAL_8703B 0x03c00014
|
||||
|
||||
static
|
||||
@@ -1948,7 +1894,7 @@ static const struct rtw_chip_ops rtw8703b_ops = {
|
||||
.read_efuse = rtw8703b_read_efuse,
|
||||
.phy_set_param = rtw8703b_phy_set_param,
|
||||
.set_channel = rtw8703b_set_channel,
|
||||
- .query_rx_desc = rtw8703b_query_rx_desc,
|
||||
+ .query_phy_status = query_phy_status,
|
||||
.read_rf = rtw_phy_read_rf_sipi,
|
||||
.write_rf = rtw_phy_write_rf_reg_sipi,
|
||||
.set_tx_power_index = rtw8723x_set_tx_power_index,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index 7f33e141e646..86a5e2497641 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -227,47 +227,6 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
}
|
||||
}
|
||||
|
||||
-static void rtw8723d_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_rx_status *rx_status)
|
||||
-{
|
||||
- struct ieee80211_hdr *hdr;
|
||||
- u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
|
||||
- u8 *phy_status = NULL;
|
||||
-
|
||||
- memset(pkt_stat, 0, sizeof(*pkt_stat));
|
||||
-
|
||||
- pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
|
||||
- pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
|
||||
- pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
|
||||
- pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
|
||||
- GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
|
||||
- pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
|
||||
- pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
|
||||
- pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
|
||||
- pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
|
||||
- pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
|
||||
- pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
|
||||
- pkt_stat->ppdu_cnt = 0;
|
||||
- pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
|
||||
-
|
||||
- /* drv_info_sz is in unit of 8-bytes */
|
||||
- pkt_stat->drv_info_sz *= 8;
|
||||
-
|
||||
- /* c2h cmd pkt's rx/phy status is not interested */
|
||||
- if (pkt_stat->is_c2h)
|
||||
- return;
|
||||
-
|
||||
- hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
|
||||
- pkt_stat->drv_info_sz);
|
||||
- if (pkt_stat->phy_status) {
|
||||
- phy_status = rx_desc + desc_sz + pkt_stat->shift;
|
||||
- query_phy_status(rtwdev, phy_status, pkt_stat);
|
||||
- }
|
||||
-
|
||||
- rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
|
||||
-}
|
||||
-
|
||||
static bool rtw8723d_check_spur_ov_thres(struct rtw_dev *rtwdev,
|
||||
u8 channel, u32 thres)
|
||||
{
|
||||
@@ -1433,7 +1392,7 @@ static void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
|
||||
static const struct rtw_chip_ops rtw8723d_ops = {
|
||||
.phy_set_param = rtw8723d_phy_set_param,
|
||||
.read_efuse = rtw8723x_read_efuse,
|
||||
- .query_rx_desc = rtw8723d_query_rx_desc,
|
||||
+ .query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8723d_set_channel,
|
||||
.mac_init = rtw8723x_mac_init,
|
||||
.shutdown = rtw8723d_shutdown,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 9d21c4b1450e..66c79956e8e5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -679,47 +679,6 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
}
|
||||
}
|
||||
|
||||
-static void rtw8821c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_rx_status *rx_status)
|
||||
-{
|
||||
- struct ieee80211_hdr *hdr;
|
||||
- u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
|
||||
- u8 *phy_status = NULL;
|
||||
-
|
||||
- memset(pkt_stat, 0, sizeof(*pkt_stat));
|
||||
-
|
||||
- pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
|
||||
- pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
|
||||
- pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
|
||||
- pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
|
||||
- GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
|
||||
- pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
|
||||
- pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
|
||||
- pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
|
||||
- pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
|
||||
- pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
|
||||
- pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
|
||||
- pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
|
||||
- pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
|
||||
-
|
||||
- /* drv_info_sz is in unit of 8-bytes */
|
||||
- pkt_stat->drv_info_sz *= 8;
|
||||
-
|
||||
- /* c2h cmd pkt's rx/phy status is not interested */
|
||||
- if (pkt_stat->is_c2h)
|
||||
- return;
|
||||
-
|
||||
- hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
|
||||
- pkt_stat->drv_info_sz);
|
||||
- if (pkt_stat->phy_status) {
|
||||
- phy_status = rx_desc + desc_sz + pkt_stat->shift;
|
||||
- query_phy_status(rtwdev, phy_status, pkt_stat);
|
||||
- }
|
||||
-
|
||||
- rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
|
||||
-}
|
||||
-
|
||||
static void
|
||||
rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
{
|
||||
@@ -1686,7 +1645,7 @@ static const struct rtw_prioq_addrs prioq_addrs_8821c = {
|
||||
static const struct rtw_chip_ops rtw8821c_ops = {
|
||||
.phy_set_param = rtw8821c_phy_set_param,
|
||||
.read_efuse = rtw8821c_read_efuse,
|
||||
- .query_rx_desc = rtw8821c_query_rx_desc,
|
||||
+ .query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8821c_set_channel,
|
||||
.mac_init = rtw8821c_mac_init,
|
||||
.read_rf = rtw_phy_read_rf,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index c9e50756655c..8e1393ca3301 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -934,47 +934,6 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
}
|
||||
}
|
||||
|
||||
-static void rtw8822b_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_rx_status *rx_status)
|
||||
-{
|
||||
- struct ieee80211_hdr *hdr;
|
||||
- u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
|
||||
- u8 *phy_status = NULL;
|
||||
-
|
||||
- memset(pkt_stat, 0, sizeof(*pkt_stat));
|
||||
-
|
||||
- pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
|
||||
- pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
|
||||
- pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
|
||||
- pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
|
||||
- GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
|
||||
- pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
|
||||
- pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
|
||||
- pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
|
||||
- pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
|
||||
- pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
|
||||
- pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
|
||||
- pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
|
||||
- pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
|
||||
-
|
||||
- /* drv_info_sz is in unit of 8-bytes */
|
||||
- pkt_stat->drv_info_sz *= 8;
|
||||
-
|
||||
- /* c2h cmd pkt's rx/phy status is not interested */
|
||||
- if (pkt_stat->is_c2h)
|
||||
- return;
|
||||
-
|
||||
- hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
|
||||
- pkt_stat->drv_info_sz);
|
||||
- if (pkt_stat->phy_status) {
|
||||
- phy_status = rx_desc + desc_sz + pkt_stat->shift;
|
||||
- query_phy_status(rtwdev, phy_status, pkt_stat);
|
||||
- }
|
||||
-
|
||||
- rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
|
||||
-}
|
||||
-
|
||||
static void
|
||||
rtw8822b_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path,
|
||||
u8 rs, u32 *phy_pwr_idx)
|
||||
@@ -2177,7 +2136,7 @@ static const struct rtw_prioq_addrs prioq_addrs_8822b = {
|
||||
static const struct rtw_chip_ops rtw8822b_ops = {
|
||||
.phy_set_param = rtw8822b_phy_set_param,
|
||||
.read_efuse = rtw8822b_read_efuse,
|
||||
- .query_rx_desc = rtw8822b_query_rx_desc,
|
||||
+ .query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8822b_set_channel,
|
||||
.mac_init = rtw8822b_mac_init,
|
||||
.read_rf = rtw_phy_read_rf,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 9aae401722fb..11dc14db822b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -2690,48 +2690,6 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
}
|
||||
}
|
||||
|
||||
-static void rtw8822c_query_rx_desc(struct rtw_dev *rtwdev, u8 *rx_desc,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_rx_status *rx_status)
|
||||
-{
|
||||
- struct ieee80211_hdr *hdr;
|
||||
- u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
|
||||
- u8 *phy_status = NULL;
|
||||
-
|
||||
- memset(pkt_stat, 0, sizeof(*pkt_stat));
|
||||
-
|
||||
- pkt_stat->phy_status = GET_RX_DESC_PHYST(rx_desc);
|
||||
- pkt_stat->icv_err = GET_RX_DESC_ICV_ERR(rx_desc);
|
||||
- pkt_stat->crc_err = GET_RX_DESC_CRC32(rx_desc);
|
||||
- pkt_stat->decrypted = !GET_RX_DESC_SWDEC(rx_desc) &&
|
||||
- GET_RX_DESC_ENC_TYPE(rx_desc) != RX_DESC_ENC_NONE;
|
||||
- pkt_stat->is_c2h = GET_RX_DESC_C2H(rx_desc);
|
||||
- pkt_stat->pkt_len = GET_RX_DESC_PKT_LEN(rx_desc);
|
||||
- pkt_stat->drv_info_sz = GET_RX_DESC_DRV_INFO_SIZE(rx_desc);
|
||||
- pkt_stat->shift = GET_RX_DESC_SHIFT(rx_desc);
|
||||
- pkt_stat->rate = GET_RX_DESC_RX_RATE(rx_desc);
|
||||
- pkt_stat->cam_id = GET_RX_DESC_MACID(rx_desc);
|
||||
- pkt_stat->ppdu_cnt = GET_RX_DESC_PPDU_CNT(rx_desc);
|
||||
- pkt_stat->tsf_low = GET_RX_DESC_TSFL(rx_desc);
|
||||
-
|
||||
- /* drv_info_sz is in unit of 8-bytes */
|
||||
- pkt_stat->drv_info_sz *= 8;
|
||||
-
|
||||
- /* c2h cmd pkt's rx/phy status is not interested */
|
||||
- if (pkt_stat->is_c2h)
|
||||
- return;
|
||||
-
|
||||
- hdr = (struct ieee80211_hdr *)(rx_desc + desc_sz + pkt_stat->shift +
|
||||
- pkt_stat->drv_info_sz);
|
||||
- pkt_stat->hdr = hdr;
|
||||
- if (pkt_stat->phy_status) {
|
||||
- phy_status = rx_desc + desc_sz + pkt_stat->shift;
|
||||
- query_phy_status(rtwdev, phy_status, pkt_stat);
|
||||
- }
|
||||
-
|
||||
- rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status, phy_status);
|
||||
-}
|
||||
-
|
||||
static void
|
||||
rtw8822c_set_write_tx_power_ref(struct rtw_dev *rtwdev, u8 *tx_pwr_ref_cck,
|
||||
u8 *tx_pwr_ref_ofdm)
|
||||
@@ -4992,7 +4950,7 @@ static const struct rtw_prioq_addrs prioq_addrs_8822c = {
|
||||
static const struct rtw_chip_ops rtw8822c_ops = {
|
||||
.phy_set_param = rtw8822c_phy_set_param,
|
||||
.read_efuse = rtw8822c_read_efuse,
|
||||
- .query_rx_desc = rtw8822c_query_rx_desc,
|
||||
+ .query_phy_status = query_phy_status,
|
||||
.set_channel = rtw8822c_set_channel,
|
||||
.mac_init = rtw8822c_mac_init,
|
||||
.dump_fw_crash = rtw8822c_dump_fw_crash,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rx.c b/drivers/net/wireless/realtek/rtw88/rx.c
|
||||
index 66f9419588cf..1de93fc9efe9 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rx.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rx.c
|
||||
@@ -187,11 +187,10 @@ void rtw_update_rx_freq_from_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_update_rx_freq_from_ie);
|
||||
|
||||
-void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_hdr *hdr,
|
||||
- struct ieee80211_rx_status *rx_status,
|
||||
- u8 *phy_status)
|
||||
+static void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_rx_pkt_stat *pkt_stat,
|
||||
+ struct ieee80211_hdr *hdr,
|
||||
+ struct ieee80211_rx_status *rx_status)
|
||||
{
|
||||
struct ieee80211_hw *hw = rtwdev->hw;
|
||||
u8 path;
|
||||
@@ -242,5 +241,64 @@ void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
|
||||
}
|
||||
|
||||
rtw_rx_addr_match(rtwdev, pkt_stat, hdr);
|
||||
+
|
||||
+ /* Rtl8723cs driver checks for size < 14 or size > 8192 and
|
||||
+ * simply drops the packet.
|
||||
+ */
|
||||
+ if (rtwdev->chip->id == RTW_CHIP_TYPE_8703B && pkt_stat->pkt_len == 0) {
|
||||
+ rx_status->flag |= RX_FLAG_NO_PSDU;
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_RX, "zero length packet");
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void rtw_rx_query_rx_desc(struct rtw_dev *rtwdev, void *rx_desc8,
|
||||
+ struct rtw_rx_pkt_stat *pkt_stat,
|
||||
+ struct ieee80211_rx_status *rx_status)
|
||||
+{
|
||||
+ u32 desc_sz = rtwdev->chip->rx_pkt_desc_sz;
|
||||
+ struct rtw_rx_desc *rx_desc = rx_desc8;
|
||||
+ struct ieee80211_hdr *hdr;
|
||||
+ u32 enc_type, swdec;
|
||||
+ void *phy_status;
|
||||
+
|
||||
+ memset(pkt_stat, 0, sizeof(*pkt_stat));
|
||||
+
|
||||
+ pkt_stat->pkt_len = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_PKT_LEN);
|
||||
+ pkt_stat->crc_err = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_CRC32);
|
||||
+ pkt_stat->icv_err = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_ICV_ERR);
|
||||
+ pkt_stat->drv_info_sz = le32_get_bits(rx_desc->w0,
|
||||
+ RTW_RX_DESC_W0_DRV_INFO_SIZE);
|
||||
+ enc_type = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_ENC_TYPE);
|
||||
+ pkt_stat->shift = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_SHIFT);
|
||||
+ pkt_stat->phy_status = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_PHYST);
|
||||
+ swdec = le32_get_bits(rx_desc->w0, RTW_RX_DESC_W0_SWDEC);
|
||||
+ pkt_stat->decrypted = !swdec && enc_type != RX_DESC_ENC_NONE;
|
||||
+
|
||||
+ pkt_stat->cam_id = le32_get_bits(rx_desc->w1, RTW_RX_DESC_W1_MACID);
|
||||
+
|
||||
+ pkt_stat->is_c2h = le32_get_bits(rx_desc->w2, RTW_RX_DESC_W2_C2H);
|
||||
+ pkt_stat->ppdu_cnt = le32_get_bits(rx_desc->w2, RTW_RX_DESC_W2_PPDU_CNT);
|
||||
+
|
||||
+ pkt_stat->rate = le32_get_bits(rx_desc->w3, RTW_RX_DESC_W3_RX_RATE);
|
||||
+
|
||||
+ pkt_stat->bw = le32_get_bits(rx_desc->w4, RTW_RX_DESC_W4_BW);
|
||||
+
|
||||
+ pkt_stat->tsf_low = le32_get_bits(rx_desc->w5, RTW_RX_DESC_W5_TSFL);
|
||||
+
|
||||
+ /* drv_info_sz is in unit of 8-bytes */
|
||||
+ pkt_stat->drv_info_sz *= 8;
|
||||
+
|
||||
+ /* c2h cmd pkt's rx/phy status is not interested */
|
||||
+ if (pkt_stat->is_c2h)
|
||||
+ return;
|
||||
+
|
||||
+ phy_status = rx_desc8 + desc_sz + pkt_stat->shift;
|
||||
+ hdr = phy_status + pkt_stat->drv_info_sz;
|
||||
+ pkt_stat->hdr = hdr;
|
||||
+
|
||||
+ if (pkt_stat->phy_status)
|
||||
+ rtwdev->chip->ops->query_phy_status(rtwdev, phy_status, pkt_stat);
|
||||
+
|
||||
+ rtw_rx_fill_rx_status(rtwdev, pkt_stat, hdr, rx_status);
|
||||
}
|
||||
-EXPORT_SYMBOL(rtw_rx_fill_rx_status);
|
||||
+EXPORT_SYMBOL(rtw_rx_query_rx_desc);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rx.h b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
index 9f0019112987..6b7dee245c0a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
@@ -14,42 +14,40 @@ enum rtw_rx_desc_enc {
|
||||
RX_DESC_ENC_WEP104 = 5,
|
||||
};
|
||||
|
||||
-#define GET_RX_DESC_PHYST(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(26))
|
||||
-#define GET_RX_DESC_ICV_ERR(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(15))
|
||||
-#define GET_RX_DESC_CRC32(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(14))
|
||||
-#define GET_RX_DESC_SWDEC(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), BIT(27))
|
||||
-#define GET_RX_DESC_C2H(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x02), BIT(28))
|
||||
-#define GET_RX_DESC_PKT_LEN(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(13, 0))
|
||||
-#define GET_RX_DESC_DRV_INFO_SIZE(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(19, 16))
|
||||
-#define GET_RX_DESC_SHIFT(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(25, 24))
|
||||
-#define GET_RX_DESC_ENC_TYPE(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x00), GENMASK(22, 20))
|
||||
-#define GET_RX_DESC_RX_RATE(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x03), GENMASK(6, 0))
|
||||
-#define GET_RX_DESC_MACID(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x01), GENMASK(6, 0))
|
||||
-#define GET_RX_DESC_PPDU_CNT(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x02), GENMASK(30, 29))
|
||||
-#define GET_RX_DESC_TSFL(rxdesc) \
|
||||
- le32_get_bits(*((__le32 *)(rxdesc) + 0x05), GENMASK(31, 0))
|
||||
-#define GET_RX_DESC_BW(rxdesc) \
|
||||
- (le32_get_bits(*((__le32 *)(rxdesc) + 0x04), GENMASK(5, 4)))
|
||||
+struct rtw_rx_desc {
|
||||
+ __le32 w0;
|
||||
+ __le32 w1;
|
||||
+ __le32 w2;
|
||||
+ __le32 w3;
|
||||
+ __le32 w4;
|
||||
+ __le32 w5;
|
||||
+} __packed;
|
||||
+
|
||||
+#define RTW_RX_DESC_W0_PKT_LEN GENMASK(13, 0)
|
||||
+#define RTW_RX_DESC_W0_CRC32 BIT(14)
|
||||
+#define RTW_RX_DESC_W0_ICV_ERR BIT(15)
|
||||
+#define RTW_RX_DESC_W0_DRV_INFO_SIZE GENMASK(19, 16)
|
||||
+#define RTW_RX_DESC_W0_ENC_TYPE GENMASK(22, 20)
|
||||
+#define RTW_RX_DESC_W0_SHIFT GENMASK(25, 24)
|
||||
+#define RTW_RX_DESC_W0_PHYST BIT(26)
|
||||
+#define RTW_RX_DESC_W0_SWDEC BIT(27)
|
||||
+
|
||||
+#define RTW_RX_DESC_W1_MACID GENMASK(6, 0)
|
||||
+
|
||||
+#define RTW_RX_DESC_W2_C2H BIT(28)
|
||||
+#define RTW_RX_DESC_W2_PPDU_CNT GENMASK(30, 29)
|
||||
+
|
||||
+#define RTW_RX_DESC_W3_RX_RATE GENMASK(6, 0)
|
||||
+
|
||||
+#define RTW_RX_DESC_W4_BW GENMASK(5, 4)
|
||||
+
|
||||
+#define RTW_RX_DESC_W5_TSFL GENMASK(31, 0)
|
||||
|
||||
void rtw_rx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct sk_buff *skb);
|
||||
-void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
|
||||
- struct rtw_rx_pkt_stat *pkt_stat,
|
||||
- struct ieee80211_hdr *hdr,
|
||||
- struct ieee80211_rx_status *rx_status,
|
||||
- u8 *phy_status);
|
||||
+void rtw_rx_query_rx_desc(struct rtw_dev *rtwdev, void *rx_desc8,
|
||||
+ struct rtw_rx_pkt_stat *pkt_stat,
|
||||
+ struct ieee80211_rx_status *rx_status);
|
||||
void rtw_update_rx_freq_from_ie(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
struct rtw_rx_pkt_stat *pkt_stat);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 787fa09fd063..fe6f14290bdd 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -979,8 +979,7 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len)
|
||||
|
||||
while (true) {
|
||||
rx_desc = skb->data;
|
||||
- chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
|
||||
- &rx_status);
|
||||
+ rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat, &rx_status);
|
||||
pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
|
||||
pkt_stat.shift;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index a446be45f26e..83acb96b44ed 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -625,8 +625,8 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
|
||||
do {
|
||||
rx_desc = skb->data;
|
||||
- chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
|
||||
- &rx_status);
|
||||
+ rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat,
|
||||
+ &rx_status);
|
||||
pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
|
||||
pkt_stat.shift;
|
||||
|
||||
--
|
||||
2.39.5
|
||||
|
502
packages/linux/patches/rtlwifi/6.13/0003-wifi-rtw88-Add-some-definitions-for-RTL8821AU-RTL881.patch
vendored
Normal file
502
packages/linux/patches/rtlwifi/6.13/0003-wifi-rtw88-Add-some-definitions-for-RTL8821AU-RTL881.patch
vendored
Normal file
@ -0,0 +1,502 @@
|
||||
From 26496e78b747356fcbb88a23316625679697ba88 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:00:59 +0300
|
||||
Subject: [PATCH 03/24] wifi: rtw88: Add some definitions for
|
||||
RTL8821AU/RTL8812AU
|
||||
|
||||
Add 8821A and 8812A chip type enums.
|
||||
|
||||
Add cck_high_power member to struct rtw_hal. This will be used to
|
||||
calculate the RX signal strength of RTL8812AU.
|
||||
|
||||
Add various register definitions which will be used by the new drivers.
|
||||
|
||||
Move some existing register definitions from rtw8821c.h and rtw8822b.h.
|
||||
They were duplicated in those headers and will also be used by the new
|
||||
drivers.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/9279a9cd-6f86-4dc3-a095-7c36cb9b9d06@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 3 +
|
||||
drivers/net/wireless/realtek/rtw88/reg.h | 174 ++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.h | 24 ---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.h | 12 --
|
||||
4 files changed, 177 insertions(+), 36 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index c9efe9d66954..46935524783e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -189,6 +189,8 @@ enum rtw_chip_type {
|
||||
RTW_CHIP_TYPE_8723D,
|
||||
RTW_CHIP_TYPE_8821C,
|
||||
RTW_CHIP_TYPE_8703B,
|
||||
+ RTW_CHIP_TYPE_8821A,
|
||||
+ RTW_CHIP_TYPE_8812A,
|
||||
};
|
||||
|
||||
enum rtw_tx_queue_type {
|
||||
@@ -1934,6 +1936,7 @@ struct rtw_hal {
|
||||
u32 antenna_rx;
|
||||
u8 bfee_sts_cap;
|
||||
bool txrx_1ss;
|
||||
+ bool cck_high_power;
|
||||
|
||||
/* protect tx power section */
|
||||
struct mutex tx_power_mutex;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index 2708ee2f12a4..946a6e6cc826 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -9,6 +9,7 @@
|
||||
#define BIT_FEN_EN_25_1 BIT(13)
|
||||
#define BIT_FEN_ELDR BIT(12)
|
||||
#define BIT_FEN_CPUEN BIT(2)
|
||||
+#define BIT_FEN_USBA BIT(2)
|
||||
#define BIT_FEN_BB_GLB_RST BIT(1)
|
||||
#define BIT_FEN_BB_RSTB BIT(0)
|
||||
#define BIT_R_DIS_PRST BIT(6)
|
||||
@@ -16,6 +17,10 @@
|
||||
#define REG_SYS_PW_CTRL 0x0004
|
||||
#define BIT_PFM_WOWL BIT(3)
|
||||
#define BIT_APFM_OFFMAC BIT(9)
|
||||
+#define REG_APS_FSMCO 0x0004
|
||||
+#define APS_FSMCO_MAC_ENABLE BIT(8)
|
||||
+#define APS_FSMCO_MAC_OFF BIT(9)
|
||||
+#define APS_FSMCO_HW_POWERDOWN BIT(15)
|
||||
#define REG_SYS_CLK_CTRL 0x0008
|
||||
#define BIT_CPU_CLK_EN BIT(14)
|
||||
|
||||
@@ -58,6 +63,8 @@
|
||||
#define BIT_SHIFT_LDO25_VOLTAGE 4
|
||||
#define BIT_LDO25_EN BIT(7)
|
||||
|
||||
+#define REG_ACLK_MON 0x3e
|
||||
+
|
||||
#define REG_GPIO_MUXCFG 0x0040
|
||||
#define BIT_FSPI_EN BIT(19)
|
||||
#define BIT_EN_SIC BIT(12)
|
||||
@@ -90,6 +97,8 @@
|
||||
#define BIT_USB_SUS_DIS BIT(8)
|
||||
#define BIT_SDIO_PAD_E5 BIT(18)
|
||||
|
||||
+#define REG_RF_B_CTRL 0x76
|
||||
+
|
||||
#define REG_AFE_CTRL_4 0x0078
|
||||
#define BIT_CK320M_AFE_EN BIT(4)
|
||||
#define BIT_EN_SYN BIT(15)
|
||||
@@ -135,6 +144,11 @@
|
||||
#define REG_PMC_DBG_CTRL1 0xa8
|
||||
#define BITS_PMC_BT_IQK_STS GENMASK(22, 21)
|
||||
|
||||
+#define REG_HIMR0 0xb0
|
||||
+#define REG_HISR0 0xb4
|
||||
+#define REG_HIMR1 0xb8
|
||||
+#define REG_HISR1 0xbc
|
||||
+
|
||||
#define REG_PAD_CTRL2 0x00C4
|
||||
#define BIT_RSM_EN_V1 BIT(16)
|
||||
#define BIT_NO_PDN_CHIPOFF_V1 BIT(17)
|
||||
@@ -186,6 +200,15 @@
|
||||
#define MAC_TRX_ENABLE (BIT_HCI_TXDMA_EN | BIT_HCI_RXDMA_EN | BIT_TXDMA_EN | \
|
||||
BIT_RXDMA_EN | BIT_PROTOCOL_EN | BIT_SCHEDULE_EN | \
|
||||
BIT_MACTXEN | BIT_MACRXEN)
|
||||
+#define REG_PBP 0x104
|
||||
+#define PBP_RX_MASK 0x0f
|
||||
+#define PBP_TX_MASK 0xf0
|
||||
+#define PBP_64 0x0
|
||||
+#define PBP_128 0x1
|
||||
+#define PBP_256 0x2
|
||||
+#define PBP_512 0x3
|
||||
+#define PBP_1024 0x4
|
||||
+
|
||||
#define BIT_SHIFT_TXDMA_VOQ_MAP 4
|
||||
#define BIT_MASK_TXDMA_VOQ_MAP 0x3
|
||||
#define BIT_TXDMA_VOQ_MAP(x) \
|
||||
@@ -257,6 +280,8 @@
|
||||
#define REG_HMEBOX1 0x01D4
|
||||
#define REG_HMEBOX2 0x01D8
|
||||
#define REG_HMEBOX3 0x01DC
|
||||
+#define REG_LLT_INIT 0x01E0
|
||||
+#define BIT_LLT_WRITE_ACCESS BIT(30)
|
||||
#define REG_HMEBOX0_EX 0x01F0
|
||||
#define REG_HMEBOX1_EX 0x01F4
|
||||
#define REG_HMEBOX2_EX 0x01F8
|
||||
@@ -299,6 +324,7 @@
|
||||
|
||||
#define REG_AUTO_LLT 0x0224
|
||||
#define BIT_AUTO_INIT_LLT BIT(16)
|
||||
+#define REG_DWBCN1_CTRL 0x0228
|
||||
#define REG_RQPN_CTRL_1 0x0228
|
||||
#define REG_RQPN_CTRL_2 0x022C
|
||||
#define BIT_LD_RQPN BIT(31)
|
||||
@@ -330,6 +356,7 @@
|
||||
#define BIT_DMA_BURST_SIZE_1024 0
|
||||
|
||||
#define REG_RXPKTNUM 0x02B0
|
||||
+#define REG_EARLY_MODE_CONTROL 0x02BC
|
||||
|
||||
#define REG_INT_MIG 0x0304
|
||||
#define REG_HCI_MIX_CFG 0x03FC
|
||||
@@ -337,6 +364,7 @@
|
||||
|
||||
#define REG_BCNQ_INFO 0x0418
|
||||
#define BIT_MGQ_CPU_EMPTY BIT(24)
|
||||
+#define REG_TXPKT_EMPTY 0x041A
|
||||
#define REG_FWHW_TXQ_CTRL 0x0420
|
||||
#define BIT_EN_BCNQ_DL BIT(22)
|
||||
#define BIT_EN_WR_FREE_TAIL BIT(20)
|
||||
@@ -363,10 +391,12 @@
|
||||
#define REG_AMPDU_MAX_TIME_V1 0x0455
|
||||
#define REG_BCNQ1_BDNY_V1 0x0456
|
||||
#define REG_AMPDU_MAX_TIME 0x0456
|
||||
+#define REG_AMPDU_MAX_LENGTH 0x0458
|
||||
#define REG_WMAC_LBK_BF_HD 0x045D
|
||||
#define REG_TX_HANG_CTRL 0x045E
|
||||
#define BIT_EN_GNT_BT_AWAKE BIT(3)
|
||||
#define BIT_EN_EOF_V1 BIT(2)
|
||||
+#define REG_FAST_EDCA_CTRL 0x0460
|
||||
#define REG_DATA_SC 0x0483
|
||||
#define REG_ARFR2_V1 0x048C
|
||||
#define REG_ARFRH2_V1 0x0490
|
||||
@@ -391,6 +421,8 @@
|
||||
#define REG_PRECNT_CTRL 0x04E5
|
||||
#define BIT_BTCCA_CTRL (BIT(0) | BIT(1))
|
||||
#define BIT_EN_PRECNT BIT(11)
|
||||
+#define REG_TX_RPT_CTRL 0x04EC
|
||||
+#define REG_TX_RPT_TIME 0x04F0
|
||||
#define REG_DUMMY_PAGE4_V1 0x04FC
|
||||
|
||||
#define REG_EDCA_VO_PARAM 0x0500
|
||||
@@ -401,6 +433,7 @@
|
||||
#define BIT_MASK_CWMAX GENMASK(15, 12)
|
||||
#define BIT_MASK_CWMIN GENMASK(11, 8)
|
||||
#define BIT_MASK_AIFS GENMASK(7, 0)
|
||||
+#define REG_BCNTCFG 0x0510
|
||||
#define REG_PIFS 0x0512
|
||||
#define REG_SIFS 0x0514
|
||||
#define BIT_SHIFT_SIFS_OFDM_CTX 8
|
||||
@@ -527,6 +560,8 @@
|
||||
#define REG_BT_COEX_V2 0x0762
|
||||
#define BIT_GNT_BT_POLARITY BIT(12)
|
||||
#define BIT_LTE_COEX_EN BIT(7)
|
||||
+#define REG_GNT_BT 0x0765
|
||||
+#define BIT_PTA_SW_CTL GENMASK(4, 3)
|
||||
#define REG_BT_COEX_ENH_INTR_CTRL 0x76E
|
||||
#define BIT_R_GRANTALL_WLMASK BIT(3)
|
||||
#define BIT_STATIS_BT_EN BIT(2)
|
||||
@@ -544,14 +579,43 @@
|
||||
#define REG_FPGA0_RFMOD 0x0800
|
||||
#define BIT_CCKEN BIT(24)
|
||||
#define BIT_OFDMEN BIT(25)
|
||||
+#define REG_CCK_RPT_FORMAT 0x0804
|
||||
+#define BIT_CCK_RPT_FORMAT BIT(16)
|
||||
+#define REG_RXPSEL 0x0808
|
||||
+#define BIT_RX_PSEL_RST (BIT(28) | BIT(29))
|
||||
+#define REG_TXPSEL 0x080C
|
||||
#define REG_RX_GAIN_EN 0x081c
|
||||
+#define REG_CCASEL 0x082C
|
||||
+#define REG_PDMFTH 0x0830
|
||||
+#define REG_BWINDICATION 0x0834
|
||||
+#define REG_CCA2ND 0x0838
|
||||
+#define REG_L1PKTH 0x0848
|
||||
+#define REG_CLKTRK 0x0860
|
||||
+#define REG_ADCCLK 0x08AC
|
||||
+#define REG_HSSI_READ 0x08B0
|
||||
+#define REG_FPGA0_XCD_RF_PARA 0x08B4
|
||||
+#define REG_RX_MCS_LIMIT 0x08BC
|
||||
+#define REG_ADC160 0x08C4
|
||||
+#define REG_ANTSEL_SW 0x0900
|
||||
+#define REG_DAC_RSTB 0x090c
|
||||
+#define REG_SINGLE_TONE_CONT_TX 0x0914
|
||||
|
||||
#define REG_RFE_CTRL_E 0x0974
|
||||
#define REG_2ND_CCA_CTRL 0x0976
|
||||
+#define REG_IQK_COM00 0x0978
|
||||
+#define REG_IQK_COM32 0x097c
|
||||
+#define REG_IQK_COM64 0x0980
|
||||
+#define REG_IQK_COM96 0x0984
|
||||
+
|
||||
+#define REG_FAS 0x09a4
|
||||
+#define REG_RXSB 0x0a00
|
||||
+#define REG_CCK_RX 0x0a04
|
||||
+#define REG_CCK_PD_TH 0x0a0a
|
||||
|
||||
#define REG_CCK0_FAREPORT 0xa2c
|
||||
#define BIT_CCK0_2RX BIT(18)
|
||||
#define BIT_CCK0_MRC BIT(22)
|
||||
+#define REG_FA_CCK 0x0a5c
|
||||
|
||||
#define REG_DIS_DPD 0x0a70
|
||||
#define DIS_DPD_MASK GENMASK(9, 0)
|
||||
@@ -567,13 +631,109 @@
|
||||
#define DIS_DPD_RATEVHT2SS_MCS1 BIT(9)
|
||||
#define DIS_DPD_RATEALL GENMASK(9, 0)
|
||||
|
||||
+#define REG_CNTRST 0x0b58
|
||||
+
|
||||
+#define REG_3WIRE_SWA 0x0c00
|
||||
+#define REG_RX_IQC_AB_A 0x0c10
|
||||
+#define REG_TXSCALE_A 0x0c1c
|
||||
+#define BB_SWING_MASK GENMASK(31, 21)
|
||||
+#define REG_TX_AGC_A_CCK_11_CCK_1 0xc20
|
||||
+#define REG_TX_AGC_A_OFDM18_OFDM6 0xc24
|
||||
+#define REG_TX_AGC_A_OFDM54_OFDM24 0xc28
|
||||
+#define REG_TX_AGC_A_MCS3_MCS0 0xc2c
|
||||
+#define REG_TX_AGC_A_MCS7_MCS4 0xc30
|
||||
+#define REG_TX_AGC_A_MCS11_MCS8 0xc34
|
||||
+#define REG_TX_AGC_A_MCS15_MCS12 0xc38
|
||||
+#define REG_TX_AGC_A_NSS1_INDEX3_NSS1_INDEX0 0xc3c
|
||||
+#define REG_TX_AGC_A_NSS1_INDEX7_NSS1_INDEX4 0xc40
|
||||
+#define REG_TX_AGC_A_NSS2_INDEX1_NSS1_INDEX8 0xc44
|
||||
+#define REG_TX_AGC_A_NSS2_INDEX5_NSS2_INDEX2 0xc48
|
||||
+#define REG_TX_AGC_A_NSS2_INDEX9_NSS2_INDEX6 0xc4c
|
||||
+#define REG_RXIGI_A 0x0c50
|
||||
+#define REG_TX_PWR_TRAINING_A 0x0c54
|
||||
+#define REG_CK_MONHA 0x0c5c
|
||||
+#define REG_AFE_PWR1_A 0x0c60
|
||||
+#define REG_AFE_PWR2_A 0x0c64
|
||||
+#define REG_RX_WAIT_CCA_TX_CCK_RFON_A 0x0c68
|
||||
+#define REG_OFDM0_XA_TX_IQ_IMBALANCE 0x0c80
|
||||
+#define REG_OFDM0_A_TX_AFE 0x0c84
|
||||
+#define REG_OFDM0_XB_TX_IQ_IMBALANCE 0x0c88
|
||||
+#define REG_TSSI_TRK_SW 0x0c8c
|
||||
+#define REG_LSSI_WRITE_A 0x0c90
|
||||
+#define REG_PREDISTA 0x0c90
|
||||
+#define REG_TXAGCIDX 0x0c94
|
||||
+
|
||||
+#define REG_RFE_PINMUX_A 0x0cb0
|
||||
+#define REG_RFE_INV_A 0x0cb4
|
||||
#define REG_RFE_CTRL8 0x0cb4
|
||||
#define BIT_MASK_RFE_SEL89 GENMASK(7, 0)
|
||||
+#define PTA_CTRL_PIN 0x66
|
||||
+#define DPDT_CTRL_PIN 0x77
|
||||
+#define RFE_INV_MASK 0x3ff00000
|
||||
+#define REG_RFECTL_A 0x0cb8
|
||||
#define REG_RFE_INV8 0x0cbd
|
||||
#define BIT_MASK_RFE_INV89 GENMASK(1, 0)
|
||||
#define REG_RFE_INV16 0x0cbe
|
||||
#define BIT_RFE_BUF_EN BIT(3)
|
||||
|
||||
+#define REG_IQK_DPD_CFG 0x0cc4
|
||||
+#define REG_CFG_PMPD 0x0cc8
|
||||
+#define REG_IQC_Y 0x0ccc
|
||||
+#define REG_IQC_X 0x0cd4
|
||||
+#define REG_INTPO_SETA 0x0ce8
|
||||
+
|
||||
+#define REG_IQKA_END 0x0d00
|
||||
+#define REG_PI_READ_A 0x0d04
|
||||
+#define REG_SI_READ_A 0x0d08
|
||||
+#define REG_IQKB_END 0x0d40
|
||||
+#define REG_PI_READ_B 0x0d44
|
||||
+#define REG_SI_READ_B 0x0d48
|
||||
+
|
||||
+#define REG_3WIRE_SWB 0x0e00
|
||||
+#define REG_RX_IQC_AB_B 0x0e10
|
||||
+#define REG_TXSCALE_B 0x0e1c
|
||||
+#define REG_TX_AGC_B_CCK_11_CCK_1 0xe20
|
||||
+#define REG_TX_AGC_B_OFDM18_OFDM6 0xe24
|
||||
+#define REG_TX_AGC_B_OFDM54_OFDM24 0xe28
|
||||
+#define REG_TX_AGC_B_MCS3_MCS0 0xe2c
|
||||
+#define REG_TX_AGC_B_MCS7_MCS4 0xe30
|
||||
+#define REG_TX_AGC_B_MCS11_MCS8 0xe34
|
||||
+#define REG_TX_AGC_B_MCS15_MCS12 0xe38
|
||||
+#define REG_TX_AGC_B_NSS1_INDEX3_NSS1_INDEX0 0xe3c
|
||||
+#define REG_TX_AGC_B_NSS1_INDEX7_NSS1_INDEX4 0xe40
|
||||
+#define REG_TX_AGC_B_NSS2_INDEX1_NSS1_INDEX8 0xe44
|
||||
+#define REG_TX_AGC_B_NSS2_INDEX5_NSS2_INDEX2 0xe48
|
||||
+#define REG_TX_AGC_B_NSS2_INDEX9_NSS2_INDEX6 0xe4c
|
||||
+#define REG_RXIGI_B 0x0e50
|
||||
+#define REG_TX_PWR_TRAINING_B 0x0e54
|
||||
+#define REG_CK_MONHB 0x0e5c
|
||||
+#define REG_AFE_PWR1_B 0x0e60
|
||||
+#define REG_AFE_PWR2_B 0x0e64
|
||||
+#define REG_RX_WAIT_CCA_TX_CCK_RFON_B 0x0e68
|
||||
+#define REG_TXTONEB 0x0e80
|
||||
+#define REG_RXTONEB 0x0e84
|
||||
+#define REG_TXPITMB 0x0e88
|
||||
+#define REG_RXPITMB 0x0e8c
|
||||
+#define REG_LSSI_WRITE_B 0x0e90
|
||||
+#define REG_PREDISTB 0x0e90
|
||||
+#define REG_INIDLYB 0x0e94
|
||||
+#define REG_RFE_PINMUX_B 0x0eb0
|
||||
+#define REG_RFE_INV_B 0x0eb4
|
||||
+#define REG_RFECTL_B 0x0eb8
|
||||
+#define REG_BPBDB 0x0ec4
|
||||
+#define REG_PHYTXONB 0x0ec8
|
||||
+#define REG_IQKYB 0x0ecc
|
||||
+#define REG_IQKXB 0x0ed4
|
||||
+#define REG_INTPO_SETB 0x0ee8
|
||||
+
|
||||
+#define REG_CRC_CCK 0x0f04
|
||||
+#define REG_CCA_OFDM 0x0f08
|
||||
+#define REG_CRC_VHT 0x0f0c
|
||||
+#define REG_CRC_HT 0x0f10
|
||||
+#define REG_CRC_OFDM 0x0f14
|
||||
+#define REG_FA_OFDM 0x0f48
|
||||
+#define REG_CCA_CCK 0x0fcc
|
||||
+
|
||||
#define REG_ANAPARSW_MAC_0 0x1010
|
||||
#define BIT_CF_L_V2 GENMASK(29, 28)
|
||||
|
||||
@@ -710,6 +870,10 @@
|
||||
|
||||
#define REG_IGN_GNTBT4 0x4160
|
||||
|
||||
+#define REG_USB_MOD 0xf008
|
||||
+#define REG_USB3_RXITV 0xf050
|
||||
+#define REG_USB_HRPWM 0xfe58
|
||||
+
|
||||
#define RF_MODE 0x00
|
||||
#define RF_MODOPT 0x01
|
||||
#define RF_WLINT 0x01
|
||||
@@ -717,7 +881,13 @@
|
||||
#define RF_DTXLOK 0x08
|
||||
#define RF_CFGCH 0x18
|
||||
#define BIT_BAND GENMASK(18, 16)
|
||||
+#define RF18_BAND_MASK (BIT(16) | BIT(9) | BIT(8))
|
||||
+#define RF18_CHANNEL_MASK (MASKBYTE0)
|
||||
+#define RF18_RFSI_MASK (BIT(18) | BIT(17))
|
||||
#define RF_RCK 0x1d
|
||||
+#define RF_MODE_TABLE_ADDR 0x30
|
||||
+#define RF_MODE_TABLE_DATA0 0x31
|
||||
+#define RF_MODE_TABLE_DATA1 0x32
|
||||
#define RF_LUTWA 0x33
|
||||
#define RF_LUTWD1 0x3e
|
||||
#define RF_LUTWD0 0x3f
|
||||
@@ -726,10 +896,14 @@
|
||||
#define RF_T_METER 0x42
|
||||
#define RF_BSPAD 0x54
|
||||
#define RF_GAINTX 0x56
|
||||
+#define RF_TXMOD 0x58
|
||||
#define RF_TXATANK 0x64
|
||||
+#define RF_TXA_PREPAD 0x65
|
||||
#define RF_TRXIQ 0x66
|
||||
#define RF_RXIQGEN 0x8d
|
||||
+#define RF_RXBB2 0x8f
|
||||
#define RF_SYN_PFD 0xb0
|
||||
+#define RF_LCK 0xb4
|
||||
#define RF_XTALX2 0xb8
|
||||
#define RF_SYN_CTRL 0xbb
|
||||
#define RF_MALSEL 0xbe
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
index 10172f4d74bf..954e93c8020d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
@@ -215,19 +215,10 @@ extern const struct rtw_chip_info rtw8821c_hw_spec;
|
||||
#define BIT_FEN_EN BIT(26)
|
||||
#define REG_INIRTS_RATE_SEL 0x0480
|
||||
#define REG_HTSTFWT 0x800
|
||||
-#define REG_RXPSEL 0x808
|
||||
-#define BIT_RX_PSEL_RST (BIT(28) | BIT(29))
|
||||
-#define REG_TXPSEL 0x80c
|
||||
#define REG_RXCCAMSK 0x814
|
||||
-#define REG_CCASEL 0x82c
|
||||
-#define REG_PDMFTH 0x830
|
||||
-#define REG_CCA2ND 0x838
|
||||
#define REG_L1WT 0x83c
|
||||
#define REG_L1PKWT 0x840
|
||||
#define REG_MRC 0x850
|
||||
-#define REG_CLKTRK 0x860
|
||||
-#define REG_ADCCLK 0x8ac
|
||||
-#define REG_ADC160 0x8c4
|
||||
#define REG_ADC40 0x8c8
|
||||
#define REG_CHFIR 0x8f0
|
||||
#define REG_CDDTXP 0x93c
|
||||
@@ -235,14 +226,11 @@ extern const struct rtw_chip_info rtw8821c_hw_spec;
|
||||
#define REG_ACBB0 0x948
|
||||
#define REG_ACBBRXFIR 0x94c
|
||||
#define REG_ACGG2TBL 0x958
|
||||
-#define REG_FAS 0x9a4
|
||||
-#define REG_RXSB 0xa00
|
||||
#define REG_ADCINI 0xa04
|
||||
#define REG_PWRTH 0xa08
|
||||
#define REG_CCA_FLTR 0xa20
|
||||
#define REG_TXSF2 0xa24
|
||||
#define REG_TXSF6 0xa28
|
||||
-#define REG_FA_CCK 0xa5c
|
||||
#define REG_RXDESC 0xa2c
|
||||
#define REG_ENTXCCK 0xa80
|
||||
#define BTG_LNA 0xfc84
|
||||
@@ -253,12 +241,8 @@ extern const struct rtw_chip_info rtw8821c_hw_spec;
|
||||
#define REG_PWRTH2 0xaa8
|
||||
#define REG_CSRATIO 0xaaa
|
||||
#define REG_TXFILTER 0xaac
|
||||
-#define REG_CNTRST 0xb58
|
||||
#define REG_AGCTR_A 0xc08
|
||||
-#define REG_TXSCALE_A 0xc1c
|
||||
#define REG_TXDFIR 0xc20
|
||||
-#define REG_RXIGI_A 0xc50
|
||||
-#define REG_TXAGCIDX 0xc94
|
||||
#define REG_TRSW 0xca0
|
||||
#define REG_RFESEL0 0xcb0
|
||||
#define REG_RFESEL8 0xcb4
|
||||
@@ -270,14 +254,6 @@ extern const struct rtw_chip_info rtw8821c_hw_spec;
|
||||
#define B_WLA_SWITCH BIT(23)
|
||||
#define REG_RFEINV 0xcbc
|
||||
#define REG_AGCTR_B 0xe08
|
||||
-#define REG_RXIGI_B 0xe50
|
||||
-#define REG_CRC_CCK 0xf04
|
||||
-#define REG_CRC_OFDM 0xf14
|
||||
-#define REG_CRC_HT 0xf10
|
||||
-#define REG_CRC_VHT 0xf0c
|
||||
-#define REG_CCA_OFDM 0xf08
|
||||
-#define REG_FA_OFDM 0xf48
|
||||
-#define REG_CCA_CCK 0xfcc
|
||||
#define REG_DMEM_CTRL 0x1080
|
||||
#define BIT_WL_RST BIT(16)
|
||||
#define REG_ANTWT 0x1904
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h
|
||||
index e815bc97c218..9fca9ba67c90 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h
|
||||
@@ -152,21 +152,12 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
|
||||
#define RTW8822B_EDCCA_MAX 0x7f
|
||||
#define RTW8822B_EDCCA_SRC_DEF 1
|
||||
#define REG_HTSTFWT 0x800
|
||||
-#define REG_RXPSEL 0x808
|
||||
-#define BIT_RX_PSEL_RST (BIT(28) | BIT(29))
|
||||
-#define REG_TXPSEL 0x80c
|
||||
#define REG_RXCCAMSK 0x814
|
||||
-#define REG_CCASEL 0x82c
|
||||
-#define REG_PDMFTH 0x830
|
||||
-#define REG_CCA2ND 0x838
|
||||
#define REG_L1WT 0x83c
|
||||
#define REG_L1PKWT 0x840
|
||||
#define REG_MRC 0x850
|
||||
-#define REG_CLKTRK 0x860
|
||||
#define REG_EDCCA_POW_MA 0x8a0
|
||||
#define BIT_MA_LEVEL GENMASK(1, 0)
|
||||
-#define REG_ADCCLK 0x8ac
|
||||
-#define REG_ADC160 0x8c4
|
||||
#define REG_ADC40 0x8c8
|
||||
#define REG_EDCCA_DECISION 0x8dc
|
||||
#define BIT_EDCCA_OPTION BIT(5)
|
||||
@@ -177,7 +168,6 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
|
||||
#define REG_ACBB0 0x948
|
||||
#define REG_ACBBRXFIR 0x94c
|
||||
#define REG_ACGG2TBL 0x958
|
||||
-#define REG_RXSB 0xa00
|
||||
#define REG_ADCINI 0xa04
|
||||
#define REG_TXSF2 0xa24
|
||||
#define REG_TXSF6 0xa28
|
||||
@@ -185,14 +175,12 @@ _rtw_write32s_mask(struct rtw_dev *rtwdev, u32 addr, u32 mask, u32 data)
|
||||
#define REG_ENTXCCK 0xa80
|
||||
#define REG_AGCTR_A 0xc08
|
||||
#define REG_TXDFIR 0xc20
|
||||
-#define REG_RXIGI_A 0xc50
|
||||
#define REG_TRSW 0xca0
|
||||
#define REG_RFESEL0 0xcb0
|
||||
#define REG_RFESEL8 0xcb4
|
||||
#define REG_RFECTL 0xcb8
|
||||
#define REG_RFEINV 0xcbc
|
||||
#define REG_AGCTR_B 0xe08
|
||||
-#define REG_RXIGI_B 0xe50
|
||||
#define REG_ANTWT 0x1904
|
||||
#define REG_IQKFAILMSK 0x1bf0
|
||||
|
||||
--
|
||||
2.39.5
|
||||
|
110
packages/linux/patches/rtlwifi/6.13/0004-wifi-rtw88-Dump-the-HW-features-only-for-some-chips.patch
vendored
Normal file
110
packages/linux/patches/rtlwifi/6.13/0004-wifi-rtw88-Dump-the-HW-features-only-for-some-chips.patch
vendored
Normal file
@ -0,0 +1,110 @@
|
||||
From 5f2999c9758d313579bc67cf8851c80b725df7ab Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:02:05 +0300
|
||||
Subject: [PATCH 04/24] wifi: rtw88: Dump the HW features only for some chips
|
||||
|
||||
RTL8821AU and RTL8812AU don't support this. They hit the "failed to read
|
||||
hw feature report" error.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/8becd851-8760-4480-8e8c-c4869ce72507@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 3 +++
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
|
||||
7 files changed, 9 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index a808af2f085e..c314b2fc06ee 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -1907,6 +1907,9 @@ static int rtw_dump_hw_feature(struct rtw_dev *rtwdev)
|
||||
u8 bw;
|
||||
int i;
|
||||
|
||||
+ if (!rtwdev->chip->hw_feature_report)
|
||||
+ return 0;
|
||||
+
|
||||
id = rtw_read8(rtwdev, REG_C2HEVT);
|
||||
if (id != C2H_HW_FEATURE_REPORT) {
|
||||
rtw_err(rtwdev, "failed to read hw feature report\n");
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 46935524783e..95b5acf975c6 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1200,6 +1200,7 @@ struct rtw_chip_info {
|
||||
const struct rtw_fwcd_segs *fwcd_segs;
|
||||
|
||||
u8 usb_tx_agg_desc_num;
|
||||
+ bool hw_feature_report;
|
||||
|
||||
u8 default_1ss_tx_path;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index fe09c23b51b5..c4793e10d9dc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -1960,6 +1960,7 @@ const struct rtw_chip_info rtw8703b_hw_spec = {
|
||||
.max_power_index = 0x3f,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
|
||||
.usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB interface */
|
||||
+ .hw_feature_report = true,
|
||||
|
||||
.path_div_supported = false,
|
||||
.ht_supported = true,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index 86a5e2497641..bf87c92087da 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -2131,6 +2131,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
.usb_tx_agg_desc_num = 1,
|
||||
+ .hw_feature_report = true,
|
||||
.ht_supported = true,
|
||||
.vht_supported = false,
|
||||
.lps_deep_mode_supported = 0,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 66c79956e8e5..44ef2e246724 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1968,6 +1968,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
+ .hw_feature_report = true,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index 8e1393ca3301..3b25536a253e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -2511,6 +2511,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
+ .hw_feature_report = true,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 11dc14db822b..936d4bf82c8f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -5330,6 +5330,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
+ .hw_feature_report = true,
|
||||
.default_1ss_tx_path = BB_PATH_A,
|
||||
.path_div_supported = true,
|
||||
.ht_supported = true,
|
||||
--
|
||||
2.39.5
|
||||
|
194
packages/linux/patches/rtlwifi/6.13/0005-wifi-rtw88-Allow-different-C2H-RA-report-sizes.patch
vendored
Normal file
194
packages/linux/patches/rtlwifi/6.13/0005-wifi-rtw88-Allow-different-C2H-RA-report-sizes.patch
vendored
Normal file
@ -0,0 +1,194 @@
|
||||
From 918d5d5a9a90d3c6e0f8920cec6818bd9d70eabf Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:06:14 +0300
|
||||
Subject: [PATCH 05/24] wifi: rtw88: Allow different C2H RA report sizes
|
||||
|
||||
The RTL8821AU and RTL8812AU have smaller RA report size, only 4 bytes.
|
||||
Avoid the "invalid ra report c2h length" error.
|
||||
|
||||
Also, use a struct and u8_get_bits() to access the RA report C2H.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/c3e73c3a-fb2f-4013-9f06-d5274211e282@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 21 +++++++++++++------
|
||||
drivers/net/wireless/realtek/rtw88/fw.h | 17 +++++++++++----
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
|
||||
8 files changed, 34 insertions(+), 10 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index 813c12148819..168e19187ba7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -139,25 +139,30 @@ static u16 get_max_amsdu_len(u32 bit_rate)
|
||||
struct rtw_fw_iter_ra_data {
|
||||
struct rtw_dev *rtwdev;
|
||||
u8 *payload;
|
||||
+ u8 length;
|
||||
};
|
||||
|
||||
static void rtw_fw_ra_report_iter(void *data, struct ieee80211_sta *sta)
|
||||
{
|
||||
struct rtw_fw_iter_ra_data *ra_data = data;
|
||||
+ struct rtw_c2h_ra_rpt *ra_rpt = (struct rtw_c2h_ra_rpt *)ra_data->payload;
|
||||
struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv;
|
||||
u8 mac_id, rate, sgi, bw;
|
||||
u8 mcs, nss;
|
||||
u32 bit_rate;
|
||||
|
||||
- mac_id = GET_RA_REPORT_MACID(ra_data->payload);
|
||||
+ mac_id = ra_rpt->mac_id;
|
||||
if (si->mac_id != mac_id)
|
||||
return;
|
||||
|
||||
si->ra_report.txrate.flags = 0;
|
||||
|
||||
- rate = GET_RA_REPORT_RATE(ra_data->payload);
|
||||
- sgi = GET_RA_REPORT_SGI(ra_data->payload);
|
||||
- bw = GET_RA_REPORT_BW(ra_data->payload);
|
||||
+ rate = u8_get_bits(ra_rpt->rate_sgi, RTW_C2H_RA_RPT_RATE);
|
||||
+ sgi = u8_get_bits(ra_rpt->rate_sgi, RTW_C2H_RA_RPT_SGI);
|
||||
+ if (ra_data->length >= offsetofend(typeof(*ra_rpt), bw))
|
||||
+ bw = ra_rpt->bw;
|
||||
+ else
|
||||
+ bw = si->bw_mode;
|
||||
|
||||
if (rate < DESC_RATEMCS0) {
|
||||
si->ra_report.txrate.legacy = rtw_desc_to_bitrate(rate);
|
||||
@@ -197,14 +202,18 @@ static void rtw_fw_ra_report_iter(void *data, struct ieee80211_sta *sta)
|
||||
static void rtw_fw_ra_report_handle(struct rtw_dev *rtwdev, u8 *payload,
|
||||
u8 length)
|
||||
{
|
||||
+ struct rtw_c2h_ra_rpt *ra_rpt = (struct rtw_c2h_ra_rpt *)payload;
|
||||
struct rtw_fw_iter_ra_data ra_data;
|
||||
|
||||
- if (WARN(length < 7, "invalid ra report c2h length\n"))
|
||||
+ if (WARN(length < rtwdev->chip->c2h_ra_report_size,
|
||||
+ "invalid ra report c2h length %d\n", length))
|
||||
return;
|
||||
|
||||
- rtwdev->dm_info.tx_rate = GET_RA_REPORT_RATE(payload);
|
||||
+ rtwdev->dm_info.tx_rate = u8_get_bits(ra_rpt->rate_sgi,
|
||||
+ RTW_C2H_RA_RPT_RATE);
|
||||
ra_data.rtwdev = rtwdev;
|
||||
ra_data.payload = payload;
|
||||
+ ra_data.length = length;
|
||||
rtw_iterate_stas_atomic(rtwdev, rtw_fw_ra_report_iter, &ra_data);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
index e999c24e4634..404de1b0c407 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
@@ -85,6 +85,19 @@ struct rtw_c2h_adaptivity {
|
||||
u8 option;
|
||||
} __packed;
|
||||
|
||||
+struct rtw_c2h_ra_rpt {
|
||||
+ u8 rate_sgi;
|
||||
+ u8 mac_id;
|
||||
+ u8 byte2;
|
||||
+ u8 status;
|
||||
+ u8 byte4;
|
||||
+ u8 ra_ratio;
|
||||
+ u8 bw;
|
||||
+} __packed;
|
||||
+
|
||||
+#define RTW_C2H_RA_RPT_RATE GENMASK(6, 0)
|
||||
+#define RTW_C2H_RA_RPT_SGI BIT(7)
|
||||
+
|
||||
struct rtw_h2c_register {
|
||||
u32 w0;
|
||||
u32 w1;
|
||||
@@ -364,10 +377,6 @@ struct rtw_fw_hdr_legacy {
|
||||
#define GET_CHAN_SWITCH_CENTRAL_CH(c2h_payload) (c2h_payload[2])
|
||||
#define GET_CHAN_SWITCH_ID(c2h_payload) (c2h_payload[3])
|
||||
#define GET_CHAN_SWITCH_STATUS(c2h_payload) (c2h_payload[4])
|
||||
-#define GET_RA_REPORT_RATE(c2h_payload) (c2h_payload[0] & 0x7f)
|
||||
-#define GET_RA_REPORT_SGI(c2h_payload) ((c2h_payload[0] & 0x80) >> 7)
|
||||
-#define GET_RA_REPORT_BW(c2h_payload) (c2h_payload[6])
|
||||
-#define GET_RA_REPORT_MACID(c2h_payload) (c2h_payload[1])
|
||||
|
||||
#define GET_BCN_FILTER_NOTIFY_TYPE(c2h_payload) (c2h_payload[1] & 0xf)
|
||||
#define GET_BCN_FILTER_NOTIFY_EVENT(c2h_payload) (c2h_payload[1] & 0x10)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 95b5acf975c6..9f474dbed965 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1201,6 +1201,7 @@ struct rtw_chip_info {
|
||||
|
||||
u8 usb_tx_agg_desc_num;
|
||||
bool hw_feature_report;
|
||||
+ u8 c2h_ra_report_size;
|
||||
|
||||
u8 default_1ss_tx_path;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index c4793e10d9dc..e541443adb15 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -1961,6 +1961,7 @@ const struct rtw_chip_info rtw8703b_hw_spec = {
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
|
||||
.usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB interface */
|
||||
.hw_feature_report = true,
|
||||
+ .c2h_ra_report_size = 7,
|
||||
|
||||
.path_div_supported = false,
|
||||
.ht_supported = true,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index bf87c92087da..6a9115775faf 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -2132,6 +2132,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.dig_min = 0x20,
|
||||
.usb_tx_agg_desc_num = 1,
|
||||
.hw_feature_report = true,
|
||||
+ .c2h_ra_report_size = 7,
|
||||
.ht_supported = true,
|
||||
.vht_supported = false,
|
||||
.lps_deep_mode_supported = 0,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 44ef2e246724..6cb7e9aaa437 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1969,6 +1969,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.dig_min = 0x1c,
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
.hw_feature_report = true,
|
||||
+ .c2h_ra_report_size = 7,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index 3b25536a253e..ca8813fdf9fb 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -2512,6 +2512,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.dig_min = 0x1c,
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
.hw_feature_report = true,
|
||||
+ .c2h_ra_report_size = 7,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 936d4bf82c8f..ca98da8e4000 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -5331,6 +5331,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.dig_min = 0x20,
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
.hw_feature_report = true,
|
||||
+ .c2h_ra_report_size = 7,
|
||||
.default_1ss_tx_path = BB_PATH_A,
|
||||
.path_div_supported = true,
|
||||
.ht_supported = true,
|
||||
--
|
||||
2.39.5
|
||||
|
173
packages/linux/patches/rtlwifi/6.13/0006-wifi-rtw88-Extend-the-init-table-parsing-for-RTL8812.patch
vendored
Normal file
173
packages/linux/patches/rtlwifi/6.13/0006-wifi-rtw88-Extend-the-init-table-parsing-for-RTL8812.patch
vendored
Normal file
@ -0,0 +1,173 @@
|
||||
From 699321b4de81b1c6e0e8973f763f4d8ef9be583d Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:08:24 +0300
|
||||
Subject: [PATCH 06/24] wifi: rtw88: Extend the init table parsing for
|
||||
RTL8812AU
|
||||
|
||||
The chips supported so far only use the first condition, and so the
|
||||
parsing code ignores the second condition. RTL8812AU's init tables use
|
||||
the second condition also. Make the parsing code check it.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/1bee6b74-6eab-44a3-9f40-794ca006c72d@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 15 ++++++
|
||||
drivers/net/wireless/realtek/rtw88/phy.c | 62 ++++++++++++++++++++---
|
||||
2 files changed, 69 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 9f474dbed965..9dd8c459b014 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1835,6 +1835,20 @@ struct rtw_phy_cond {
|
||||
#define BRANCH_ENDIF 3
|
||||
};
|
||||
|
||||
+struct rtw_phy_cond2 {
|
||||
+#ifdef __LITTLE_ENDIAN
|
||||
+ u8 type_glna;
|
||||
+ u8 type_gpa;
|
||||
+ u8 type_alna;
|
||||
+ u8 type_apa;
|
||||
+#else
|
||||
+ u8 type_apa;
|
||||
+ u8 type_alna;
|
||||
+ u8 type_gpa;
|
||||
+ u8 type_glna;
|
||||
+#endif
|
||||
+};
|
||||
+
|
||||
struct rtw_fifo_conf {
|
||||
/* tx fifo information */
|
||||
u16 rsvd_boundary;
|
||||
@@ -1916,6 +1930,7 @@ struct rtw_hal {
|
||||
u8 oem_id;
|
||||
u8 pkg_type;
|
||||
struct rtw_phy_cond phy_cond;
|
||||
+ struct rtw_phy_cond2 phy_cond2;
|
||||
bool rfe_btg;
|
||||
|
||||
u8 ps_mode;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
index d57a2aabd89b..739c619460ca 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
@@ -18,7 +18,10 @@ struct phy_cfg_pair {
|
||||
};
|
||||
|
||||
union phy_table_tile {
|
||||
- struct rtw_phy_cond cond;
|
||||
+ struct {
|
||||
+ struct rtw_phy_cond cond;
|
||||
+ struct rtw_phy_cond2 cond2;
|
||||
+ } __packed;
|
||||
struct phy_cfg_pair cfg;
|
||||
};
|
||||
|
||||
@@ -1041,7 +1044,8 @@ void rtw_phy_setup_phy_cond(struct rtw_dev *rtwdev, u32 pkg)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
- struct rtw_phy_cond cond = {0};
|
||||
+ struct rtw_phy_cond cond = {};
|
||||
+ struct rtw_phy_cond2 cond2 = {};
|
||||
|
||||
cond.cut = hal->cut_version ? hal->cut_version : 15;
|
||||
cond.pkg = pkg ? pkg : 15;
|
||||
@@ -1061,15 +1065,34 @@ void rtw_phy_setup_phy_cond(struct rtw_dev *rtwdev, u32 pkg)
|
||||
break;
|
||||
}
|
||||
|
||||
+ if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A ||
|
||||
+ rtwdev->chip->id == RTW_CHIP_TYPE_8821A) {
|
||||
+ cond.rfe = 0;
|
||||
+ cond.rfe |= efuse->ext_lna_2g;
|
||||
+ cond.rfe |= efuse->ext_pa_2g << 1;
|
||||
+ cond.rfe |= efuse->ext_lna_5g << 2;
|
||||
+ cond.rfe |= efuse->ext_pa_5g << 3;
|
||||
+ cond.rfe |= efuse->btcoex << 4;
|
||||
+
|
||||
+ cond2.type_alna = efuse->alna_type;
|
||||
+ cond2.type_glna = efuse->glna_type;
|
||||
+ cond2.type_apa = efuse->apa_type;
|
||||
+ cond2.type_gpa = efuse->gpa_type;
|
||||
+ }
|
||||
+
|
||||
hal->phy_cond = cond;
|
||||
+ hal->phy_cond2 = cond2;
|
||||
|
||||
- rtw_dbg(rtwdev, RTW_DBG_PHY, "phy cond=0x%08x\n", *((u32 *)&hal->phy_cond));
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_PHY, "phy cond=0x%08x cond2=0x%08x\n",
|
||||
+ *((u32 *)&hal->phy_cond), *((u32 *)&hal->phy_cond2));
|
||||
}
|
||||
|
||||
-static bool check_positive(struct rtw_dev *rtwdev, struct rtw_phy_cond cond)
|
||||
+static bool check_positive(struct rtw_dev *rtwdev, struct rtw_phy_cond cond,
|
||||
+ struct rtw_phy_cond2 cond2)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
struct rtw_phy_cond drv_cond = hal->phy_cond;
|
||||
+ struct rtw_phy_cond2 drv_cond2 = hal->phy_cond2;
|
||||
|
||||
if (cond.cut && cond.cut != drv_cond.cut)
|
||||
return false;
|
||||
@@ -1080,8 +1103,29 @@ static bool check_positive(struct rtw_dev *rtwdev, struct rtw_phy_cond cond)
|
||||
if (cond.intf && cond.intf != drv_cond.intf)
|
||||
return false;
|
||||
|
||||
- if (cond.rfe != drv_cond.rfe)
|
||||
- return false;
|
||||
+ if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A ||
|
||||
+ rtwdev->chip->id == RTW_CHIP_TYPE_8821A) {
|
||||
+ if (!(cond.rfe & 0x0f))
|
||||
+ return true;
|
||||
+
|
||||
+ if ((cond.rfe & drv_cond.rfe) != cond.rfe)
|
||||
+ return false;
|
||||
+
|
||||
+ if ((cond.rfe & BIT(0)) && cond2.type_glna != drv_cond2.type_glna)
|
||||
+ return false;
|
||||
+
|
||||
+ if ((cond.rfe & BIT(1)) && cond2.type_gpa != drv_cond2.type_gpa)
|
||||
+ return false;
|
||||
+
|
||||
+ if ((cond.rfe & BIT(2)) && cond2.type_alna != drv_cond2.type_alna)
|
||||
+ return false;
|
||||
+
|
||||
+ if ((cond.rfe & BIT(3)) && cond2.type_apa != drv_cond2.type_apa)
|
||||
+ return false;
|
||||
+ } else {
|
||||
+ if (cond.rfe != drv_cond.rfe)
|
||||
+ return false;
|
||||
+ }
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1090,7 +1134,8 @@ void rtw_parse_tbl_phy_cond(struct rtw_dev *rtwdev, const struct rtw_table *tbl)
|
||||
{
|
||||
const union phy_table_tile *p = tbl->data;
|
||||
const union phy_table_tile *end = p + tbl->size / 2;
|
||||
- struct rtw_phy_cond pos_cond = {0};
|
||||
+ struct rtw_phy_cond pos_cond = {};
|
||||
+ struct rtw_phy_cond2 pos_cond2 = {};
|
||||
bool is_matched = true, is_skipped = false;
|
||||
|
||||
BUILD_BUG_ON(sizeof(union phy_table_tile) != sizeof(struct phy_cfg_pair));
|
||||
@@ -1109,11 +1154,12 @@ void rtw_parse_tbl_phy_cond(struct rtw_dev *rtwdev, const struct rtw_table *tbl)
|
||||
case BRANCH_ELIF:
|
||||
default:
|
||||
pos_cond = p->cond;
|
||||
+ pos_cond2 = p->cond2;
|
||||
break;
|
||||
}
|
||||
} else if (p->cond.neg) {
|
||||
if (!is_skipped) {
|
||||
- if (check_positive(rtwdev, pos_cond)) {
|
||||
+ if (check_positive(rtwdev, pos_cond, pos_cond2)) {
|
||||
is_matched = true;
|
||||
is_skipped = true;
|
||||
} else {
|
||||
--
|
||||
2.39.5
|
||||
|
@ -0,0 +1,64 @@
|
||||
From 17e658bc7d856587cbd960c176a4a5d2e53b838b Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:09:04 +0300
|
||||
Subject: [PATCH 07/24] wifi: rtw88: Allow rtw_chip_info.ltecoex_addr to be
|
||||
NULL
|
||||
|
||||
RTL8821A doesn't have this. Trying to use it results in error messages,
|
||||
so don't try if ltecoex_addr is NULL.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/d1004817-1760-41d1-9136-3d799757c444@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 14 +++++++++++---
|
||||
1 file changed, 11 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index c476e65c4d71..901984ec026e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -950,12 +950,18 @@ static void rtw_coex_coex_ctrl_owner(struct rtw_dev *rtwdev, bool wifi_control)
|
||||
|
||||
static void rtw_coex_set_gnt_bt(struct rtw_dev *rtwdev, u8 state)
|
||||
{
|
||||
+ if (!rtwdev->chip->ltecoex_addr)
|
||||
+ return;
|
||||
+
|
||||
rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0xc000, state);
|
||||
rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x0c00, state);
|
||||
}
|
||||
|
||||
static void rtw_coex_set_gnt_wl(struct rtw_dev *rtwdev, u8 state)
|
||||
{
|
||||
+ if (!rtwdev->chip->ltecoex_addr)
|
||||
+ return;
|
||||
+
|
||||
rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x3000, state);
|
||||
rtw_coex_write_indirect_reg(rtwdev, LTE_COEX_CTRL, 0x0300, state);
|
||||
}
|
||||
@@ -3904,7 +3910,7 @@ void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
u8 sys_lte;
|
||||
u16 score_board_WB, score_board_BW;
|
||||
u32 wl_reg_6c0, wl_reg_6c4, wl_reg_6c8, wl_reg_778, wl_reg_6cc;
|
||||
- u32 lte_coex, bt_coex;
|
||||
+ u32 lte_coex = 0, bt_coex = 0;
|
||||
int i;
|
||||
|
||||
score_board_BW = rtw_coex_read_scbd(rtwdev);
|
||||
@@ -3916,8 +3922,10 @@ void rtw_coex_display_coex_info(struct rtw_dev *rtwdev, struct seq_file *m)
|
||||
wl_reg_778 = rtw_read8(rtwdev, REG_BT_STAT_CTRL);
|
||||
|
||||
sys_lte = rtw_read8(rtwdev, 0x73);
|
||||
- lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
|
||||
- bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
|
||||
+ if (rtwdev->chip->ltecoex_addr) {
|
||||
+ lte_coex = rtw_coex_read_indirect_reg(rtwdev, 0x38);
|
||||
+ bt_coex = rtw_coex_read_indirect_reg(rtwdev, 0x54);
|
||||
+ }
|
||||
|
||||
if (!coex_stat->wl_under_ips &&
|
||||
(!coex_stat->wl_under_lps || coex_stat->wl_force_lps_ctrl) &&
|
||||
--
|
||||
2.39.5
|
||||
|
298
packages/linux/patches/rtlwifi/6.13/0008-wifi-rtw88-Let-each-driver-control-the-power-on-off-.patch
vendored
Normal file
298
packages/linux/patches/rtlwifi/6.13/0008-wifi-rtw88-Let-each-driver-control-the-power-on-off-.patch
vendored
Normal file
@ -0,0 +1,298 @@
|
||||
From fc1fcada274a5c5d73178ce30982f75771773d44 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:09:47 +0300
|
||||
Subject: [PATCH 08/24] wifi: rtw88: Let each driver control the power on/off
|
||||
process
|
||||
|
||||
RTL8821AU and RTL8812AU have to do some things differently, so let
|
||||
them have full control.
|
||||
|
||||
The other chips use the same functions as before.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/98ab839f-9100-44ae-9551-9af743a4aa3a@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 3 +++
|
||||
drivers/net/wireless/realtek/rtw88/mac.c | 11 +++++++----
|
||||
drivers/net/wireless/realtek/rtw88/mac.h | 3 +++
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 13 ++++++++-----
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 5 +++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 2 ++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 2 ++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 2 ++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 2 ++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 2 ++
|
||||
10 files changed, 36 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index 901984ec026e..3bd7f55f4b18 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -2753,16 +2753,19 @@ void rtw_coex_power_on_setting(struct rtw_dev *rtwdev)
|
||||
rtw_write8(rtwdev, 0xff1a, 0x0);
|
||||
rtw_coex_set_gnt_debug(rtwdev);
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_coex_power_on_setting);
|
||||
|
||||
void rtw_coex_power_off_setting(struct rtw_dev *rtwdev)
|
||||
{
|
||||
rtw_write16(rtwdev, REG_WIFI_BT_INFO, BIT_BT_INT_EN);
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_coex_power_off_setting);
|
||||
|
||||
void rtw_coex_init_hw_config(struct rtw_dev *rtwdev, bool wifi_only)
|
||||
{
|
||||
__rtw_coex_init_hw_config(rtwdev, wifi_only);
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_coex_init_hw_config);
|
||||
|
||||
void rtw_coex_ips_notify(struct rtw_dev *rtwdev, u8 type)
|
||||
{
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index 5aa45592c2ac..b5a1caf13997 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -227,8 +227,8 @@ static int rtw_sub_pwr_seq_parser(struct rtw_dev *rtwdev, u8 intf_mask,
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
|
||||
- const struct rtw_pwr_seq_cmd * const *cmd_seq)
|
||||
+int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
|
||||
+ const struct rtw_pwr_seq_cmd * const *cmd_seq)
|
||||
{
|
||||
u8 cut_mask;
|
||||
u8 intf_mask;
|
||||
@@ -267,6 +267,7 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_pwr_seq_parser);
|
||||
|
||||
static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on)
|
||||
{
|
||||
@@ -999,6 +1000,7 @@ int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw)
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_download_firmware);
|
||||
|
||||
static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues)
|
||||
{
|
||||
@@ -1132,7 +1134,7 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static int set_trx_fifo_info(struct rtw_dev *rtwdev)
|
||||
+int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fifo_conf *fifo = &rtwdev->fifo;
|
||||
@@ -1184,6 +1186,7 @@ static int set_trx_fifo_info(struct rtw_dev *rtwdev)
|
||||
|
||||
return 0;
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_set_trx_fifo_info);
|
||||
|
||||
static int __priority_queue_cfg(struct rtw_dev *rtwdev,
|
||||
const struct rtw_page_table *pg_tbl,
|
||||
@@ -1261,7 +1264,7 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev)
|
||||
u16 pubq_num;
|
||||
int ret;
|
||||
|
||||
- ret = set_trx_fifo_info(rtwdev);
|
||||
+ ret = rtw_set_trx_fifo_info(rtwdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h
|
||||
index 737c6d5d8da7..e92b1483728d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.h
|
||||
@@ -30,6 +30,8 @@
|
||||
|
||||
void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw,
|
||||
u8 primary_ch_idx);
|
||||
+int rtw_pwr_seq_parser(struct rtw_dev *rtwdev,
|
||||
+ const struct rtw_pwr_seq_cmd * const *cmd_seq);
|
||||
int rtw_mac_power_on(struct rtw_dev *rtwdev);
|
||||
void rtw_mac_power_off(struct rtw_dev *rtwdev);
|
||||
void rtw_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
|
||||
@@ -37,6 +39,7 @@ void rtw_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
|
||||
int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw);
|
||||
int rtw_mac_init(struct rtw_dev *rtwdev);
|
||||
void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop);
|
||||
+int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev);
|
||||
int rtw_ddma_to_fw_fifo(struct rtw_dev *rtwdev, u32 ocp_src, u32 size);
|
||||
|
||||
static inline void rtw_mac_flush_all_queues(struct rtw_dev *rtwdev, bool drop)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index c314b2fc06ee..0b86a0a939c3 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -1309,7 +1309,7 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
|
||||
rtw_fw_send_ra_info(rtwdev, si, reset_ra_mask);
|
||||
}
|
||||
|
||||
-static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
|
||||
+int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fw_state *fw;
|
||||
@@ -1329,6 +1329,7 @@ static int rtw_wait_firmware_completion(struct rtw_dev *rtwdev)
|
||||
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_wait_firmware_completion);
|
||||
|
||||
static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,
|
||||
struct rtw_fw_state *fw)
|
||||
@@ -1350,7 +1351,7 @@ static enum rtw_lps_deep_mode rtw_update_lps_deep_mode(struct rtw_dev *rtwdev,
|
||||
return LPS_DEEP_MODE_NONE;
|
||||
}
|
||||
|
||||
-static int rtw_power_on(struct rtw_dev *rtwdev)
|
||||
+int rtw_power_on(struct rtw_dev *rtwdev)
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct rtw_fw_state *fw = &rtwdev->fw;
|
||||
@@ -1413,6 +1414,7 @@ static int rtw_power_on(struct rtw_dev *rtwdev)
|
||||
err:
|
||||
return ret;
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_power_on);
|
||||
|
||||
void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start)
|
||||
{
|
||||
@@ -1485,7 +1487,7 @@ int rtw_core_start(struct rtw_dev *rtwdev)
|
||||
{
|
||||
int ret;
|
||||
|
||||
- ret = rtw_power_on(rtwdev);
|
||||
+ ret = rtwdev->chip->ops->power_on(rtwdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1505,12 +1507,13 @@ int rtw_core_start(struct rtw_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
-static void rtw_power_off(struct rtw_dev *rtwdev)
|
||||
+void rtw_power_off(struct rtw_dev *rtwdev)
|
||||
{
|
||||
rtw_hci_stop(rtwdev);
|
||||
rtw_coex_power_off_setting(rtwdev);
|
||||
rtw_mac_power_off(rtwdev);
|
||||
}
|
||||
+EXPORT_SYMBOL(rtw_power_off);
|
||||
|
||||
void rtw_core_stop(struct rtw_dev *rtwdev)
|
||||
{
|
||||
@@ -1535,7 +1538,7 @@ void rtw_core_stop(struct rtw_dev *rtwdev)
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
|
||||
- rtw_power_off(rtwdev);
|
||||
+ rtwdev->chip->ops->power_off(rtwdev);
|
||||
}
|
||||
|
||||
static void rtw_init_ht_cap(struct rtw_dev *rtwdev,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 9dd8c459b014..bf48ec42ffb9 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -843,6 +843,8 @@ struct rtw_regd {
|
||||
};
|
||||
|
||||
struct rtw_chip_ops {
|
||||
+ int (*power_on)(struct rtw_dev *rtwdev);
|
||||
+ void (*power_off)(struct rtw_dev *rtwdev);
|
||||
int (*mac_init)(struct rtw_dev *rtwdev);
|
||||
int (*dump_fw_crash)(struct rtw_dev *rtwdev);
|
||||
void (*shutdown)(struct rtw_dev *rtwdev);
|
||||
@@ -2209,6 +2211,7 @@ void rtw_core_scan_start(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif,
|
||||
void rtw_core_scan_complete(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
bool hw_scan);
|
||||
int rtw_core_start(struct rtw_dev *rtwdev);
|
||||
+void rtw_power_off(struct rtw_dev *rtwdev);
|
||||
void rtw_core_stop(struct rtw_dev *rtwdev);
|
||||
int rtw_chip_info_setup(struct rtw_dev *rtwdev);
|
||||
int rtw_core_init(struct rtw_dev *rtwdev);
|
||||
@@ -2223,6 +2226,8 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta,
|
||||
bool fw_exist);
|
||||
void rtw_fw_recovery(struct rtw_dev *rtwdev);
|
||||
+int rtw_wait_firmware_completion(struct rtw_dev *rtwdev);
|
||||
+int rtw_power_on(struct rtw_dev *rtwdev);
|
||||
void rtw_core_fw_scan_notify(struct rtw_dev *rtwdev, bool start);
|
||||
int rtw_dump_fw(struct rtw_dev *rtwdev, const u32 ocp_src, u32 size,
|
||||
u32 fwcd_item);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index e541443adb15..f72e5042920c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -1888,6 +1888,8 @@ static const struct coex_tdma_para tdma_sant_8703b[] = {
|
||||
};
|
||||
|
||||
static const struct rtw_chip_ops rtw8703b_ops = {
|
||||
+ .power_on = rtw_power_on,
|
||||
+ .power_off = rtw_power_off,
|
||||
.mac_init = rtw8723x_mac_init,
|
||||
.dump_fw_crash = NULL,
|
||||
.shutdown = NULL,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index 6a9115775faf..f6a08b06f853 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -1390,6 +1390,8 @@ static void rtw8723d_pwr_track(struct rtw_dev *rtwdev)
|
||||
}
|
||||
|
||||
static const struct rtw_chip_ops rtw8723d_ops = {
|
||||
+ .power_on = rtw_power_on,
|
||||
+ .power_off = rtw_power_off,
|
||||
.phy_set_param = rtw8723d_phy_set_param,
|
||||
.read_efuse = rtw8723x_read_efuse,
|
||||
.query_phy_status = query_phy_status,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 6cb7e9aaa437..e17d0193ca6f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1643,6 +1643,8 @@ static const struct rtw_prioq_addrs prioq_addrs_8821c = {
|
||||
};
|
||||
|
||||
static const struct rtw_chip_ops rtw8821c_ops = {
|
||||
+ .power_on = rtw_power_on,
|
||||
+ .power_off = rtw_power_off,
|
||||
.phy_set_param = rtw8821c_phy_set_param,
|
||||
.read_efuse = rtw8821c_read_efuse,
|
||||
.query_phy_status = query_phy_status,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index ca8813fdf9fb..9bd269319795 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -2134,6 +2134,8 @@ static const struct rtw_prioq_addrs prioq_addrs_8822b = {
|
||||
};
|
||||
|
||||
static const struct rtw_chip_ops rtw8822b_ops = {
|
||||
+ .power_on = rtw_power_on,
|
||||
+ .power_off = rtw_power_off,
|
||||
.phy_set_param = rtw8822b_phy_set_param,
|
||||
.read_efuse = rtw8822b_read_efuse,
|
||||
.query_phy_status = query_phy_status,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index ca98da8e4000..36733c88102a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -4948,6 +4948,8 @@ static const struct rtw_prioq_addrs prioq_addrs_8822c = {
|
||||
};
|
||||
|
||||
static const struct rtw_chip_ops rtw8822c_ops = {
|
||||
+ .power_on = rtw_power_on,
|
||||
+ .power_off = rtw_power_off,
|
||||
.phy_set_param = rtw8822c_phy_set_param,
|
||||
.read_efuse = rtw8822c_read_efuse,
|
||||
.query_phy_status = query_phy_status,
|
||||
--
|
||||
2.39.5
|
||||
|
221
packages/linux/patches/rtlwifi/6.13/0009-wifi-rtw88-Enable-data-rate-fallback-for-older-chips.patch
vendored
Normal file
221
packages/linux/patches/rtlwifi/6.13/0009-wifi-rtw88-Enable-data-rate-fallback-for-older-chips.patch
vendored
Normal file
@ -0,0 +1,221 @@
|
||||
From 0ced33188bdc330299c80f4d1afd67278d9c2ded Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:10:32 +0300
|
||||
Subject: [PATCH 09/24] wifi: rtw88: Enable data rate fallback for older chips
|
||||
|
||||
RTL8811AU fails to perform the 4-way handshake when the AP is too far
|
||||
because it transmits the EAPOL frames at MCS9 and when that doesn't
|
||||
work it retries 48 times with the same rate, to no avail.
|
||||
|
||||
Retrying 48 times with the same rate seems pointless. Set the
|
||||
appropriate field in the TX descriptor to allow it to use lower rates
|
||||
when retrying.
|
||||
|
||||
Set it for RTL8723D and RTL8703B because they interpret this field the
|
||||
same way as RTL8811A.
|
||||
|
||||
The newer RTL8822C, RTL8822B, RTL8821C seem to interpret this field in
|
||||
the TX descriptor differently, so leave it alone for those chips.
|
||||
|
||||
Tested with RTL8811AU and RTL8723DU.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/2b3e3e6f-541b-4a3b-8ca3-65b267e6a95a@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/pci.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/tx.c | 6 +++++-
|
||||
drivers/net/wireless/realtek/rtw88/tx.h | 4 +++-
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 4 ++--
|
||||
12 files changed, 19 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index 168e19187ba7..19de5ba555a9 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -1290,7 +1290,7 @@ static void rtw_fill_rsvd_page_desc(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
rtw_tx_rsvd_page_pkt_info_update(rtwdev, &pkt_info, skb, type);
|
||||
pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
|
||||
memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
|
||||
- rtw_tx_fill_tx_desc(&pkt_info, skb);
|
||||
+ rtw_tx_fill_tx_desc(rtwdev, &pkt_info, skb);
|
||||
}
|
||||
|
||||
static inline u8 rtw_len_to_page(unsigned int len, u8 page_size)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index bf48ec42ffb9..a57680167144 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1204,6 +1204,7 @@ struct rtw_chip_info {
|
||||
u8 usb_tx_agg_desc_num;
|
||||
bool hw_feature_report;
|
||||
u8 c2h_ra_report_size;
|
||||
+ bool old_datarate_fb_limit;
|
||||
|
||||
u8 default_1ss_tx_path;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
index 729b270d5851..08226b61b653 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
@@ -825,7 +825,7 @@ static int rtw_pci_tx_write_data(struct rtw_dev *rtwdev,
|
||||
pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
|
||||
memset(pkt_desc, 0, tx_pkt_desc_sz);
|
||||
pkt_info->qsel = rtw_pci_get_tx_qsel(skb, queue);
|
||||
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
||||
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
||||
dma = dma_map_single(&rtwpci->pdev->dev, skb->data, skb->len,
|
||||
DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(&rtwpci->pdev->dev, dma))
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index f72e5042920c..bff6e8b93650 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -1964,6 +1964,7 @@ const struct rtw_chip_info rtw8703b_hw_spec = {
|
||||
.usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB interface */
|
||||
.hw_feature_report = true,
|
||||
.c2h_ra_report_size = 7,
|
||||
+ .old_datarate_fb_limit = true,
|
||||
|
||||
.path_div_supported = false,
|
||||
.ht_supported = true,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index f6a08b06f853..a0bf37a58632 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -2135,6 +2135,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.usb_tx_agg_desc_num = 1,
|
||||
.hw_feature_report = true,
|
||||
.c2h_ra_report_size = 7,
|
||||
+ .old_datarate_fb_limit = true,
|
||||
.ht_supported = true,
|
||||
.vht_supported = false,
|
||||
.lps_deep_mode_supported = 0,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index e17d0193ca6f..39dc8244f744 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1972,6 +1972,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
.hw_feature_report = true,
|
||||
.c2h_ra_report_size = 7,
|
||||
+ .old_datarate_fb_limit = false,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index 9bd269319795..ccabbe85be6f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -2515,6 +2515,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
.hw_feature_report = true,
|
||||
.c2h_ra_report_size = 7,
|
||||
+ .old_datarate_fb_limit = false,
|
||||
.ht_supported = true,
|
||||
.vht_supported = true,
|
||||
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 36733c88102a..3fa72af40aa4 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -5334,6 +5334,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.usb_tx_agg_desc_num = 3,
|
||||
.hw_feature_report = true,
|
||||
.c2h_ra_report_size = 7,
|
||||
+ .old_datarate_fb_limit = false,
|
||||
.default_1ss_tx_path = BB_PATH_A,
|
||||
.path_div_supported = true,
|
||||
.ht_supported = true,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index fe6f14290bdd..df8b62fe4548 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -862,7 +862,7 @@ static void rtw_sdio_tx_skb_prepare(struct rtw_dev *rtwdev,
|
||||
|
||||
pkt_info->qsel = rtw_sdio_get_tx_qsel(rtwdev, skb, queue);
|
||||
|
||||
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
||||
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
||||
rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, pkt_desc);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c
|
||||
index dae7ca148865..6ed470dd6f22 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/tx.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/tx.c
|
||||
@@ -32,7 +32,8 @@ void rtw_tx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
}
|
||||
}
|
||||
|
||||
-void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
||||
+void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
||||
{
|
||||
struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data;
|
||||
bool more_data = false;
|
||||
@@ -67,6 +68,9 @@ void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
||||
|
||||
tx_desc->w4 = le32_encode_bits(pkt_info->rate, RTW_TX_DESC_W4_DATARATE);
|
||||
|
||||
+ if (rtwdev->chip->old_datarate_fb_limit)
|
||||
+ tx_desc->w4 |= le32_encode_bits(0x1f, RTW_TX_DESC_W4_DATARATE_FB_LIMIT);
|
||||
+
|
||||
tx_desc->w5 = le32_encode_bits(pkt_info->short_gi, RTW_TX_DESC_W5_DATA_SHORT) |
|
||||
le32_encode_bits(pkt_info->bw, RTW_TX_DESC_W5_DATA_BW) |
|
||||
le32_encode_bits(pkt_info->ldpc, RTW_TX_DESC_W5_DATA_LDPC) |
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h
|
||||
index 3d544fd7f60f..d34cdeca16f1 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/tx.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/tx.h
|
||||
@@ -44,6 +44,7 @@ struct rtw_tx_desc {
|
||||
#define RTW_TX_DESC_W3_NAVUSEHDR BIT(15)
|
||||
#define RTW_TX_DESC_W3_MAX_AGG_NUM GENMASK(21, 17)
|
||||
#define RTW_TX_DESC_W4_DATARATE GENMASK(6, 0)
|
||||
+#define RTW_TX_DESC_W4_DATARATE_FB_LIMIT GENMASK(12, 8)
|
||||
#define RTW_TX_DESC_W4_RTSRATE GENMASK(28, 24)
|
||||
#define RTW_TX_DESC_W5_DATA_SHORT BIT(4)
|
||||
#define RTW_TX_DESC_W5_DATA_BW GENMASK(6, 5)
|
||||
@@ -94,7 +95,8 @@ void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
struct ieee80211_sta *sta,
|
||||
struct sk_buff *skb);
|
||||
-void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb);
|
||||
+void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb);
|
||||
void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff *skb, u8 sn);
|
||||
void rtw_tx_report_handle(struct rtw_dev *rtwdev, struct sk_buff *skb, int src);
|
||||
void rtw_tx_rsvd_page_pkt_info_update(struct rtw_dev *rtwdev,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 83acb96b44ed..a0ce3a306221 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -512,7 +512,7 @@ static int rtw_usb_write_data(struct rtw_dev *rtwdev,
|
||||
skb_put_data(skb, buf, size);
|
||||
skb_push(skb, chip->tx_pkt_desc_sz);
|
||||
memset(skb->data, 0, chip->tx_pkt_desc_sz);
|
||||
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
||||
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
||||
rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
|
||||
|
||||
ret = rtw_usb_write_port(rtwdev, qsel, skb,
|
||||
@@ -579,7 +579,7 @@ static int rtw_usb_tx_write(struct rtw_dev *rtwdev,
|
||||
pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
|
||||
memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
|
||||
ep = qsel_to_ep(rtwusb, pkt_info->qsel);
|
||||
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
||||
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
||||
rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
|
||||
tx_data = rtw_usb_get_tx_data(skb);
|
||||
tx_data->sn = pkt_info->sn;
|
||||
--
|
||||
2.39.5
|
||||
|
96
packages/linux/patches/rtlwifi/6.13/0010-wifi-rtw88-Make-txagc_remnant_ofdm-an-array.patch
vendored
Normal file
96
packages/linux/patches/rtlwifi/6.13/0010-wifi-rtw88-Make-txagc_remnant_ofdm-an-array.patch
vendored
Normal file
@ -0,0 +1,96 @@
|
||||
From d5bdea3831a848fa09f4d1cf6884e507839596b0 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:10:54 +0300
|
||||
Subject: [PATCH 10/24] wifi: rtw88: Make txagc_remnant_ofdm an array
|
||||
|
||||
txagc_remnant_ofdm member of struct rtw_dm_info should be different for
|
||||
each RF path, so make it an array of size RTW_RF_PATH_MAX (4).
|
||||
|
||||
Until now all the chips using this had only one RF path, but RTL8812AU
|
||||
has two, and RTL8814AU has four.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/68571ba9-e504-4b2d-bfa1-62f468753649@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/phy.c | 4 ++--
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 4 ++--
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 4 ++--
|
||||
4 files changed, 7 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index a57680167144..49bf20942ade 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1715,7 +1715,7 @@ struct rtw_dm_info {
|
||||
bool pwr_trk_init_trigger;
|
||||
struct ewma_thermal avg_thermal[RTW_RF_PATH_MAX];
|
||||
s8 txagc_remnant_cck;
|
||||
- s8 txagc_remnant_ofdm;
|
||||
+ s8 txagc_remnant_ofdm[RTW_RF_PATH_MAX];
|
||||
u8 rx_cck_agc_report_type;
|
||||
|
||||
/* backup dack results for each path and I/Q */
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
index 739c619460ca..215e4af64da3 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
@@ -2171,8 +2171,8 @@ void rtw_get_tx_power_params(struct rtw_dev *rtwdev, u8 path, u8 rate, u8 bw,
|
||||
|
||||
*limit = rtw_phy_get_tx_power_limit(rtwdev, band, bw, path,
|
||||
rate, ch, regd);
|
||||
- *remnant = (rate <= DESC_RATE11M ? dm_info->txagc_remnant_cck :
|
||||
- dm_info->txagc_remnant_ofdm);
|
||||
+ *remnant = rate <= DESC_RATE11M ? dm_info->txagc_remnant_cck :
|
||||
+ dm_info->txagc_remnant_ofdm[path];
|
||||
*sar = rtw_phy_get_tx_power_sar(rtwdev, hal->sar_band, path, rate);
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index bff6e8b93650..1a41f1c31a06 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -637,7 +637,7 @@ static void rtw8703b_pwrtrack_init(struct rtw_dev *rtwdev)
|
||||
dm_info->pwr_trk_init_trigger = true;
|
||||
dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
|
||||
dm_info->txagc_remnant_cck = 0;
|
||||
- dm_info->txagc_remnant_ofdm = 0;
|
||||
+ dm_info->txagc_remnant_ofdm[RF_PATH_A] = 0;
|
||||
}
|
||||
|
||||
static void rtw8703b_phy_set_param(struct rtw_dev *rtwdev)
|
||||
@@ -1589,7 +1589,7 @@ static void rtw8703b_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
|
||||
{
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
|
||||
- dm_info->txagc_remnant_ofdm = txagc_idx;
|
||||
+ dm_info->txagc_remnant_ofdm[RF_PATH_A] = txagc_idx;
|
||||
|
||||
/* Only path A is calibrated for rtl8703b */
|
||||
rtw8703b_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index a0bf37a58632..1d99bb89ef1d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -79,7 +79,7 @@ static void rtw8723d_pwrtrack_init(struct rtw_dev *rtwdev)
|
||||
dm_info->pwr_trk_init_trigger = true;
|
||||
dm_info->thermal_meter_k = rtwdev->efuse.thermal_meter_k;
|
||||
dm_info->txagc_remnant_cck = 0;
|
||||
- dm_info->txagc_remnant_ofdm = 0;
|
||||
+ dm_info->txagc_remnant_ofdm[RF_PATH_A] = 0;
|
||||
}
|
||||
|
||||
static void rtw8723d_phy_set_param(struct rtw_dev *rtwdev)
|
||||
@@ -1265,7 +1265,7 @@ static void rtw8723d_pwrtrack_set_ofdm_pwr(struct rtw_dev *rtwdev, s8 swing_idx,
|
||||
{
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
|
||||
- dm_info->txagc_remnant_ofdm = txagc_idx;
|
||||
+ dm_info->txagc_remnant_ofdm[RF_PATH_A] = txagc_idx;
|
||||
|
||||
rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_A);
|
||||
rtw8723d_set_iqk_matrix(rtwdev, swing_idx, RF_PATH_B);
|
||||
--
|
||||
2.39.5
|
||||
|
126
packages/linux/patches/rtlwifi/6.13/0011-wifi-rtw88-Support-TX-page-sizes-bigger-than-128.patch
vendored
Normal file
126
packages/linux/patches/rtlwifi/6.13/0011-wifi-rtw88-Support-TX-page-sizes-bigger-than-128.patch
vendored
Normal file
@ -0,0 +1,126 @@
|
||||
From c1d505e4db7c5398ea3eff3815ebe4e586948a92 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:12:06 +0300
|
||||
Subject: [PATCH 11/24] wifi: rtw88: Support TX page sizes bigger than 128
|
||||
|
||||
All the chips supported so far have a TX page size of 128 bytes.
|
||||
|
||||
Change the type of the page_size member of struct rtw_chip_info from u8
|
||||
to u16 in order to support RTL8821AU (page size of 256 bytes) and
|
||||
RTL8812AU (page size of 512 bytes). Also change the types of several
|
||||
related variables and function parameters from u8 to u16.
|
||||
|
||||
The TX page size is used, among other things, to construct the beacon,
|
||||
null data, QOS null data, and PS poll templates which are uploaded to
|
||||
the chip's reserved page. Each template needs to be aligned on a
|
||||
multiple of the TX page size. Power saving can't work if the TX page
|
||||
size is wrong.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/acdefbb1-3daf-4349-9e03-9472754d5f1e@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/debug.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 21 +++++++++++----------
|
||||
drivers/net/wireless/realtek/rtw88/mac.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 2 +-
|
||||
4 files changed, 14 insertions(+), 13 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
index c26a6905fd15..364ec0436d0f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/debug.c
|
||||
@@ -308,7 +308,7 @@ static int rtw_debugfs_get_rsvd_page(struct seq_file *m, void *v)
|
||||
{
|
||||
struct rtw_debugfs_priv *debugfs_priv = m->private;
|
||||
struct rtw_dev *rtwdev = debugfs_priv->rtwdev;
|
||||
- u8 page_size = rtwdev->chip->page_size;
|
||||
+ u16 page_size = rtwdev->chip->page_size;
|
||||
u32 buf_size = debugfs_priv->rsvd_page.page_num * page_size;
|
||||
u32 offset = debugfs_priv->rsvd_page.page_offset * page_size;
|
||||
u8 *buf;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index 19de5ba555a9..e6e9946fbf44 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -1293,13 +1293,13 @@ static void rtw_fill_rsvd_page_desc(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
rtw_tx_fill_tx_desc(rtwdev, &pkt_info, skb);
|
||||
}
|
||||
|
||||
-static inline u8 rtw_len_to_page(unsigned int len, u8 page_size)
|
||||
+static inline u8 rtw_len_to_page(unsigned int len, u16 page_size)
|
||||
{
|
||||
return DIV_ROUND_UP(len, page_size);
|
||||
}
|
||||
|
||||
-static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u8 page_size,
|
||||
- u8 page_margin, u32 page, u8 *buf,
|
||||
+static void rtw_rsvd_page_list_to_buf(struct rtw_dev *rtwdev, u16 page_size,
|
||||
+ u16 page_margin, u32 page, u8 *buf,
|
||||
struct rtw_rsvd_page *rsvd_pkt)
|
||||
{
|
||||
struct sk_buff *skb = rsvd_pkt->skb;
|
||||
@@ -1601,13 +1601,13 @@ static int __rtw_build_rsvd_page_from_vifs(struct rtw_dev *rtwdev)
|
||||
|
||||
static u8 *rtw_build_rsvd_page(struct rtw_dev *rtwdev, u32 *size)
|
||||
{
|
||||
- struct ieee80211_hw *hw = rtwdev->hw;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
- struct sk_buff *iter;
|
||||
+ struct ieee80211_hw *hw = rtwdev->hw;
|
||||
struct rtw_rsvd_page *rsvd_pkt;
|
||||
- u32 page = 0;
|
||||
+ struct sk_buff *iter;
|
||||
+ u16 page_size, page_margin, tx_desc_sz;
|
||||
u8 total_page = 0;
|
||||
- u8 page_size, page_margin, tx_desc_sz;
|
||||
+ u32 page = 0;
|
||||
u8 *buf;
|
||||
int ret;
|
||||
|
||||
@@ -2013,12 +2013,13 @@ static int _rtw_hw_scan_update_probe_req(struct rtw_dev *rtwdev, u8 num_probes,
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *skb, *tmp;
|
||||
- u8 page_offset = 1, *buf, page_size = chip->page_size;
|
||||
u16 pg_addr = rtwdev->fifo.rsvd_h2c_info_addr, loc;
|
||||
- u16 buf_offset = page_size * page_offset;
|
||||
u8 tx_desc_sz = chip->tx_pkt_desc_sz;
|
||||
- u8 page_cnt, pages;
|
||||
+ u16 page_size = chip->page_size;
|
||||
+ u8 page_offset = 1, *buf;
|
||||
+ u16 buf_offset = page_size * page_offset;
|
||||
unsigned int pkt_len;
|
||||
+ u8 page_cnt, pages;
|
||||
int ret;
|
||||
|
||||
if (rtw_fw_feature_ext_check(&rtwdev->fw, FW_FEATURE_EXT_OLD_PAGE_NUM))
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index b5a1caf13997..65f04bad215c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -1143,7 +1143,7 @@ int rtw_set_trx_fifo_info(struct rtw_dev *rtwdev)
|
||||
|
||||
/* config rsvd page num */
|
||||
fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num;
|
||||
- fifo->txff_pg_num = chip->txff_size >> 7;
|
||||
+ fifo->txff_pg_num = chip->txff_size / chip->page_size;
|
||||
if (rtw_chip_wcpu_11n(rtwdev))
|
||||
fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num;
|
||||
else
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 49bf20942ade..4d5910afaf0f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1187,7 +1187,7 @@ struct rtw_chip_info {
|
||||
u32 fw_rxff_size;
|
||||
u16 rsvd_drv_pg_num;
|
||||
u8 band;
|
||||
- u8 page_size;
|
||||
+ u16 page_size;
|
||||
u8 csi_buf_pg_num;
|
||||
u8 dig_max;
|
||||
u8 dig_min;
|
||||
--
|
||||
2.39.5
|
||||
|
316
packages/linux/patches/rtlwifi/6.13/0012-wifi-rtw88-Move-pwr_track_tbl-to-struct-rtw_rfe_def.patch
vendored
Normal file
316
packages/linux/patches/rtlwifi/6.13/0012-wifi-rtw88-Move-pwr_track_tbl-to-struct-rtw_rfe_def.patch
vendored
Normal file
@ -0,0 +1,316 @@
|
||||
From 3db94ce8fc4cd44f8211f3334c65f61320c722ad Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:12:39 +0300
|
||||
Subject: [PATCH 12/24] wifi: rtw88: Move pwr_track_tbl to struct rtw_rfe_def
|
||||
|
||||
RTL8812AU uses one set of TX power tracking tables for RFE 3, and
|
||||
another set for everything else.
|
||||
|
||||
Move pwr_track_tbl from struct rtw_chip_info to struct rtw_rfe_def in
|
||||
order to load the right set of tables for each RFE (RF front end) type.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/904d0ab1-c046-40cd-a3a3-d4fdcf663c9d@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 8 ++++---
|
||||
drivers/net/wireless/realtek/rtw88/phy.c | 3 ++-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 12 +++++-----
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 12 +++++-----
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723x.c | 3 ++-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 17 +++++++-------
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 15 ++++++------
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 23 +++++++++----------
|
||||
8 files changed, 47 insertions(+), 46 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 4d5910afaf0f..e01964db8f67 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1099,17 +1099,20 @@ enum rtw_rfe_fem {
|
||||
struct rtw_rfe_def {
|
||||
const struct rtw_table *phy_pg_tbl;
|
||||
const struct rtw_table *txpwr_lmt_tbl;
|
||||
+ const struct rtw_pwr_track_tbl *pwr_track_tbl;
|
||||
const struct rtw_table *agc_btg_tbl;
|
||||
};
|
||||
|
||||
-#define RTW_DEF_RFE(chip, bb_pg, pwrlmt) { \
|
||||
+#define RTW_DEF_RFE(chip, bb_pg, pwrlmt, track) { \
|
||||
.phy_pg_tbl = &rtw ## chip ## _bb_pg_type ## bb_pg ## _tbl, \
|
||||
.txpwr_lmt_tbl = &rtw ## chip ## _txpwr_lmt_type ## pwrlmt ## _tbl, \
|
||||
+ .pwr_track_tbl = &rtw ## chip ## _pwr_track_type ## track ## _tbl, \
|
||||
}
|
||||
|
||||
-#define RTW_DEF_RFE_EXT(chip, bb_pg, pwrlmt, btg) { \
|
||||
+#define RTW_DEF_RFE_EXT(chip, bb_pg, pwrlmt, track, btg) { \
|
||||
.phy_pg_tbl = &rtw ## chip ## _bb_pg_type ## bb_pg ## _tbl, \
|
||||
.txpwr_lmt_tbl = &rtw ## chip ## _txpwr_lmt_type ## pwrlmt ## _tbl, \
|
||||
+ .pwr_track_tbl = &rtw ## chip ## _pwr_track_type ## track ## _tbl, \
|
||||
.agc_btg_tbl = &rtw ## chip ## _agc_btg_type ## btg ## _tbl, \
|
||||
}
|
||||
|
||||
@@ -1243,7 +1246,6 @@ struct rtw_chip_info {
|
||||
u16 dpd_ratemask;
|
||||
u8 iqk_threshold;
|
||||
u8 lck_threshold;
|
||||
- const struct rtw_pwr_track_tbl *pwr_track_tbl;
|
||||
|
||||
u8 bfer_su_max_num;
|
||||
u8 bfer_mu_max_num;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
index 215e4af64da3..b52108f2b147 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
@@ -2386,7 +2386,8 @@ void rtw_phy_init_tx_power(struct rtw_dev *rtwdev)
|
||||
void rtw_phy_config_swing_table(struct rtw_dev *rtwdev,
|
||||
struct rtw_swing_table *swing_table)
|
||||
{
|
||||
- const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
|
||||
+ const struct rtw_rfe_def *rfe_def = rtw_get_rfe_def(rtwdev);
|
||||
+ const struct rtw_pwr_track_tbl *tbl = rfe_def->pwr_track_tbl;
|
||||
u8 channel = rtwdev->hal.current_channel;
|
||||
|
||||
if (IS_CH_2G_BAND(channel)) {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index 1a41f1c31a06..1d232adbdd7e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -493,11 +493,6 @@ static const struct rtw_pwr_seq_cmd * const card_disable_flow_8703b[] = {
|
||||
NULL
|
||||
};
|
||||
|
||||
-static const struct rtw_rfe_def rtw8703b_rfe_defs[] = {
|
||||
- [0] = { .phy_pg_tbl = &rtw8703b_bb_pg_tbl,
|
||||
- .txpwr_lmt_tbl = &rtw8703b_txpwr_lmt_tbl,},
|
||||
-};
|
||||
-
|
||||
static const struct rtw_page_table page_table_8703b[] = {
|
||||
{12, 2, 2, 0, 1},
|
||||
{12, 2, 2, 0, 1},
|
||||
@@ -1818,6 +1813,12 @@ static const struct rtw_pwr_track_tbl rtw8703b_rtw_pwr_track_tbl = {
|
||||
.pwrtrk_xtal_p = rtw8703b_pwrtrk_xtal_p,
|
||||
};
|
||||
|
||||
+static const struct rtw_rfe_def rtw8703b_rfe_defs[] = {
|
||||
+ [0] = { .phy_pg_tbl = &rtw8703b_bb_pg_tbl,
|
||||
+ .txpwr_lmt_tbl = &rtw8703b_txpwr_lmt_tbl,
|
||||
+ .pwr_track_tbl = &rtw8703b_rtw_pwr_track_tbl, },
|
||||
+};
|
||||
+
|
||||
/* Shared-Antenna Coex Table */
|
||||
static const struct coex_table_para table_sant_8703b[] = {
|
||||
{0xffffffff, 0xffffffff}, /* case-0 */
|
||||
@@ -1997,7 +1998,6 @@ const struct rtw_chip_info rtw8703b_hw_spec = {
|
||||
.rfe_defs_size = ARRAY_SIZE(rtw8703b_rfe_defs),
|
||||
|
||||
.iqk_threshold = 8,
|
||||
- .pwr_track_tbl = &rtw8703b_rtw_pwr_track_tbl,
|
||||
|
||||
/* WOWLAN firmware exists, but not implemented yet */
|
||||
.wow_fw_name = "rtw88/rtw8703b_wow_fw.bin",
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
index 1d99bb89ef1d..eeca31bf71f1 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -2020,11 +2020,6 @@ static const struct rtw_intf_phy_para_table phy_para_table_8723d = {
|
||||
.n_gen1_para = ARRAY_SIZE(pcie_gen1_param_8723d),
|
||||
};
|
||||
|
||||
-static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
|
||||
- [0] = { .phy_pg_tbl = &rtw8723d_bb_pg_tbl,
|
||||
- .txpwr_lmt_tbl = &rtw8723d_txpwr_lmt_tbl,},
|
||||
-};
|
||||
-
|
||||
static const u8 rtw8723d_pwrtrk_2gb_n[] = {
|
||||
0, 0, 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5, 5,
|
||||
6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 10, 10
|
||||
@@ -2088,6 +2083,12 @@ static const struct rtw_pwr_track_tbl rtw8723d_rtw_pwr_track_tbl = {
|
||||
.pwrtrk_xtal_n = rtw8723d_pwrtrk_xtal_n,
|
||||
};
|
||||
|
||||
+static const struct rtw_rfe_def rtw8723d_rfe_defs[] = {
|
||||
+ [0] = { .phy_pg_tbl = &rtw8723d_bb_pg_tbl,
|
||||
+ .txpwr_lmt_tbl = &rtw8723d_txpwr_lmt_tbl,
|
||||
+ .pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl, },
|
||||
+};
|
||||
+
|
||||
static const struct rtw_reg_domain coex_info_hw_regs_8723d[] = {
|
||||
{0x948, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0x67, BIT(7), RTW_REG_DOMAIN_MAC8},
|
||||
@@ -2159,7 +2160,6 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.rfe_defs = rtw8723d_rfe_defs,
|
||||
.rfe_defs_size = ARRAY_SIZE(rtw8723d_rfe_defs),
|
||||
.rx_ldpc = false,
|
||||
- .pwr_track_tbl = &rtw8723d_rtw_pwr_track_tbl,
|
||||
.iqk_threshold = 8,
|
||||
.ampdu_density = IEEE80211_HT_MPDU_DENSITY_16,
|
||||
.max_scan_ie_len = IEEE80211_MAX_DATA_LEN,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723x.c b/drivers/net/wireless/realtek/rtw88/rtw8723x.c
|
||||
index 0d0b6c2cb9aa..69f73cb5b4cd 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723x.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723x.c
|
||||
@@ -595,7 +595,8 @@ void __rtw8723x_pwrtrack_set_xtal(struct rtw_dev *rtwdev, u8 therm_path,
|
||||
u8 delta)
|
||||
{
|
||||
struct rtw_dm_info *dm_info = &rtwdev->dm_info;
|
||||
- const struct rtw_pwr_track_tbl *tbl = rtwdev->chip->pwr_track_tbl;
|
||||
+ const struct rtw_rfe_def *rfe_def = rtw_get_rfe_def(rtwdev);
|
||||
+ const struct rtw_pwr_track_tbl *tbl = rfe_def->pwr_track_tbl;
|
||||
const s8 *pwrtrk_xtal;
|
||||
s8 xtal_cap;
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 39dc8244f744..0270225b9c20 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1581,13 +1581,6 @@ static const struct rtw_intf_phy_para_table phy_para_table_8821c = {
|
||||
.n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8821c),
|
||||
};
|
||||
|
||||
-static const struct rtw_rfe_def rtw8821c_rfe_defs[] = {
|
||||
- [0] = RTW_DEF_RFE(8821c, 0, 0),
|
||||
- [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
|
||||
- [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 2),
|
||||
- [6] = RTW_DEF_RFE(8821c, 0, 0),
|
||||
-};
|
||||
-
|
||||
static const struct rtw_hw_reg rtw8821c_dig[] = {
|
||||
[0] = { .addr = 0xc50, .mask = 0x7f },
|
||||
};
|
||||
@@ -1899,7 +1892,7 @@ static const u8 rtw8821c_pwrtrk_2g_cck_a_p[] = {
|
||||
5, 6, 6, 7, 7, 7, 8, 8, 9, 9, 9, 9, 9, 9
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_track_tbl rtw8821c_rtw_pwr_track_tbl = {
|
||||
+static const struct rtw_pwr_track_tbl rtw8821c_pwr_track_type0_tbl = {
|
||||
.pwrtrk_5gb_n[0] = rtw8821c_pwrtrk_5gb_n[0],
|
||||
.pwrtrk_5gb_n[1] = rtw8821c_pwrtrk_5gb_n[1],
|
||||
.pwrtrk_5gb_n[2] = rtw8821c_pwrtrk_5gb_n[2],
|
||||
@@ -1922,6 +1915,13 @@ static const struct rtw_pwr_track_tbl rtw8821c_rtw_pwr_track_tbl = {
|
||||
.pwrtrk_2g_ccka_p = rtw8821c_pwrtrk_2g_cck_a_p,
|
||||
};
|
||||
|
||||
+static const struct rtw_rfe_def rtw8821c_rfe_defs[] = {
|
||||
+ [0] = RTW_DEF_RFE(8821c, 0, 0, 0),
|
||||
+ [2] = RTW_DEF_RFE_EXT(8821c, 0, 0, 0, 2),
|
||||
+ [4] = RTW_DEF_RFE_EXT(8821c, 0, 0, 0, 2),
|
||||
+ [6] = RTW_DEF_RFE(8821c, 0, 0, 0),
|
||||
+};
|
||||
+
|
||||
static const struct rtw_reg_domain coex_info_hw_regs_8821c[] = {
|
||||
{0xCB0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0xCB4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
@@ -1994,7 +1994,6 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.rfe_defs = rtw8821c_rfe_defs,
|
||||
.rfe_defs_size = ARRAY_SIZE(rtw8821c_rfe_defs),
|
||||
.rx_ldpc = false,
|
||||
- .pwr_track_tbl = &rtw8821c_rtw_pwr_track_tbl,
|
||||
.iqk_threshold = 8,
|
||||
.bfer_su_max_num = 2,
|
||||
.bfer_mu_max_num = 1,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index ccabbe85be6f..6f51b613e095 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -2074,12 +2074,6 @@ static const struct rtw_intf_phy_para_table phy_para_table_8822b = {
|
||||
.n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8822b),
|
||||
};
|
||||
|
||||
-static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
|
||||
- [2] = RTW_DEF_RFE(8822b, 2, 2),
|
||||
- [3] = RTW_DEF_RFE(8822b, 3, 0),
|
||||
- [5] = RTW_DEF_RFE(8822b, 5, 5),
|
||||
-};
|
||||
-
|
||||
static const struct rtw_hw_reg rtw8822b_dig[] = {
|
||||
[0] = { .addr = 0xc50, .mask = 0x7f },
|
||||
[1] = { .addr = 0xe50, .mask = 0x7f },
|
||||
@@ -2434,7 +2428,7 @@ static const u8 rtw8822b_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
|
||||
10, 11, 11, 12, 12, 13, 13, 14, 14, 15
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = {
|
||||
+static const struct rtw_pwr_track_tbl rtw8822b_pwr_track_type0_tbl = {
|
||||
.pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
|
||||
.pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
|
||||
.pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822b_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
|
||||
@@ -2457,6 +2451,12 @@ static const struct rtw_pwr_track_tbl rtw8822b_rtw_pwr_track_tbl = {
|
||||
.pwrtrk_2g_ccka_p = rtw8822b_pwrtrk_2g_cck_a_p,
|
||||
};
|
||||
|
||||
+static const struct rtw_rfe_def rtw8822b_rfe_defs[] = {
|
||||
+ [2] = RTW_DEF_RFE(8822b, 2, 2, 0),
|
||||
+ [3] = RTW_DEF_RFE(8822b, 3, 0, 0),
|
||||
+ [5] = RTW_DEF_RFE(8822b, 5, 5, 0),
|
||||
+};
|
||||
+
|
||||
static const struct rtw_reg_domain coex_info_hw_regs_8822b[] = {
|
||||
{0xcb0, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
{0xcb4, MASKDWORD, RTW_REG_DOMAIN_MAC32},
|
||||
@@ -2537,7 +2537,6 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.rf_tbl = {&rtw8822b_rf_a_tbl, &rtw8822b_rf_b_tbl},
|
||||
.rfe_defs = rtw8822b_rfe_defs,
|
||||
.rfe_defs_size = ARRAY_SIZE(rtw8822b_rfe_defs),
|
||||
- .pwr_track_tbl = &rtw8822b_rtw_pwr_track_tbl,
|
||||
.iqk_threshold = 8,
|
||||
.bfer_su_max_num = 2,
|
||||
.bfer_mu_max_num = 1,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 3fa72af40aa4..563a9faec556 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -4884,16 +4884,6 @@ static const struct rtw_intf_phy_para_table phy_para_table_8822c = {
|
||||
.n_gen2_para = ARRAY_SIZE(pcie_gen2_param_8822c),
|
||||
};
|
||||
|
||||
-static const struct rtw_rfe_def rtw8822c_rfe_defs[] = {
|
||||
- [0] = RTW_DEF_RFE(8822c, 0, 0),
|
||||
- [1] = RTW_DEF_RFE(8822c, 0, 0),
|
||||
- [2] = RTW_DEF_RFE(8822c, 0, 0),
|
||||
- [3] = RTW_DEF_RFE(8822c, 0, 0),
|
||||
- [4] = RTW_DEF_RFE(8822c, 0, 0),
|
||||
- [5] = RTW_DEF_RFE(8822c, 0, 5),
|
||||
- [6] = RTW_DEF_RFE(8822c, 0, 0),
|
||||
-};
|
||||
-
|
||||
static const struct rtw_hw_reg rtw8822c_dig[] = {
|
||||
[0] = { .addr = 0x1d70, .mask = 0x7f },
|
||||
[1] = { .addr = 0x1d70, .mask = 0x7f00 },
|
||||
@@ -5239,7 +5229,7 @@ static const u8 rtw8822c_pwrtrk_2g_cck_a_p[RTW_PWR_TRK_TBL_SZ] = {
|
||||
18, 18, 19, 20, 21, 22, 23, 24, 24, 25
|
||||
};
|
||||
|
||||
-static const struct rtw_pwr_track_tbl rtw8822c_rtw_pwr_track_tbl = {
|
||||
+static const struct rtw_pwr_track_tbl rtw8822c_pwr_track_type0_tbl = {
|
||||
.pwrtrk_5gb_n[RTW_PWR_TRK_5G_1] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_1],
|
||||
.pwrtrk_5gb_n[RTW_PWR_TRK_5G_2] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_2],
|
||||
.pwrtrk_5gb_n[RTW_PWR_TRK_5G_3] = rtw8822c_pwrtrk_5gb_n[RTW_PWR_TRK_5G_3],
|
||||
@@ -5262,6 +5252,16 @@ static const struct rtw_pwr_track_tbl rtw8822c_rtw_pwr_track_tbl = {
|
||||
.pwrtrk_2g_ccka_p = rtw8822c_pwrtrk_2g_cck_a_p,
|
||||
};
|
||||
|
||||
+static const struct rtw_rfe_def rtw8822c_rfe_defs[] = {
|
||||
+ [0] = RTW_DEF_RFE(8822c, 0, 0, 0),
|
||||
+ [1] = RTW_DEF_RFE(8822c, 0, 0, 0),
|
||||
+ [2] = RTW_DEF_RFE(8822c, 0, 0, 0),
|
||||
+ [3] = RTW_DEF_RFE(8822c, 0, 0, 0),
|
||||
+ [4] = RTW_DEF_RFE(8822c, 0, 0, 0),
|
||||
+ [5] = RTW_DEF_RFE(8822c, 0, 5, 0),
|
||||
+ [6] = RTW_DEF_RFE(8822c, 0, 0, 0),
|
||||
+};
|
||||
+
|
||||
static const struct rtw_hw_reg_offset rtw8822c_edcca_th[] = {
|
||||
[EDCCA_TH_L2H_IDX] = {
|
||||
{.addr = 0x84c, .mask = MASKBYTE2}, .offset = 0x80
|
||||
@@ -5361,7 +5361,6 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.rfe_defs_size = ARRAY_SIZE(rtw8822c_rfe_defs),
|
||||
.en_dis_dpd = true,
|
||||
.dpd_ratemask = DIS_DPD_RATEALL,
|
||||
- .pwr_track_tbl = &rtw8822c_rtw_pwr_track_tbl,
|
||||
.iqk_threshold = 8,
|
||||
.lck_threshold = 8,
|
||||
.bfer_su_max_num = 2,
|
||||
--
|
||||
2.39.5
|
||||
|
@ -0,0 +1,32 @@
|
||||
From ebadcb81bd3167f9360cb86b92eee02a43a224b2 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:13:10 +0300
|
||||
Subject: [PATCH 13/24] wifi: rtw88: usb: Set pkt_info.ls for the reserved page
|
||||
|
||||
"ls" meaning "last segment". Without this RTL8812AU can't upload the
|
||||
reserved page in USB 2 mode. (Somehow it's fine in USB 3 mode.)
|
||||
|
||||
Also tested with RTL8822CU, RTL8812BU, RTL8811CU, RTL8723DU, RTL8811AU.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/e443f5d9-4b53-4f64-985c-64313ec80bef@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 1 +
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index a0ce3a306221..05025fed5b68 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -532,6 +532,7 @@ static int rtw_usb_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf,
|
||||
pkt_info.tx_pkt_size = size;
|
||||
pkt_info.qsel = TX_DESC_QSEL_BEACON;
|
||||
pkt_info.offset = chip->tx_pkt_desc_sz;
|
||||
+ pkt_info.ls = true;
|
||||
|
||||
return rtw_usb_write_data(rtwdev, &pkt_info, buf);
|
||||
}
|
||||
--
|
||||
2.39.5
|
||||
|
@ -0,0 +1,69 @@
|
||||
From 753c741b4474db92b0a4598481fca3b8120aaca9 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:13:45 +0300
|
||||
Subject: [PATCH 14/24] wifi: rtw88: Detect beacon loss with chips other than
|
||||
8822c
|
||||
|
||||
The driver is supposed to avoid entering LPS (power saving) when there
|
||||
is beacon loss, but only RTL8822C detects the beacon loss (because it
|
||||
has beacon filtering in the firmware).
|
||||
|
||||
Detect beacon loss with the other chips by checking if we received less
|
||||
than half the expected number of beacons in the last 2-second interval.
|
||||
|
||||
This gets rid of the occasional "failed to get tx report from firmware"
|
||||
warnings with RTL8821AU. It may also avoid some disconnections.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/f52b2fcf-bf94-48bc-89bd-e55ebc3a2f2d@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 18 ++++++++++++++++++
|
||||
1 file changed, 18 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 0b86a0a939c3..876d0b126ed7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -202,6 +202,21 @@ static void rtw_vif_watch_dog_iter(void *data, struct ieee80211_vif *vif)
|
||||
rtwvif->stats.rx_cnt = 0;
|
||||
}
|
||||
|
||||
+static void rtw_sw_beacon_loss_check(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_vif *rtwvif, int received_beacons)
|
||||
+{
|
||||
+ int watchdog_delay = 2000000 / 1024; /* TU */
|
||||
+ int beacon_int, expected_beacons;
|
||||
+
|
||||
+ if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER) || !rtwvif)
|
||||
+ return;
|
||||
+
|
||||
+ beacon_int = rtwvif_to_vif(rtwvif)->bss_conf.beacon_int;
|
||||
+ expected_beacons = DIV_ROUND_UP(watchdog_delay, beacon_int);
|
||||
+
|
||||
+ rtwdev->beacon_loss = received_beacons < expected_beacons / 2;
|
||||
+}
|
||||
+
|
||||
/* process TX/RX statistics periodically for hardware,
|
||||
* the information helps hardware to enhance performance
|
||||
*/
|
||||
@@ -212,6 +227,7 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
struct rtw_traffic_stats *stats = &rtwdev->stats;
|
||||
struct rtw_watch_dog_iter_data data = {};
|
||||
bool busy_traffic = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
|
||||
+ int received_beacons = rtwdev->dm_info.cur_pkt_count.num_bcn_pkt;
|
||||
u32 tx_unicast_mbps, rx_unicast_mbps;
|
||||
bool ps_active;
|
||||
|
||||
@@ -270,6 +286,8 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
*/
|
||||
rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data);
|
||||
|
||||
+ rtw_sw_beacon_loss_check(rtwdev, data.rtwvif, received_beacons);
|
||||
+
|
||||
/* fw supports only one station associated to enter lps, if there are
|
||||
* more than two stations associated to the AP, then we can not enter
|
||||
* lps, because fw does not handle the overlapped beacon interval
|
||||
--
|
||||
2.39.5
|
||||
|
@ -0,0 +1,73 @@
|
||||
From e79edfcfe5de7f916607ebb09c991bc1d5c8a8e7 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:14:12 +0300
|
||||
Subject: [PATCH 15/24] wifi: rtw88: coex: Support chips without a scoreboard
|
||||
|
||||
All the chips currently supported have a "scoreboard": the chip keeps
|
||||
track of certain things related to bluetooth, for example, whether
|
||||
bluetooth is active. The information can be read from register 0xaa.
|
||||
|
||||
RTL8821AU doesn't have this. Implement bluetooth activity detection in
|
||||
rtw_coex_monitor_bt_enable() based on the bluetooth TX/RX counters.
|
||||
|
||||
This is mostly important for RTL8811AU, the version of RTL8821AU without
|
||||
bluetooth. Without this change, the driver thinks bluetooth is active
|
||||
and the wifi speeds are low.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/5058f23d-2086-42cd-82ad-eef31a348467@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 18 ++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 1 +
|
||||
2 files changed, 19 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index 3bd7f55f4b18..e616c5271b84 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -494,11 +494,29 @@ static void rtw_coex_monitor_bt_enable(struct rtw_dev *rtwdev)
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
struct rtw_coex_dm *coex_dm = &coex->dm;
|
||||
bool bt_disabled = false;
|
||||
+ bool bt_active = true;
|
||||
u16 score_board;
|
||||
|
||||
if (chip->scbd_support) {
|
||||
score_board = rtw_coex_read_scbd(rtwdev);
|
||||
bt_disabled = !(score_board & COEX_SCBD_ONOFF);
|
||||
+ } else {
|
||||
+ if (coex_stat->hi_pri_tx == 0 && coex_stat->hi_pri_rx == 0 &&
|
||||
+ coex_stat->lo_pri_tx == 0 && coex_stat->lo_pri_rx == 0)
|
||||
+ bt_active = false;
|
||||
+
|
||||
+ if (coex_stat->hi_pri_tx == 0xffff && coex_stat->hi_pri_rx == 0xffff &&
|
||||
+ coex_stat->lo_pri_tx == 0xffff && coex_stat->lo_pri_rx == 0xffff)
|
||||
+ bt_active = false;
|
||||
+
|
||||
+ if (bt_active) {
|
||||
+ coex_stat->bt_disable_cnt = 0;
|
||||
+ bt_disabled = false;
|
||||
+ } else {
|
||||
+ coex_stat->bt_disable_cnt++;
|
||||
+ if (coex_stat->bt_disable_cnt >= 10)
|
||||
+ bt_disabled = true;
|
||||
+ }
|
||||
}
|
||||
|
||||
if (coex_stat->bt_disabled != bt_disabled) {
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index e01964db8f67..65c7acea41af 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1494,6 +1494,7 @@ struct rtw_coex_stat {
|
||||
u8 bt_hid_slot;
|
||||
u8 bt_a2dp_bitpool;
|
||||
u8 bt_iqk_state;
|
||||
+ u8 bt_disable_cnt;
|
||||
|
||||
u16 wl_beacon_interval;
|
||||
u8 wl_noisy_level;
|
||||
--
|
||||
2.39.5
|
||||
|
@ -0,0 +1,76 @@
|
||||
From 30a80c5357062ce1008ae6ed279bce2b71aac244 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:14:45 +0300
|
||||
Subject: [PATCH 16/24] wifi: rtw88: 8821a: Regularly ask for BT info updates
|
||||
|
||||
The RTL8821AU firmware sends C2H_BT_INFO by itself when bluetooth
|
||||
headphones are connected, but not when they are disconnected. This leads
|
||||
to the coexistence code still using the A2DP algorithm long after the
|
||||
headphones are disconnected, which means the wifi speeds are much lower
|
||||
than they should be. Work around this by asking for updates every two
|
||||
seconds if the chip is RTL8821AU.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/358acdd2-6aae-46c1-9c66-fcce4e700b96@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/coex.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/coex.h | 11 +++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 1 +
|
||||
3 files changed, 13 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
index e616c5271b84..64904278ddad 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||||
@@ -446,7 +446,7 @@ static void rtw_coex_check_rfk(struct rtw_dev *rtwdev)
|
||||
}
|
||||
}
|
||||
|
||||
-static void rtw_coex_query_bt_info(struct rtw_dev *rtwdev)
|
||||
+void rtw_coex_query_bt_info(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_coex *coex = &rtwdev->coex;
|
||||
struct rtw_coex_stat *coex_stat = &coex->stat;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/coex.h b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
index 57cf29da9ea4..c398be8391f7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/coex.h
|
||||
@@ -384,6 +384,7 @@ u32 rtw_coex_read_indirect_reg(struct rtw_dev *rtwdev, u16 addr);
|
||||
void rtw_coex_write_indirect_reg(struct rtw_dev *rtwdev, u16 addr,
|
||||
u32 mask, u32 val);
|
||||
void rtw_coex_write_scbd(struct rtw_dev *rtwdev, u16 bitpos, bool set);
|
||||
+void rtw_coex_query_bt_info(struct rtw_dev *rtwdev);
|
||||
|
||||
void rtw_coex_bt_relink_work(struct work_struct *work);
|
||||
void rtw_coex_bt_reenable_work(struct work_struct *work);
|
||||
@@ -419,4 +420,14 @@ static inline bool rtw_coex_disabled(struct rtw_dev *rtwdev)
|
||||
return coex_stat->bt_disabled;
|
||||
}
|
||||
|
||||
+static inline void rtw_coex_active_query_bt_info(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ /* The RTL8821AU firmware doesn't send C2H_BT_INFO by itself
|
||||
+ * when bluetooth headphones are disconnected, so we have to
|
||||
+ * ask for it regularly.
|
||||
+ */
|
||||
+ if (rtwdev->chip->id == RTW_CHIP_TYPE_8821A && rtwdev->efuse.btcoex)
|
||||
+ rtw_coex_query_bt_info(rtwdev);
|
||||
+}
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 876d0b126ed7..a36c861a3023 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -274,6 +274,7 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
rtw_leave_lps(rtwdev);
|
||||
rtw_coex_wl_status_check(rtwdev);
|
||||
rtw_coex_query_bt_hid_list(rtwdev);
|
||||
+ rtw_coex_active_query_bt_info(rtwdev);
|
||||
|
||||
rtw_phy_dynamic_mechanism(rtwdev);
|
||||
|
||||
--
|
||||
2.39.5
|
||||
|
42
packages/linux/patches/rtlwifi/6.13/0017-wifi-rtw88-8812a-Mitigate-beacon-loss.patch
vendored
Normal file
42
packages/linux/patches/rtlwifi/6.13/0017-wifi-rtw88-8812a-Mitigate-beacon-loss.patch
vendored
Normal file
@ -0,0 +1,42 @@
|
||||
From fa93ac195068575da6bb5484bac9f95561d3f92c Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 23 Oct 2024 17:15:13 +0300
|
||||
Subject: [PATCH 17/24] wifi: rtw88: 8812a: Mitigate beacon loss
|
||||
|
||||
The RTL8812AU has a reception problem, maybe only in the 5 GHz band.
|
||||
Sometimes, in some positions, it stops receiving anything even though
|
||||
the distance to the AP is only ~3 meters and there are no obstacles.
|
||||
Moving it a few centimeters fixes it.
|
||||
|
||||
Switch the initial gain to maximum coverage when there is beacon loss.
|
||||
This only helps sometimes. This is similar to what the official driver
|
||||
does.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/203f5043-4fe1-4f35-8b8f-d3b6f44e1fd9@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/phy.c | 7 +++++++
|
||||
1 file changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
index b52108f2b147..40c36118f579 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/phy.c
|
||||
@@ -530,6 +530,13 @@ static void rtw_phy_dig(struct rtw_dev *rtwdev)
|
||||
*/
|
||||
rtw_phy_dig_recorder(dm_info, cur_igi, fa_cnt);
|
||||
|
||||
+ /* Mitigate beacon loss and connectivity issues, mainly (only?)
|
||||
+ * in the 5 GHz band
|
||||
+ */
|
||||
+ if (rtwdev->chip->id == RTW_CHIP_TYPE_8812A && rtwdev->beacon_loss &&
|
||||
+ linked && dm_info->total_fa_cnt < DIG_PERF_FA_TH_EXTRA_HIGH)
|
||||
+ cur_igi = DIG_CVRG_MIN;
|
||||
+
|
||||
if (cur_igi != pre_igi)
|
||||
rtw_phy_dig_write(rtwdev, cur_igi);
|
||||
}
|
||||
--
|
||||
2.39.5
|
||||
|
2871
packages/linux/patches/rtlwifi/6.13/0018-wifi-rtw88-Add-rtw8812a_table.-c-h.patch
vendored
Normal file
2871
packages/linux/patches/rtlwifi/6.13/0018-wifi-rtw88-Add-rtw8812a_table.-c-h.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2404
packages/linux/patches/rtlwifi/6.13/0019-wifi-rtw88-Add-rtw8821a_table.-c-h.patch
vendored
Normal file
2404
packages/linux/patches/rtlwifi/6.13/0019-wifi-rtw88-Add-rtw8821a_table.-c-h.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
2196
packages/linux/patches/rtlwifi/6.13/0020-wifi-rtw88-Add-rtw88xxa.-c-h.patch
vendored
Normal file
2196
packages/linux/patches/rtlwifi/6.13/0020-wifi-rtw88-Add-rtw88xxa.-c-h.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1239
packages/linux/patches/rtlwifi/6.13/0021-wifi-rtw88-Add-rtw8821a.-c-h.patch
vendored
Normal file
1239
packages/linux/patches/rtlwifi/6.13/0021-wifi-rtw88-Add-rtw8821a.-c-h.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
1144
packages/linux/patches/rtlwifi/6.13/0022-wifi-rtw88-Add-rtw8812a.-c-h.patch
vendored
Normal file
1144
packages/linux/patches/rtlwifi/6.13/0022-wifi-rtw88-Add-rtw8812a.-c-h.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
89
packages/linux/patches/rtlwifi/6.13/0023-wifi-rtw88-Add-rtw8821au.c-and-rtw8812au.c.patch
vendored
Normal file
89
packages/linux/patches/rtlwifi/6.13/0023-wifi-rtw88-Add-rtw8821au.c-and-rtw8812au.c.patch
vendored
Normal file
@ -0,0 +1,89 @@
|
||||
From 1f08e8b01d83e04439f4c607d3daa94751ce2b90 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 30 Oct 2024 20:29:28 +0200
|
||||
Subject: [PATCH 23/24] wifi: rtw88: Add rtw8821au.c and rtw8812au.c
|
||||
|
||||
These are the entry points for the new modules rtw88_8821au
|
||||
(RTL8821AU/RTL8811AU) and rtw88_8812au (RTL8812AU).
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/91c495f8-a607-429b-8bc0-5a45d3c1393e@gmail.com
|
||||
---
|
||||
.../net/wireless/realtek/rtw88/rtw8812au.c | 28 +++++++++++++++++++
|
||||
.../net/wireless/realtek/rtw88/rtw8821au.c | 28 +++++++++++++++++++
|
||||
2 files changed, 56 insertions(+)
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8812au.c
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821au.c
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8812au.c b/drivers/net/wireless/realtek/rtw88/rtw8812au.c
|
||||
new file mode 100644
|
||||
index 000000000000..4da69590a423
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8812au.c
|
||||
@@ -0,0 +1,28 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2024 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include "main.h"
|
||||
+#include "rtw8812a.h"
|
||||
+#include "usb.h"
|
||||
+
|
||||
+static const struct usb_device_id rtw_8812au_id_table[] = {
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2604, 0x0012, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(usb, rtw_8812au_id_table);
|
||||
+
|
||||
+static struct usb_driver rtw_8812au_driver = {
|
||||
+ .name = "rtw_8812au",
|
||||
+ .id_table = rtw_8812au_id_table,
|
||||
+ .probe = rtw_usb_probe,
|
||||
+ .disconnect = rtw_usb_disconnect,
|
||||
+};
|
||||
+module_usb_driver(rtw_8812au_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8812au driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821au.c b/drivers/net/wireless/realtek/rtw88/rtw8821au.c
|
||||
new file mode 100644
|
||||
index 000000000000..730018773e1c
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821au.c
|
||||
@@ -0,0 +1,28 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2024 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#include <linux/module.h>
|
||||
+#include <linux/usb.h>
|
||||
+#include "main.h"
|
||||
+#include "rtw8821a.h"
|
||||
+#include "usb.h"
|
||||
+
|
||||
+static const struct usb_device_id rtw_8821au_id_table[] = {
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011e, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
|
||||
+ {},
|
||||
+};
|
||||
+MODULE_DEVICE_TABLE(usb, rtw_8821au_id_table);
|
||||
+
|
||||
+static struct usb_driver rtw_8821au_driver = {
|
||||
+ .name = "rtw_8821au",
|
||||
+ .id_table = rtw_8821au_id_table,
|
||||
+ .probe = rtw_usb_probe,
|
||||
+ .disconnect = rtw_usb_disconnect,
|
||||
+};
|
||||
+module_usb_driver(rtw_8821au_driver);
|
||||
+
|
||||
+MODULE_AUTHOR("Bitterblue Smith <rtl8821cerfe2@gmail.com>");
|
||||
+MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821au/8811au driver");
|
||||
+MODULE_LICENSE("Dual BSD/GPL");
|
||||
--
|
||||
2.39.5
|
||||
|
123
packages/linux/patches/rtlwifi/6.13/0024-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver.patch
vendored
Normal file
123
packages/linux/patches/rtlwifi/6.13/0024-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver.patch
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
From ed2463a8afecd7ca59d00256367ac0447b75d0dc Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 30 Oct 2024 20:31:28 +0200
|
||||
Subject: [PATCH 24/24] wifi: rtw88: Enable the new RTL8821AU/RTL8812AU drivers
|
||||
|
||||
These are older Wifi 5 chips. RTL8821AU is 1x1, with or without
|
||||
Bluetooth. RTL8812AU is 2x2, without Bluetooth.
|
||||
|
||||
Beamforming is not implemented. It looks like these chips need a
|
||||
different implementation than what is in bf.c.
|
||||
|
||||
Speed tests with RTL8821AU: 137 Mbps download, 144 Mbps upload.
|
||||
Speed tests with RTL8812AU: 344 Mbps download, 387 Mbps upload.
|
||||
|
||||
Station mode and AP mode were tested.
|
||||
|
||||
Bluetooth coexistence works. I used my Bluetooth headphones for
|
||||
several days, listening to music and watching videos. There is only
|
||||
a problem with the wifi speeds with one router:
|
||||
|
||||
With ISP's HG6544C router:
|
||||
Official driver: 3/5 Mbps.
|
||||
rtw88: a bit more, but not steady at all. Not enough to watch a 1080p
|
||||
Youtube video.
|
||||
|
||||
With my D-Link Eagle R32 router running Openwrt, on the same channel:
|
||||
Official driver: 6/10 Mbps.
|
||||
rtw88: download starts around 30, climbs to 50 / upload is 10 Mbps.
|
||||
I can watch a 1080p Youtube video.
|
||||
|
||||
The music doesn't cut out during any speed tests.
|
||||
|
||||
I also tested transferring files to and from my phone. I don't have
|
||||
other types of Bluetooth devices to test.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/0b8e8093-8103-4999-86bf-0055ec52ea64@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/Kconfig | 33 +++++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/Makefile | 15 ++++++++++
|
||||
2 files changed, 48 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
index 02b0d698413b..733b3e58da51 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/Kconfig
|
||||
@@ -43,6 +43,17 @@ config RTW88_8723D
|
||||
config RTW88_8821C
|
||||
tristate
|
||||
|
||||
+config RTW88_88XXA
|
||||
+ tristate
|
||||
+
|
||||
+config RTW88_8821A
|
||||
+ tristate
|
||||
+ select RTW88_88XXA
|
||||
+
|
||||
+config RTW88_8812A
|
||||
+ tristate
|
||||
+ select RTW88_88XXA
|
||||
+
|
||||
config RTW88_8822BE
|
||||
tristate "Realtek 8822BE PCI wireless network adapter"
|
||||
depends on PCI
|
||||
@@ -189,6 +200,28 @@ config RTW88_8821CU
|
||||
|
||||
802.11ac USB wireless network adapter
|
||||
|
||||
+config RTW88_8821AU
|
||||
+ tristate "Realtek 8821AU/8811AU USB wireless network adapter"
|
||||
+ depends on USB
|
||||
+ select RTW88_CORE
|
||||
+ select RTW88_USB
|
||||
+ select RTW88_8821A
|
||||
+ help
|
||||
+ Select this option will enable support for 8821AU and 8811AU chipset
|
||||
+
|
||||
+ 802.11ac USB wireless network adapter
|
||||
+
|
||||
+config RTW88_8812AU
|
||||
+ tristate "Realtek 8812AU USB wireless network adapter"
|
||||
+ depends on USB
|
||||
+ select RTW88_CORE
|
||||
+ select RTW88_USB
|
||||
+ select RTW88_8812A
|
||||
+ help
|
||||
+ Select this option will enable support for 8812AU chipset
|
||||
+
|
||||
+ 802.11ac USB wireless network adapter
|
||||
+
|
||||
config RTW88_DEBUG
|
||||
bool "Realtek rtw88 debug support"
|
||||
depends on RTW88_CORE
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
index 8f47359b4380..f0b49f5a8a5a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
@@ -77,6 +77,21 @@ rtw88_8821cs-objs := rtw8821cs.o
|
||||
obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o
|
||||
rtw88_8821cu-objs := rtw8821cu.o
|
||||
|
||||
+obj-$(CONFIG_RTW88_88XXA) += rtw88_88xxa.o
|
||||
+rtw88_88xxa-objs := rtw88xxa.o
|
||||
+
|
||||
+obj-$(CONFIG_RTW88_8821A) += rtw88_8821a.o
|
||||
+rtw88_8821a-objs := rtw8821a.o rtw8821a_table.o
|
||||
+
|
||||
+obj-$(CONFIG_RTW88_8812A) += rtw88_8812a.o
|
||||
+rtw88_8812a-objs := rtw8812a.o rtw8812a_table.o
|
||||
+
|
||||
+obj-$(CONFIG_RTW88_8821AU) += rtw88_8821au.o
|
||||
+rtw88_8821au-objs := rtw8821au.o
|
||||
+
|
||||
+obj-$(CONFIG_RTW88_8812AU) += rtw88_8812au.o
|
||||
+rtw88_8812au-objs := rtw8812au.o
|
||||
+
|
||||
obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o
|
||||
rtw88_pci-objs := pci.o
|
||||
|
||||
--
|
||||
2.39.5
|
||||
|
@ -0,0 +1,84 @@
|
||||
From 7b5ce65d90187f0944e70dc5741aa0edfac926f4 Mon Sep 17 00:00:00 2001
|
||||
From: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Date: Wed, 6 Nov 2024 15:55:31 +0200
|
||||
Subject: [PATCH] wifi: rtw88: 8821au: Add additional devices to the USB_DEVICE
|
||||
list
|
||||
|
||||
These are the entries that Nick Morrow provided. From
|
||||
https://github.com/morrownr/8821au-20210708
|
||||
|
||||
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/da05b866-a9ff-428c-a008-35e8cf200a98@gmail.com
|
||||
---
|
||||
.../net/wireless/realtek/rtw88/rtw8821au.c | 52 ++++++++++++++++++-
|
||||
1 file changed, 51 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821au.c b/drivers/net/wireless/realtek/rtw88/rtw8821au.c
|
||||
index 730018773e1c..a01744b64e8d 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821au.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821au.c
|
||||
@@ -9,8 +9,58 @@
|
||||
#include "usb.h"
|
||||
|
||||
static const struct usb_device_id rtw_8821au_id_table[] = {
|
||||
- { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011e, 0xff, 0xff, 0xff),
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0811, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0820, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0821, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8822, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x0823, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0xa811, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x0242, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Buffalo */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x029b, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Buffalo */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x04bb, 0x0953, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* I-O DATA */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x4007, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* ELECOM */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400e, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* ELECOM */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x056e, 0x400f, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* ELECOM */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9052, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Netgear */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0023, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* HAWKING */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3314, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* D-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3318, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* D-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab32, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Planex */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x804b, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TRENDnet */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011e, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TP Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x011f, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TP Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0120, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* TP Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x3823, 0x6249, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Obihai */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa811, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa812, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa813, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xb611, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8821a_hw_spec) }, /* Edimax */
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, rtw_8821au_id_table);
|
||||
--
|
||||
2.43.0
|
||||
|
98
packages/linux/patches/rtlwifi/6.14/0026-wifi-rtw88-8812au-Add-more-device-IDs.patch
vendored
Normal file
98
packages/linux/patches/rtlwifi/6.14/0026-wifi-rtw88-8812au-Add-more-device-IDs.patch
vendored
Normal file
@ -0,0 +1,98 @@
|
||||
From 1ee6ff9ae3c1a9eda9081f9db04f85d3a7352d38 Mon Sep 17 00:00:00 2001
|
||||
From: Nick Morrow <usbwifi2024@gmail.com>
|
||||
Date: Wed, 6 Nov 2024 15:57:10 +0200
|
||||
Subject: [PATCH] wifi: rtw88: 8812au: Add more device IDs
|
||||
|
||||
From https://github.com/morrownr/8812au-20210820.
|
||||
|
||||
Signed-off-by: Nick Morrow <usbwifi2024@gmail.com>
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/31b7ee6b-f96d-43e0-a32f-a9eb1174a0c1@gmail.com
|
||||
---
|
||||
.../net/wireless/realtek/rtw88/rtw8812au.c | 68 ++++++++++++++++++-
|
||||
1 file changed, 67 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8812au.c b/drivers/net/wireless/realtek/rtw88/rtw8812au.c
|
||||
index 4da69590a423..e18995f4cc78 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8812au.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8812au.c
|
||||
@@ -9,8 +9,74 @@
|
||||
#include "usb.h"
|
||||
|
||||
static const struct usb_device_id rtw_8812au_id_table[] = {
|
||||
- { USB_DEVICE_AND_INTERFACE_INFO(0x2604, 0x0012, 0xff, 0xff, 0xff),
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x8812, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881a, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881b, 0xff, 0xff, 0xff),
|
||||
.driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(RTW_USB_VENDOR_ID_REALTEK, 0x881c, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) },
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0409, 0x0408, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* NEC */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0411, 0x025d, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Buffalo */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x04bb, 0x0952, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* I-O DATA */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x1106, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Belkin */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x050d, 0x1109, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Belkin */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0586, 0x3426, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* ZyXEL */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0789, 0x016e, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Logitec */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x07b8, 0x8812, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Abocom */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0846, 0x9051, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Netgear */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0b05, 0x17d2, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* ASUS */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0df6, 0x0074, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Sitecom */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x0e66, 0x0022, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Hawking */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x1058, 0x0632, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* WD */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x13b1, 0x003f, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Linksys */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x148f, 0x9097, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Amped Wireless */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x1740, 0x0100, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* EnGenius */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x330e, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3313, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3315, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3316, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* D-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2019, 0xab30, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Planex */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x20f4, 0x805b, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TRENDnet */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0101, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0103, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010d, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010e, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x010f, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0122, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* TP-Link */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x2604, 0x0012, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Tenda */
|
||||
+ { USB_DEVICE_AND_INTERFACE_INFO(0x7392, 0xa822, 0xff, 0xff, 0xff),
|
||||
+ .driver_info = (kernel_ulong_t)&(rtw8812a_hw_spec) }, /* Edimax */
|
||||
{},
|
||||
};
|
||||
MODULE_DEVICE_TABLE(usb, rtw_8812au_id_table);
|
||||
--
|
||||
2.43.0
|
||||
|
90
packages/linux/patches/rtlwifi/6.14/0027-wifi-rtw88-usb-Support-USB-3-with-RTL8812AU.patch
vendored
Normal file
90
packages/linux/patches/rtlwifi/6.14/0027-wifi-rtw88-usb-Support-USB-3-with-RTL8812AU.patch
vendored
Normal file
@ -0,0 +1,90 @@
|
||||
From 82a35723a67c29f685d7b518962154a73b7163a2 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 14 Nov 2024 17:46:08 +0200
|
||||
Subject: [PATCH] wifi: rtw88: usb: Support USB 3 with RTL8812AU
|
||||
|
||||
Add the function to automatically switch the RTL8812AU into USB 3 mode.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/19cda72b-f1f1-4b69-8369-0e4376b646bf@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 44 ++++++++++++++++++++++--
|
||||
1 file changed, 42 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 8d6db68246f1..db1769a4b617 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -930,6 +930,32 @@ static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev,
|
||||
usb_set_intfdata(intf, NULL);
|
||||
}
|
||||
|
||||
+static int rtw_usb_switch_mode_old(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
|
||||
+ enum usb_device_speed cur_speed = rtwusb->udev->speed;
|
||||
+ u8 hci_opt;
|
||||
+
|
||||
+ if (cur_speed == USB_SPEED_HIGH) {
|
||||
+ hci_opt = rtw_read8(rtwdev, REG_HCI_OPT_CTRL);
|
||||
+
|
||||
+ if ((hci_opt & (BIT(2) | BIT(3))) != BIT(3)) {
|
||||
+ rtw_write8(rtwdev, REG_HCI_OPT_CTRL, 0x8);
|
||||
+ rtw_write8(rtwdev, REG_SYS_SDIO_CTRL, 0x2);
|
||||
+ rtw_write8(rtwdev, REG_ACLK_MON, 0x1);
|
||||
+ rtw_write8(rtwdev, 0x3d, 0x3);
|
||||
+ /* usb disconnect */
|
||||
+ rtw_write8(rtwdev, REG_SYS_PW_CTRL + 1, 0x80);
|
||||
+ return 1;
|
||||
+ }
|
||||
+ } else if (cur_speed == USB_SPEED_SUPER) {
|
||||
+ rtw_write8_clr(rtwdev, REG_SYS_SDIO_CTRL, BIT(1));
|
||||
+ rtw_write8_clr(rtwdev, REG_ACLK_MON, BIT(0));
|
||||
+ }
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int rtw_usb_switch_mode_new(struct rtw_dev *rtwdev)
|
||||
{
|
||||
enum usb_device_speed cur_speed;
|
||||
@@ -979,11 +1005,22 @@ static int rtw_usb_switch_mode_new(struct rtw_dev *rtwdev)
|
||||
return 1;
|
||||
}
|
||||
|
||||
+static bool rtw_usb3_chip_old(u8 chip_id)
|
||||
+{
|
||||
+ return chip_id == RTW_CHIP_TYPE_8812A;
|
||||
+}
|
||||
+
|
||||
+static bool rtw_usb3_chip_new(u8 chip_id)
|
||||
+{
|
||||
+ return chip_id == RTW_CHIP_TYPE_8822C ||
|
||||
+ chip_id == RTW_CHIP_TYPE_8822B;
|
||||
+}
|
||||
+
|
||||
static int rtw_usb_switch_mode(struct rtw_dev *rtwdev)
|
||||
{
|
||||
u8 id = rtwdev->chip->id;
|
||||
|
||||
- if (id != RTW_CHIP_TYPE_8822C && id != RTW_CHIP_TYPE_8822B)
|
||||
+ if (!rtw_usb3_chip_new(id) && !rtw_usb3_chip_old(id))
|
||||
return 0;
|
||||
|
||||
if (!rtwdev->efuse.usb_mode_switch) {
|
||||
@@ -998,7 +1035,10 @@ static int rtw_usb_switch_mode(struct rtw_dev *rtwdev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
- return rtw_usb_switch_mode_new(rtwdev);
|
||||
+ if (rtw_usb3_chip_old(id))
|
||||
+ return rtw_usb_switch_mode_old(rtwdev);
|
||||
+ else
|
||||
+ return rtw_usb_switch_mode_new(rtwdev);
|
||||
}
|
||||
|
||||
int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,70 @@
|
||||
From ce5dea83ee8f945203144fb891fdcb978216e45a Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 14 Nov 2024 17:48:09 +0200
|
||||
Subject: [PATCH] wifi: rtw88: usb: Enable RX aggregation for 8821au/8812au
|
||||
|
||||
USB RX aggregation improves the RX speed on certain ARM systems, like
|
||||
the NanoPi NEO Core2. With RTL8811AU, before: 30 Mbps, after: 224 Mbps.
|
||||
|
||||
The out-of-tree driver uses aggregation size of 7 in USB 3 mode, but
|
||||
that doesn't work here. rtw88 advertises support for receiving AMSDU
|
||||
in AMPDU, so the AP sends larger frames, up to ~5100 bytes. With a size
|
||||
of 7 RTL8812AU frequently tries to aggregate more frames than will fit
|
||||
in 32768 bytes. Use a size of 6 instead.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/63012163-a425-4b15-b830-43f279c06b73@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 28 ++++++++++++++++++++++++
|
||||
1 file changed, 28 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index db1769a4b617..be193c7add77 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -789,6 +789,30 @@ static void rtw_usb_dynamic_rx_agg_v1(struct rtw_dev *rtwdev, bool enable)
|
||||
rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
|
||||
}
|
||||
|
||||
+static void rtw_usb_dynamic_rx_agg_v2(struct rtw_dev *rtwdev, bool enable)
|
||||
+{
|
||||
+ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
|
||||
+ u8 size, timeout;
|
||||
+ u16 val16;
|
||||
+
|
||||
+ if (!enable) {
|
||||
+ size = 0x0;
|
||||
+ timeout = 0x1;
|
||||
+ } else if (rtwusb->udev->speed == USB_SPEED_SUPER) {
|
||||
+ size = 0x6;
|
||||
+ timeout = 0x1a;
|
||||
+ } else {
|
||||
+ size = 0x5;
|
||||
+ timeout = 0x20;
|
||||
+ }
|
||||
+
|
||||
+ val16 = u16_encode_bits(size, BIT_RXDMA_AGG_PG_TH) |
|
||||
+ u16_encode_bits(timeout, BIT_DMA_AGG_TO_V1);
|
||||
+
|
||||
+ rtw_write16(rtwdev, REG_RXDMA_AGG_PG_TH, val16);
|
||||
+ rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
|
||||
+}
|
||||
+
|
||||
static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
|
||||
{
|
||||
switch (rtwdev->chip->id) {
|
||||
@@ -797,6 +821,10 @@ static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
|
||||
case RTW_CHIP_TYPE_8821C:
|
||||
rtw_usb_dynamic_rx_agg_v1(rtwdev, enable);
|
||||
break;
|
||||
+ case RTW_CHIP_TYPE_8821A:
|
||||
+ case RTW_CHIP_TYPE_8812A:
|
||||
+ rtw_usb_dynamic_rx_agg_v2(rtwdev, enable);
|
||||
+ break;
|
||||
case RTW_CHIP_TYPE_8723D:
|
||||
/* Doesn't like aggregation. */
|
||||
break;
|
||||
--
|
||||
2.43.0
|
||||
|
33
packages/linux/patches/rtlwifi/6.14/0031-wifi-rtw88-8812a-Support-RFE-type-2.patch
vendored
Normal file
33
packages/linux/patches/rtlwifi/6.14/0031-wifi-rtw88-8812a-Support-RFE-type-2.patch
vendored
Normal file
@ -0,0 +1,33 @@
|
||||
From 59ab27a9f20f8de6f7989e8a8c3d97c04ed8199c Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 18 Dec 2024 02:13:22 +0200
|
||||
Subject: [PATCH 31/35] wifi: rtw88: 8812a: Support RFE type 2
|
||||
|
||||
RF front end type 2 exists in the wild and can be treated like types
|
||||
0 and 1.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/2917c7fc-6d88-4007-b6a6-9130bd1991e5@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8812a.c | 3 +++
|
||||
1 file changed, 3 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8812a.c b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
index 482edd31823d..d8f0ed70777f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
@@ -985,6 +985,9 @@ static const struct rtw_rfe_def rtw8812a_rfe_defs[] = {
|
||||
[1] = { .phy_pg_tbl = &rtw8812a_bb_pg_tbl,
|
||||
.txpwr_lmt_tbl = &rtw8812a_txpwr_lmt_tbl,
|
||||
.pwr_track_tbl = &rtw8812a_rtw_pwr_track_tbl, },
|
||||
+ [2] = { .phy_pg_tbl = &rtw8812a_bb_pg_tbl,
|
||||
+ .txpwr_lmt_tbl = &rtw8812a_txpwr_lmt_tbl,
|
||||
+ .pwr_track_tbl = &rtw8812a_rtw_pwr_track_tbl, },
|
||||
[3] = { .phy_pg_tbl = &rtw8812a_bb_pg_rfe3_tbl,
|
||||
.txpwr_lmt_tbl = &rtw8812a_txpwr_lmt_tbl,
|
||||
.pwr_track_tbl = &rtw8812a_rtw_pwr_track_rfe3_tbl, },
|
||||
--
|
||||
2.43.0
|
||||
|
58
packages/linux/patches/rtlwifi/6.14/0032-wifi-rtw88-8821a-8812a-Set-ptct_efuse_size-to-0.patch
vendored
Normal file
58
packages/linux/patches/rtlwifi/6.14/0032-wifi-rtw88-8821a-8812a-Set-ptct_efuse_size-to-0.patch
vendored
Normal file
@ -0,0 +1,58 @@
|
||||
From 74a72c367573ad521becf6cc4d649e14387b3c64 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 18 Dec 2024 02:16:11 +0200
|
||||
Subject: [PATCH 32/35] wifi: rtw88: 8821a/8812a: Set ptct_efuse_size to 0
|
||||
|
||||
Some RTL8812AU devices fail to probe:
|
||||
|
||||
[ 12.478774] rtw_8812au 1-1.3:1.0: failed to dump efuse logical map
|
||||
[ 12.487712] rtw_8812au 1-1.3:1.0: failed to setup chip efuse info
|
||||
[ 12.487742] rtw_8812au 1-1.3:1.0: failed to setup chip information
|
||||
[ 12.491077] rtw_8812au: probe of 1-1.3:1.0 failed with error -22
|
||||
|
||||
It turns out these chips don't need to "protect" any bytes at the end of
|
||||
the efuse.
|
||||
|
||||
The original value of 96 was copied from rtw8821c.c.
|
||||
|
||||
No one reported any failures with RTL8821AU yet, but the vendor driver
|
||||
uses the same efuse reading code for both chips.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/1a477adb-60c3-463c-b158-3f86c94cb821@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8812a.c | 2 +-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821a.c | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8812a.c b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
index d8f0ed70777f..21795286a1a0 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
@@ -1027,7 +1027,7 @@ const struct rtw_chip_info rtw8812a_hw_spec = {
|
||||
.rx_buf_desc_sz = 8,
|
||||
.phy_efuse_size = 512,
|
||||
.log_efuse_size = 512,
|
||||
- .ptct_efuse_size = 96 + 1, /* TODO or just 18? */
|
||||
+ .ptct_efuse_size = 0,
|
||||
.txff_size = 131072,
|
||||
.rxff_size = 16128,
|
||||
.rsvd_drv_pg_num = 9,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821a.c b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
|
||||
index db242c9ad68f..dafab2af33bc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
|
||||
@@ -1118,7 +1118,7 @@ const struct rtw_chip_info rtw8821a_hw_spec = {
|
||||
.rx_buf_desc_sz = 8,
|
||||
.phy_efuse_size = 512,
|
||||
.log_efuse_size = 512,
|
||||
- .ptct_efuse_size = 96 + 1, /* TODO or just 18? */
|
||||
+ .ptct_efuse_size = 0,
|
||||
.txff_size = 65536,
|
||||
.rxff_size = 16128,
|
||||
.rsvd_drv_pg_num = 8,
|
||||
--
|
||||
2.43.0
|
||||
|
135
packages/linux/patches/rtlwifi/6.14/0033-wifi-rtw88-usb-Copy-instead-of-cloning-the-RX-skb.patch
vendored
Normal file
135
packages/linux/patches/rtlwifi/6.14/0033-wifi-rtw88-usb-Copy-instead-of-cloning-the-RX-skb.patch
vendored
Normal file
@ -0,0 +1,135 @@
|
||||
From e9048e2935f7d797c2ba047c15b705b57c2fa99a Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 19 Dec 2024 00:33:20 +0200
|
||||
Subject: [PATCH 33/35] wifi: rtw88: usb: Copy instead of cloning the RX skb
|
||||
|
||||
"iperf3 -c 192.168.0.1 -R --udp -b 0" shows about 40% of datagrams
|
||||
are lost. Many torrents don't download faster than 3 MiB/s, probably
|
||||
because the Bittorrent protocol uses UDP. This is somehow related to
|
||||
the use of skb_clone() in the RX path.
|
||||
|
||||
Don't use skb_clone(). Instead allocate a new skb for each 802.11 frame
|
||||
received and copy the data from the big (32768 byte) skb.
|
||||
|
||||
With this patch, "iperf3 -c 192.168.0.1 -R --udp -b 0" shows only 1-2%
|
||||
of datagrams are lost, and torrents can reach download speeds of 36
|
||||
MiB/s.
|
||||
|
||||
Tested with RTL8812AU and RTL8822CU.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/8c9d4f9d-ebd8-4dc0-a0c4-9ebe430521dd@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 52 ++++++++++++++----------
|
||||
1 file changed, 31 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index be193c7add77..28679d9cdffc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <linux/mutex.h>
|
||||
#include "main.h"
|
||||
#include "debug.h"
|
||||
+#include "mac.h"
|
||||
#include "reg.h"
|
||||
#include "tx.h"
|
||||
#include "rx.h"
|
||||
@@ -547,49 +548,58 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
{
|
||||
struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, rx_work);
|
||||
struct rtw_dev *rtwdev = rtwusb->rtwdev;
|
||||
- const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
- u32 pkt_desc_sz = chip->rx_pkt_desc_sz;
|
||||
struct ieee80211_rx_status rx_status;
|
||||
- u32 pkt_offset, next_pkt, urb_len;
|
||||
struct rtw_rx_pkt_stat pkt_stat;
|
||||
- struct sk_buff *next_skb;
|
||||
+ struct sk_buff *rx_skb;
|
||||
struct sk_buff *skb;
|
||||
+ u32 pkt_desc_sz = rtwdev->chip->rx_pkt_desc_sz;
|
||||
+ u32 max_skb_len = pkt_desc_sz + PHY_STATUS_SIZE * 8 +
|
||||
+ IEEE80211_MAX_MPDU_LEN_VHT_11454;
|
||||
+ u32 pkt_offset, next_pkt, skb_len;
|
||||
u8 *rx_desc;
|
||||
int limit;
|
||||
|
||||
for (limit = 0; limit < 200; limit++) {
|
||||
- skb = skb_dequeue(&rtwusb->rx_queue);
|
||||
- if (!skb)
|
||||
+ rx_skb = skb_dequeue(&rtwusb->rx_queue);
|
||||
+ if (!rx_skb)
|
||||
break;
|
||||
|
||||
if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) {
|
||||
dev_dbg_ratelimited(rtwdev->dev, "failed to get rx_queue, overflow\n");
|
||||
- dev_kfree_skb_any(skb);
|
||||
+ dev_kfree_skb_any(rx_skb);
|
||||
continue;
|
||||
}
|
||||
|
||||
- urb_len = skb->len;
|
||||
+ rx_desc = rx_skb->data;
|
||||
|
||||
do {
|
||||
- rx_desc = skb->data;
|
||||
rtw_rx_query_rx_desc(rtwdev, rx_desc, &pkt_stat,
|
||||
&rx_status);
|
||||
pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
|
||||
pkt_stat.shift;
|
||||
|
||||
- next_pkt = round_up(pkt_stat.pkt_len + pkt_offset, 8);
|
||||
+ skb_len = pkt_stat.pkt_len + pkt_offset;
|
||||
+ if (skb_len > max_skb_len) {
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
+ "skipping too big packet: %u\n",
|
||||
+ skb_len);
|
||||
+ goto skip_packet;
|
||||
+ }
|
||||
|
||||
- if (urb_len >= next_pkt + pkt_desc_sz)
|
||||
- next_skb = skb_clone(skb, GFP_KERNEL);
|
||||
- else
|
||||
- next_skb = NULL;
|
||||
+ skb = alloc_skb(skb_len, GFP_KERNEL);
|
||||
+ if (!skb) {
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
+ "failed to allocate RX skb of size %u\n",
|
||||
+ skb_len);
|
||||
+ goto skip_packet;
|
||||
+ }
|
||||
+
|
||||
+ skb_put_data(skb, rx_desc, skb_len);
|
||||
|
||||
if (pkt_stat.is_c2h) {
|
||||
- skb_trim(skb, pkt_stat.pkt_len + pkt_offset);
|
||||
rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb);
|
||||
} else {
|
||||
skb_pull(skb, pkt_offset);
|
||||
- skb_trim(skb, pkt_stat.pkt_len);
|
||||
rtw_update_rx_freq_for_invalid(rtwdev, skb,
|
||||
&rx_status,
|
||||
&pkt_stat);
|
||||
@@ -598,12 +608,12 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
}
|
||||
|
||||
- skb = next_skb;
|
||||
- if (skb)
|
||||
- skb_pull(skb, next_pkt);
|
||||
+skip_packet:
|
||||
+ next_pkt = round_up(skb_len, 8);
|
||||
+ rx_desc += next_pkt;
|
||||
+ } while (rx_desc + pkt_desc_sz < rx_skb->data + rx_skb->len);
|
||||
|
||||
- urb_len -= next_pkt;
|
||||
- } while (skb);
|
||||
+ dev_kfree_skb_any(rx_skb);
|
||||
}
|
||||
}
|
||||
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,51 @@
|
||||
From 13221be72034d1c34630ab124c43438aefe7e656 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 19 Dec 2024 00:34:42 +0200
|
||||
Subject: [PATCH 34/35] wifi: rtw88: Handle C2H_ADAPTIVITY in
|
||||
rtw_fw_c2h_cmd_handle()
|
||||
|
||||
The firmware message C2H_ADAPTIVITY is currently handled in
|
||||
rtw_fw_c2h_cmd_rx_irqsafe(), which runs in the RX workqueue, but it's
|
||||
not "irqsafe" with USB because it sleeps (reads hardware registers).
|
||||
This becomes a problem after the next patch, which will create the RX
|
||||
workqueue with the flag WQ_BH.
|
||||
|
||||
To avoid sleeping when it's not allowed, handle C2H_ADAPTIVITY in
|
||||
rtw_fw_c2h_cmd_handle(), which runs in the c2h workqueue.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/96e52b03-be8d-4050-ae71-bfdb478ff42f@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 7 +++----
|
||||
1 file changed, 3 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index e6e9946fbf44..02389b7c6876 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -332,6 +332,9 @@ void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb)
|
||||
case C2H_RA_RPT:
|
||||
rtw_fw_ra_report_handle(rtwdev, c2h->payload, len);
|
||||
break;
|
||||
+ case C2H_ADAPTIVITY:
|
||||
+ rtw_fw_adaptivity_result(rtwdev, c2h->payload, len);
|
||||
+ break;
|
||||
default:
|
||||
rtw_dbg(rtwdev, RTW_DBG_FW, "C2H 0x%x isn't handled\n", c2h->id);
|
||||
break;
|
||||
@@ -367,10 +370,6 @@ void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
|
||||
rtw_fw_scan_result(rtwdev, c2h->payload, len);
|
||||
dev_kfree_skb_any(skb);
|
||||
break;
|
||||
- case C2H_ADAPTIVITY:
|
||||
- rtw_fw_adaptivity_result(rtwdev, c2h->payload, len);
|
||||
- dev_kfree_skb_any(skb);
|
||||
- break;
|
||||
default:
|
||||
/* pass offset for further operation */
|
||||
*((u32 *)skb->cb) = pkt_offset;
|
||||
--
|
||||
2.43.0
|
||||
|
230
packages/linux/patches/rtlwifi/6.14/0035-wifi-rtw88-usb-Preallocate-and-reuse-the-RX-skbs.patch
vendored
Normal file
230
packages/linux/patches/rtlwifi/6.14/0035-wifi-rtw88-usb-Preallocate-and-reuse-the-RX-skbs.patch
vendored
Normal file
@ -0,0 +1,230 @@
|
||||
From 3e3aa566dd1803f1697530de6c8489a8350765b3 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 19 Dec 2024 00:35:49 +0200
|
||||
Subject: [PATCH 35/35] wifi: rtw88: usb: Preallocate and reuse the RX skbs
|
||||
|
||||
The USB driver uses four USB Request Blocks for RX. Before submitting
|
||||
one, it allocates a 32768 byte skb for the RX data. This allocation can
|
||||
fail, maybe due to temporary memory fragmentation. When the allocation
|
||||
fails, the corresponding URB is never submitted again. After four such
|
||||
allocation failures, all RX stops because the driver is not requesting
|
||||
data from the device anymore.
|
||||
|
||||
Don't allocate a 32768 byte skb when submitting a USB Request Block
|
||||
(which happens very often). Instead preallocate 8 such skbs, and reuse
|
||||
them over and over. If all 8 are busy, allocate a new one. This is
|
||||
pretty rare. If the allocation fails, use a work to try again later.
|
||||
When there are enough free skbs again, free the excess skbs.
|
||||
|
||||
Also, use WQ_BH for the RX workqueue. With a normal or high priority
|
||||
workqueue the skbs are processed too slowly when the system is even a
|
||||
little busy, like when opening a new page in a browser, and the driver
|
||||
runs out of free skbs and allocates a lot of new ones.
|
||||
|
||||
This is more or less what the out-of-tree Realtek drivers do, except
|
||||
they use a tasklet instead of a BH workqueue.
|
||||
|
||||
Tested with RTL8723DU, RTL8821AU, RTL8812AU, RTL8812BU, RTL8822CU,
|
||||
RTL8811CU.
|
||||
|
||||
Closes: https://lore.kernel.org/linux-wireless/6e7ecb47-7ea0-433a-a19f-05f88a2edf6b@gmail.com/
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/9cee7a34-c38d-4128-824d-0ec139ca5a4e@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 79 +++++++++++++++++++-----
|
||||
drivers/net/wireless/realtek/rtw88/usb.h | 3 +
|
||||
2 files changed, 67 insertions(+), 15 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 28679d9cdffc..1572b61cf877 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -586,7 +586,7 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
goto skip_packet;
|
||||
}
|
||||
|
||||
- skb = alloc_skb(skb_len, GFP_KERNEL);
|
||||
+ skb = alloc_skb(skb_len, GFP_ATOMIC);
|
||||
if (!skb) {
|
||||
rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
"failed to allocate RX skb of size %u\n",
|
||||
@@ -613,32 +613,70 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
rx_desc += next_pkt;
|
||||
} while (rx_desc + pkt_desc_sz < rx_skb->data + rx_skb->len);
|
||||
|
||||
- dev_kfree_skb_any(rx_skb);
|
||||
+ if (skb_queue_len(&rtwusb->rx_free_queue) >= RTW_USB_RX_SKB_NUM)
|
||||
+ dev_kfree_skb_any(rx_skb);
|
||||
+ else
|
||||
+ skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
|
||||
}
|
||||
}
|
||||
|
||||
static void rtw_usb_read_port_complete(struct urb *urb);
|
||||
|
||||
-static void rtw_usb_rx_resubmit(struct rtw_usb *rtwusb, struct rx_usb_ctrl_block *rxcb)
|
||||
+static void rtw_usb_rx_resubmit(struct rtw_usb *rtwusb,
|
||||
+ struct rx_usb_ctrl_block *rxcb,
|
||||
+ gfp_t gfp)
|
||||
{
|
||||
struct rtw_dev *rtwdev = rtwusb->rtwdev;
|
||||
+ struct sk_buff *rx_skb;
|
||||
int error;
|
||||
|
||||
- rxcb->rx_skb = alloc_skb(RTW_USB_MAX_RECVBUF_SZ, GFP_ATOMIC);
|
||||
- if (!rxcb->rx_skb)
|
||||
- return;
|
||||
+ rx_skb = skb_dequeue(&rtwusb->rx_free_queue);
|
||||
+ if (!rx_skb)
|
||||
+ rx_skb = alloc_skb(RTW_USB_MAX_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->pipe_in),
|
||||
rxcb->rx_skb->data, RTW_USB_MAX_RECVBUF_SZ,
|
||||
rtw_usb_read_port_complete, rxcb);
|
||||
|
||||
- error = usb_submit_urb(rxcb->rx_urb, GFP_ATOMIC);
|
||||
+ error = usb_submit_urb(rxcb->rx_urb, gfp);
|
||||
if (error) {
|
||||
- kfree_skb(rxcb->rx_skb);
|
||||
+ skb_queue_tail(&rtwusb->rx_free_queue, rxcb->rx_skb);
|
||||
+
|
||||
if (error != -ENODEV)
|
||||
rtw_err(rtwdev, "Err sending rx data urb %d\n",
|
||||
error);
|
||||
+
|
||||
+ if (error == -ENOMEM)
|
||||
+ goto try_later;
|
||||
+ }
|
||||
+
|
||||
+ return;
|
||||
+
|
||||
+try_later:
|
||||
+ rxcb->rx_skb = NULL;
|
||||
+ queue_work(rtwusb->rxwq, &rtwusb->rx_urb_work);
|
||||
+}
|
||||
+
|
||||
+static void rtw_usb_rx_resubmit_work(struct work_struct *work)
|
||||
+{
|
||||
+ struct rtw_usb *rtwusb = container_of(work, struct rtw_usb, rx_urb_work);
|
||||
+ struct rx_usb_ctrl_block *rxcb;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
|
||||
+ rxcb = &rtwusb->rx_cb[i];
|
||||
+
|
||||
+ if (!rxcb->rx_skb)
|
||||
+ rtw_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -654,15 +692,16 @@ static void rtw_usb_read_port_complete(struct urb *urb)
|
||||
urb->actual_length < 24) {
|
||||
rtw_err(rtwdev, "failed to get urb length:%d\n",
|
||||
urb->actual_length);
|
||||
- if (skb)
|
||||
- dev_kfree_skb_any(skb);
|
||||
+ 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);
|
||||
}
|
||||
- rtw_usb_rx_resubmit(rtwusb, rxcb);
|
||||
+ rtw_usb_rx_resubmit(rtwusb, rxcb, GFP_ATOMIC);
|
||||
} else {
|
||||
+ skb_queue_tail(&rtwusb->rx_free_queue, skb);
|
||||
+
|
||||
switch (urb->status) {
|
||||
case -EINVAL:
|
||||
case -EPIPE:
|
||||
@@ -680,8 +719,6 @@ static void rtw_usb_read_port_complete(struct urb *urb)
|
||||
rtw_err(rtwdev, "status %d\n", urb->status);
|
||||
break;
|
||||
}
|
||||
- if (skb)
|
||||
- dev_kfree_skb_any(skb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -869,16 +906,26 @@ static struct rtw_hci_ops rtw_usb_ops = {
|
||||
static int rtw_usb_init_rx(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
|
||||
+ struct sk_buff *rx_skb;
|
||||
+ int i;
|
||||
|
||||
- rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq");
|
||||
+ rtwusb->rxwq = alloc_workqueue("rtw88_usb: rx wq", WQ_BH, 0);
|
||||
if (!rtwusb->rxwq) {
|
||||
rtw_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, rtw_usb_rx_handler);
|
||||
+ INIT_WORK(&rtwusb->rx_urb_work, rtw_usb_rx_resubmit_work);
|
||||
+
|
||||
+ for (i = 0; i < RTW_USB_RX_SKB_NUM; i++) {
|
||||
+ rx_skb = alloc_skb(RTW_USB_MAX_RECVBUF_SZ, GFP_KERNEL);
|
||||
+ if (rx_skb)
|
||||
+ skb_queue_tail(&rtwusb->rx_free_queue, rx_skb);
|
||||
+ }
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -891,7 +938,7 @@ static void rtw_usb_setup_rx(struct rtw_dev *rtwdev)
|
||||
for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
|
||||
struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i];
|
||||
|
||||
- rtw_usb_rx_resubmit(rtwusb, rxcb);
|
||||
+ rtw_usb_rx_resubmit(rtwusb, rxcb, GFP_KERNEL);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -903,6 +950,8 @@ static void rtw_usb_deinit_rx(struct rtw_dev *rtwdev)
|
||||
|
||||
flush_workqueue(rtwusb->rxwq);
|
||||
destroy_workqueue(rtwusb->rxwq);
|
||||
+
|
||||
+ skb_queue_purge(&rtwusb->rx_free_queue);
|
||||
}
|
||||
|
||||
static int rtw_usb_init_tx(struct rtw_dev *rtwdev)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.h b/drivers/net/wireless/realtek/rtw88/usb.h
|
||||
index 86697a5c0103..9b695b688b24 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.h
|
||||
@@ -38,6 +38,7 @@
|
||||
#define RTW_USB_RXAGG_TIMEOUT 10
|
||||
|
||||
#define RTW_USB_RXCB_NUM 4
|
||||
+#define RTW_USB_RX_SKB_NUM 8
|
||||
|
||||
#define RTW_USB_EP_MAX 4
|
||||
|
||||
@@ -81,7 +82,9 @@ struct rtw_usb {
|
||||
|
||||
struct rx_usb_ctrl_block rx_cb[RTW_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 rtw_usb_tx_data *rtw_usb_get_tx_data(struct sk_buff *skb)
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,34 @@
|
||||
From 93b3a45645f13290745ef58bf99ad0877af29381 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Mon, 23 Dec 2024 17:01:57 +0200
|
||||
Subject: [PATCH 36/41] wifi: rtl8xxxu: Fix RTL8188EU firmware upload block
|
||||
size
|
||||
|
||||
A user reports that the firmware upload consistently fails when it's
|
||||
uploaded in chunks of 128 bytes, but it works when uploaded in chunks
|
||||
of 196 bytes. The official driver uses 196 bytes also.
|
||||
|
||||
Link: https://github.com/a5a5aa555oo/rtl8xxxu/issues/2
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/cba8e2f2-32c4-4174-90ba-0219f29dbdde@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtl8xxxu/8188e.c | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtl8xxxu/8188e.c b/drivers/net/wireless/realtek/rtl8xxxu/8188e.c
|
||||
index 3d04df0f5bf4..766a7a7c7d28 100644
|
||||
--- a/drivers/net/wireless/realtek/rtl8xxxu/8188e.c
|
||||
+++ b/drivers/net/wireless/realtek/rtl8xxxu/8188e.c
|
||||
@@ -1860,7 +1860,7 @@ struct rtl8xxxu_fileops rtl8188eu_fops = {
|
||||
.set_crystal_cap = rtl8188f_set_crystal_cap,
|
||||
.cck_rssi = rtl8188e_cck_rssi,
|
||||
.led_classdev_brightness_set = rtl8188eu_led_brightness_set,
|
||||
- .writeN_block_size = 128,
|
||||
+ .writeN_block_size = 196,
|
||||
.rx_desc_size = sizeof(struct rtl8xxxu_rxdesc16),
|
||||
.tx_desc_size = sizeof(struct rtl8xxxu_txdesc32),
|
||||
.has_tx_report = 1,
|
||||
--
|
||||
2.43.0
|
||||
|
148
packages/linux/patches/rtlwifi/6.14/0037-wifi-rtw88-Add-USB-PHY-configuration.patch
vendored
Normal file
148
packages/linux/patches/rtlwifi/6.14/0037-wifi-rtw88-Add-USB-PHY-configuration.patch
vendored
Normal file
@ -0,0 +1,148 @@
|
||||
From fc57e8bef80bbfaba1ce0554f3b3c8df825e30b9 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 1 Jan 2025 18:16:32 +0200
|
||||
Subject: [PATCH 37/41] wifi: rtw88: Add USB PHY configuration
|
||||
|
||||
Add some extra configuration for USB devices. Currently only RTL8822BU
|
||||
version (cut) D needs this. The new code makes use of the existing
|
||||
usb3_param_8822b array from rtw8822b.c.
|
||||
|
||||
A user reported that TP-Link Archer T3U in USB 3 mode was randomly
|
||||
disconnecting from USB:
|
||||
|
||||
[ 26.036502] usb 2-2: new SuperSpeed USB device number 3 using xhci_hcd
|
||||
...
|
||||
[ 27.576491] usb 2-2: USB disconnect, device number 3
|
||||
[ 28.621528] usb 2-2: new SuperSpeed USB device number 4 using xhci_hcd
|
||||
...
|
||||
[ 45.984521] usb 2-2: USB disconnect, device number 4
|
||||
...
|
||||
[ 46.845585] usb 2-2: new SuperSpeed USB device number 5 using xhci_hcd
|
||||
...
|
||||
[ 94.400380] usb 2-2: USB disconnect, device number 5
|
||||
...
|
||||
[ 95.590421] usb 2-2: new SuperSpeed USB device number 6 using xhci_hcd
|
||||
|
||||
This patch fixes that.
|
||||
|
||||
Link: https://github.com/lwfinger/rtw88/issues/262
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/9d312b14-0146-4be8-9c50-ef432234db50@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/reg.h | 10 ++++
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 68 ++++++++++++++++++++++++
|
||||
2 files changed, 78 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index e4d506cf9c33..95a39ae74cd3 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -871,7 +871,17 @@
|
||||
|
||||
#define REG_USB_MOD 0xf008
|
||||
#define REG_USB3_RXITV 0xf050
|
||||
+#define REG_USB2_PHY_ADR 0xfe40
|
||||
+#define REG_USB2_PHY_DAT 0xfe41
|
||||
+#define REG_USB2_PHY_CMD 0xfe42
|
||||
+#define BIT_USB2_PHY_CMD_TRG 0x81
|
||||
#define REG_USB_HRPWM 0xfe58
|
||||
+#define REG_USB3_PHY_ADR 0xff0c
|
||||
+#define REG_USB3_PHY_DAT_L 0xff0d
|
||||
+#define REG_USB3_PHY_DAT_H 0xff0e
|
||||
+#define BIT_USB3_PHY_ADR_WR BIT(7)
|
||||
+#define BIT_USB3_PHY_ADR_RD BIT(6)
|
||||
+#define BIT_USB3_PHY_ADR_MASK GENMASK(5, 0)
|
||||
|
||||
#define RF_MODE 0x00
|
||||
#define RF_MODOPT 0x01
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 1572b61cf877..c4908db4ff0e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -1128,6 +1128,71 @@ static int rtw_usb_switch_mode(struct rtw_dev *rtwdev)
|
||||
return rtw_usb_switch_mode_new(rtwdev);
|
||||
}
|
||||
|
||||
+#define USB_REG_PAGE 0xf4
|
||||
+#define USB_PHY_PAGE0 0x9b
|
||||
+#define USB_PHY_PAGE1 0xbb
|
||||
+
|
||||
+static void rtw_usb_phy_write(struct rtw_dev *rtwdev, u8 addr, u16 data,
|
||||
+ enum usb_device_speed speed)
|
||||
+{
|
||||
+ if (speed == USB_SPEED_SUPER) {
|
||||
+ rtw_write8(rtwdev, REG_USB3_PHY_DAT_L, data & 0xff);
|
||||
+ rtw_write8(rtwdev, REG_USB3_PHY_DAT_H, data >> 8);
|
||||
+ rtw_write8(rtwdev, REG_USB3_PHY_ADR, addr | BIT_USB3_PHY_ADR_WR);
|
||||
+ } else if (speed == USB_SPEED_HIGH) {
|
||||
+ rtw_write8(rtwdev, REG_USB2_PHY_DAT, data);
|
||||
+ rtw_write8(rtwdev, REG_USB2_PHY_ADR, addr);
|
||||
+ rtw_write8(rtwdev, REG_USB2_PHY_CMD, BIT_USB2_PHY_CMD_TRG);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+static void rtw_usb_page_switch(struct rtw_dev *rtwdev,
|
||||
+ enum usb_device_speed speed, u8 page)
|
||||
+{
|
||||
+ if (speed == USB_SPEED_SUPER)
|
||||
+ return;
|
||||
+
|
||||
+ rtw_usb_phy_write(rtwdev, USB_REG_PAGE, page, speed);
|
||||
+}
|
||||
+
|
||||
+static void rtw_usb_phy_cfg(struct rtw_dev *rtwdev,
|
||||
+ enum usb_device_speed speed)
|
||||
+{
|
||||
+ const struct rtw_intf_phy_para *para = NULL;
|
||||
+ u16 offset;
|
||||
+
|
||||
+ if (!rtwdev->chip->intf_table)
|
||||
+ return;
|
||||
+
|
||||
+ if (speed == USB_SPEED_SUPER)
|
||||
+ para = rtwdev->chip->intf_table->usb3_para;
|
||||
+ else if (speed == USB_SPEED_HIGH)
|
||||
+ para = rtwdev->chip->intf_table->usb2_para;
|
||||
+
|
||||
+ if (!para)
|
||||
+ return;
|
||||
+
|
||||
+ for ( ; para->offset != 0xffff; para++) {
|
||||
+ if (!(para->cut_mask & BIT(rtwdev->hal.cut_version)))
|
||||
+ continue;
|
||||
+
|
||||
+ offset = para->offset;
|
||||
+
|
||||
+ if (para->ip_sel == RTW_IP_SEL_MAC) {
|
||||
+ rtw_write8(rtwdev, offset, para->value);
|
||||
+ } else {
|
||||
+ if (offset > 0x100)
|
||||
+ rtw_usb_page_switch(rtwdev, speed, USB_PHY_PAGE1);
|
||||
+ else
|
||||
+ rtw_usb_page_switch(rtwdev, speed, USB_PHY_PAGE0);
|
||||
+
|
||||
+ offset &= 0xff;
|
||||
+
|
||||
+ rtw_usb_phy_write(rtwdev, offset, para->value, speed);
|
||||
+ }
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct rtw_dev *rtwdev;
|
||||
@@ -1183,6 +1248,9 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
goto err_destroy_rxwq;
|
||||
}
|
||||
|
||||
+ rtw_usb_phy_cfg(rtwdev, USB_SPEED_HIGH);
|
||||
+ rtw_usb_phy_cfg(rtwdev, USB_SPEED_SUPER);
|
||||
+
|
||||
ret = rtw_usb_switch_mode(rtwdev);
|
||||
if (ret) {
|
||||
/* Not a fail, but we do need to skip rtw_register_hw. */
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,68 @@
|
||||
From 254af62d5fc0f34512854eabc46591f48d387cbb Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 1 Jan 2025 18:27:35 +0200
|
||||
Subject: [PATCH 38/41] wifi: rtw88: Delete rf_type member of struct
|
||||
rtw_sta_info
|
||||
|
||||
It's not used for anything.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/b80f7904-c6b4-4d12-a5f9-69ab9b965732@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 9 ++-------
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 1 -
|
||||
2 files changed, 2 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index e91530ed05a0..6993f93c8f06 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -1217,7 +1217,6 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
|
||||
u8 wireless_set;
|
||||
u8 bw_mode;
|
||||
u8 rate_id;
|
||||
- u8 rf_type = RF_1T1R;
|
||||
u8 stbc_en = 0;
|
||||
u8 ldpc_en = 0;
|
||||
u8 tx_num = 1;
|
||||
@@ -1302,13 +1301,10 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
|
||||
break;
|
||||
}
|
||||
|
||||
- if (sta->deflink.vht_cap.vht_supported && ra_mask & 0xffc00000) {
|
||||
+ if (sta->deflink.vht_cap.vht_supported && ra_mask & 0xffc00000)
|
||||
tx_num = 2;
|
||||
- rf_type = RF_2T2R;
|
||||
- } else if (sta->deflink.ht_cap.ht_supported && ra_mask & 0xfff00000) {
|
||||
+ else if (sta->deflink.ht_cap.ht_supported && ra_mask & 0xfff00000)
|
||||
tx_num = 2;
|
||||
- rf_type = RF_2T2R;
|
||||
- }
|
||||
|
||||
rate_id = get_rate_id(wireless_set, bw_mode, tx_num);
|
||||
|
||||
@@ -1319,7 +1315,6 @@ void rtw_update_sta_info(struct rtw_dev *rtwdev, struct rtw_sta_info *si,
|
||||
si->bw_mode = bw_mode;
|
||||
si->stbc_en = stbc_en;
|
||||
si->ldpc_en = ldpc_en;
|
||||
- si->rf_type = rf_type;
|
||||
si->sgi_enable = is_support_sgi;
|
||||
si->vht_enable = is_vht_enable;
|
||||
si->ra_mask = ra_mask;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 65c7acea41af..6ba9e0dcf9fd 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -757,7 +757,6 @@ struct rtw_sta_info {
|
||||
u8 mac_id;
|
||||
u8 rate_id;
|
||||
enum rtw_bandwidth bw_mode;
|
||||
- enum rtw_rf_type rf_type;
|
||||
u8 stbc_en:2;
|
||||
u8 ldpc_en:2;
|
||||
bool sgi_enable;
|
||||
--
|
||||
2.43.0
|
||||
|
451
packages/linux/patches/rtlwifi/6.14/0041-wifi-rtw88-Add-support-for-LED-blinking.patch
vendored
Normal file
451
packages/linux/patches/rtlwifi/6.14/0041-wifi-rtw88-Add-support-for-LED-blinking.patch
vendored
Normal file
@ -0,0 +1,451 @@
|
||||
From 43b890bc487226f22127d0a328b05ab017cbe9c0 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 8 Jan 2025 13:41:23 +0200
|
||||
Subject: [PATCH 41/41] wifi: rtw88: Add support for LED blinking
|
||||
|
||||
Register a struct led_classdev with the kernel's LED subsystem and
|
||||
create a throughput-based trigger for it. Then mac80211 makes the LED
|
||||
blink.
|
||||
|
||||
Tested with Tenda U12 (RTL8812AU), Tenda U9 (RTL8811CU), TP-Link Archer
|
||||
T2U Nano (RTL8811AU), TP-Link Archer T3U Plus (RTL8812BU), Edimax
|
||||
EW-7611UCB (RTL8821AU), LM842 (RTL8822CU).
|
||||
|
||||
Also tested with devices which don't have LEDs: the laptop's internal
|
||||
RTL8822CE and a no-name RTL8723DU.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/6c43451f-ab2f-4e76-ac6e-ff5a18dd981d@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/Makefile | 2 +
|
||||
drivers/net/wireless/realtek/rtw88/led.c | 73 +++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/led.h | 25 +++++++
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 12 ++-
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 5 ++
|
||||
drivers/net/wireless/realtek/rtw88/reg.h | 12 +++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8812a.c | 17 +++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821a.c | 26 +++++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 19 +++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 19 +++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 19 +++++
|
||||
11 files changed, 227 insertions(+), 2 deletions(-)
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw88/led.c
|
||||
create mode 100644 drivers/net/wireless/realtek/rtw88/led.h
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
index f0b49f5a8a5a..e8bad9d099a4 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/Makefile
|
||||
@@ -20,6 +20,8 @@ rtw88_core-y += main.o \
|
||||
|
||||
rtw88_core-$(CONFIG_PM) += wow.o
|
||||
|
||||
+rtw88_core-$(CONFIG_LEDS_CLASS) += led.o
|
||||
+
|
||||
obj-$(CONFIG_RTW88_8822B) += rtw88_8822b.o
|
||||
rtw88_8822b-objs := rtw8822b.o rtw8822b_table.o
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/led.c b/drivers/net/wireless/realtek/rtw88/led.c
|
||||
new file mode 100644
|
||||
index 000000000000..25aa6cbaa728
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/led.c
|
||||
@@ -0,0 +1,73 @@
|
||||
+// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
|
||||
+/* Copyright(c) 2025 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#include "main.h"
|
||||
+#include "debug.h"
|
||||
+#include "led.h"
|
||||
+
|
||||
+static int rtw_led_set_blocking(struct led_classdev *led,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
|
||||
+
|
||||
+ rtwdev->chip->ops->led_set(led, brightness);
|
||||
+
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+void rtw_led_init(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ static const struct ieee80211_tpt_blink rtw_tpt_blink[] = {
|
||||
+ { .throughput = 0 * 1024, .blink_time = 334 },
|
||||
+ { .throughput = 1 * 1024, .blink_time = 260 },
|
||||
+ { .throughput = 5 * 1024, .blink_time = 220 },
|
||||
+ { .throughput = 10 * 1024, .blink_time = 190 },
|
||||
+ { .throughput = 20 * 1024, .blink_time = 170 },
|
||||
+ { .throughput = 50 * 1024, .blink_time = 150 },
|
||||
+ { .throughput = 70 * 1024, .blink_time = 130 },
|
||||
+ { .throughput = 100 * 1024, .blink_time = 110 },
|
||||
+ { .throughput = 200 * 1024, .blink_time = 80 },
|
||||
+ { .throughput = 300 * 1024, .blink_time = 50 },
|
||||
+ };
|
||||
+ struct led_classdev *led = &rtwdev->led_cdev;
|
||||
+ int err;
|
||||
+
|
||||
+ if (!rtwdev->chip->ops->led_set)
|
||||
+ return;
|
||||
+
|
||||
+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE)
|
||||
+ led->brightness_set = rtwdev->chip->ops->led_set;
|
||||
+ else
|
||||
+ led->brightness_set_blocking = rtw_led_set_blocking;
|
||||
+
|
||||
+ snprintf(rtwdev->led_name, sizeof(rtwdev->led_name),
|
||||
+ "rtw88-%s", dev_name(rtwdev->dev));
|
||||
+
|
||||
+ led->name = rtwdev->led_name;
|
||||
+ led->max_brightness = LED_ON;
|
||||
+ led->default_trigger =
|
||||
+ ieee80211_create_tpt_led_trigger(rtwdev->hw,
|
||||
+ IEEE80211_TPT_LEDTRIG_FL_RADIO,
|
||||
+ rtw_tpt_blink,
|
||||
+ ARRAY_SIZE(rtw_tpt_blink));
|
||||
+
|
||||
+ err = led_classdev_register(rtwdev->dev, led);
|
||||
+ if (err) {
|
||||
+ rtw_warn(rtwdev, "Failed to register the LED, error %d\n", err);
|
||||
+ return;
|
||||
+ }
|
||||
+
|
||||
+ rtwdev->led_registered = true;
|
||||
+}
|
||||
+
|
||||
+void rtw_led_deinit(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct led_classdev *led = &rtwdev->led_cdev;
|
||||
+
|
||||
+ if (!rtwdev->led_registered)
|
||||
+ return;
|
||||
+
|
||||
+ rtwdev->chip->ops->led_set(led, LED_OFF);
|
||||
+ led_classdev_unregister(led);
|
||||
+}
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/led.h b/drivers/net/wireless/realtek/rtw88/led.h
|
||||
new file mode 100644
|
||||
index 000000000000..c3bb6fe49b49
|
||||
--- /dev/null
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/led.h
|
||||
@@ -0,0 +1,25 @@
|
||||
+/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
|
||||
+/* Copyright(c) 2025 Realtek Corporation
|
||||
+ */
|
||||
+
|
||||
+#ifndef __RTW_LED_H
|
||||
+#define __RTW_LED_H
|
||||
+
|
||||
+#ifdef CONFIG_LEDS_CLASS
|
||||
+
|
||||
+void rtw_led_init(struct rtw_dev *rtwdev);
|
||||
+void rtw_led_deinit(struct rtw_dev *rtwdev);
|
||||
+
|
||||
+#else
|
||||
+
|
||||
+static inline void rtw_led_init(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+static inline void rtw_led_deinit(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+}
|
||||
+
|
||||
+#endif
|
||||
+
|
||||
+#endif
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 6993f93c8f06..0cee0fd8c0ef 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -19,6 +19,7 @@
|
||||
#include "bf.h"
|
||||
#include "sar.h"
|
||||
#include "sdio.h"
|
||||
+#include "led.h"
|
||||
|
||||
bool rtw_disable_lps_deep_mode;
|
||||
EXPORT_SYMBOL(rtw_disable_lps_deep_mode);
|
||||
@@ -2292,16 +2293,18 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+ rtw_led_init(rtwdev);
|
||||
+
|
||||
ret = ieee80211_register_hw(hw);
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to register hw\n");
|
||||
- return ret;
|
||||
+ goto led_deinit;
|
||||
}
|
||||
|
||||
ret = rtw_regd_hint(rtwdev);
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to hint regd\n");
|
||||
- return ret;
|
||||
+ goto led_deinit;
|
||||
}
|
||||
|
||||
rtw_debugfs_init(rtwdev);
|
||||
@@ -2310,6 +2313,10 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
rtwdev->bf_info.bfer_su_cnt = 0;
|
||||
|
||||
return 0;
|
||||
+
|
||||
+led_deinit:
|
||||
+ rtw_led_deinit(rtwdev);
|
||||
+ return ret;
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_register_hw);
|
||||
|
||||
@@ -2320,6 +2327,7 @@ void rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw)
|
||||
ieee80211_unregister_hw(hw);
|
||||
rtw_unset_supported_band(hw, chip);
|
||||
rtw_debugfs_deinit(rtwdev);
|
||||
+ rtw_led_deinit(rtwdev);
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_unregister_hw);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 6ba9e0dcf9fd..62cd4c526301 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -887,6 +887,7 @@ struct rtw_chip_ops {
|
||||
bool is_tx2_path);
|
||||
void (*config_txrx_mode)(struct rtw_dev *rtwdev, u8 tx_path,
|
||||
u8 rx_path, bool is_tx2_path);
|
||||
+ void (*led_set)(struct led_classdev *led, enum led_brightness brightness);
|
||||
/* for USB/SDIO only */
|
||||
void (*fill_txdesc_checksum)(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
@@ -2097,6 +2098,10 @@ struct rtw_dev {
|
||||
struct completion fw_scan_density;
|
||||
bool ap_active;
|
||||
|
||||
+ bool led_registered;
|
||||
+ char led_name[32];
|
||||
+ struct led_classdev led_cdev;
|
||||
+
|
||||
/* hci related data, must be last */
|
||||
u8 priv[] __aligned(sizeof(void *));
|
||||
};
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index 95a39ae74cd3..e438405fba56 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -78,7 +78,19 @@
|
||||
#define BIT_PAPE_SEL_EN BIT(25)
|
||||
#define BIT_DPDT_WL_SEL BIT(24)
|
||||
#define BIT_DPDT_SEL_EN BIT(23)
|
||||
+#define BIT_GPIO13_14_WL_CTRL_EN BIT(22)
|
||||
+#define BIT_LED2_SV BIT(19)
|
||||
+#define BIT_LED2_CM GENMASK(18, 16)
|
||||
+#define BIT_LED1_SV BIT(11)
|
||||
+#define BIT_LED1_CM GENMASK(10, 8)
|
||||
+#define BIT_LED0_SV BIT(3)
|
||||
+#define BIT_LED0_CM GENMASK(2, 0)
|
||||
+#define BIT_LED_MODE_SW_CTRL 0
|
||||
+#define BIT_LED_MODE_RX 6
|
||||
+#define BIT_LED_MODE_TX 4
|
||||
+#define BIT_LED_MODE_TRX 2
|
||||
#define REG_LEDCFG2 0x004E
|
||||
+#define REG_GPIO_PIN_CTRL_2 0x0060
|
||||
#define REG_PAD_CTRL1 0x0064
|
||||
#define BIT_BT_BTG_SEL BIT(31)
|
||||
#define BIT_PAPE_WLBT_SEL BIT(29)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8812a.c b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
index 21795286a1a0..f9ba2aa2928a 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8812a.c
|
||||
@@ -868,6 +868,22 @@ static void rtw8812a_pwr_track(struct rtw_dev *rtwdev)
|
||||
dm_info->pwr_trk_triggered = false;
|
||||
}
|
||||
|
||||
+static void rtw8812a_led_set(struct led_classdev *led,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
|
||||
+ u8 ledcfg;
|
||||
+
|
||||
+ ledcfg = rtw_read8(rtwdev, REG_LED_CFG);
|
||||
+ ledcfg &= BIT(6) | BIT(4);
|
||||
+ ledcfg |= BIT(5);
|
||||
+
|
||||
+ if (brightness == LED_OFF)
|
||||
+ ledcfg |= BIT(3);
|
||||
+
|
||||
+ rtw_write8(rtwdev, REG_LED_CFG, ledcfg);
|
||||
+}
|
||||
+
|
||||
static void rtw8812a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *txdesc)
|
||||
@@ -916,6 +932,7 @@ static const struct rtw_chip_ops rtw8812a_ops = {
|
||||
.config_bfee = NULL,
|
||||
.set_gid_table = NULL,
|
||||
.cfg_csi_rate = NULL,
|
||||
+ .led_set = rtw8812a_led_set,
|
||||
.fill_txdesc_checksum = rtw8812a_fill_txdesc_checksum,
|
||||
.coex_set_init = rtw8812a_coex_cfg_init,
|
||||
.coex_set_ant_switch = NULL,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821a.c b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
|
||||
index dafab2af33bc..f68239b07319 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821a.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821a.c
|
||||
@@ -706,6 +706,31 @@ static void rtw8821a_pwr_track(struct rtw_dev *rtwdev)
|
||||
dm_info->pwr_trk_triggered = false;
|
||||
}
|
||||
|
||||
+static void rtw8821a_led_set(struct led_classdev *led,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
|
||||
+ u32 gpio8_cfg;
|
||||
+ u8 ledcfg;
|
||||
+
|
||||
+ if (brightness == LED_OFF) {
|
||||
+ gpio8_cfg = rtw_read32(rtwdev, REG_GPIO_PIN_CTRL_2);
|
||||
+ gpio8_cfg &= ~BIT(24);
|
||||
+ gpio8_cfg |= BIT(16) | BIT(8);
|
||||
+ rtw_write32(rtwdev, REG_GPIO_PIN_CTRL_2, gpio8_cfg);
|
||||
+ } else {
|
||||
+ ledcfg = rtw_read8(rtwdev, REG_LED_CFG + 2);
|
||||
+ gpio8_cfg = rtw_read32(rtwdev, REG_GPIO_PIN_CTRL_2);
|
||||
+
|
||||
+ ledcfg &= BIT(7) | BIT(6);
|
||||
+ rtw_write8(rtwdev, REG_LED_CFG + 2, ledcfg);
|
||||
+
|
||||
+ gpio8_cfg &= ~(BIT(24) | BIT(8));
|
||||
+ gpio8_cfg |= BIT(16);
|
||||
+ rtw_write32(rtwdev, REG_GPIO_PIN_CTRL_2, gpio8_cfg);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void rtw8821a_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *txdesc)
|
||||
@@ -853,6 +878,7 @@ static const struct rtw_chip_ops rtw8821a_ops = {
|
||||
.config_bfee = NULL,
|
||||
.set_gid_table = NULL,
|
||||
.cfg_csi_rate = NULL,
|
||||
+ .led_set = rtw8821a_led_set,
|
||||
.fill_txdesc_checksum = rtw8821a_fill_txdesc_checksum,
|
||||
.coex_set_init = rtw8821a_coex_cfg_init,
|
||||
.coex_set_ant_switch = rtw8821a_coex_cfg_ant_switch,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index 0270225b9c20..eb7e34c545d0 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -1206,6 +1206,24 @@ static void rtw8821c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl)
|
||||
dm_info->cck_pd_default + new_lvl * 2);
|
||||
}
|
||||
|
||||
+static void rtw8821c_led_set(struct led_classdev *led,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
|
||||
+ u32 ledcfg;
|
||||
+
|
||||
+ ledcfg = rtw_read32(rtwdev, REG_LED_CFG);
|
||||
+ u32p_replace_bits(&ledcfg, BIT_LED_MODE_SW_CTRL, BIT_LED2_CM);
|
||||
+ ledcfg &= ~BIT_GPIO13_14_WL_CTRL_EN;
|
||||
+
|
||||
+ if (brightness == LED_OFF)
|
||||
+ ledcfg |= BIT_LED2_SV;
|
||||
+ else
|
||||
+ ledcfg &= ~BIT_LED2_SV;
|
||||
+
|
||||
+ rtw_write32(rtwdev, REG_LED_CFG, ledcfg);
|
||||
+}
|
||||
+
|
||||
static void rtw8821c_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *txdesc)
|
||||
@@ -1655,6 +1673,7 @@ static const struct rtw_chip_ops rtw8821c_ops = {
|
||||
.config_bfee = rtw8821c_bf_config_bfee,
|
||||
.set_gid_table = rtw_bf_set_gid_table,
|
||||
.cfg_csi_rate = rtw_bf_cfg_csi_rate,
|
||||
+ .led_set = rtw8821c_led_set,
|
||||
.fill_txdesc_checksum = rtw8821c_fill_txdesc_checksum,
|
||||
|
||||
.coex_set_init = rtw8821c_coex_cfg_init,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index 739809f4cab5..7f03903ddf4b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -1566,6 +1566,24 @@ static void rtw8822b_adaptivity(struct rtw_dev *rtwdev)
|
||||
rtw_phy_set_edcca_th(rtwdev, l2h, h2l);
|
||||
}
|
||||
|
||||
+static void rtw8822b_led_set(struct led_classdev *led,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
|
||||
+ u32 ledcfg;
|
||||
+
|
||||
+ ledcfg = rtw_read32(rtwdev, REG_LED_CFG);
|
||||
+ u32p_replace_bits(&ledcfg, BIT_LED_MODE_SW_CTRL, BIT_LED2_CM);
|
||||
+ ledcfg &= ~BIT_GPIO13_14_WL_CTRL_EN;
|
||||
+
|
||||
+ if (brightness == LED_OFF)
|
||||
+ ledcfg |= BIT_LED2_SV;
|
||||
+ else
|
||||
+ ledcfg &= ~BIT_LED2_SV;
|
||||
+
|
||||
+ rtw_write32(rtwdev, REG_LED_CFG, ledcfg);
|
||||
+}
|
||||
+
|
||||
static void rtw8822b_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *txdesc)
|
||||
@@ -2146,6 +2164,7 @@ static const struct rtw_chip_ops rtw8822b_ops = {
|
||||
.cfg_csi_rate = rtw_bf_cfg_csi_rate,
|
||||
.adaptivity_init = rtw8822b_adaptivity_init,
|
||||
.adaptivity = rtw8822b_adaptivity,
|
||||
+ .led_set = rtw8822b_led_set,
|
||||
.fill_txdesc_checksum = rtw8822b_fill_txdesc_checksum,
|
||||
|
||||
.coex_set_init = rtw8822b_coex_cfg_init,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index af6b76937f1d..ec362a817f5f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -4537,6 +4537,24 @@ static void rtw8822c_adaptivity(struct rtw_dev *rtwdev)
|
||||
rtw_phy_set_edcca_th(rtwdev, l2h, h2l);
|
||||
}
|
||||
|
||||
+static void rtw8822c_led_set(struct led_classdev *led,
|
||||
+ enum led_brightness brightness)
|
||||
+{
|
||||
+ struct rtw_dev *rtwdev = container_of(led, struct rtw_dev, led_cdev);
|
||||
+ u32 ledcfg;
|
||||
+
|
||||
+ ledcfg = rtw_read32(rtwdev, REG_LED_CFG);
|
||||
+ u32p_replace_bits(&ledcfg, BIT_LED_MODE_SW_CTRL, BIT_LED2_CM);
|
||||
+ ledcfg &= ~BIT_GPIO13_14_WL_CTRL_EN;
|
||||
+
|
||||
+ if (brightness == LED_OFF)
|
||||
+ ledcfg |= BIT_LED2_SV;
|
||||
+ else
|
||||
+ ledcfg &= ~BIT_LED2_SV;
|
||||
+
|
||||
+ rtw_write32(rtwdev, REG_LED_CFG, ledcfg);
|
||||
+}
|
||||
+
|
||||
static void rtw8822c_fill_txdesc_checksum(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *txdesc)
|
||||
@@ -4964,6 +4982,7 @@ static const struct rtw_chip_ops rtw8822c_ops = {
|
||||
.cfo_track = rtw8822c_cfo_track,
|
||||
.config_tx_path = rtw8822c_config_tx_path,
|
||||
.config_txrx_mode = rtw8822c_config_trx_mode,
|
||||
+ .led_set = rtw8822c_led_set,
|
||||
.fill_txdesc_checksum = rtw8822c_fill_txdesc_checksum,
|
||||
|
||||
.coex_set_init = rtw8822c_coex_cfg_init,
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,76 @@
|
||||
From 2031f4725fab8be5092d483281e92c9cb7a7bc68 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Sun, 26 Jan 2025 16:04:21 +0200
|
||||
Subject: [PATCH 43/43] wifi: rtw88: Don't use static local variable in
|
||||
rtw8821c_set_tx_power_index_by_rate
|
||||
|
||||
Some users want to plug two identical USB devices at the same time.
|
||||
This static variable could theoretically cause them to use incorrect
|
||||
TX power values.
|
||||
|
||||
Move the variable to the caller and pass a pointer to it to
|
||||
rtw8821c_set_tx_power_index_by_rate().
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/fe42858c-9b9f-4f03-9aaa-737472c2cd90@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 14 ++++++++------
|
||||
1 file changed, 8 insertions(+), 6 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index eb7e34c545d0..cc152248407c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -680,11 +680,11 @@ static void query_phy_status(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
}
|
||||
|
||||
static void
|
||||
-rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
+rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path,
|
||||
+ u8 rs, u32 *phy_pwr_idx)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
static const u32 offset_txagc[2] = {0x1d00, 0x1d80};
|
||||
- static u32 phy_pwr_idx;
|
||||
u8 rate, rate_idx, pwr_index, shift;
|
||||
int j;
|
||||
|
||||
@@ -692,12 +692,12 @@ rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
rate = rtw_rate_section[rs][j];
|
||||
pwr_index = hal->tx_pwr_tbl[path][rate];
|
||||
shift = rate & 0x3;
|
||||
- phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
|
||||
+ *phy_pwr_idx |= ((u32)pwr_index << (shift * 8));
|
||||
if (shift == 0x3 || rate == DESC_RATEVHT1SS_MCS9) {
|
||||
rate_idx = rate & 0xfc;
|
||||
rtw_write32(rtwdev, offset_txagc[path] + rate_idx,
|
||||
- phy_pwr_idx);
|
||||
- phy_pwr_idx = 0;
|
||||
+ *phy_pwr_idx);
|
||||
+ *phy_pwr_idx = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -705,6 +705,7 @@ rtw8821c_set_tx_power_index_by_rate(struct rtw_dev *rtwdev, u8 path, u8 rs)
|
||||
static void rtw8821c_set_tx_power_index(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_hal *hal = &rtwdev->hal;
|
||||
+ u32 phy_pwr_idx = 0;
|
||||
int rs, path;
|
||||
|
||||
for (path = 0; path < hal->rf_path_num; path++) {
|
||||
@@ -712,7 +713,8 @@ static void rtw8821c_set_tx_power_index(struct rtw_dev *rtwdev)
|
||||
if (rs == RTW_RATE_SECTION_HT_2S ||
|
||||
rs == RTW_RATE_SECTION_VHT_2S)
|
||||
continue;
|
||||
- rtw8821c_set_tx_power_index_by_rate(rtwdev, path, rs);
|
||||
+ rtw8821c_set_tx_power_index_by_rate(rtwdev, path, rs,
|
||||
+ &phy_pwr_idx);
|
||||
}
|
||||
}
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
Loading…
x
Reference in New Issue
Block a user