mirror of
https://github.com/LibreELEC/LibreELEC.tv.git
synced 2025-07-24 11:16:51 +00:00
linux: wifi: rtw88: Add support for RTL8821AU and RTL8812AU
https://patchwork.kernel.org/project/linux-wireless/cover/d2870a44-9b91-4090-9a25-873eb62997f5@gmail.com/
This commit is contained in:
parent
ca94442ce3
commit
3b71b340ff
@ -20,20 +20,20 @@ case "${LINUX}" in
|
||||
PKG_SHA256=""
|
||||
PKG_URL="https://github.com/torvalds/linux/archive/${PKG_VERSION}.tar.gz"
|
||||
PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz"
|
||||
PKG_PATCH_DIRS="default"
|
||||
PKG_PATCH_DIRS="default rtlwifi/6.12 rtlwifi/after-6.12"
|
||||
;;
|
||||
raspberrypi)
|
||||
PKG_VERSION="3edaa3875fbeb0b2effd77c62baabf2933efc6ef" # 6.6.54
|
||||
PKG_SHA256="97a9055a9f76d501b93948a6956e28eafd26d69ec75327326e54b220b504fd37"
|
||||
PKG_URL="https://github.com/raspberrypi/linux/archive/${PKG_VERSION}.tar.gz"
|
||||
PKG_SOURCE_NAME="linux-${LINUX}-${PKG_VERSION}.tar.gz"
|
||||
PKG_PATCH_DIRS="raspberrypi rtlwifi/6.9 rtlwifi/6.10 rtlwifi/6.11"
|
||||
PKG_PATCH_DIRS="raspberrypi rtlwifi/6.9 rtlwifi/6.10 rtlwifi/6.11 rtlwifi/6.12 rtlwifi/after-6.12"
|
||||
;;
|
||||
*)
|
||||
PKG_VERSION="6.11"
|
||||
PKG_SHA256="55d2c6c025ebc27810c748d66325dd5bc601e8d32f8581d9e77673529bdacb2e"
|
||||
PKG_URL="https://www.kernel.org/pub/linux/kernel/v${PKG_VERSION/.*/}.x/${PKG_NAME}-${PKG_VERSION}.tar.xz"
|
||||
PKG_PATCH_DIRS="default"
|
||||
PKG_PATCH_DIRS="default rtlwifi/6.12 rtlwifi/after-6.12"
|
||||
;;
|
||||
esac
|
||||
|
||||
|
2324
packages/linux/patches/rtlwifi/6.10/0008-6.10-wifi-rtw88-Shared-module-for-rtw8723x-devices.patch
vendored
Normal file
2324
packages/linux/patches/rtlwifi/6.10/0008-6.10-wifi-rtw88-Shared-module-for-rtw8723x-devices.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
231
packages/linux/patches/rtlwifi/6.10/0009-6.10-wifi-rtw88-Debug-output-for-rtw8723x-EFUSE.patch
vendored
Normal file
231
packages/linux/patches/rtlwifi/6.10/0009-6.10-wifi-rtw88-Debug-output-for-rtw8723x-EFUSE.patch
vendored
Normal file
@ -0,0 +1,231 @@
|
||||
From da2abdcdbbb8c498fcfb2bc88ba56028bccdbc8a Mon Sep 17 00:00:00 2001
|
||||
From: Fiona Klute <fiona.klute@gmx.de>
|
||||
Date: Mon, 11 Mar 2024 11:37:06 +0100
|
||||
Subject: [PATCH] wifi: rtw88: Debug output for rtw8723x EFUSE
|
||||
|
||||
Some 8703b chips contain invalid EFUSE data, getting detailed
|
||||
information is critical when analyzing issues caused by that.
|
||||
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Tested-by: Pavel Machek <pavel@ucw.cz>
|
||||
Signed-off-by: Fiona Klute <fiona.klute@gmx.de>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240311103735.615541-3-fiona.klute@gmx.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723x.c | 159 ++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723x.h | 11 ++
|
||||
2 files changed, 170 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723x.c b/drivers/net/wireless/realtek/rtw88/rtw8723x.c
|
||||
index c23650c5a20080..0d0b6c2cb9aa19 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723x.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723x.c
|
||||
@@ -63,6 +63,163 @@ static void __rtw8723x_lck(struct rtw_dev *rtwdev)
|
||||
rtw_write8(rtwdev, REG_TXPAUSE, 0x00);
|
||||
}
|
||||
|
||||
+#define DBG_EFUSE_VAL(rtwdev, map, name) \
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, # name "=0x%02x\n", \
|
||||
+ (map)->name)
|
||||
+#define DBG_EFUSE_2BYTE(rtwdev, map, name) \
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, # name "=0x%02x%02x\n", \
|
||||
+ (map)->name[0], (map)->name[1])
|
||||
+
|
||||
+static void rtw8723xe_efuse_debug(struct rtw_dev *rtwdev,
|
||||
+ struct rtw8723x_efuse *map)
|
||||
+{
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "mac_addr=%pM\n", map->e.mac_addr);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, e.vendor_id);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, e.device_id);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, e.sub_vendor_id);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, e.sub_device_id);
|
||||
+}
|
||||
+
|
||||
+static void rtw8723xu_efuse_debug(struct rtw_dev *rtwdev,
|
||||
+ struct rtw8723x_efuse *map)
|
||||
+{
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, u.vendor_id);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, u.product_id);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, u.usb_option);
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "mac_addr=%pM\n", map->u.mac_addr);
|
||||
+}
|
||||
+
|
||||
+static void rtw8723xs_efuse_debug(struct rtw_dev *rtwdev,
|
||||
+ struct rtw8723x_efuse *map)
|
||||
+{
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "mac_addr=%pM\n", map->s.mac_addr);
|
||||
+}
|
||||
+
|
||||
+static void __rtw8723x_debug_txpwr_limit(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_txpwr_idx *table,
|
||||
+ int tx_path_count)
|
||||
+{
|
||||
+ if (!rtw_dbg_is_enabled(rtwdev, RTW_DBG_EFUSE))
|
||||
+ return;
|
||||
+
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
|
||||
+ "Power index table (2.4G):\n");
|
||||
+ /* CCK base */
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "CCK base\n");
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "RF G0 G1 G2 G3 G4 G5\n");
|
||||
+ for (int i = 0; i < tx_path_count; i++)
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
|
||||
+ "[%c]: %3u %3u %3u %3u %3u %3u\n",
|
||||
+ 'A' + i,
|
||||
+ table[i].pwr_idx_2g.cck_base[0],
|
||||
+ table[i].pwr_idx_2g.cck_base[1],
|
||||
+ table[i].pwr_idx_2g.cck_base[2],
|
||||
+ table[i].pwr_idx_2g.cck_base[3],
|
||||
+ table[i].pwr_idx_2g.cck_base[4],
|
||||
+ table[i].pwr_idx_2g.cck_base[5]);
|
||||
+ /* CCK diff */
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "CCK diff\n");
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "RF 1S 2S 3S 4S\n");
|
||||
+ for (int i = 0; i < tx_path_count; i++)
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
|
||||
+ "[%c]: %2d %2d %2d %2d\n",
|
||||
+ 'A' + i, 0 /* no diff for 1S */,
|
||||
+ table[i].pwr_idx_2g.ht_2s_diff.cck,
|
||||
+ table[i].pwr_idx_2g.ht_3s_diff.cck,
|
||||
+ table[i].pwr_idx_2g.ht_4s_diff.cck);
|
||||
+ /* BW40-1S base */
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "BW40-1S base\n");
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "RF G0 G1 G2 G3 G4\n");
|
||||
+ for (int i = 0; i < tx_path_count; i++)
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
|
||||
+ "[%c]: %3u %3u %3u %3u %3u\n",
|
||||
+ 'A' + i,
|
||||
+ table[i].pwr_idx_2g.bw40_base[0],
|
||||
+ table[i].pwr_idx_2g.bw40_base[1],
|
||||
+ table[i].pwr_idx_2g.bw40_base[2],
|
||||
+ table[i].pwr_idx_2g.bw40_base[3],
|
||||
+ table[i].pwr_idx_2g.bw40_base[4]);
|
||||
+ /* OFDM diff */
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "OFDM diff\n");
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "RF 1S 2S 3S 4S\n");
|
||||
+ for (int i = 0; i < tx_path_count; i++)
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
|
||||
+ "[%c]: %2d %2d %2d %2d\n",
|
||||
+ 'A' + i,
|
||||
+ table[i].pwr_idx_2g.ht_1s_diff.ofdm,
|
||||
+ table[i].pwr_idx_2g.ht_2s_diff.ofdm,
|
||||
+ table[i].pwr_idx_2g.ht_3s_diff.ofdm,
|
||||
+ table[i].pwr_idx_2g.ht_4s_diff.ofdm);
|
||||
+ /* BW20 diff */
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "BW20 diff\n");
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "RF 1S 2S 3S 4S\n");
|
||||
+ for (int i = 0; i < tx_path_count; i++)
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
|
||||
+ "[%c]: %2d %2d %2d %2d\n",
|
||||
+ 'A' + i,
|
||||
+ table[i].pwr_idx_2g.ht_1s_diff.bw20,
|
||||
+ table[i].pwr_idx_2g.ht_2s_diff.bw20,
|
||||
+ table[i].pwr_idx_2g.ht_3s_diff.bw20,
|
||||
+ table[i].pwr_idx_2g.ht_4s_diff.bw20);
|
||||
+ /* BW40 diff */
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "BW40 diff\n");
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "RF 1S 2S 3S 4S\n");
|
||||
+ for (int i = 0; i < tx_path_count; i++)
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE,
|
||||
+ "[%c]: %2d %2d %2d %2d\n",
|
||||
+ 'A' + i, 0 /* no diff for 1S */,
|
||||
+ table[i].pwr_idx_2g.ht_2s_diff.bw40,
|
||||
+ table[i].pwr_idx_2g.ht_3s_diff.bw40,
|
||||
+ table[i].pwr_idx_2g.ht_4s_diff.bw40);
|
||||
+}
|
||||
+
|
||||
+static void efuse_debug_dump(struct rtw_dev *rtwdev,
|
||||
+ struct rtw8723x_efuse *map)
|
||||
+{
|
||||
+ if (!rtw_dbg_is_enabled(rtwdev, RTW_DBG_EFUSE))
|
||||
+ return;
|
||||
+
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "EFUSE raw logical map:\n");
|
||||
+ print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 16, 1,
|
||||
+ (u8 *)map, sizeof(struct rtw8723x_efuse), false);
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_EFUSE, "Parsed rtw8723x EFUSE data:\n");
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, rtl_id);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, afe);
|
||||
+ rtw8723x_debug_txpwr_limit(rtwdev, map->txpwr_idx_table, 4);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, channel_plan);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, xtal_k);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, thermal_meter);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, iqk_lck);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, pa_type);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, lna_type_2g);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, lna_type_5g);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, rf_board_option);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, rf_feature_option);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, rf_bt_setting);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, eeprom_version);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, eeprom_customer_id);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, tx_bb_swing_setting_2g);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, tx_pwr_calibrate_rate);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, rf_antenna_option);
|
||||
+ DBG_EFUSE_VAL(rtwdev, map, rfe_option);
|
||||
+ DBG_EFUSE_2BYTE(rtwdev, map, country_code);
|
||||
+
|
||||
+ switch (rtw_hci_type(rtwdev)) {
|
||||
+ case RTW_HCI_TYPE_PCIE:
|
||||
+ rtw8723xe_efuse_debug(rtwdev, map);
|
||||
+ break;
|
||||
+ case RTW_HCI_TYPE_USB:
|
||||
+ rtw8723xu_efuse_debug(rtwdev, map);
|
||||
+ break;
|
||||
+ case RTW_HCI_TYPE_SDIO:
|
||||
+ rtw8723xs_efuse_debug(rtwdev, map);
|
||||
+ break;
|
||||
+ default:
|
||||
+ /* unsupported now */
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void rtw8723xe_efuse_parsing(struct rtw_efuse *efuse,
|
||||
struct rtw8723x_efuse *map)
|
||||
{
|
||||
@@ -88,6 +245,7 @@ static int __rtw8723x_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
int i;
|
||||
|
||||
map = (struct rtw8723x_efuse *)log_map;
|
||||
+ efuse_debug_dump(rtwdev, map);
|
||||
|
||||
efuse->rfe_option = 0;
|
||||
efuse->rf_board_option = map->rf_board_option;
|
||||
@@ -553,6 +711,7 @@ const struct rtw8723x_common rtw8723x_common = {
|
||||
.pwrtrack_set_xtal = __rtw8723x_pwrtrack_set_xtal,
|
||||
.coex_cfg_init = __rtw8723x_coex_cfg_init,
|
||||
.fill_txdesc_checksum = __rtw8723x_fill_txdesc_checksum,
|
||||
+ .debug_txpwr_limit = __rtw8723x_debug_txpwr_limit,
|
||||
};
|
||||
EXPORT_SYMBOL(rtw8723x_common);
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723x.h b/drivers/net/wireless/realtek/rtw88/rtw8723x.h
|
||||
index cace285fc03397..d6dfee5a1806e2 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723x.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723x.h
|
||||
@@ -154,6 +154,9 @@ struct rtw8723x_common {
|
||||
void (*fill_txdesc_checksum)(struct rtw_dev *rtwdev,
|
||||
struct rtw_tx_pkt_info *pkt_info,
|
||||
u8 *txdesc);
|
||||
+ void (*debug_txpwr_limit)(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_txpwr_idx *table,
|
||||
+ int tx_path_count);
|
||||
};
|
||||
|
||||
extern const struct rtw8723x_common rtw8723x_common;
|
||||
@@ -346,6 +349,14 @@ static inline s32 iqk_mult(s32 x, s32 y, s32 *ext)
|
||||
return (t >> 8); /* Q.16 --> Q.8 */
|
||||
}
|
||||
|
||||
+static inline
|
||||
+void rtw8723x_debug_txpwr_limit(struct rtw_dev *rtwdev,
|
||||
+ struct rtw_txpwr_idx *table,
|
||||
+ int tx_path_count)
|
||||
+{
|
||||
+ rtw8723x_common.debug_txpwr_limit(rtwdev, table, tx_path_count);
|
||||
+}
|
||||
+
|
||||
static inline void rtw8723x_lck(struct rtw_dev *rtwdev)
|
||||
{
|
||||
rtw8723x_common.lck(rtwdev);
|
106
packages/linux/patches/rtlwifi/6.10/0010-6.10-wifi-rtw88-Add-definitions-for-8703b-chip.patch
vendored
Normal file
106
packages/linux/patches/rtlwifi/6.10/0010-6.10-wifi-rtw88-Add-definitions-for-8703b-chip.patch
vendored
Normal file
@ -0,0 +1,106 @@
|
||||
From 9bb762b3a957faffb4ba596165525521c07ad2eb Mon Sep 17 00:00:00 2001
|
||||
From: Fiona Klute <fiona.klute@gmx.de>
|
||||
Date: Mon, 11 Mar 2024 11:37:07 +0100
|
||||
Subject: [PATCH] wifi: rtw88: Add definitions for 8703b chip
|
||||
|
||||
default_cck_index is used in power track, the rx_cck_agc_report_type
|
||||
for RX PHY status. GET_RX_DESC_BW is an RX descriptor field not used
|
||||
by the other chip drivers.
|
||||
|
||||
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Tested-by: Pavel Machek <pavel@ucw.cz>
|
||||
Signed-off-by: Fiona Klute <fiona.klute@gmx.de>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240311103735.615541-4-fiona.klute@gmx.de
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 3 +++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8723x.h | 11 +++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/rx.h | 2 ++
|
||||
3 files changed, 16 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index e14d1da43940fa..49894331f7b495 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -187,6 +187,7 @@ enum rtw_chip_type {
|
||||
RTW_CHIP_TYPE_8822C,
|
||||
RTW_CHIP_TYPE_8723D,
|
||||
RTW_CHIP_TYPE_8821C,
|
||||
+ RTW_CHIP_TYPE_8703B,
|
||||
};
|
||||
|
||||
enum rtw_tx_queue_type {
|
||||
@@ -1700,11 +1701,13 @@ struct rtw_dm_info {
|
||||
s8 delta_power_index[RTW_RF_PATH_MAX];
|
||||
s8 delta_power_index_last[RTW_RF_PATH_MAX];
|
||||
u8 default_ofdm_index;
|
||||
+ u8 default_cck_index;
|
||||
bool pwr_trk_triggered;
|
||||
bool pwr_trk_init_trigger;
|
||||
struct ewma_thermal avg_thermal[RTW_RF_PATH_MAX];
|
||||
s8 txagc_remnant_cck;
|
||||
s8 txagc_remnant_ofdm;
|
||||
+ u8 rx_cck_agc_report_type;
|
||||
|
||||
/* backup dack results for each path and I/Q */
|
||||
u32 dack_adck[RTW_RF_PATH_MAX];
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723x.h b/drivers/net/wireless/realtek/rtw88/rtw8723x.h
|
||||
index d6dfee5a1806e2..e93bfce994bf82 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723x.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723x.h
|
||||
@@ -165,6 +165,8 @@ extern const struct rtw8723x_common rtw8723x_common;
|
||||
#define MAX_TOLERANCE 5
|
||||
#define IQK_TX_X_ERR 0x142
|
||||
#define IQK_TX_Y_ERR 0x42
|
||||
+#define IQK_RX_X_ERR 0x132
|
||||
+#define IQK_RX_Y_ERR 0x36
|
||||
#define IQK_RX_X_UPPER 0x11a
|
||||
#define IQK_RX_X_LOWER 0xe6
|
||||
#define IQK_RX_Y_LMT 0x1a
|
||||
@@ -177,6 +179,10 @@ extern const struct rtw8723x_common rtw8723x_common;
|
||||
#define DIS_3WIRE 0xccf000c0
|
||||
#define EN_3WIRE 0xccc000c0
|
||||
#define START_PSD 0x400000
|
||||
+#define FREQ_CH5 0xfccd
|
||||
+#define FREQ_CH6 0xfc4d
|
||||
+#define FREQ_CH7 0xffcd
|
||||
+#define FREQ_CH8 0xff4d
|
||||
#define FREQ_CH13 0xfccd
|
||||
#define FREQ_CH14 0xff9a
|
||||
#define RFCFGCH_CHANNEL_MASK GENMASK(7, 0)
|
||||
@@ -239,10 +245,13 @@ extern const struct rtw8723x_common rtw8723x_common;
|
||||
#define BIT_MASK_OFDM0_EXT_C BIT(29)
|
||||
#define BIT_MASK_OFDM0_EXTS (BIT(31) | BIT(29) | BIT(28))
|
||||
#define BIT_SET_OFDM0_EXTS(a, c, d) (((a) << 31) | ((c) << 29) | ((d) << 28))
|
||||
+#define BIT_MASK_OFDM0_EXTS_B (BIT(27) | BIT(25) | BIT(24))
|
||||
+#define BIT_SET_OFDM0_EXTS_B(a, c, d) (((a) << 27) | ((c) << 25) | ((d) << 24))
|
||||
#define REG_OFDM0_XAAGC1 0x0c50
|
||||
#define REG_OFDM0_XBAGC1 0x0c58
|
||||
#define REG_AGCRSSI 0x0c78
|
||||
#define REG_OFDM_0_XA_TX_IQ_IMBALANCE 0x0c80
|
||||
+#define REG_OFDM_0_XB_TX_IQ_IMBALANCE 0x0c88
|
||||
#define BIT_MASK_TXIQ_ELM_A 0x03ff
|
||||
#define BIT_SET_TXIQ_ELM_ACD(a, c, d) (((d) << 22) | (((c) & 0x3F) << 16) | \
|
||||
((a) & 0x03ff))
|
||||
@@ -303,6 +312,8 @@ extern const struct rtw8723x_common rtw8723x_common;
|
||||
#define REG_IQK_AGC_RSP_11N 0x0e4c
|
||||
#define REG_TX_IQK_TONE_B 0x0e50
|
||||
#define REG_RX_IQK_TONE_B 0x0e54
|
||||
+#define REG_TXIQK_PI_B 0x0e58
|
||||
+#define REG_RXIQK_PI_B 0x0e5c
|
||||
#define REG_IQK_RES_TX 0x0e94
|
||||
#define BIT_MASK_RES_TX GENMASK(25, 16)
|
||||
#define REG_IQK_RES_TY 0x0e9c
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rx.h b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
index 3342e37612813a..d3668c4efc24d5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
@@ -40,6 +40,8 @@ enum rtw_rx_desc_enc {
|
||||
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(31, 24)))
|
||||
|
||||
void rtw_rx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct sk_buff *skb);
|
2132
packages/linux/patches/rtlwifi/6.10/0011-6.10-wifi-rtw88-Add-rtw8703b.c.patch
vendored
Normal file
2132
packages/linux/patches/rtlwifi/6.10/0011-6.10-wifi-rtw88-Add-rtw8703b.c.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
164
packages/linux/patches/rtlwifi/6.11/0013-6.11-wifi-rtw88-usb-Further-limit-the-TX-aggregation.patch
vendored
Normal file
164
packages/linux/patches/rtlwifi/6.11/0013-6.11-wifi-rtw88-usb-Further-limit-the-TX-aggregation.patch
vendored
Normal file
@ -0,0 +1,164 @@
|
||||
From d7dd13ea54af8496aca2762a758d817d6813e81c Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Sun, 16 Jun 2024 22:27:34 +0300
|
||||
Subject: [PATCH] wifi: rtw88: usb: Further limit the TX aggregation
|
||||
|
||||
Currently the number of frames sent to the chip in a single USB Request
|
||||
Block is limited only by the size of the TX buffer, which is 20 KiB.
|
||||
Testing reveals that as many as 13 frames get aggregated. This is more
|
||||
than what any of the chips would like to receive. RTL8822CU, RTL8822BU,
|
||||
and RTL8821CU want at most 3 frames, and RTL8723DU wants only 1 frame
|
||||
per URB.
|
||||
|
||||
RTL8723DU in particular reliably malfunctions during a speed test if it
|
||||
receives more than 1 frame per URB. All traffic seems to stop. Pinging
|
||||
the AP no longer works.
|
||||
|
||||
Fix this problem by limiting the number of frames sent to the chip in a
|
||||
single URB according to what each chip likes.
|
||||
|
||||
Also configure RTL8822CU, RTL8822BU, and RTL8821CU to expect 3 frames
|
||||
per URB.
|
||||
|
||||
RTL8703B may or may not be found in USB devices. Declare that it wants
|
||||
only 1 frame per URB, just in case.
|
||||
|
||||
Tested with RTL8723DU and RTL8811CU.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
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/cb46ea35-7e59-4742-9c1f-01ceeaad36fb@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/mac.c | 9 +++++++++
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 2 ++
|
||||
drivers/net/wireless/realtek/rtw88/reg.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 +
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 4 +++-
|
||||
9 files changed, 20 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
index 0dba8aae771603..564f5988ee82a7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
||||
@@ -1201,6 +1201,15 @@ static int __priority_queue_cfg(struct rtw_dev *rtwdev,
|
||||
rtw_write16(rtwdev, REG_FIFOPAGE_CTRL_2 + 2, fifo->rsvd_boundary);
|
||||
rtw_write16(rtwdev, REG_BCNQ1_BDNY_V1, fifo->rsvd_boundary);
|
||||
rtw_write32(rtwdev, REG_RXFF_BNDY, chip->rxff_size - C2H_PKT_BUF - 1);
|
||||
+
|
||||
+ if (rtwdev->hci.type == RTW_HCI_TYPE_USB) {
|
||||
+ rtw_write8_mask(rtwdev, REG_AUTO_LLT_V1, BIT_MASK_BLK_DESC_NUM,
|
||||
+ chip->usb_tx_agg_desc_num);
|
||||
+
|
||||
+ rtw_write8(rtwdev, REG_AUTO_LLT_V1 + 3, chip->usb_tx_agg_desc_num);
|
||||
+ rtw_write8_set(rtwdev, REG_TXDMA_OFFSET_CHK + 1, BIT(1));
|
||||
+ }
|
||||
+
|
||||
rtw_write8_set(rtwdev, REG_AUTO_LLT_V1, BIT_AUTO_INIT_LLT_V1);
|
||||
|
||||
if (!check_hw_ready(rtwdev, REG_AUTO_LLT_V1, BIT_AUTO_INIT_LLT_V1, 0))
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 49894331f7b495..49a3fd4fb7dcdc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1197,6 +1197,8 @@ struct rtw_chip_info {
|
||||
u16 fw_fifo_addr[RTW_FW_FIFO_MAX];
|
||||
const struct rtw_fwcd_segs *fwcd_segs;
|
||||
|
||||
+ u8 usb_tx_agg_desc_num;
|
||||
+
|
||||
u8 default_1ss_tx_path;
|
||||
|
||||
bool path_div_supported;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index b122f226924be5..02ef9a77316b48 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -270,6 +270,7 @@
|
||||
#define BIT_MASK_BCN_HEAD_1_V1 0xfff
|
||||
#define REG_AUTO_LLT_V1 0x0208
|
||||
#define BIT_AUTO_INIT_LLT_V1 BIT(0)
|
||||
+#define BIT_MASK_BLK_DESC_NUM GENMASK(7, 4)
|
||||
#define REG_DWBCN0_CTRL 0x0208
|
||||
#define BIT_BCN_VALID BIT(16)
|
||||
#define REG_TXDMA_OFFSET_CHK 0x020C
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8703b.c b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
index 8919f9e11f0378..222608de33cdec 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
||||
@@ -2013,6 +2013,7 @@ const struct rtw_chip_info rtw8703b_hw_spec = {
|
||||
.tx_stbc = false,
|
||||
.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 */
|
||||
|
||||
.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 f8df4c84d39f73..3fba4054d45f49 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
||||
@@ -2171,6 +2171,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = {
|
||||
.band = RTW_BAND_2G,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
+ .usb_tx_agg_desc_num = 1,
|
||||
.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 fe5d8e18835093..526e8de77b3e82 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -2008,6 +2008,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = {
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
+ .usb_tx_agg_desc_num = 3,
|
||||
.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 3017a9760da8dc..2456ff24281801 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -2548,6 +2548,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = {
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x1c,
|
||||
+ .usb_tx_agg_desc_num = 3,
|
||||
.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 cd965edc29cea3..62376d1cca22fc 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -5366,6 +5366,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = {
|
||||
.band = RTW_BAND_2G | RTW_BAND_5G,
|
||||
.page_size = TX_PAGE_SIZE,
|
||||
.dig_min = 0x20,
|
||||
+ .usb_tx_agg_desc_num = 3,
|
||||
.default_1ss_tx_path = BB_PATH_A,
|
||||
.path_div_supported = true,
|
||||
.ht_supported = true,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index d204d138afe298..057c0ffbe94472 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -379,7 +379,9 @@ static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list
|
||||
|
||||
skb_iter = skb_peek(list);
|
||||
|
||||
- if (skb_iter && skb_iter->len + skb_head->len <= RTW_USB_MAX_XMITBUF_SZ)
|
||||
+ if (skb_iter &&
|
||||
+ skb_iter->len + skb_head->len <= RTW_USB_MAX_XMITBUF_SZ &&
|
||||
+ agg_num < rtwdev->chip->usb_tx_agg_desc_num)
|
||||
__skb_unlink(skb_iter, list);
|
||||
else
|
||||
skb_iter = NULL;
|
51
packages/linux/patches/rtlwifi/6.11/0014-6.11-wifi-rtw88-usb-Simplify-rtw_usb_write_data.patch
vendored
Normal file
51
packages/linux/patches/rtlwifi/6.11/0014-6.11-wifi-rtw88-usb-Simplify-rtw_usb_write_data.patch
vendored
Normal file
@ -0,0 +1,51 @@
|
||||
From a892f6ffbec7a1a25c639534bee62200418242f9 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Fri, 3 May 2024 13:53:28 +0300
|
||||
Subject: [PATCH] wifi: rtw88: usb: Simplify rtw_usb_write_data
|
||||
|
||||
The skb created in this function always has the same headroom,
|
||||
the chip's TX descriptor size. (pkt_info->offset is set by
|
||||
rtw_usb_write_data_rsvd_page() to chip->tx_pkt_desc_sz.) Use
|
||||
chip->tx_pkt_desc_sz directly.
|
||||
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Tested-by: Larry Finger <Larry.Finger@lwfinger.net>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://msgid.link/2479507e-3946-492f-857e-83e54969aad2@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 12 +++++-------
|
||||
1 file changed, 5 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index a0188511099a1b..90afeefe002f37 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -433,23 +433,21 @@ static int rtw_usb_write_data(struct rtw_dev *rtwdev,
|
||||
{
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
struct sk_buff *skb;
|
||||
- unsigned int desclen, headsize, size;
|
||||
+ unsigned int size;
|
||||
u8 qsel;
|
||||
int ret = 0;
|
||||
|
||||
size = pkt_info->tx_pkt_size;
|
||||
qsel = pkt_info->qsel;
|
||||
- desclen = chip->tx_pkt_desc_sz;
|
||||
- headsize = pkt_info->offset ? pkt_info->offset : desclen;
|
||||
|
||||
- skb = dev_alloc_skb(headsize + size);
|
||||
+ skb = dev_alloc_skb(chip->tx_pkt_desc_sz + size);
|
||||
if (unlikely(!skb))
|
||||
return -ENOMEM;
|
||||
|
||||
- skb_reserve(skb, headsize);
|
||||
+ skb_reserve(skb, chip->tx_pkt_desc_sz);
|
||||
skb_put_data(skb, buf, size);
|
||||
- skb_push(skb, headsize);
|
||||
- memset(skb->data, 0, headsize);
|
||||
+ 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_txdesc_checksum(rtwdev, pkt_info, skb->data);
|
||||
|
@ -0,0 +1,303 @@
|
||||
From 3c64d161a450d62330ad79d2b5f92c115b11622d Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 11 Jul 2024 01:11:33 +0300
|
||||
Subject: [PATCH 1/7] wifi: rtw88: usb: Support USB 3 with RTL8822CU/RTL8822BU
|
||||
|
||||
The Realtek wifi 5 devices which support USB 3 are weird: when first
|
||||
plugged in, they pretend to be USB 2. The driver needs to send some
|
||||
commands to the device, which make it disappear and come back as a
|
||||
USB 3 device.
|
||||
|
||||
Implement the required commands in rtw88.
|
||||
|
||||
When a USB 3 device is plugged into a USB 2 port, rtw88 will try to
|
||||
switch it to USB 3 mode only once. The device will disappear and come
|
||||
back still in USB 2 mode, of course.
|
||||
|
||||
Some people experience heavy interference in the 2.4 GHz band in
|
||||
USB 3 mode, so add a module parameter switch_usb_mode with the
|
||||
default value 1 to let people disable the switching.
|
||||
|
||||
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/77906c62-5674-426f-bde1-1b2a12a0339d@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/debug.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 2 +
|
||||
drivers/net/wireless/realtek/rtw88/reg.h | 11 +++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822b.h | 4 +-
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.h | 24 +++---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 84 +++++++++++++++++++
|
||||
8 files changed, 116 insertions(+), 12 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h
|
||||
index eb69006c463e..9a1e0e85a13c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/debug.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/debug.h
|
||||
@@ -25,6 +25,7 @@ enum rtw_debug_mask {
|
||||
RTW_DBG_HW_SCAN = 0x00010000,
|
||||
RTW_DBG_STATE = 0x00020000,
|
||||
RTW_DBG_SDIO = 0x00040000,
|
||||
+ RTW_DBG_USB = 0x00080000,
|
||||
|
||||
RTW_DBG_UNEXP = 0x80000000,
|
||||
RTW_DBG_ALL = 0xffffffff
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 49a3fd4fb7dc..9d21637cf5d5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -1785,6 +1785,8 @@ struct rtw_efuse {
|
||||
bool share_ant;
|
||||
u8 bt_setting;
|
||||
|
||||
+ u8 usb_mode_switch;
|
||||
+
|
||||
struct {
|
||||
u8 hci;
|
||||
u8 bw;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index 02ef9a77316b..e7b24465f549 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -15,6 +15,7 @@
|
||||
#define BIT_WLOCK_1C_B6 BIT(5)
|
||||
#define REG_SYS_PW_CTRL 0x0004
|
||||
#define BIT_PFM_WOWL BIT(3)
|
||||
+#define BIT_APFM_OFFMAC BIT(9)
|
||||
#define REG_SYS_CLK_CTRL 0x0008
|
||||
#define BIT_CPU_CLK_EN BIT(14)
|
||||
|
||||
@@ -133,6 +134,14 @@
|
||||
#define REG_PMC_DBG_CTRL1 0xa8
|
||||
#define BITS_PMC_BT_IQK_STS GENMASK(22, 21)
|
||||
|
||||
+#define REG_PAD_CTRL2 0x00C4
|
||||
+#define BIT_RSM_EN_V1 BIT(16)
|
||||
+#define BIT_NO_PDN_CHIPOFF_V1 BIT(17)
|
||||
+#define BIT_MASK_USB23_SW_MODE_V1 GENMASK(19, 18)
|
||||
+#define BIT_USB3_USB2_TRANSITION BIT(20)
|
||||
+#define BIT_USB_MODE_U2 1
|
||||
+#define BIT_USB_MODE_U3 2
|
||||
+
|
||||
#define REG_EFUSE_ACCESS 0x00CF
|
||||
#define EFUSE_ACCESS_ON 0x69
|
||||
#define EFUSE_ACCESS_OFF 0x00
|
||||
@@ -568,6 +577,8 @@
|
||||
#define BIT_WL_SECURITY_CLK BIT(15)
|
||||
#define BIT_DDMA_EN BIT(8)
|
||||
|
||||
+#define REG_SW_MDIO 0x10C0
|
||||
+
|
||||
#define REG_H2C_PKT_READADDR 0x10D0
|
||||
#define REG_H2C_PKT_WRITEADDR 0x10D4
|
||||
#define REG_FW_DBG6 0x10F8
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
index 2456ff242818..6edb17aea90e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -46,6 +46,7 @@ static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
|
||||
map = (struct rtw8822b_efuse *)log_map;
|
||||
|
||||
+ efuse->usb_mode_switch = u8_get_bits(map->usb_mode, BIT(7));
|
||||
efuse->rfe_option = map->rfe_option;
|
||||
efuse->rf_board_option = map->rf_board_option;
|
||||
efuse->crystal_cap = map->xtal_k;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h
|
||||
index 2dc3a6660f06..cf85e63966a1 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h
|
||||
@@ -72,7 +72,9 @@ struct rtw8822bs_efuse {
|
||||
|
||||
struct rtw8822b_efuse {
|
||||
__le16 rtl_id;
|
||||
- u8 res0[0x0e];
|
||||
+ u8 res0[4];
|
||||
+ u8 usb_mode;
|
||||
+ u8 res1[0x09];
|
||||
|
||||
/* power index for four RF paths */
|
||||
struct rtw_txpwr_idx txpwr_idx_table[4];
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index 62376d1cca22..bc807b13e9ce 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -49,6 +49,7 @@ static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map)
|
||||
|
||||
map = (struct rtw8822c_efuse *)log_map;
|
||||
|
||||
+ efuse->usb_mode_switch = u8_get_bits(map->usb_mode, BIT(7));
|
||||
efuse->rfe_option = map->rfe_option;
|
||||
efuse->rf_board_option = map->rf_board_option;
|
||||
efuse->crystal_cap = map->xtal_k & XCAP_MASK;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
|
||||
index 1bc0e7f5d6bb..e2b383d633cd 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h
|
||||
@@ -59,16 +59,18 @@ struct rtw8822ce_efuse {
|
||||
|
||||
struct rtw8822c_efuse {
|
||||
__le16 rtl_id;
|
||||
- u8 res0[0x0e];
|
||||
+ u8 res0[4];
|
||||
+ u8 usb_mode;
|
||||
+ u8 res1[0x09];
|
||||
|
||||
/* power index for four RF paths */
|
||||
struct rtw_txpwr_idx txpwr_idx_table[4];
|
||||
|
||||
u8 channel_plan; /* 0xb8 */
|
||||
u8 xtal_k;
|
||||
- u8 res1;
|
||||
+ u8 res2;
|
||||
u8 iqk_lck;
|
||||
- u8 res2[5]; /* 0xbc */
|
||||
+ u8 res3[5]; /* 0xbc */
|
||||
u8 rf_board_option;
|
||||
u8 rf_feature_option;
|
||||
u8 rf_bt_setting;
|
||||
@@ -80,21 +82,21 @@ struct rtw8822c_efuse {
|
||||
u8 rf_antenna_option; /* 0xc9 */
|
||||
u8 rfe_option;
|
||||
u8 country_code[2];
|
||||
- u8 res3[3];
|
||||
+ u8 res4[3];
|
||||
u8 path_a_thermal; /* 0xd0 */
|
||||
u8 path_b_thermal;
|
||||
- u8 res4[2];
|
||||
+ u8 res5[2];
|
||||
u8 rx_gain_gap_2g_ofdm;
|
||||
- u8 res5;
|
||||
- u8 rx_gain_gap_2g_cck;
|
||||
u8 res6;
|
||||
- u8 rx_gain_gap_5gl;
|
||||
+ u8 rx_gain_gap_2g_cck;
|
||||
u8 res7;
|
||||
- u8 rx_gain_gap_5gm;
|
||||
+ u8 rx_gain_gap_5gl;
|
||||
u8 res8;
|
||||
- u8 rx_gain_gap_5gh;
|
||||
+ u8 rx_gain_gap_5gm;
|
||||
u8 res9;
|
||||
- u8 res10[0x42];
|
||||
+ u8 rx_gain_gap_5gh;
|
||||
+ u8 res10;
|
||||
+ u8 res11[0x42];
|
||||
union {
|
||||
struct rtw8822ce_efuse e;
|
||||
struct rtw8822cu_efuse u;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index a55ca5a24227..251a5726f3ee 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -14,6 +14,11 @@
|
||||
#include "ps.h"
|
||||
#include "usb.h"
|
||||
|
||||
+static bool rtw_switch_usb_mode = true;
|
||||
+module_param_named(switch_usb_mode, rtw_switch_usb_mode, bool, 0644);
|
||||
+MODULE_PARM_DESC(switch_usb_mode,
|
||||
+ "Set to N to disable switching to USB 3 mode to avoid potential interference in the 2.4 GHz band (default: Y)");
|
||||
+
|
||||
#define RTW_USB_MAX_RXQ_LEN 512
|
||||
|
||||
struct rtw_usb_txcb {
|
||||
@@ -841,6 +846,77 @@ static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev,
|
||||
usb_set_intfdata(intf, NULL);
|
||||
}
|
||||
|
||||
+static int rtw_usb_switch_mode_new(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ enum usb_device_speed cur_speed;
|
||||
+ u8 id = rtwdev->chip->id;
|
||||
+ bool can_switch;
|
||||
+ u32 pad_ctrl2;
|
||||
+
|
||||
+ if (rtw_read8(rtwdev, REG_SYS_CFG2 + 3) == 0x20)
|
||||
+ cur_speed = USB_SPEED_SUPER;
|
||||
+ else
|
||||
+ cur_speed = USB_SPEED_HIGH;
|
||||
+
|
||||
+ if (cur_speed == USB_SPEED_SUPER)
|
||||
+ return 0;
|
||||
+
|
||||
+ pad_ctrl2 = rtw_read32(rtwdev, REG_PAD_CTRL2);
|
||||
+
|
||||
+ can_switch = !!(pad_ctrl2 & (BIT_MASK_USB23_SW_MODE_V1 |
|
||||
+ BIT_USB3_USB2_TRANSITION));
|
||||
+
|
||||
+ if (!can_switch) {
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
+ "Switching to USB 3 mode unsupported by the chip\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ /* At this point cur_speed is USB_SPEED_HIGH. If we already tried
|
||||
+ * to switch don't try again - it's a USB 2 port.
|
||||
+ */
|
||||
+ if (u32_get_bits(pad_ctrl2, BIT_MASK_USB23_SW_MODE_V1) == BIT_USB_MODE_U3)
|
||||
+ return 0;
|
||||
+
|
||||
+ /* Enable IO wrapper timeout */
|
||||
+ if (id == RTW_CHIP_TYPE_8822B || id == RTW_CHIP_TYPE_8821C)
|
||||
+ rtw_write8_clr(rtwdev, REG_SW_MDIO + 3, BIT(0));
|
||||
+
|
||||
+ u32p_replace_bits(&pad_ctrl2, BIT_USB_MODE_U3, BIT_MASK_USB23_SW_MODE_V1);
|
||||
+ pad_ctrl2 |= BIT_RSM_EN_V1;
|
||||
+
|
||||
+ rtw_write32(rtwdev, REG_PAD_CTRL2, pad_ctrl2);
|
||||
+ rtw_write8(rtwdev, REG_PAD_CTRL2 + 1, 4);
|
||||
+
|
||||
+ rtw_write16_set(rtwdev, REG_SYS_PW_CTRL, BIT_APFM_OFFMAC);
|
||||
+ usleep_range(1000, 1001);
|
||||
+ rtw_write32_set(rtwdev, REG_PAD_CTRL2, BIT_NO_PDN_CHIPOFF_V1);
|
||||
+
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+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)
|
||||
+ return 0;
|
||||
+
|
||||
+ if (!rtwdev->efuse.usb_mode_switch) {
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
+ "Switching to USB 3 mode disabled by chip's efuse\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ if (!rtw_switch_usb_mode) {
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_USB,
|
||||
+ "Switching to USB 3 mode disabled by module parameter\n");
|
||||
+ return 0;
|
||||
+ }
|
||||
+
|
||||
+ return rtw_usb_switch_mode_new(rtwdev);
|
||||
+}
|
||||
+
|
||||
int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
{
|
||||
struct rtw_dev *rtwdev;
|
||||
@@ -896,6 +972,14 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
|
||||
goto err_destroy_rxwq;
|
||||
}
|
||||
|
||||
+ ret = rtw_usb_switch_mode(rtwdev);
|
||||
+ if (ret) {
|
||||
+ /* Not a fail, but we do need to skip rtw_register_hw. */
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_USB, "switching to USB 3 mode\n");
|
||||
+ ret = 0;
|
||||
+ goto err_destroy_rxwq;
|
||||
+ }
|
||||
+
|
||||
ret = rtw_register_hw(rtwdev, rtwdev->hw);
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to register hw\n");
|
||||
--
|
||||
2.43.0
|
||||
|
36
packages/linux/patches/rtlwifi/6.12/0002-6.12-wifi-rtw88-8703b-Fix-reported-RX-band-width.patch
vendored
Normal file
36
packages/linux/patches/rtlwifi/6.12/0002-6.12-wifi-rtw88-8703b-Fix-reported-RX-band-width.patch
vendored
Normal file
@ -0,0 +1,36 @@
|
||||
From aefa7a3a7cbe6c7de08fd7a7447c797a97c2e0cf Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Tue, 23 Jul 2024 22:32:59 +0300
|
||||
Subject: [PATCH 2/7] wifi: rtw88: 8703b: Fix reported RX band width
|
||||
|
||||
The definition of GET_RX_DESC_BW is incorrect. Fix it according to the
|
||||
GET_RX_STATUS_DESC_BW_8703B macro from the official driver.
|
||||
|
||||
Tested only with RTL8812AU, which uses the same bits.
|
||||
|
||||
Cc: stable@vger.kernel.org
|
||||
Fixes: 9bb762b3a957 ("wifi: rtw88: Add definitions for 8703b chip")
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Tested-by: Fiona Klute <fiona.klute@gmx.de>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/1cfed9d5-4304-4b96-84c5-c347f59fedb9@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/rx.h | 2 +-
|
||||
1 file changed, 1 insertion(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rx.h b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
index d3668c4efc24..8a072dd3d73c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
@@ -41,7 +41,7 @@ enum rtw_rx_desc_enc {
|
||||
#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(31, 24)))
|
||||
+ (le32_get_bits(*((__le32 *)(rxdesc) + 0x04), GENMASK(5, 4)))
|
||||
|
||||
void rtw_rx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
|
||||
struct sk_buff *skb);
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,168 @@
|
||||
From c1ca6ece1a989240c04f9a77230592cc92ff823c Mon Sep 17 00:00:00 2001
|
||||
From: Po-Hao Huang <phhuang@realtek.com>
|
||||
Date: Wed, 24 Jul 2024 13:05:01 +0800
|
||||
Subject: [PATCH 3/7] wifi: rtw88: 8822c: Parse channel from IE to correct
|
||||
invalid hardware reports
|
||||
|
||||
For CCK packets we could get incorrect reports from hardware.
|
||||
And this causes wrong frequencies being reported. Parse the channel
|
||||
information from IE if provided by AP to fix this.
|
||||
|
||||
Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/20240724050501.7550-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/pci.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 7 ++--
|
||||
drivers/net/wireless/realtek/rtw88/rx.c | 41 +++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/rx.h | 13 ++++++
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 2 +
|
||||
7 files changed, 63 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 9d21637cf5d5..37912dded128 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -622,6 +622,7 @@ struct rtw_rx_pkt_stat {
|
||||
bool crc_err;
|
||||
bool decrypted;
|
||||
bool is_c2h;
|
||||
+ bool channel_invalid;
|
||||
|
||||
s32 signal_power;
|
||||
u16 pkt_len;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
index a5b9d6c7be37..5d0580da13fb 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
@@ -1088,6 +1088,7 @@ static u32 rtw_pci_rx_napi(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci,
|
||||
/* remove rx_desc */
|
||||
skb_pull(new, pkt_offset);
|
||||
|
||||
+ rtw_update_rx_freq_for_invalid(rtwdev, new, &rx_status, &pkt_stat);
|
||||
rtw_rx_stats(rtwdev, pkt_stat.vif, new);
|
||||
memcpy(new->cb, &rx_status, sizeof(rx_status));
|
||||
ieee80211_rx_napi(rtwdev->hw, NULL, new, napi);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
index bc807b13e9ce..96a233079e02 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -2576,9 +2576,10 @@ static void query_phy_status_page0(struct rtw_dev *rtwdev, u8 *phy_status,
|
||||
rx_power[RF_PATH_B] -= 110;
|
||||
|
||||
channel = GET_PHY_STAT_P0_CHANNEL(phy_status);
|
||||
- if (channel == 0)
|
||||
- channel = rtwdev->hal.current_channel;
|
||||
- rtw_set_rx_freq_band(pkt_stat, channel);
|
||||
+ if (channel != 0)
|
||||
+ rtw_set_rx_freq_band(pkt_stat, channel);
|
||||
+ else
|
||||
+ pkt_stat->channel_invalid = true;
|
||||
|
||||
pkt_stat->rx_power[RF_PATH_A] = rx_power[RF_PATH_A];
|
||||
pkt_stat->rx_power[RF_PATH_B] = rx_power[RF_PATH_B];
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rx.c b/drivers/net/wireless/realtek/rtw88/rx.c
|
||||
index 84aedabdf285..66f9419588cf 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rx.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rx.c
|
||||
@@ -146,6 +146,47 @@ static void rtw_set_rx_freq_by_pktstat(struct rtw_rx_pkt_stat *pkt_stat,
|
||||
rx_status->band = pkt_stat->band;
|
||||
}
|
||||
|
||||
+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)
|
||||
+{
|
||||
+ struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *)skb->data;
|
||||
+ int channel = rtwdev->hal.current_channel;
|
||||
+ size_t hdr_len, ielen;
|
||||
+ int channel_number;
|
||||
+ u8 *variable;
|
||||
+
|
||||
+ if (!test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
|
||||
+ goto fill_rx_status;
|
||||
+
|
||||
+ if (ieee80211_is_beacon(mgmt->frame_control)) {
|
||||
+ variable = mgmt->u.beacon.variable;
|
||||
+ hdr_len = offsetof(struct ieee80211_mgmt,
|
||||
+ u.beacon.variable);
|
||||
+ } else if (ieee80211_is_probe_resp(mgmt->frame_control)) {
|
||||
+ variable = mgmt->u.probe_resp.variable;
|
||||
+ hdr_len = offsetof(struct ieee80211_mgmt,
|
||||
+ u.probe_resp.variable);
|
||||
+ } else {
|
||||
+ goto fill_rx_status;
|
||||
+ }
|
||||
+
|
||||
+ if (skb->len > hdr_len)
|
||||
+ ielen = skb->len - hdr_len;
|
||||
+ else
|
||||
+ goto fill_rx_status;
|
||||
+
|
||||
+ channel_number = cfg80211_get_ies_channel_number(variable, ielen,
|
||||
+ NL80211_BAND_2GHZ);
|
||||
+ if (channel_number != -1)
|
||||
+ channel = channel_number;
|
||||
+
|
||||
+fill_rx_status:
|
||||
+ rtw_set_rx_freq_band(pkt_stat, channel);
|
||||
+ rtw_set_rx_freq_by_pktstat(pkt_stat, rx_status);
|
||||
+}
|
||||
+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,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rx.h b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
index 8a072dd3d73c..9f0019112987 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rx.h
|
||||
@@ -50,5 +50,18 @@ void rtw_rx_fill_rx_status(struct rtw_dev *rtwdev,
|
||||
struct ieee80211_hdr *hdr,
|
||||
struct ieee80211_rx_status *rx_status,
|
||||
u8 *phy_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);
|
||||
+
|
||||
+static inline
|
||||
+void rtw_update_rx_freq_for_invalid(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
+ struct ieee80211_rx_status *rx_status,
|
||||
+ struct rtw_rx_pkt_stat *pkt_stat)
|
||||
+{
|
||||
+ if (pkt_stat->channel_invalid)
|
||||
+ rtw_update_rx_freq_from_ie(rtwdev, skb, rx_status, pkt_stat);
|
||||
+}
|
||||
+
|
||||
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 0cae5746f540..763aa8212a4b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -948,6 +948,7 @@ static void rtw_sdio_rx_skb(struct rtw_dev *rtwdev, struct sk_buff *skb,
|
||||
skb_put(skb, pkt_stat->pkt_len);
|
||||
skb_reserve(skb, pkt_offset);
|
||||
|
||||
+ rtw_update_rx_freq_for_invalid(rtwdev, skb, rx_status, pkt_stat);
|
||||
rtw_rx_stats(rtwdev, pkt_stat->vif, skb);
|
||||
|
||||
ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 251a5726f3ee..9145c11a063e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -579,6 +579,8 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
|
||||
skb_put(skb, pkt_stat.pkt_len);
|
||||
skb_reserve(skb, pkt_offset);
|
||||
+
|
||||
+ rtw_update_rx_freq_for_invalid(rtwdev, skb, &rx_status, &pkt_stat);
|
||||
memcpy(skb->cb, &rx_status, sizeof(rx_status));
|
||||
ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,81 @@
|
||||
From 93523589d4dae8567b471743e8c6a88bf80750c4 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 8 Aug 2024 01:19:36 +0300
|
||||
Subject: [PATCH 4/7] wifi: rtw88: usb: Init RX burst length according to USB
|
||||
speed
|
||||
|
||||
This is needed in order to make USB RX aggregation work with RTL8811CU
|
||||
(and presumably RTL8822BU and RTL8822CU also).
|
||||
|
||||
I don't know what BIT_DMA_BURST_CNT, BIT_DMA_MODE, and BIT_DROP_DATA_EN
|
||||
are doing.
|
||||
|
||||
Tested with RTL8822CU, RTL8811CU, and RTL8723DU.
|
||||
|
||||
The RX speed is unchanged in my tests.
|
||||
|
||||
Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/ac569c6f-7129-4341-b523-901fe10cabff@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/reg.h | 6 ++++++
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 23 ++++++++++++++++++++++-
|
||||
2 files changed, 28 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index e7b24465f549..4d9b8668e8b0 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -322,6 +322,12 @@
|
||||
#define REG_RXDMA_DPR 0x028C
|
||||
#define REG_RXDMA_MODE 0x0290
|
||||
#define BIT_DMA_MODE BIT(1)
|
||||
+#define BIT_DMA_BURST_CNT GENMASK(3, 2)
|
||||
+#define BIT_DMA_BURST_SIZE GENMASK(5, 4)
|
||||
+#define BIT_DMA_BURST_SIZE_64 2
|
||||
+#define BIT_DMA_BURST_SIZE_512 1
|
||||
+#define BIT_DMA_BURST_SIZE_1024 0
|
||||
+
|
||||
#define REG_RXPKTNUM 0x02B0
|
||||
|
||||
#define REG_INT_MIG 0x0304
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 9145c11a063e..1c40d46a7eb4 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -720,9 +720,30 @@ static void rtw_usb_link_ps(struct rtw_dev *rtwdev, bool enter)
|
||||
/* empty function for rtw_hci_ops */
|
||||
}
|
||||
|
||||
+static void rtw_usb_init_burst_pkt_len(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
|
||||
+ enum usb_device_speed speed = rtwusb->udev->speed;
|
||||
+ u8 rxdma, burst_size;
|
||||
+
|
||||
+ rxdma = BIT_DMA_BURST_CNT | BIT_DMA_MODE;
|
||||
+
|
||||
+ if (speed == USB_SPEED_SUPER)
|
||||
+ burst_size = BIT_DMA_BURST_SIZE_1024;
|
||||
+ else if (speed == USB_SPEED_HIGH)
|
||||
+ burst_size = BIT_DMA_BURST_SIZE_512;
|
||||
+ else
|
||||
+ burst_size = BIT_DMA_BURST_SIZE_64;
|
||||
+
|
||||
+ u8p_replace_bits(&rxdma, burst_size, BIT_DMA_BURST_SIZE);
|
||||
+
|
||||
+ rtw_write8(rtwdev, REG_RXDMA_MODE, rxdma);
|
||||
+ rtw_write16_set(rtwdev, REG_TXDMA_OFFSET_CHK, BIT_DROP_DATA_EN);
|
||||
+}
|
||||
+
|
||||
static void rtw_usb_interface_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
- /* empty function for rtw_hci_ops */
|
||||
+ rtw_usb_init_burst_pkt_len(rtwdev);
|
||||
}
|
||||
|
||||
static struct rtw_hci_ops rtw_usb_ops = {
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,36 @@
|
||||
From 7198cca8f07045773f92befd8861bb5b3f8bd83d Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 8 Aug 2024 01:20:36 +0300
|
||||
Subject: [PATCH 5/7] wifi: rtw88: usb: Update the RX stats after every frame
|
||||
|
||||
Update the number of received unicast data frames and bytes every time
|
||||
a frame is received. This is what the PCI and SDIO drivers do.
|
||||
|
||||
This has an influence on the power saving, bluetooth coexistence, and
|
||||
(in a future patch) the use of RX aggregation.
|
||||
|
||||
Tested with RTL8822CU, RTL8811CU, and RTL8723DU.
|
||||
|
||||
Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/75a2ca52-8f01-45c5-926f-d3a68ae3b284@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 1c40d46a7eb4..10f1d724370e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -581,6 +581,7 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
skb_reserve(skb, pkt_offset);
|
||||
|
||||
rtw_update_rx_freq_for_invalid(rtwdev, skb, &rx_status, &pkt_stat);
|
||||
+ rtw_rx_stats(rtwdev, pkt_stat.vif, skb);
|
||||
memcpy(skb->cb, &rx_status, sizeof(rx_status));
|
||||
ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
123
packages/linux/patches/rtlwifi/6.12/0006-6.12-wifi-rtw88-usb-Support-RX-aggregation.patch
vendored
Normal file
123
packages/linux/patches/rtlwifi/6.12/0006-6.12-wifi-rtw88-usb-Support-RX-aggregation.patch
vendored
Normal file
@ -0,0 +1,123 @@
|
||||
From 8e07253c6c1c00d2dc5fc8937f3ab15c23be5367 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 8 Aug 2024 01:21:36 +0300
|
||||
Subject: [PATCH 6/7] wifi: rtw88: usb: Support RX aggregation
|
||||
|
||||
The chips can be configured to aggregate several frames into a single
|
||||
USB transfer. Modify rtw_usb_rx_handler() to support this case.
|
||||
|
||||
RX aggregation improves the RX speed of RTL8811CU on certain ARM
|
||||
systems, like the NanoPi NEO Core2. It also improves the RX speed of
|
||||
RTL8822CU on some x86_64 systems.
|
||||
|
||||
Currently none of the chips are configured to aggregate frames.
|
||||
|
||||
Tested with RTL8822CU, RTL8811CU, and RTL8723DU.
|
||||
|
||||
Reviewed-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/f845826d-de71-492d-9a22-e48c07989a1f@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 61 ++++++++++++++++--------
|
||||
1 file changed, 40 insertions(+), 21 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 10f1d724370e..64d68366812c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -546,11 +546,12 @@ 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;
|
||||
- struct rtw_rx_pkt_stat pkt_stat;
|
||||
+ 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 *skb;
|
||||
- u32 pkt_desc_sz = chip->rx_pkt_desc_sz;
|
||||
- u32 pkt_offset;
|
||||
u8 *rx_desc;
|
||||
int limit;
|
||||
|
||||
@@ -559,31 +560,48 @@ static void rtw_usb_rx_handler(struct work_struct *work)
|
||||
if (!skb)
|
||||
break;
|
||||
|
||||
- rx_desc = skb->data;
|
||||
- chip->ops->query_rx_desc(rtwdev, rx_desc, &pkt_stat,
|
||||
- &rx_status);
|
||||
- pkt_offset = pkt_desc_sz + pkt_stat.drv_info_sz +
|
||||
- pkt_stat.shift;
|
||||
-
|
||||
- if (pkt_stat.is_c2h) {
|
||||
- skb_put(skb, pkt_stat.pkt_len + pkt_offset);
|
||||
- rtw_fw_c2h_cmd_rx_irqsafe(rtwdev, pkt_offset, skb);
|
||||
- continue;
|
||||
- }
|
||||
-
|
||||
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);
|
||||
continue;
|
||||
}
|
||||
|
||||
- skb_put(skb, pkt_stat.pkt_len);
|
||||
- skb_reserve(skb, pkt_offset);
|
||||
+ urb_len = skb->len;
|
||||
+
|
||||
+ do {
|
||||
+ rx_desc = skb->data;
|
||||
+ chip->ops->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);
|
||||
+
|
||||
+ if (urb_len >= next_pkt + pkt_desc_sz)
|
||||
+ next_skb = skb_clone(skb, GFP_KERNEL);
|
||||
+ else
|
||||
+ next_skb = NULL;
|
||||
+
|
||||
+ 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);
|
||||
+ rtw_rx_stats(rtwdev, pkt_stat.vif, skb);
|
||||
+ memcpy(skb->cb, &rx_status, sizeof(rx_status));
|
||||
+ ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
+ }
|
||||
+
|
||||
+ skb = next_skb;
|
||||
+ if (skb)
|
||||
+ skb_pull(skb, next_pkt);
|
||||
|
||||
- rtw_update_rx_freq_for_invalid(rtwdev, skb, &rx_status, &pkt_stat);
|
||||
- rtw_rx_stats(rtwdev, pkt_stat.vif, skb);
|
||||
- memcpy(skb->cb, &rx_status, sizeof(rx_status));
|
||||
- ieee80211_rx_irqsafe(rtwdev->hw, skb);
|
||||
+ urb_len -= next_pkt;
|
||||
+ } while (skb);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -627,6 +645,7 @@ static void rtw_usb_read_port_complete(struct urb *urb)
|
||||
if (skb)
|
||||
dev_kfree_skb_any(skb);
|
||||
} else {
|
||||
+ skb_put(skb, urb->actual_length);
|
||||
skb_queue_tail(&rtwusb->rx_queue, skb);
|
||||
queue_work(rtwusb->rxwq, &rtwusb->rx_work);
|
||||
}
|
||||
--
|
||||
2.43.0
|
||||
|
@ -0,0 +1,182 @@
|
||||
From 3e36db62ff52667d63497da45b6cae4cd8382721 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Thu, 8 Aug 2024 01:23:06 +0300
|
||||
Subject: [PATCH 7/7] wifi: rtw88: Enable USB RX aggregation for
|
||||
8822c/8822b/8821c
|
||||
|
||||
Enable USB RX aggregation when there is at least 1 Mbps RX or TX
|
||||
traffic, otherwise disable it.
|
||||
|
||||
USB RX aggregation improves the RX speed of RTL8811CU on certain ARM
|
||||
systems, like the NanoPi NEO Core2. Before: 28 Mbps, after: 231 Mbps.
|
||||
|
||||
It also improves the RX speed of RTL8822CU on some x86_64 systems.
|
||||
Before: ~200 Mbps, after: ~300 Mbps.
|
||||
|
||||
The official drivers for these chips use the same logic for SDIO, but
|
||||
for some reason the SDIO driver in rtw88 always enables RX aggregation,
|
||||
so this patch only toggles aggregation for USB devices.
|
||||
|
||||
RTL8703B is likely not found in USB devices, and RTL8723DU doesn't like
|
||||
aggregation.
|
||||
|
||||
Tested-by: Sascha Hauer <s.hauer@pengutronix.de>
|
||||
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Link: https://patch.msgid.link/b4c0d54c-6755-4b0f-9dd7-f9196fd74b68@gmail.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/hci.h | 7 ++++
|
||||
drivers/net/wireless/realtek/rtw88/main.c | 13 +++++---
|
||||
drivers/net/wireless/realtek/rtw88/pci.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/sdio.c | 1 +
|
||||
drivers/net/wireless/realtek/rtw88/usb.c | 40 +++++++++++++++++++++++
|
||||
5 files changed, 58 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h
|
||||
index 830d7532f2a3..96aeda26014e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/hci.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/hci.h
|
||||
@@ -18,6 +18,7 @@ struct rtw_hci_ops {
|
||||
void (*deep_ps)(struct rtw_dev *rtwdev, bool enter);
|
||||
void (*link_ps)(struct rtw_dev *rtwdev, bool enter);
|
||||
void (*interface_cfg)(struct rtw_dev *rtwdev);
|
||||
+ void (*dynamic_rx_agg)(struct rtw_dev *rtwdev, bool enable);
|
||||
|
||||
int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
|
||||
int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
|
||||
@@ -72,6 +73,12 @@ static inline void rtw_hci_interface_cfg(struct rtw_dev *rtwdev)
|
||||
rtwdev->hci.ops->interface_cfg(rtwdev);
|
||||
}
|
||||
|
||||
+static inline void rtw_hci_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
|
||||
+{
|
||||
+ if (rtwdev->hci.ops->dynamic_rx_agg)
|
||||
+ rtwdev->hci.ops->dynamic_rx_agg(rtwdev, enable);
|
||||
+}
|
||||
+
|
||||
static inline int
|
||||
rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
|
||||
{
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
index 7ab7a988b123..22b39b3acc6c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||||
@@ -212,6 +212,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);
|
||||
+ u32 tx_unicast_mbps, rx_unicast_mbps;
|
||||
bool ps_active;
|
||||
|
||||
mutex_lock(&rtwdev->mutex);
|
||||
@@ -236,10 +237,11 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
else
|
||||
ps_active = false;
|
||||
|
||||
- ewma_tp_add(&stats->tx_ewma_tp,
|
||||
- (u32)(stats->tx_unicast >> RTW_TP_SHIFT));
|
||||
- ewma_tp_add(&stats->rx_ewma_tp,
|
||||
- (u32)(stats->rx_unicast >> RTW_TP_SHIFT));
|
||||
+ tx_unicast_mbps = stats->tx_unicast >> RTW_TP_SHIFT;
|
||||
+ rx_unicast_mbps = stats->rx_unicast >> RTW_TP_SHIFT;
|
||||
+
|
||||
+ ewma_tp_add(&stats->tx_ewma_tp, tx_unicast_mbps);
|
||||
+ ewma_tp_add(&stats->rx_ewma_tp, rx_unicast_mbps);
|
||||
stats->tx_throughput = ewma_tp_read(&stats->tx_ewma_tp);
|
||||
stats->rx_throughput = ewma_tp_read(&stats->rx_ewma_tp);
|
||||
|
||||
@@ -259,6 +261,9 @@ static void rtw_watch_dog_work(struct work_struct *work)
|
||||
|
||||
rtw_phy_dynamic_mechanism(rtwdev);
|
||||
|
||||
+ rtw_hci_dynamic_rx_agg(rtwdev,
|
||||
+ tx_unicast_mbps >= 1 || rx_unicast_mbps >= 1);
|
||||
+
|
||||
data.rtwdev = rtwdev;
|
||||
/* rtw_iterate_vifs internally uses an atomic iterator which is needed
|
||||
* to avoid taking local->iflist_mtx mutex
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
index 5d0580da13fb..0b9b8807af2c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
@@ -1601,6 +1601,7 @@ static struct rtw_hci_ops rtw_pci_ops = {
|
||||
.deep_ps = rtw_pci_deep_ps,
|
||||
.link_ps = rtw_pci_link_ps,
|
||||
.interface_cfg = rtw_pci_interface_cfg,
|
||||
+ .dynamic_rx_agg = NULL,
|
||||
|
||||
.read8 = rtw_pci_read8,
|
||||
.read16 = rtw_pci_read16,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
index 763aa8212a4b..21d0754dd7f6 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -1157,6 +1157,7 @@ static struct rtw_hci_ops rtw_sdio_ops = {
|
||||
.deep_ps = rtw_sdio_deep_ps,
|
||||
.link_ps = rtw_sdio_link_ps,
|
||||
.interface_cfg = rtw_sdio_interface_cfg,
|
||||
+ .dynamic_rx_agg = NULL,
|
||||
|
||||
.read8 = rtw_sdio_read8,
|
||||
.read16 = rtw_sdio_read16,
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
index 64d68366812c..e83ab6fb83f5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -766,6 +766,45 @@ static void rtw_usb_interface_cfg(struct rtw_dev *rtwdev)
|
||||
rtw_usb_init_burst_pkt_len(rtwdev);
|
||||
}
|
||||
|
||||
+static void rtw_usb_dynamic_rx_agg_v1(struct rtw_dev *rtwdev, bool enable)
|
||||
+{
|
||||
+ u8 size, timeout;
|
||||
+ u16 val16;
|
||||
+
|
||||
+ rtw_write32_set(rtwdev, REG_RXDMA_AGG_PG_TH, BIT_EN_PRE_CALC);
|
||||
+ rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_AGG_EN);
|
||||
+ rtw_write8_clr(rtwdev, REG_RXDMA_AGG_PG_TH + 3, BIT(7));
|
||||
+
|
||||
+ if (enable) {
|
||||
+ size = 0x5;
|
||||
+ timeout = 0x20;
|
||||
+ } else {
|
||||
+ size = 0x0;
|
||||
+ timeout = 0x1;
|
||||
+ }
|
||||
+ 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);
|
||||
+}
|
||||
+
|
||||
+static void rtw_usb_dynamic_rx_agg(struct rtw_dev *rtwdev, bool enable)
|
||||
+{
|
||||
+ switch (rtwdev->chip->id) {
|
||||
+ case RTW_CHIP_TYPE_8822C:
|
||||
+ case RTW_CHIP_TYPE_8822B:
|
||||
+ case RTW_CHIP_TYPE_8821C:
|
||||
+ rtw_usb_dynamic_rx_agg_v1(rtwdev, enable);
|
||||
+ break;
|
||||
+ case RTW_CHIP_TYPE_8723D:
|
||||
+ /* Doesn't like aggregation. */
|
||||
+ break;
|
||||
+ case RTW_CHIP_TYPE_8703B:
|
||||
+ /* Likely not found in USB devices. */
|
||||
+ break;
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static struct rtw_hci_ops rtw_usb_ops = {
|
||||
.tx_write = rtw_usb_tx_write,
|
||||
.tx_kick_off = rtw_usb_tx_kick_off,
|
||||
@@ -775,6 +814,7 @@ static struct rtw_hci_ops rtw_usb_ops = {
|
||||
.deep_ps = rtw_usb_deep_ps,
|
||||
.link_ps = rtw_usb_link_ps,
|
||||
.interface_cfg = rtw_usb_interface_cfg,
|
||||
+ .dynamic_rx_agg = rtw_usb_dynamic_rx_agg,
|
||||
|
||||
.write8 = rtw_usb_write8,
|
||||
.write16 = rtw_usb_write16,
|
||||
--
|
||||
2.43.0
|
||||
|
156
packages/linux/patches/rtlwifi/6.9/0008-wifi-rtw88-8821c-tweak-CCK-TX-filter-setting-for-SRRC.patch
vendored
Normal file
156
packages/linux/patches/rtlwifi/6.9/0008-wifi-rtw88-8821c-tweak-CCK-TX-filter-setting-for-SRRC.patch
vendored
Normal file
@ -0,0 +1,156 @@
|
||||
From 14a5b11532e850e7a748cbb4c74ac5c5abf18211 Mon Sep 17 00:00:00 2001
|
||||
From: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Date: Wed, 4 Oct 2023 16:50:51 +0800
|
||||
Subject: [PATCH] wifi: rtw88: 8821c: tweak CCK TX filter setting for SRRC
|
||||
regulation
|
||||
|
||||
Since new criterion released by SRRC (State Radio Regulatory Commission,
|
||||
China) is stricter, we have adjusted TX power limit tables for it. But,
|
||||
due to RTL8821C HW characteristic, we still need to use specific parameter
|
||||
in CCK TX filter when set channel to avoid violations in some corner cases.
|
||||
|
||||
Signed-off-by: Zong-Zhe Yang <kevin_yang@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20231004085051.205683-6-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/regd.c | 8 +++
|
||||
drivers/net/wireless/realtek/rtw88/regd.h | 2 +
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 67 +++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/rtw8821c.h | 1 +
|
||||
4 files changed, 78 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/regd.c b/drivers/net/wireless/realtek/rtw88/regd.c
|
||||
index 124fc7ae6a1476..7f3b2ea3f2a560 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/regd.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/regd.c
|
||||
@@ -502,6 +502,14 @@ u8 rtw_regd_get(struct rtw_dev *rtwdev)
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_regd_get);
|
||||
|
||||
+bool rtw_regd_srrc(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ struct rtw_regd *regd = &rtwdev->regd;
|
||||
+
|
||||
+ return rtw_reg_match(regd->regulatory, "CN");
|
||||
+}
|
||||
+EXPORT_SYMBOL(rtw_regd_srrc);
|
||||
+
|
||||
struct rtw_regd_alternative_t {
|
||||
bool set;
|
||||
u8 alt;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/regd.h b/drivers/net/wireless/realtek/rtw88/regd.h
|
||||
index 34cb13d0cd9ebc..3c5a6fd8e6ddd8 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/regd.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/regd.h
|
||||
@@ -68,4 +68,6 @@ int rtw_regd_init(struct rtw_dev *rtwdev);
|
||||
int rtw_regd_hint(struct rtw_dev *rtwdev);
|
||||
u8 rtw_regd_get(struct rtw_dev *rtwdev);
|
||||
bool rtw_regd_has_alt(u8 regd, u8 *regd_alt);
|
||||
+bool rtw_regd_srrc(struct rtw_dev *rtwdev);
|
||||
+
|
||||
#endif
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
index adf224618a2a6f..429bb420b0563e 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
||||
@@ -381,6 +381,65 @@ static void rtw8821c_set_channel_rxdfir(struct rtw_dev *rtwdev, u8 bw)
|
||||
}
|
||||
}
|
||||
|
||||
+static void rtw8821c_cck_tx_filter_srrc(struct rtw_dev *rtwdev, u8 channel, u8 bw)
|
||||
+{
|
||||
+ struct rtw_hal *hal = &rtwdev->hal;
|
||||
+
|
||||
+ if (channel == 14) {
|
||||
+ rtw_write32_mask(rtwdev, REG_CCA_FLTR, MASKHWORD, 0xe82c);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x00003667);
|
||||
+
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00002);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001e);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001c);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000e);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000c);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00000);
|
||||
+ } else if (channel == 13 ||
|
||||
+ (channel == 11 && bw == RTW_CHANNEL_WIDTH_40)) {
|
||||
+ rtw_write32_mask(rtwdev, REG_CCA_FLTR, MASKHWORD, 0xf8fe);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x64b80c1c);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x8810);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD, 0x01235667);
|
||||
+
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00002);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001e);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00027);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001c);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00027);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000e);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00029);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000c);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00026);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00000);
|
||||
+ } else {
|
||||
+ rtw_write32_mask(rtwdev, REG_CCA_FLTR, MASKHWORD, 0xe82c);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD,
|
||||
+ hal->ch_param[0]);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD,
|
||||
+ hal->ch_param[1] & MASKLWORD);
|
||||
+ rtw_write32_mask(rtwdev, REG_TXFILTER, MASKDWORD,
|
||||
+ hal->ch_param[2]);
|
||||
+
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00002);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001e);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0001c);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000e);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWA, RFREG_MASK, 0x0000c);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWD0, RFREG_MASK, 0x00000);
|
||||
+ rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTWE2, RFREG_MASK, 0x00000);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
|
||||
u8 primary_ch_idx)
|
||||
{
|
||||
@@ -395,6 +454,13 @@ static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
|
||||
|
||||
rtw_write32_mask(rtwdev, REG_TXSCALE_A, 0xf00, 0x0);
|
||||
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x96a);
|
||||
+
|
||||
+ if (rtw_regd_srrc(rtwdev)) {
|
||||
+ rtw8821c_cck_tx_filter_srrc(rtwdev, channel, bw);
|
||||
+ goto set_bw;
|
||||
+ }
|
||||
+
|
||||
+ /* CCK TX filter parameters for default case */
|
||||
if (channel == 14) {
|
||||
rtw_write32_mask(rtwdev, REG_TXSF2, MASKDWORD, 0x0000b81c);
|
||||
rtw_write32_mask(rtwdev, REG_TXSF6, MASKLWORD, 0x0000);
|
||||
@@ -430,6 +496,7 @@ static void rtw8821c_set_channel_bb(struct rtw_dev *rtwdev, u8 channel, u8 bw,
|
||||
rtw_write32_mask(rtwdev, REG_CLKTRK, 0x1ffe0000, 0x412);
|
||||
}
|
||||
|
||||
+set_bw:
|
||||
switch (bw) {
|
||||
case RTW_CHANNEL_WIDTH_20:
|
||||
default:
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
index fcff31688c453a..91ed921407bbe7 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h
|
||||
@@ -238,6 +238,7 @@ extern const struct rtw_chip_info rtw8821c_hw_spec;
|
||||
#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
|
@ -0,0 +1,52 @@
|
||||
From 8d101b15f86dae41fcf1afe448d5a52c1956c465 Mon Sep 17 00:00:00 2001
|
||||
From: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Date: Wed, 3 Jan 2024 15:01:55 +0800
|
||||
Subject: [PATCH] wifi: rtw88: 8822ce: refine power parameters for RFE type 5
|
||||
|
||||
Refine the power parameters for better step response especially at high
|
||||
current ramp case that is caused by power inductor variation.
|
||||
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://msgid.link/20240103070155.119488-1-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/pci.c | 4 ++++
|
||||
drivers/net/wireless/realtek/rtw88/reg.h | 3 +++
|
||||
2 files changed, 7 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
index 2bfc0e822b8d0b..9986a4cb37eb2b 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
@@ -1450,6 +1450,7 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
|
||||
{
|
||||
struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv;
|
||||
const struct rtw_chip_info *chip = rtwdev->chip;
|
||||
+ struct rtw_efuse *efuse = &rtwdev->efuse;
|
||||
struct pci_dev *pdev = rtwpci->pdev;
|
||||
const struct rtw_intf_phy_para *para;
|
||||
u16 cut;
|
||||
@@ -1498,6 +1499,9 @@ static void rtw_pci_phy_cfg(struct rtw_dev *rtwdev)
|
||||
rtw_err(rtwdev, "failed to set PCI cap, ret = %d\n",
|
||||
ret);
|
||||
}
|
||||
+
|
||||
+ if (chip->id == RTW_CHIP_TYPE_8822C && efuse->rfe_option == 5)
|
||||
+ rtw_write32_mask(rtwdev, REG_ANAPARSW_MAC_0, BIT_CF_L_V2, 0x1);
|
||||
}
|
||||
|
||||
static int __maybe_unused rtw_pci_suspend(struct device *dev)
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index 1634f03784f171..b122f226924be5 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -557,6 +557,9 @@
|
||||
#define REG_RFE_INV16 0x0cbe
|
||||
#define BIT_RFE_BUF_EN BIT(3)
|
||||
|
||||
+#define REG_ANAPARSW_MAC_0 0x1010
|
||||
+#define BIT_CF_L_V2 GENMASK(29, 28)
|
||||
+
|
||||
#define REG_ANAPAR_XTAL_0 0x1040
|
||||
#define BIT_XCAP_0 GENMASK(23, 10)
|
||||
#define REG_CPU_DMEM_CON 0x1080
|
@ -0,0 +1,46 @@
|
||||
From 1926a27299db00239d6bdc4c3f2bd3f842277d0d Mon Sep 17 00:00:00 2001
|
||||
From: Chin-Yen Lee <timlee@realtek.com>
|
||||
Date: Mon, 16 Oct 2023 13:35:53 +0800
|
||||
Subject: [PATCH] wifi: rtw88: debug: add to check if debug mask is enabled
|
||||
|
||||
The coming dump function for FW malfunction will add a function to
|
||||
dump registers to reflect status. However, if we are not debugging
|
||||
the mechanism, we don't print anything, so avoid reading registers by
|
||||
checking debug mask to reduce IO.
|
||||
|
||||
Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20231016053554.744180-2-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/debug.h | 12 ++++++++++++
|
||||
1 file changed, 12 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h
|
||||
index a9149c6c2b48c5..a03ced11bbe042 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/debug.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/debug.h
|
||||
@@ -48,11 +48,23 @@ void __rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
|
||||
|
||||
#define rtw_dbg(rtwdev, a...) __rtw_dbg(rtwdev, ##a)
|
||||
|
||||
+static inline bool rtw_dbg_is_enabled(struct rtw_dev *rtwdev,
|
||||
+ enum rtw_debug_mask mask)
|
||||
+{
|
||||
+ return !!(rtw_debug_mask & mask);
|
||||
+}
|
||||
+
|
||||
#else
|
||||
|
||||
static inline void rtw_dbg(struct rtw_dev *rtwdev, enum rtw_debug_mask mask,
|
||||
const char *fmt, ...) {}
|
||||
|
||||
+static inline bool rtw_dbg_is_enabled(struct rtw_dev *rtwdev,
|
||||
+ enum rtw_debug_mask mask)
|
||||
+{
|
||||
+ return false;
|
||||
+}
|
||||
+
|
||||
#endif /* CONFIG_RTW88_DEBUG */
|
||||
|
||||
#define rtw_info(rtwdev, a...) dev_info(rtwdev->dev, ##a)
|
@ -0,0 +1,234 @@
|
||||
From 20907fc069976fcf972239b7b253cf7c59c08a14 Mon Sep 17 00:00:00 2001
|
||||
From: Chin-Yen Lee <timlee@realtek.com>
|
||||
Date: Mon, 16 Oct 2023 13:35:54 +0800
|
||||
Subject: [PATCH] wifi: rtw88: dump firmware debug information in abnormal
|
||||
state
|
||||
|
||||
Sometimes firmware may enter strange state or infinite
|
||||
loop due to unknown bug, and then it will lead critical
|
||||
function fail, such as sending H2C command or changing
|
||||
power mode. In these abnormal states, we add more debug
|
||||
information, including hardware register status, to help
|
||||
further investigation.
|
||||
|
||||
Signed-off-by: Chin-Yen Lee <timlee@realtek.com>
|
||||
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
||||
Signed-off-by: Kalle Valo <kvalo@kernel.org>
|
||||
Link: https://lore.kernel.org/r/20231016053554.744180-3-pkshih@realtek.com
|
||||
---
|
||||
drivers/net/wireless/realtek/rtw88/fw.c | 74 +++++++++++++++++++++++
|
||||
drivers/net/wireless/realtek/rtw88/fw.h | 3 +
|
||||
drivers/net/wireless/realtek/rtw88/main.h | 6 ++
|
||||
drivers/net/wireless/realtek/rtw88/ps.c | 2 +
|
||||
drivers/net/wireless/realtek/rtw88/reg.h | 23 +++++++
|
||||
5 files changed, 108 insertions(+)
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
index a1b674e3caaa3c..acd78311c8c4a1 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
||||
@@ -17,6 +17,79 @@
|
||||
#include "phy.h"
|
||||
#include "mac.h"
|
||||
|
||||
+static const struct rtw_hw_reg_desc fw_h2c_regs[] = {
|
||||
+ {REG_FWIMR, MASKDWORD, "FWIMR"},
|
||||
+ {REG_FWIMR, BIT_FS_H2CCMD_INT_EN, "FWIMR enable"},
|
||||
+ {REG_FWISR, MASKDWORD, "FWISR"},
|
||||
+ {REG_FWISR, BIT_FS_H2CCMD_INT, "FWISR enable"},
|
||||
+ {REG_HMETFR, BIT_INT_BOX_ALL, "BoxBitMap"},
|
||||
+ {REG_HMEBOX0, MASKDWORD, "MSG 0"},
|
||||
+ {REG_HMEBOX0_EX, MASKDWORD, "MSG_EX 0"},
|
||||
+ {REG_HMEBOX1, MASKDWORD, "MSG 1"},
|
||||
+ {REG_HMEBOX1_EX, MASKDWORD, "MSG_EX 1"},
|
||||
+ {REG_HMEBOX2, MASKDWORD, "MSG 2"},
|
||||
+ {REG_HMEBOX2_EX, MASKDWORD, "MSG_EX 2"},
|
||||
+ {REG_HMEBOX3, MASKDWORD, "MSG 3"},
|
||||
+ {REG_HMEBOX3_EX, MASKDWORD, "MSG_EX 3"},
|
||||
+ {REG_FT1IMR, MASKDWORD, "FT1IMR"},
|
||||
+ {REG_FT1IMR, BIT_FS_H2C_CMD_OK_INT_EN, "FT1IMR enable"},
|
||||
+ {REG_FT1ISR, MASKDWORD, "FT1ISR"},
|
||||
+ {REG_FT1ISR, BIT_FS_H2C_CMD_OK_INT, "FT1ISR enable "},
|
||||
+};
|
||||
+
|
||||
+static const struct rtw_hw_reg_desc fw_c2h_regs[] = {
|
||||
+ {REG_FWIMR, MASKDWORD, "FWIMR"},
|
||||
+ {REG_FWIMR, BIT_FS_H2CCMD_INT_EN, "CPWM"},
|
||||
+ {REG_FWIMR, BIT_FS_HRCV_INT_EN, "HRECV"},
|
||||
+ {REG_FWISR, MASKDWORD, "FWISR"},
|
||||
+ {REG_FWISR, BIT_FS_H2CCMD_INT, "CPWM"},
|
||||
+ {REG_FWISR, BIT_FS_HRCV_INT, "HRECV"},
|
||||
+ {REG_CPWM, MASKDWORD, "REG_CPWM"},
|
||||
+};
|
||||
+
|
||||
+static const struct rtw_hw_reg_desc fw_core_regs[] = {
|
||||
+ {REG_ARFR2_V1, MASKDWORD, "EPC"},
|
||||
+ {REG_ARFRH2_V1, MASKDWORD, "BADADDR"},
|
||||
+ {REG_ARFR3_V1, MASKDWORD, "CAUSE"},
|
||||
+ {REG_ARFR3_V1, BIT_EXC_CODE, "ExcCode"},
|
||||
+ {REG_ARFRH3_V1, MASKDWORD, "Status"},
|
||||
+ {REG_ARFR4, MASKDWORD, "SP"},
|
||||
+ {REG_ARFRH4, MASKDWORD, "RA"},
|
||||
+ {REG_FW_DBG6, MASKDWORD, "DBG 6"},
|
||||
+ {REG_FW_DBG7, MASKDWORD, "DBG 7"},
|
||||
+};
|
||||
+
|
||||
+static void _rtw_fw_dump_dbg_info(struct rtw_dev *rtwdev,
|
||||
+ const struct rtw_hw_reg_desc regs[], u32 size)
|
||||
+{
|
||||
+ const struct rtw_hw_reg_desc *reg;
|
||||
+ u32 val;
|
||||
+ int i;
|
||||
+
|
||||
+ for (i = 0; i < size; i++) {
|
||||
+ reg = ®s[i];
|
||||
+ val = rtw_read32_mask(rtwdev, reg->addr, reg->mask);
|
||||
+
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_FW, "[%s]addr:0x%x mask:0x%x value:0x%x\n",
|
||||
+ reg->desc, reg->addr, reg->mask, val);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void rtw_fw_dump_dbg_info(struct rtw_dev *rtwdev)
|
||||
+{
|
||||
+ int i;
|
||||
+
|
||||
+ if (!rtw_dbg_is_enabled(rtwdev, RTW_DBG_FW))
|
||||
+ return;
|
||||
+
|
||||
+ _rtw_fw_dump_dbg_info(rtwdev, fw_h2c_regs, ARRAY_SIZE(fw_h2c_regs));
|
||||
+ _rtw_fw_dump_dbg_info(rtwdev, fw_c2h_regs, ARRAY_SIZE(fw_c2h_regs));
|
||||
+ for (i = 0 ; i < RTW_DEBUG_DUMP_TIMES; i++) {
|
||||
+ rtw_dbg(rtwdev, RTW_DBG_FW, "Firmware Coredump %dth\n", i + 1);
|
||||
+ _rtw_fw_dump_dbg_info(rtwdev, fw_core_regs, ARRAY_SIZE(fw_core_regs));
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
static void rtw_fw_c2h_cmd_handle_ext(struct rtw_dev *rtwdev,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
@@ -349,6 +422,7 @@ static void rtw_fw_send_h2c_command_register(struct rtw_dev *rtwdev,
|
||||
|
||||
if (ret) {
|
||||
rtw_err(rtwdev, "failed to send h2c command\n");
|
||||
+ rtw_fw_dump_dbg_info(rtwdev);
|
||||
return;
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
index 43ccdf9965ac46..84e47c71ea1255 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/fw.h
|
||||
@@ -44,6 +44,8 @@
|
||||
#define RTW_OLD_PROBE_PG_CNT 2
|
||||
#define RTW_PROBE_PG_CNT 4
|
||||
|
||||
+#define RTW_DEBUG_DUMP_TIMES 10
|
||||
+
|
||||
enum rtw_c2h_cmd_id {
|
||||
C2H_CCX_TX_RPT = 0x03,
|
||||
C2H_BT_INFO = 0x09,
|
||||
@@ -808,6 +810,7 @@ static inline bool rtw_fw_feature_ext_check(struct rtw_fw_state *fw,
|
||||
return !!(fw->feature_ext & feature);
|
||||
}
|
||||
|
||||
+void rtw_fw_dump_dbg_info(struct rtw_dev *rtwdev);
|
||||
void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset,
|
||||
struct sk_buff *skb);
|
||||
void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb);
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
index 86dc1516effade..b6bfd4c02e2db3 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
||||
@@ -524,6 +524,12 @@ struct rtw_hw_reg {
|
||||
u32 mask;
|
||||
};
|
||||
|
||||
+struct rtw_hw_reg_desc {
|
||||
+ u32 addr;
|
||||
+ u32 mask;
|
||||
+ const char *desc;
|
||||
+};
|
||||
+
|
||||
struct rtw_ltecoex_addr {
|
||||
u32 ctrl;
|
||||
u32 wdata;
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
index 07e8cbd436cd81..add5a20b84320f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/ps.c
|
||||
@@ -104,6 +104,7 @@ void rtw_power_mode_change(struct rtw_dev *rtwdev, bool enter)
|
||||
*/
|
||||
WARN(1, "firmware failed to ack driver for %s Deep Power mode\n",
|
||||
enter ? "entering" : "leaving");
|
||||
+ rtw_fw_dump_dbg_info(rtwdev);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL(rtw_power_mode_change);
|
||||
@@ -164,6 +165,7 @@ static void rtw_fw_leave_lps_check(struct rtw_dev *rtwdev)
|
||||
if (ret) {
|
||||
rtw_write32_clr(rtwdev, REG_TCR, BIT_PWRMGT_HWDATA_EN);
|
||||
rtw_warn(rtwdev, "firmware failed to leave lps state\n");
|
||||
+ rtw_fw_dump_dbg_info(rtwdev);
|
||||
}
|
||||
}
|
||||
|
||||
diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
index 7c6c11d50ff30f..1634f03784f171 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/reg.h
|
||||
@@ -224,12 +224,25 @@
|
||||
#define REG_RXFF_BNDY 0x011C
|
||||
#define REG_FE1IMR 0x0120
|
||||
#define BIT_FS_RXDONE BIT(16)
|
||||
+#define REG_CPWM 0x012C
|
||||
+#define REG_FWIMR 0x0130
|
||||
+#define BIT_FS_H2CCMD_INT_EN BIT(4)
|
||||
+#define BIT_FS_HRCV_INT_EN BIT(5)
|
||||
+#define REG_FWISR 0x0134
|
||||
+#define BIT_FS_H2CCMD_INT BIT(4)
|
||||
+#define BIT_FS_HRCV_INT BIT(5)
|
||||
#define REG_PKTBUF_DBG_CTRL 0x0140
|
||||
#define REG_C2HEVT 0x01A0
|
||||
#define REG_MCUTST_1 0x01C0
|
||||
#define REG_MCUTST_II 0x01C4
|
||||
#define REG_WOWLAN_WAKE_REASON 0x01C7
|
||||
#define REG_HMETFR 0x01CC
|
||||
+#define BIT_INT_BOX0 BIT(0)
|
||||
+#define BIT_INT_BOX1 BIT(1)
|
||||
+#define BIT_INT_BOX2 BIT(2)
|
||||
+#define BIT_INT_BOX3 BIT(3)
|
||||
+#define BIT_INT_BOX_ALL (BIT_INT_BOX0 | BIT_INT_BOX1 | BIT_INT_BOX2 | \
|
||||
+ BIT_INT_BOX3)
|
||||
#define REG_HMEBOX0 0x01D0
|
||||
#define REG_HMEBOX1 0x01D4
|
||||
#define REG_HMEBOX2 0x01D8
|
||||
@@ -338,6 +351,11 @@
|
||||
#define BIT_EN_GNT_BT_AWAKE BIT(3)
|
||||
#define BIT_EN_EOF_V1 BIT(2)
|
||||
#define REG_DATA_SC 0x0483
|
||||
+#define REG_ARFR2_V1 0x048C
|
||||
+#define REG_ARFRH2_V1 0x0490
|
||||
+#define REG_ARFR3_V1 0x0494
|
||||
+#define BIT_EXC_CODE GENMASK(6, 2)
|
||||
+#define REG_ARFRH3_V1 0x0498
|
||||
#define REG_ARFR4 0x049C
|
||||
#define BIT_WL_RFK BIT(0)
|
||||
#define REG_ARFRH4 0x04A0
|
||||
@@ -548,11 +566,16 @@
|
||||
|
||||
#define REG_H2C_PKT_READADDR 0x10D0
|
||||
#define REG_H2C_PKT_WRITEADDR 0x10D4
|
||||
+#define REG_FW_DBG6 0x10F8
|
||||
#define REG_FW_DBG7 0x10FC
|
||||
#define FW_KEY_MASK 0xffffff00
|
||||
|
||||
#define REG_CR_EXT 0x1100
|
||||
|
||||
+#define REG_FT1IMR 0x1138
|
||||
+#define BIT_FS_H2C_CMD_OK_INT_EN BIT(25)
|
||||
+#define REG_FT1ISR 0x113c
|
||||
+#define BIT_FS_H2C_CMD_OK_INT BIT(25)
|
||||
#define REG_DDMA_CH0SA 0x1200
|
||||
#define REG_DDMA_CH0DA 0x1204
|
||||
#define REG_DDMA_CH0CTRL 0x1208
|
392
packages/linux/patches/rtlwifi/after-6.12/0001-wifi-rtw88-Constify-some-arrays-and-structs.patch
vendored
Normal file
392
packages/linux/patches/rtlwifi/after-6.12/0001-wifi-rtw88-Constify-some-arrays-and-structs.patch
vendored
Normal file
@ -0,0 +1,392 @@
|
||||
From aadcf641c25806859aae90fa4c77d34039306046 Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Wed, 18 Sep 2024 01:53:55 +0300
|
||||
Subject: [PATCH 1/2] 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 ab7d414d0ba6..1b97d33b3db5 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 564f5988ee82..e5abcc20b63c 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 37912dded128..4f79165fdf79 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 222608de33cd..e3ac748ad646 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 6edb17aea90e..650585086e8f 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
||||
@@ -1978,13 +1978,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
|
||||
@@ -2156,7 +2156,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,
|
||||
},
|
||||
@@ -2172,7 +2172,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,
|
||||
@@ -2521,7 +2521,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 96a233079e02..d6c5d0a3ea20 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -4872,13 +4872,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
|
||||
@@ -4970,7 +4970,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,
|
||||
},
|
||||
@@ -4986,7 +4986,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,
|
||||
@@ -5299,7 +5299,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.43.0
|
||||
|
@ -0,0 +1,582 @@
|
||||
From f54ea3b5f3c12efda28da7541af17c89c66de15b Mon Sep 17 00:00:00 2001
|
||||
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||||
Date: Fri, 20 Sep 2024 22:27:30 +0300
|
||||
Subject: [PATCH 2/2] 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 4f79165fdf79..7b5546284489 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 0b9b8807af2c..f71e41d6f97c 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
||||
@@ -1065,7 +1065,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 e3ac748ad646..77399b8dd8cd 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 650585086e8f..24f76a36f23e 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)
|
||||
{
|
||||
@@ -2175,7 +2134,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 d6c5d0a3ea20..b5046dc10990 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
||||
@@ -2688,48 +2688,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)
|
||||
@@ -4989,7 +4947,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 21d0754dd7f6..601b30070f53 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
||||
@@ -981,8 +981,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 e83ab6fb83f5..2641059d3561 100644
|
||||
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
||||
@@ -570,8 +570,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.43.0
|
||||
|
14203
packages/linux/patches/rtlwifi/after-6.12/0003-wifi-rtw88-Add-support-for-RTL8821AU-and-RTL8812AU.patch
vendored
Normal file
14203
packages/linux/patches/rtlwifi/after-6.12/0003-wifi-rtw88-Add-support-for-RTL8821AU-and-RTL8812AU.patch
vendored
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
x
Reference in New Issue
Block a user