diff --git a/lib/functions/compilation/patch/drivers_network.sh b/lib/functions/compilation/patch/drivers_network.sh index f585b4729e..33cef67f35 100644 --- a/lib/functions/compilation/patch/drivers_network.sh +++ b/lib/functions/compilation/patch/drivers_network.sh @@ -407,8 +407,8 @@ driver_rtw88() { # Upstream wireless RTW88 drivers (wireless-next-2023-06-22) if [[ "$version" == "6.1" || "$version" == "6.2" || "$version" == "6.3" || "$version" == "6.4" ]] ; then display_alert "Adding" "Upstream wireless RTW88 drivers" "info" - process_patch_file "${SRC}/patch/misc/rtw88/${version}/001-rtw88-linux-next.patch" "applying" - process_patch_file "${SRC}/patch/misc/rtw88/${version}/002-rtw88-linux-next.patch" "applying" + process_patch_file "${SRC}/patch/misc/rtw88/${version}/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch" "applying" + process_patch_file "${SRC}/patch/misc/rtw88/${version}/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch" "applying" #process_patch_file "${SRC}/patch/misc/rtw88/hack/001-revert-rtw88-sdio-size-and-timout-to-rfc-v1.patch" "applying" process_patch_file "${SRC}/patch/misc/rtw88/hack/002-rtw88-usb-make-work-queues-high-priority.patch" "applying" process_patch_file "${SRC}/patch/misc/rtw88/hack/003-rtw88-decrease-the-log-level-of-tx-report.patch" "applying" diff --git a/patch/misc/rtw88/6.1/001-rtw88-linux-next.patch b/patch/misc/rtw88/6.1/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 78% rename from patch/misc/rtw88/6.1/001-rtw88-linux-next.patch rename to patch/misc/rtw88/6.1/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index a1b05e8526..208bddfc1c 100644 --- a/patch/misc/rtw88/6.1/001-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.1/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,7 +1,241 @@ -diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c ---- a/drivers/net/wireless/realtek/rtw88/bf.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/bf.c 2023-06-22 13:52:09.000000000 -0400 -@@ -49,19 +49,23 @@ +From b9f79ef6c53df06a06b938e02429c04b34425452 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Fri, 21 Jul 2023 17:03:21 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.1.y + +Signed-off-by: Patrick Yavitz +--- + drivers/net/wireless/realtek/rtw88/Kconfig | 94 +++++++++ + drivers/net/wireless/realtek/rtw88/Makefile | 30 +++ + drivers/net/wireless/realtek/rtw88/bf.c | 13 +- + drivers/net/wireless/realtek/rtw88/coex.c | 3 +- + drivers/net/wireless/realtek/rtw88/debug.c | 74 +++++-- + drivers/net/wireless/realtek/rtw88/debug.h | 1 + + drivers/net/wireless/realtek/rtw88/fw.c | 119 +++++++++-- + drivers/net/wireless/realtek/rtw88/fw.h | 26 ++- + drivers/net/wireless/realtek/rtw88/hci.h | 9 +- + drivers/net/wireless/realtek/rtw88/mac.c | 93 +++++++-- + drivers/net/wireless/realtek/rtw88/mac.h | 1 - + drivers/net/wireless/realtek/rtw88/mac80211.c | 57 +++++- + drivers/net/wireless/realtek/rtw88/main.c | 186 +++++++++++++++++- + drivers/net/wireless/realtek/rtw88/main.h | 36 +++- + drivers/net/wireless/realtek/rtw88/pci.c | 63 ++---- + drivers/net/wireless/realtek/rtw88/phy.c | 6 +- + drivers/net/wireless/realtek/rtw88/ps.c | 5 +- + drivers/net/wireless/realtek/rtw88/reg.h | 15 ++ + drivers/net/wireless/realtek/rtw88/rtw8723d.c | 40 ++++ + drivers/net/wireless/realtek/rtw88/rtw8723d.h | 19 +- + drivers/net/wireless/realtek/rtw88/rtw8821c.c | 49 ++++- + drivers/net/wireless/realtek/rtw88/rtw8821c.h | 27 +++ + drivers/net/wireless/realtek/rtw88/rtw8822b.c | 29 +++ + drivers/net/wireless/realtek/rtw88/rtw8822b.h | 8 +- + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 34 ++++ + drivers/net/wireless/realtek/rtw88/rtw8822c.h | 8 +- + drivers/net/wireless/realtek/rtw88/tx.c | 135 +++++++++---- + drivers/net/wireless/realtek/rtw88/tx.h | 138 +++++++------ + drivers/net/wireless/realtek/rtw88/util.c | 103 ++++++++++ + drivers/net/wireless/realtek/rtw88/util.h | 12 +- + include/linux/mmc/sdio_ids.h | 10 + + 31 files changed, 1189 insertions(+), 254 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig +index e3d7cb6c1290..cffad1c01249 100644 +--- a/drivers/net/wireless/realtek/rtw88/Kconfig ++++ b/drivers/net/wireless/realtek/rtw88/Kconfig +@@ -16,6 +16,12 @@ config RTW88_CORE + config RTW88_PCI + tristate + ++config RTW88_SDIO ++ tristate ++ ++config RTW88_USB ++ tristate ++ + config RTW88_8822B + tristate + +@@ -39,6 +45,28 @@ config RTW88_8822BE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822BS ++ tristate "Realtek 8822BS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8822B ++ help ++ Select this option will enable support for 8822BS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ ++config RTW88_8822BU ++ tristate "Realtek 8822BU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8822B ++ help ++ Select this option will enable support for 8822BU chipset ++ ++ 802.11ac USB wireless network adapter ++ + config RTW88_8822CE + tristate "Realtek 8822CE PCI wireless network adapter" + depends on PCI +@@ -50,6 +78,28 @@ config RTW88_8822CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822CS ++ tristate "Realtek 8822CS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8822C ++ help ++ Select this option will enable support for 8822CS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ ++config RTW88_8822CU ++ tristate "Realtek 8822CU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8822C ++ help ++ Select this option will enable support for 8822CU chipset ++ ++ 802.11ac USB wireless network adapter ++ + config RTW88_8723DE + tristate "Realtek 8723DE PCI wireless network adapter" + depends on PCI +@@ -61,6 +111,28 @@ config RTW88_8723DE + + 802.11n PCIe wireless network adapter + ++config RTW88_8723DS ++ tristate "Realtek 8723DS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8723D ++ help ++ Select this option will enable support for 8723DS chipset ++ ++ 802.11n SDIO wireless network adapter ++ ++config RTW88_8723DU ++ tristate "Realtek 8723DU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8723D ++ help ++ Select this option will enable support for 8723DU chipset ++ ++ 802.11n USB wireless network adapter ++ + config RTW88_8821CE + tristate "Realtek 8821CE PCI wireless network adapter" + depends on PCI +@@ -72,6 +144,28 @@ config RTW88_8821CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8821CS ++ tristate "Realtek 8821CS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8821C ++ help ++ Select this option will enable support for 8821CS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ ++config RTW88_8821CU ++ tristate "Realtek 8821CU USB wireless network adapter" ++ depends on USB ++ select RTW88_CORE ++ select RTW88_USB ++ select RTW88_8821C ++ help ++ Select this option will enable support for 8821CU chipset ++ ++ 802.11ac USB wireless network adapter ++ + config RTW88_DEBUG + bool "Realtek rtw88 debug support" + depends on RTW88_CORE +diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile +index 834c66ec0af9..fd212c09d88a 100644 +--- a/drivers/net/wireless/realtek/rtw88/Makefile ++++ b/drivers/net/wireless/realtek/rtw88/Makefile +@@ -26,23 +26,53 @@ rtw88_8822b-objs := rtw8822b.o rtw8822b_table.o + obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o + rtw88_8822be-objs := rtw8822be.o + ++obj-$(CONFIG_RTW88_8822BS) += rtw88_8822bs.o ++rtw88_8822bs-objs := rtw8822bs.o ++ ++obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o ++rtw88_8822bu-objs := rtw8822bu.o ++ + obj-$(CONFIG_RTW88_8822C) += rtw88_8822c.o + rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o + + obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o + rtw88_8822ce-objs := rtw8822ce.o + ++obj-$(CONFIG_RTW88_8822CS) += rtw88_8822cs.o ++rtw88_8822cs-objs := rtw8822cs.o ++ ++obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o ++rtw88_8822cu-objs := rtw8822cu.o ++ + obj-$(CONFIG_RTW88_8723D) += rtw88_8723d.o + rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o + + obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o + rtw88_8723de-objs := rtw8723de.o + ++obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o ++rtw88_8723ds-objs := rtw8723ds.o ++ ++obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o ++rtw88_8723du-objs := rtw8723du.o ++ + obj-$(CONFIG_RTW88_8821C) += rtw88_8821c.o + rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o + + obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o + rtw88_8821ce-objs := rtw8821ce.o + ++obj-$(CONFIG_RTW88_8821CS) += rtw88_8821cs.o ++rtw88_8821cs-objs := rtw8821cs.o ++ ++obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o ++rtw88_8821cu-objs := rtw8821cu.o ++ + obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o + rtw88_pci-objs := pci.o ++ ++obj-$(CONFIG_RTW88_SDIO) += rtw88_sdio.o ++rtw88_sdio-objs := sdio.o ++ ++obj-$(CONFIG_RTW88_USB) += rtw88_usb.o ++rtw88_usb-objs := usb.o +diff --git a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c +index 038a30b170ef..c827c4a2814b 100644 +--- a/drivers/net/wireless/realtek/rtw88/bf.c ++++ b/drivers/net/wireless/realtek/rtw88/bf.c +@@ -49,19 +49,23 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, sta = ieee80211_find_sta(vif, bssid); if (!sta) { @@ -27,7 +261,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/real } ether_addr_copy(bfee->mac_addr, bssid); -@@ -75,7 +79,7 @@ +@@ -75,7 +79,7 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, (vht_cap->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { if (bfinfo->bfer_su_cnt >= chip->bfer_su_max_num) { rtw_dbg(rtwdev, RTW_DBG_BF, "su bfer number over limit\n"); @@ -36,7 +270,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/real } sound_dim = vht_cap->cap & -@@ -98,9 +102,6 @@ +@@ -98,9 +102,6 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, rtw_chip_config_bfee(rtwdev, rtwvif, bfee, true); } @@ -46,10 +280,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/real } void rtw_bf_init_bfer_entry_mu(struct rtw_dev *rtwdev, -diff -Naur a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c ---- a/drivers/net/wireless/realtek/rtw88/coex.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/coex.c 2023-06-22 13:52:09.000000000 -0400 -@@ -633,7 +633,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/realtek/rtw88/coex.c +index a82476f47a7c..86467d2f8888 100644 +--- a/drivers/net/wireless/realtek/rtw88/coex.c ++++ b/drivers/net/wireless/realtek/rtw88/coex.c +@@ -633,7 +633,7 @@ static struct sk_buff *rtw_coex_info_request(struct rtw_dev *rtwdev, struct rtw_coex *coex = &rtwdev->coex; struct sk_buff *skb_resp = NULL; @@ -58,7 +293,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/re rtw_fw_query_bt_mp_info(rtwdev, req); -@@ -650,7 +650,6 @@ +@@ -650,7 +650,6 @@ static struct sk_buff *rtw_coex_info_request(struct rtw_dev *rtwdev, } out: @@ -66,10 +301,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/coex.c b/drivers/net/wireless/re return skb_resp; } -diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c ---- a/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-22 13:52:09.000000000 -0400 -@@ -144,7 +144,9 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c +index 9ebe544e51d0..f8ba133baff0 100644 +--- a/drivers/net/wireless/realtek/rtw88/debug.c ++++ b/drivers/net/wireless/realtek/rtw88/debug.c +@@ -144,7 +144,9 @@ static int rtw_debugfs_get_rf_read(struct seq_file *m, void *v) addr = debugfs_priv->rf_addr; mask = debugfs_priv->rf_mask; @@ -79,7 +315,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r seq_printf(m, "rf_read path:%d addr:0x%08x mask:0x%08x val=0x%08x\n", path, addr, mask, val); -@@ -181,8 +183,8 @@ +@@ -181,8 +183,8 @@ static int rtw_debugfs_copy_from_user(char tmp[], int size, tmp_len = (count > size - 1 ? size - 1 : count); @@ -90,7 +326,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r tmp[tmp_len] = '\0'; -@@ -199,13 +201,16 @@ +@@ -199,13 +201,16 @@ static ssize_t rtw_debugfs_set_read_reg(struct file *filp, char tmp[32 + 1]; u32 addr, len; int num; @@ -109,7 +345,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r if (len != 1 && len != 2 && len != 4) { rtw_warn(rtwdev, "read reg setting wrong len\n"); -@@ -286,8 +291,11 @@ +@@ -286,8 +291,11 @@ static ssize_t rtw_debugfs_set_rsvd_page(struct file *filp, char tmp[32 + 1]; u32 offset, page_num; int num; @@ -122,7 +358,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%d %d", &offset, &page_num); -@@ -312,8 +320,11 @@ +@@ -312,8 +320,11 @@ static ssize_t rtw_debugfs_set_single_input(struct file *filp, char tmp[32 + 1]; u32 input; int num; @@ -135,7 +371,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = kstrtoint(tmp, 0, &input); -@@ -336,14 +347,17 @@ +@@ -336,14 +347,17 @@ static ssize_t rtw_debugfs_set_write_reg(struct file *filp, char tmp[32 + 1]; u32 addr, val, len; int num; @@ -155,7 +391,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r switch (len) { case 1: -@@ -379,8 +393,11 @@ +@@ -379,8 +393,11 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp, char tmp[32 + 1]; u8 param[8]; int num; @@ -168,7 +404,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx", ¶m[0], ¶m[1], ¶m[2], ¶m[3], -@@ -390,7 +407,9 @@ +@@ -390,7 +407,9 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp, return -EINVAL; } @@ -178,7 +414,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r return count; } -@@ -404,17 +423,22 @@ +@@ -404,17 +423,22 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask, val; int num; @@ -203,7 +439,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r rtw_dbg(rtwdev, RTW_DBG_DEBUGFS, "write_rf path:%d addr:0x%08x mask:0x%08x, val:0x%08x\n", path, addr, mask, val); -@@ -432,14 +456,17 @@ +@@ -432,14 +456,17 @@ static ssize_t rtw_debugfs_set_rf_read(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask; int num; @@ -223,7 +459,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } debugfs_priv->rf_path = path; -@@ -461,7 +488,9 @@ +@@ -461,7 +488,9 @@ static ssize_t rtw_debugfs_set_fix_rate(struct file *filp, char tmp[32 + 1]; int ret; @@ -234,7 +470,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtou8(tmp, 0, &fix_rate); if (ret) { -@@ -519,6 +548,8 @@ +@@ -519,6 +548,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v) u32 addr, offset, data; u8 path; @@ -243,7 +479,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r for (path = 0; path < rtwdev->hal.rf_path_num; path++) { seq_printf(m, "RF path:%d\n", path); for (addr = 0; addr < 0x100; addr += 4) { -@@ -533,6 +564,8 @@ +@@ -533,6 +564,8 @@ static int rtw_debug_get_rf_dump(struct seq_file *m, void *v) seq_puts(m, "\n"); } @@ -252,7 +488,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r return 0; } -@@ -831,7 +864,9 @@ +@@ -831,7 +864,9 @@ static int rtw_debugfs_get_coex_info(struct seq_file *m, void *v) struct rtw_debugfs_priv *debugfs_priv = m->private; struct rtw_dev *rtwdev = debugfs_priv->rtwdev; @@ -262,7 +498,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r return 0; } -@@ -848,7 +883,9 @@ +@@ -848,7 +883,9 @@ static ssize_t rtw_debugfs_set_coex_enable(struct file *filp, bool enable; int ret; @@ -273,7 +509,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &enable); if (ret) { -@@ -918,7 +955,9 @@ +@@ -918,7 +955,9 @@ static ssize_t rtw_debugfs_set_fw_crash(struct file *filp, bool input; int ret; @@ -284,7 +520,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &input); if (ret) -@@ -1026,6 +1065,8 @@ +@@ -1026,6 +1065,8 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m) dm_info->dm_flags & BIT(RTW_DM_CAP_TXGAPK) ? '-' : '+', rtw_dm_cap_strs[RTW_DM_CAP_TXGAPK]); @@ -293,7 +529,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r for (path = 0; path < rtwdev->hal.rf_path_num; path++) { val = rtw_read_rf(rtwdev, path, RF_GAINTX, RFREG_MASK); seq_printf(m, "path %d:\n0x%x = 0x%x\n", path, RF_GAINTX, val); -@@ -1035,6 +1076,7 @@ +@@ -1035,6 +1076,7 @@ static void dump_gapk_status(struct rtw_dev *rtwdev, struct seq_file *m) txgapk->rf3f_fs[path][i], i); seq_puts(m, "\n"); } @@ -301,10 +537,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } static int rtw_debugfs_get_dm_cap(struct seq_file *m, void *v) -diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h ---- a/drivers/net/wireless/realtek/rtw88/debug.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/debug.h 2023-06-22 13:52:09.000000000 -0400 -@@ -24,6 +24,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h +index 066792dd96af..a9149c6c2b48 100644 +--- a/drivers/net/wireless/realtek/rtw88/debug.h ++++ b/drivers/net/wireless/realtek/rtw88/debug.h +@@ -24,6 +24,7 @@ enum rtw_debug_mask { RTW_DBG_ADAPTIVITY = 0x00008000, RTW_DBG_HW_SCAN = 0x00010000, RTW_DBG_STATE = 0x00020000, @@ -312,10 +549,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/r RTW_DBG_ALL = 0xffffffff }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c ---- a/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-22 13:52:09.000000000 -0400 -@@ -308,13 +308,64 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c +index 0b5f903c0f36..567bbedd8ee0 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.c ++++ b/drivers/net/wireless/realtek/rtw88/fw.c +@@ -308,13 +308,64 @@ void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev) } EXPORT_SYMBOL(rtw_fw_c2h_cmd_isr); @@ -381,7 +619,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real int ret; rtw_dbg(rtwdev, RTW_DBG_FW, -@@ -322,7 +373,7 @@ +@@ -322,7 +373,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, h2c[3], h2c[2], h2c[1], h2c[0], h2c[7], h2c[6], h2c[5], h2c[4]); @@ -390,7 +628,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real box = rtwdev->h2c.last_box_num; switch (box) { -@@ -344,7 +395,7 @@ +@@ -344,7 +395,7 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, break; default: WARN(1, "invalid h2c mail box number\n"); @@ -399,7 +637,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } ret = read_poll_timeout_atomic(rtw_read8, box_state, -@@ -353,19 +404,14 @@ +@@ -353,19 +404,14 @@ static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, if (ret) { rtw_err(rtwdev, "failed to send h2c command\n"); @@ -422,7 +660,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } void rtw_fw_h2c_cmd_dbg(struct rtw_dev *rtwdev, u8 *h2c) -@@ -377,15 +423,13 @@ +@@ -377,15 +423,13 @@ static void rtw_fw_send_h2c_packet(struct rtw_dev *rtwdev, u8 *h2c_pkt) { int ret; @@ -439,7 +677,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } void -@@ -475,6 +519,23 @@ +@@ -475,6 +519,23 @@ void rtw_fw_query_bt_info(struct rtw_dev *rtwdev) rtw_fw_send_h2c_command(rtwdev, h2c_pkt); } @@ -463,7 +701,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw) { u8 h2c_pkt[H2C_PKT_SIZE] = {0}; -@@ -824,6 +885,16 @@ +@@ -824,6 +885,16 @@ void rtw_fw_set_nlo_info(struct rtw_dev *rtwdev, bool enable) rtw_fw_send_h2c_command(rtwdev, h2c_pkt); } @@ -480,7 +718,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real void rtw_fw_set_pg_info(struct rtw_dev *rtwdev) { struct rtw_lps_conf *conf = &rtwdev->lps_conf; -@@ -1390,6 +1461,10 @@ +@@ -1390,6 +1461,10 @@ static void rtw_build_rsvd_page_iter(void *data, u8 *mac, struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; struct rtw_rsvd_page *rsvd_pkt; @@ -491,7 +729,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real list_for_each_entry(rsvd_pkt, &rtwvif->rsvd_page_list, vif_list) { if (rsvd_pkt->type == RSVD_BEACON) list_add(&rsvd_pkt->build_list, -@@ -1611,6 +1686,7 @@ +@@ -1611,6 +1686,7 @@ void rtw_fw_update_beacon_work(struct work_struct *work) mutex_lock(&rtwdev->mutex); rtw_fw_download_rsvd_page(rtwdev); @@ -499,7 +737,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real mutex_unlock(&rtwdev->mutex); } -@@ -2152,11 +2228,19 @@ +@@ -2152,11 +2228,19 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, } rtw_fw_set_scan_offload(rtwdev, &cs_option, rtwvif, &chan_list); out: @@ -520,7 +758,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD)) return; -@@ -2241,6 +2325,7 @@ +@@ -2241,6 +2325,7 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb) if (rtw_is_op_chan(rtwdev, chan)) { rtw_store_op_chan(rtwdev, false); ieee80211_wake_queues(rtwdev->hw); @@ -528,7 +766,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } } else if (id == RTW_SCAN_NOTIFY_ID_PRESWITCH) { if (IS_CH_5G_BAND(chan)) { -@@ -2259,8 +2344,10 @@ +@@ -2259,8 +2344,10 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb) * if next channel is non-op channel. */ if (!rtw_is_op_chan(rtwdev, chan) && @@ -540,10 +778,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } rtw_dbg(rtwdev, RTW_DBG_HW_SCAN, -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h ---- a/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-22 13:52:09.000000000 -0400 -@@ -81,6 +81,22 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h +index a5a965803a3c..43ccdf9965ac 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.h ++++ b/drivers/net/wireless/realtek/rtw88/fw.h +@@ -81,6 +81,22 @@ struct rtw_c2h_adaptivity { u8 option; } __packed; @@ -566,7 +805,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real enum rtw_rsvd_packet_type { RSVD_BEACON, RSVD_DUMMY, -@@ -525,6 +541,7 @@ +@@ -525,6 +541,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) #define H2C_CMD_MEDIA_STATUS_RPT 0x01 #define H2C_CMD_SET_PWR_MODE 0x20 #define H2C_CMD_LPS_PG_INFO 0x2b @@ -574,7 +813,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real #define H2C_CMD_RA_INFO 0x40 #define H2C_CMD_RSSI_MONITOR 0x42 #define H2C_CMD_BCN_FILTER_OFFLOAD_P0 0x56 -@@ -550,6 +567,8 @@ +@@ -550,6 +567,8 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) #define H2C_CMD_AOAC_GLOBAL_INFO 0x82 #define H2C_CMD_NLO_INFO 0x8C @@ -583,7 +822,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real #define SET_H2C_CMD_ID_CLASS(h2c_pkt, value) \ le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(7, 0)) -@@ -749,6 +768,9 @@ +@@ -749,6 +768,9 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) #define SET_NLO_LOC_NLO_INFO(h2c_pkt, value) \ le32p_replace_bits((__le32 *)(h2c_pkt) + 0x00, value, GENMASK(23, 16)) @@ -593,7 +832,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real #define GET_FW_DUMP_LEN(_header) \ le32_get_bits(*((__le32 *)(_header) + 0x00), GENMASK(15, 0)) #define GET_FW_DUMP_SEQ(_header) \ -@@ -791,6 +813,7 @@ +@@ -791,6 +813,7 @@ void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset, void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_fw_send_general_info(struct rtw_dev *rtwdev); void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev); @@ -601,7 +840,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para); void rtw_fw_inform_rfk_status(struct rtw_dev *rtwdev, bool start); -@@ -838,6 +861,7 @@ +@@ -838,6 +861,7 @@ void rtw_fw_set_aoac_global_info_cmd(struct rtw_dev *rtwdev, u8 group_key_enc); void rtw_fw_set_nlo_info(struct rtw_dev *rtwdev, bool enable); @@ -609,17 +848,18 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real void rtw_fw_update_pkt_probe_req(struct rtw_dev *rtwdev, struct cfg80211_ssid *ssid); void rtw_fw_channel_switch(struct rtw_dev *rtwdev, bool enable); -@@ -857,5 +881,5 @@ +@@ -857,5 +881,5 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, bool enable); void rtw_hw_scan_status_report(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb); -void rtw_hw_scan_abort(struct rtw_dev *rtwdev, struct ieee80211_vif *vif); +void rtw_hw_scan_abort(struct rtw_dev *rtwdev); #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h ---- a/drivers/net/wireless/realtek/rtw88/hci.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/hci.h 2023-06-22 13:52:09.000000000 -0400 -@@ -166,12 +166,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/realtek/rtw88/hci.h +index 4c6fc6fb3f83..830d7532f2a3 100644 +--- a/drivers/net/wireless/realtek/rtw88/hci.h ++++ b/drivers/net/wireless/realtek/rtw88/hci.h +@@ -166,12 +166,11 @@ static inline u32 rtw_read_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, u32 addr, u32 mask) { @@ -634,7 +874,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/rea return val; } -@@ -180,11 +179,9 @@ +@@ -180,11 +179,9 @@ static inline void rtw_write_rf(struct rtw_dev *rtwdev, enum rtw_rf_path rf_path, u32 addr, u32 mask, u32 data) { @@ -647,142 +887,225 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/hci.h b/drivers/net/wireless/rea } static inline u32 -diff -Naur a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig ---- a/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-22 13:52:09.000000000 -0400 -@@ -16,6 +16,12 @@ - config RTW88_PCI - tristate +diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c +index 589caeff2033..298663b03580 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac.c ++++ b/drivers/net/wireless/realtek/rtw88/mac.c +@@ -7,6 +7,7 @@ + #include "reg.h" + #include "fw.h" + #include "debug.h" ++#include "sdio.h" -+config RTW88_SDIO -+ tristate -+ -+config RTW88_USB -+ tristate -+ - config RTW88_8822B - tristate + void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, + u8 primary_ch_idx) +@@ -60,6 +61,7 @@ EXPORT_SYMBOL(rtw_set_channel_mac); -@@ -39,6 +45,28 @@ + static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) + { ++ unsigned int retry; + u32 value32; + u8 value8; - 802.11ac PCIe wireless network adapter +@@ -77,6 +79,28 @@ static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) + case RTW_HCI_TYPE_PCIE: + rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS); + break; ++ case RTW_HCI_TYPE_SDIO: ++ rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT_HCI_SUS_REQ); ++ ++ for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) { ++ if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT_HCI_RESUME_RDY) ++ break; ++ ++ usleep_range(10, 50); ++ } ++ ++ if (retry == RTW_PWR_POLLING_CNT) { ++ rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]"); ++ return -ETIMEDOUT; ++ } ++ ++ if (rtw_sdio_is_sdio30_supported(rtwdev)) ++ rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2, ++ BIT_SDIO_PAD_E5 >> 16); ++ else ++ rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2, ++ BIT_SDIO_PAD_E5 >> 16); ++ break; + case RTW_HCI_TYPE_USB: + break; + default: +@@ -217,10 +241,13 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev, + cut_mask = cut_version_to_mask(cut); + switch (rtw_hci_type(rtwdev)) { + case RTW_HCI_TYPE_PCIE: +- intf_mask = BIT(2); ++ intf_mask = RTW_PWR_INTF_PCI_MSK; + break; + case RTW_HCI_TYPE_USB: +- intf_mask = BIT(1); ++ intf_mask = RTW_PWR_INTF_USB_MSK; ++ break; ++ case RTW_HCI_TYPE_SDIO: ++ intf_mask = RTW_PWR_INTF_SDIO_MSK; + break; + default: + return -EINVAL; +@@ -245,6 +272,7 @@ 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; ++ u32 imr = 0; + u8 rpwm; + bool cur_pwr; + int ret; +@@ -270,17 +298,24 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) + if (pwr_on == cur_pwr) + return -EALREADY; -+config RTW88_8822BS -+ tristate "Realtek 8822BS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8822B -+ help -+ Select this option will enable support for 8822BS chipset ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { ++ imr = rtw_read32(rtwdev, REG_SDIO_HIMR); ++ rtw_write32(rtwdev, REG_SDIO_HIMR, 0); ++ } + -+ 802.11ac SDIO wireless network adapter ++ if (!pwr_on) ++ clear_bit(RTW_FLAG_POWERON, rtwdev->flags); + -+config RTW88_8822BU -+ tristate "Realtek 8822BU USB wireless network adapter" -+ depends on USB -+ select RTW88_CORE -+ select RTW88_USB -+ select RTW88_8822B -+ help -+ Select this option will enable support for 8822BU chipset -+ -+ 802.11ac USB wireless network adapter -+ - config RTW88_8822CE - tristate "Realtek 8822CE PCI wireless network adapter" - depends on PCI -@@ -50,6 +78,28 @@ + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; + ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); +- if (ret) +- return ret; - 802.11ac PCIe wireless network adapter +- if (pwr_on) ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) ++ rtw_write32(rtwdev, REG_SDIO_HIMR, imr); ++ ++ if (!ret && pwr_on) + set_bit(RTW_FLAG_POWERON, rtwdev->flags); +- else +- clear_bit(RTW_FLAG_POWERON, rtwdev->flags); -+config RTW88_8822CS -+ tristate "Realtek 8822CS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8822C -+ help -+ Select this option will enable support for 8822CS chipset -+ -+ 802.11ac SDIO wireless network adapter -+ -+config RTW88_8822CU -+ tristate "Realtek 8822CU USB wireless network adapter" -+ depends on USB -+ select RTW88_CORE -+ select RTW88_USB -+ select RTW88_8822C -+ help -+ Select this option will enable support for 8822CU chipset -+ -+ 802.11ac USB wireless network adapter -+ - config RTW88_8723DE - tristate "Realtek 8723DE PCI wireless network adapter" - depends on PCI -@@ -61,6 +111,28 @@ +- return 0; ++ return ret; + } - 802.11n PCIe wireless network adapter + static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) +@@ -451,6 +486,9 @@ static void download_firmware_reg_backup(struct rtw_dev *rtwdev, + rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); + rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); -+config RTW88_8723DS -+ tristate "Realtek 8723DS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8723D -+ help -+ Select this option will enable support for 8723DS chipset ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) ++ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); + -+ 802.11n SDIO wireless network adapter -+ -+config RTW88_8723DU -+ tristate "Realtek 8723DU USB wireless network adapter" -+ depends on USB -+ select RTW88_CORE -+ select RTW88_USB -+ select RTW88_8723D -+ help -+ Select this option will enable support for 8723DU chipset -+ -+ 802.11n USB wireless network adapter -+ - config RTW88_8821CE - tristate "Realtek 8821CE PCI wireless network adapter" - depends on PCI -@@ -72,6 +144,28 @@ + /* Disable beacon related functions */ + tmp = rtw_read8(rtwdev, REG_BCN_CTRL); + bckp[bckp_idx].len = 1; +@@ -756,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, - 802.11ac PCIe wireless network adapter + wlan_cpu_enable(rtwdev, true); -+config RTW88_8821CS -+ tristate "Realtek 8821CS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8821C -+ help -+ Select this option will enable support for 8821CS chipset +- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) +- return -EBUSY; ++ if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { ++ ret = -EBUSY; ++ goto dlfw_fail; ++ } + + ret = download_firmware_validate(rtwdev); + if (ret) +@@ -918,7 +958,8 @@ static int __rtw_download_firmware_legacy(struct rtw_dev *rtwdev, + return ret; + } + +-int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) ++static ++int _rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) + { + if (rtw_chip_wcpu_11n(rtwdev)) + return __rtw_download_firmware_legacy(rtwdev, fw); +@@ -926,6 +967,21 @@ int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) + return __rtw_download_firmware(rtwdev, fw); + } + ++int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) ++{ ++ int ret; + -+ 802.11ac SDIO wireless network adapter ++ ret = _rtw_download_firmware(rtwdev, fw); ++ if (ret) ++ return ret; + -+config RTW88_8821CU -+ tristate "Realtek 8821CU USB wireless network adapter" -+ depends on USB -+ select RTW88_CORE -+ select RTW88_USB -+ select RTW88_8821C -+ help -+ Select this option will enable support for 8821CU chipset ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE && ++ rtwdev->chip->id == RTW_CHIP_TYPE_8821C) ++ rtw_fw_set_recover_bt_device(rtwdev); + -+ 802.11ac USB wireless network adapter ++ return 0; ++} + - config RTW88_DEBUG - bool "Realtek rtw88 debug support" - depends on RTW88_CORE -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c ---- a/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-06-22 13:52:09.000000000 -0400 -@@ -43,7 +43,11 @@ + static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues) + { + const struct rtw_rqpn *rqpn = rtwdev->fifo.rqpn; +@@ -1026,6 +1082,9 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) + else + return -EINVAL; + break; ++ case RTW_HCI_TYPE_SDIO: ++ rqpn = &chip->rqpn_table[0]; ++ break; + default: + return -EINVAL; + } +@@ -1044,6 +1103,13 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) + if (rtw_chip_wcpu_11ac(rtwdev)) + rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); + ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { ++ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); ++ rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0); ++ } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { ++ rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); ++ } ++ + return 0; + } + +@@ -1055,7 +1121,7 @@ static int set_trx_fifo_info(struct rtw_dev *rtwdev) + u8 csi_buf_pg_num = chip->csi_buf_pg_num; + + /* config rsvd page num */ +- fifo->rsvd_drv_pg_num = 8; ++ fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num; + fifo->txff_pg_num = chip->txff_size >> 7; + if (rtw_chip_wcpu_11n(rtwdev)) + fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num; +@@ -1185,6 +1251,9 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev) + else + return -EINVAL; + break; ++ case RTW_HCI_TYPE_SDIO: ++ pg_tbl = &chip->page_table[0]; ++ break; + default: + return -EINVAL; + } +diff --git a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h +index 3172aa5ac4de..58c3dccc14bb 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac.h ++++ b/drivers/net/wireless/realtek/rtw88/mac.h +@@ -7,7 +7,6 @@ + + #define RTW_HW_PORT_NUM 5 + #define cut_version_to_mask(cut) (0x1 << ((cut) + 1)) +-#define SDIO_LOCAL_OFFSET 0x10250000 + #define DDMA_POLLING_COUNT 1000 + #define C2H_PKT_BUF 256 + #define REPORT_BUF 128 +diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c +index fabca307867a..a99b53d44267 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw88/mac80211.c +@@ -43,7 +43,11 @@ static void rtw_ops_wake_tx_queue(struct ieee80211_hw *hw, list_add_tail(&rtwtxq->list, &rtwdev->txqs); spin_unlock_bh(&rtwdev->txq_lock); @@ -795,7 +1118,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } static int rtw_ops_start(struct ieee80211_hw *hw) -@@ -146,25 +150,32 @@ +@@ -146,25 +150,32 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; enum rtw_net_type net_type; u32 config = 0; @@ -831,7 +1154,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_leave_lps_deep(rtwdev); switch (vif->type) { -@@ -186,6 +197,7 @@ +@@ -186,6 +197,7 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, break; default: WARN_ON(1); @@ -839,7 +1162,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); return -EINVAL; } -@@ -197,6 +209,7 @@ +@@ -197,6 +209,7 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, rtwvif->bcn_ctrl = bcn_ctrl; config |= PORT_SET_BCN_CTRL; rtw_vif_port_config(rtwdev, rtwvif, config); @@ -847,7 +1170,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_recalc_lps(rtwdev, vif); mutex_unlock(&rtwdev->mutex); -@@ -228,6 +241,7 @@ +@@ -228,6 +241,7 @@ static void rtw_ops_remove_interface(struct ieee80211_hw *hw, rtwvif->bcn_ctrl = 0; config |= PORT_SET_BCN_CTRL; rtw_vif_port_config(rtwdev, rtwvif, config); @@ -855,7 +1178,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_recalc_lps(rtwdev, NULL); mutex_unlock(&rtwdev->mutex); -@@ -368,6 +382,7 @@ +@@ -368,6 +382,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, rtw_fw_download_rsvd_page(rtwdev); rtw_send_rsvd_page_h2c(rtwdev); @@ -863,7 +1186,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc); if (rtw_bf_support) rtw_bf_assoc(rtwdev, vif, conf); -@@ -378,7 +393,8 @@ +@@ -378,7 +393,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, * when disconnected by peer */ if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) @@ -873,7 +1196,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } config |= PORT_SET_NET_TYPE; -@@ -388,7 +404,7 @@ +@@ -388,7 +404,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_BSSID) { ether_addr_copy(rtwvif->bssid, conf->bssid); config |= PORT_SET_BSSID; @@ -882,7 +1205,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_clear_op_chan(rtwdev); else rtw_store_op_chan(rtwdev, true); -@@ -402,6 +418,7 @@ +@@ -402,6 +418,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_BEACON) { rtw_set_dtim_period(rtwdev, conf->dtim_period); rtw_fw_download_rsvd_page(rtwdev); @@ -890,7 +1213,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } if (changed & BSS_CHANGED_BEACON_ENABLED) { -@@ -437,12 +454,29 @@ +@@ -437,12 +454,29 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw, const struct rtw_chip_info *chip = rtwdev->chip; mutex_lock(&rtwdev->mutex); @@ -920,7 +1243,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles static int rtw_ops_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id, u16 ac, -@@ -483,8 +517,8 @@ +@@ -483,8 +517,8 @@ static int rtw_ops_sta_remove(struct ieee80211_hw *hw, { struct rtw_dev *rtwdev = hw->priv; @@ -930,7 +1253,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_sta_remove(rtwdev, sta, true); mutex_unlock(&rtwdev->mutex); -@@ -733,7 +767,7 @@ +@@ -733,7 +767,7 @@ static void rtw_ra_mask_info_update(struct rtw_dev *rtwdev, br_data.rtwdev = rtwdev; br_data.vif = vif; br_data.mask = mask; @@ -939,7 +1262,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw, -@@ -742,7 +776,9 @@ +@@ -742,7 +776,9 @@ static int rtw_ops_set_bitrate_mask(struct ieee80211_hw *hw, { struct rtw_dev *rtwdev = hw->priv; @@ -949,7 +1272,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles return 0; } -@@ -843,7 +879,7 @@ +@@ -843,7 +879,7 @@ static int rtw_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, rtw_hw_scan_start(rtwdev, vif, req); ret = rtw_hw_scan_offload(rtwdev, vif, true); if (ret) { @@ -958,7 +1281,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_err(rtwdev, "HW scan failed with status: %d\n", ret); } mutex_unlock(&rtwdev->mutex); -@@ -863,7 +899,7 @@ +@@ -863,7 +899,7 @@ static void rtw_ops_cancel_hw_scan(struct ieee80211_hw *hw, return; mutex_lock(&rtwdev->mutex); @@ -967,7 +1290,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); } -@@ -902,6 +938,7 @@ +@@ -902,6 +938,7 @@ const struct ieee80211_ops rtw_ops = { .configure_filter = rtw_ops_configure_filter, .bss_info_changed = rtw_ops_bss_info_changed, .start_ap = rtw_ops_start_ap, @@ -975,221 +1298,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles .conf_tx = rtw_ops_conf_tx, .sta_add = rtw_ops_sta_add, .sta_remove = rtw_ops_sta_remove, -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c ---- a/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-22 13:52:09.000000000 -0400 -@@ -7,6 +7,7 @@ - #include "reg.h" - #include "fw.h" - #include "debug.h" -+#include "sdio.h" - - void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, - u8 primary_ch_idx) -@@ -60,6 +61,7 @@ - - static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) - { -+ unsigned int retry; - u32 value32; - u8 value8; - -@@ -77,6 +79,28 @@ - case RTW_HCI_TYPE_PCIE: - rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS); - break; -+ case RTW_HCI_TYPE_SDIO: -+ rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT_HCI_SUS_REQ); -+ -+ for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) { -+ if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT_HCI_RESUME_RDY) -+ break; -+ -+ usleep_range(10, 50); -+ } -+ -+ if (retry == RTW_PWR_POLLING_CNT) { -+ rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]"); -+ return -ETIMEDOUT; -+ } -+ -+ if (rtw_sdio_is_sdio30_supported(rtwdev)) -+ rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2, -+ BIT_SDIO_PAD_E5 >> 16); -+ else -+ rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2, -+ BIT_SDIO_PAD_E5 >> 16); -+ break; - case RTW_HCI_TYPE_USB: - break; - default: -@@ -217,10 +241,13 @@ - cut_mask = cut_version_to_mask(cut); - switch (rtw_hci_type(rtwdev)) { - case RTW_HCI_TYPE_PCIE: -- intf_mask = BIT(2); -+ intf_mask = RTW_PWR_INTF_PCI_MSK; - break; - case RTW_HCI_TYPE_USB: -- intf_mask = BIT(1); -+ intf_mask = RTW_PWR_INTF_USB_MSK; -+ break; -+ case RTW_HCI_TYPE_SDIO: -+ intf_mask = RTW_PWR_INTF_SDIO_MSK; - break; - default: - return -EINVAL; -@@ -245,6 +272,7 @@ - { - const struct rtw_chip_info *chip = rtwdev->chip; - const struct rtw_pwr_seq_cmd **pwr_seq; -+ u32 imr = 0; - u8 rpwm; - bool cur_pwr; - int ret; -@@ -270,17 +298,24 @@ - if (pwr_on == cur_pwr) - return -EALREADY; - -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { -+ imr = rtw_read32(rtwdev, REG_SDIO_HIMR); -+ rtw_write32(rtwdev, REG_SDIO_HIMR, 0); -+ } -+ -+ if (!pwr_on) -+ clear_bit(RTW_FLAG_POWERON, rtwdev->flags); -+ - pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; - ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); -- if (ret) -- return ret; - -- if (pwr_on) -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) -+ rtw_write32(rtwdev, REG_SDIO_HIMR, imr); -+ -+ if (!ret && pwr_on) - set_bit(RTW_FLAG_POWERON, rtwdev->flags); -- else -- clear_bit(RTW_FLAG_POWERON, rtwdev->flags); - -- return 0; -+ return ret; - } - - static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) -@@ -451,6 +486,9 @@ - rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); - rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); - -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) -+ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); -+ - /* Disable beacon related functions */ - tmp = rtw_read8(rtwdev, REG_BCN_CTRL); - bckp[bckp_idx].len = 1; -@@ -756,8 +794,10 @@ - - wlan_cpu_enable(rtwdev, true); - -- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) -- return -EBUSY; -+ if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { -+ ret = -EBUSY; -+ goto dlfw_fail; -+ } - - ret = download_firmware_validate(rtwdev); - if (ret) -@@ -918,7 +958,8 @@ - return ret; - } - --int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) -+static -+int _rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) - { - if (rtw_chip_wcpu_11n(rtwdev)) - return __rtw_download_firmware_legacy(rtwdev, fw); -@@ -926,6 +967,21 @@ - return __rtw_download_firmware(rtwdev, fw); - } - -+int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw) -+{ -+ int ret; -+ -+ ret = _rtw_download_firmware(rtwdev, fw); -+ if (ret) -+ return ret; -+ -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_PCIE && -+ rtwdev->chip->id == RTW_CHIP_TYPE_8821C) -+ rtw_fw_set_recover_bt_device(rtwdev); -+ -+ return 0; -+} -+ - static u32 get_priority_queues(struct rtw_dev *rtwdev, u32 queues) - { - const struct rtw_rqpn *rqpn = rtwdev->fifo.rqpn; -@@ -1026,6 +1082,9 @@ - else - return -EINVAL; - break; -+ case RTW_HCI_TYPE_SDIO: -+ rqpn = &chip->rqpn_table[0]; -+ break; - default: - return -EINVAL; - } -@@ -1044,6 +1103,13 @@ - if (rtw_chip_wcpu_11ac(rtwdev)) - rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); - -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { -+ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); -+ rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0); -+ } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { -+ rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); -+ } -+ - return 0; - } - -@@ -1055,7 +1121,7 @@ - u8 csi_buf_pg_num = chip->csi_buf_pg_num; - - /* config rsvd page num */ -- fifo->rsvd_drv_pg_num = 8; -+ fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num; - fifo->txff_pg_num = chip->txff_size >> 7; - if (rtw_chip_wcpu_11n(rtwdev)) - fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num; -@@ -1185,6 +1251,9 @@ - else - return -EINVAL; - break; -+ case RTW_HCI_TYPE_SDIO: -+ pg_tbl = &chip->page_table[0]; -+ break; - default: - return -EINVAL; - } -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h ---- a/drivers/net/wireless/realtek/rtw88/mac.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac.h 2023-06-22 13:52:09.000000000 -0400 -@@ -7,7 +7,6 @@ - - #define RTW_HW_PORT_NUM 5 - #define cut_version_to_mask(cut) (0x1 << ((cut) + 1)) --#define SDIO_LOCAL_OFFSET 0x10250000 - #define DDMA_POLLING_COUNT 1000 - #define C2H_PKT_BUF 256 - #define REPORT_BUF 128 -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c ---- a/drivers/net/wireless/realtek/rtw88/main.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c +index 4c8164db4a9e..c853e2f2d448 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.c ++++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -18,6 +18,7 @@ #include "debug.h" #include "bf.h" @@ -1198,7 +1310,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re bool rtw_disable_lps_deep_mode; EXPORT_SYMBOL(rtw_disable_lps_deep_mode); -@@ -102,6 +103,26 @@ +@@ -102,6 +103,26 @@ static struct ieee80211_rate rtw_ratetable[] = { {.bitrate = 540, .hw_value = 0x0b,}, }; @@ -1225,7 +1337,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re u16 rtw_desc_to_bitrate(u8 desc_rate) { struct ieee80211_rate rate; -@@ -241,8 +262,10 @@ +@@ -241,8 +262,10 @@ static void rtw_watch_dog_work(struct work_struct *work) rtw_phy_dynamic_mechanism(rtwdev); data.rtwdev = rtwdev; @@ -1238,7 +1350,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re /* fw supports only one station associated to enter lps, if there are * more than two stations associated to the AP, then we can not enter -@@ -254,7 +277,7 @@ +@@ -254,7 +277,7 @@ static void rtw_watch_dog_work(struct work_struct *work) * threshold. */ if (rtwdev->ps_enabled && data.rtwvif && !ps_active && @@ -1247,7 +1359,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_enter_lps(rtwdev, data.rtwvif->port); rtwdev->watch_dog_cnt++; -@@ -311,12 +334,15 @@ +@@ -311,12 +334,15 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, struct ieee80211_vif *vif) { struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; @@ -1263,7 +1375,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re si->rtwdev = rtwdev; si->sta = sta; si->vif = vif; -@@ -622,6 +648,7 @@ +@@ -622,6 +648,7 @@ static void __fw_recovery_work(struct rtw_dev *rtwdev) rcu_read_unlock(); rtw_iterate_stas_atomic(rtwdev, rtw_reset_sta_iter, rtwdev); rtw_iterate_vifs_atomic(rtwdev, rtw_reset_vif_iter, rtwdev); @@ -1271,7 +1383,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_enter_ips(rtwdev); } -@@ -841,6 +868,9 @@ +@@ -841,6 +868,9 @@ void rtw_set_channel(struct rtw_dev *rtwdev) rtw_update_channel(rtwdev, center_chan, primary_chan, band, bandwidth); @@ -1281,7 +1393,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re chip->ops->set_channel(rtwdev, center_chan, bandwidth, hal->current_primary_channel_index); -@@ -1746,7 +1776,8 @@ +@@ -1746,7 +1776,8 @@ static void rtw_load_firmware_cb(const struct firmware *firmware, void *context) update_firmware_info(rtwdev, fw); complete_all(&fw->completion); @@ -1291,7 +1403,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re fw->version, fw->sub_version, fw->sub_index, fw->h2c_version); } -@@ -1772,6 +1803,7 @@ +@@ -1772,6 +1803,7 @@ static int rtw_load_firmware(struct rtw_dev *rtwdev, enum rtw_fw_type type) return -ENOENT; } @@ -1299,7 +1411,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re fw->rtwdev = rtwdev; init_completion(&fw->completion); -@@ -1796,6 +1828,14 @@ +@@ -1796,6 +1828,14 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) rtwdev->hci.rpwm_addr = 0x03d9; rtwdev->hci.cpwm_addr = 0x03da; break; @@ -1314,7 +1426,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re default: rtw_err(rtwdev, "unsupported hci type\n"); return -EINVAL; -@@ -1986,7 +2026,7 @@ +@@ -1986,7 +2026,7 @@ static int rtw_chip_board_info_setup(struct rtw_dev *rtwdev) if (!rfe_def) return -ENODEV; @@ -1323,7 +1435,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_phy_init_tx_power(rtwdev); if (rfe_def->agc_btg_tbl) -@@ -2080,13 +2120,10 @@ +@@ -2080,13 +2120,10 @@ int rtw_core_init(struct rtw_dev *rtwdev) skb_queue_head_init(&rtwdev->coex.queue); skb_queue_head_init(&rtwdev->tx_report.queue); @@ -1337,7 +1449,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re mutex_init(&rtwdev->hal.tx_power_mutex); init_waitqueue_head(&rtwdev->coex.wait); -@@ -2158,7 +2195,6 @@ +@@ -2158,7 +2195,6 @@ void rtw_core_deinit(struct rtw_dev *rtwdev) } mutex_destroy(&rtwdev->mutex); @@ -1345,7 +1457,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re mutex_destroy(&rtwdev->hal.tx_power_mutex); } EXPORT_SYMBOL(rtw_core_deinit); -@@ -2169,9 +2205,11 @@ +@@ -2169,9 +2205,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) int max_tx_headroom = 0; int ret; @@ -1358,7 +1470,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re hw->extra_tx_headroom = max_tx_headroom; hw->queues = IEEE80211_NUM_ACS; hw->txq_data_size = sizeof(struct rtw_txq); -@@ -2205,6 +2243,11 @@ +@@ -2205,6 +2243,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS; hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev); @@ -1370,7 +1482,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0); wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SCAN_RANDOM_SN); wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SET_SCAN_DWELL); -@@ -2254,6 +2297,129 @@ +@@ -2254,6 +2297,129 @@ void rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) } EXPORT_SYMBOL(rtw_unregister_hw); @@ -1500,10 +1612,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re MODULE_AUTHOR("Realtek Corporation"); MODULE_DESCRIPTION("Realtek 802.11ac wireless core module"); MODULE_LICENSE("Dual BSD/GPL"); -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h ---- a/drivers/net/wireless/realtek/rtw88/main.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.h 2023-06-22 13:52:09.000000000 -0400 -@@ -88,7 +88,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h +index f8714f449244..f9dd2ab941c8 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.h ++++ b/drivers/net/wireless/realtek/rtw88/main.h +@@ -88,7 +88,7 @@ enum rtw_supported_band { RTW_BAND_60G = BIT(NL80211_BAND_60GHZ), }; @@ -1512,7 +1625,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re #define RTW_MAX_CHANNEL_WIDTH RTW_CHANNEL_WIDTH_80 enum rtw_bandwidth { -@@ -395,6 +395,15 @@ +@@ -395,6 +395,15 @@ enum rtw_snr { RTW_SNR_NUM }; @@ -1528,7 +1641,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re enum rtw_wow_flags { RTW_WOW_FLAG_EN_MAGIC_PKT, RTW_WOW_FLAG_EN_REKEY_PKT, -@@ -794,6 +803,7 @@ +@@ -794,6 +803,7 @@ struct rtw_bf_info { struct rtw_vif { enum rtw_net_type net_type; u16 aid; @@ -1536,7 +1649,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 mac_addr[ETH_ALEN]; u8 bssid[ETH_ALEN]; u8 port; -@@ -874,6 +884,10 @@ +@@ -874,6 +884,10 @@ struct rtw_chip_ops { bool is_tx2_path); void (*config_txrx_mode)(struct rtw_dev *rtwdev, u8 tx_path, u8 rx_path, bool is_tx2_path); @@ -1547,7 +1660,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re /* for coex */ void (*coex_set_init)(struct rtw_dev *rtwdev); -@@ -1167,6 +1181,7 @@ +@@ -1167,6 +1181,7 @@ struct rtw_chip_info { u32 txff_size; u32 rxff_size; u32 fw_rxff_size; @@ -1555,7 +1668,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 band; u8 page_size; u8 csi_buf_pg_num; -@@ -1504,8 +1519,6 @@ +@@ -1504,8 +1519,6 @@ struct rtw_coex_stat { }; struct rtw_coex { @@ -1564,7 +1677,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re struct sk_buff_head queue; wait_queue_head_t wait; -@@ -1854,6 +1867,7 @@ +@@ -1854,6 +1867,7 @@ struct rtw_fw_state { u16 h2c_version; u32 feature; u32 feature_ext; @@ -1572,7 +1685,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re }; enum rtw_sar_sources { -@@ -1871,7 +1885,7 @@ +@@ -1871,7 +1885,7 @@ enum rtw_sar_bands { RTW_SAR_BAND_NR, }; @@ -1581,7 +1694,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re * which might not re-use same format with array common. */ union rtw_sar_cfg { -@@ -1890,7 +1904,9 @@ +@@ -1890,7 +1904,9 @@ struct rtw_hal { u8 cut_version; u8 mp_chip; u8 oem_id; @@ -1591,7 +1704,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 ps_mode; u8 current_channel; -@@ -1997,9 +2013,6 @@ +@@ -1997,9 +2013,6 @@ struct rtw_dev { /* ensures exclusive access from mac80211 callbacks */ struct mutex mutex; @@ -1601,7 +1714,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re /* watch dog every 2 sec */ struct delayed_work watch_dog_work; u32 watch_dog_cnt; -@@ -2023,10 +2036,8 @@ +@@ -2023,10 +2036,8 @@ struct rtw_dev { struct rtw_tx_report tx_report; struct { @@ -1613,7 +1726,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u32 seq; } h2c; -@@ -2041,6 +2052,7 @@ +@@ -2041,6 +2052,7 @@ struct rtw_dev { u8 sta_cnt; u32 rts_threshold; @@ -1621,7 +1734,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re DECLARE_BITMAP(mac_id_map, RTW_MAX_MAC_ID_NUM); DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS); -@@ -2052,6 +2064,7 @@ +@@ -2052,6 +2064,7 @@ struct rtw_dev { bool need_rfk; struct completion fw_scan_density; @@ -1629,7 +1742,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re /* hci related data, must be last */ u8 priv[] __aligned(sizeof(void *)); -@@ -2193,4 +2206,7 @@ +@@ -2193,4 +2206,7 @@ void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool config_1ss); void rtw_update_channel(struct rtw_dev *rtwdev, u8 center_channel, u8 primary_channel, enum rtw_supported_band band, enum rtw_bandwidth bandwidth); @@ -1637,67 +1750,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re +bool rtw_core_check_sta_active(struct rtw_dev *rtwdev); +void rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable); #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile ---- a/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-22 13:52:09.000000000 -0400 -@@ -26,23 +26,53 @@ - obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o - rtw88_8822be-objs := rtw8822be.o - -+obj-$(CONFIG_RTW88_8822BS) += rtw88_8822bs.o -+rtw88_8822bs-objs := rtw8822bs.o -+ -+obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o -+rtw88_8822bu-objs := rtw8822bu.o -+ - obj-$(CONFIG_RTW88_8822C) += rtw88_8822c.o - rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o - - obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o - rtw88_8822ce-objs := rtw8822ce.o - -+obj-$(CONFIG_RTW88_8822CS) += rtw88_8822cs.o -+rtw88_8822cs-objs := rtw8822cs.o -+ -+obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o -+rtw88_8822cu-objs := rtw8822cu.o -+ - obj-$(CONFIG_RTW88_8723D) += rtw88_8723d.o - rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o - - obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o - rtw88_8723de-objs := rtw8723de.o - -+obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o -+rtw88_8723ds-objs := rtw8723ds.o -+ -+obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o -+rtw88_8723du-objs := rtw8723du.o -+ - obj-$(CONFIG_RTW88_8821C) += rtw88_8821c.o - rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o - - obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o - rtw88_8821ce-objs := rtw8821ce.o - -+obj-$(CONFIG_RTW88_8821CS) += rtw88_8821cs.o -+rtw88_8821cs-objs := rtw8821cs.o -+ -+obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o -+rtw88_8821cu-objs := rtw8821cu.o -+ - obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o - rtw88_pci-objs := pci.o -+ -+obj-$(CONFIG_RTW88_SDIO) += rtw88_sdio.o -+rtw88_sdio-objs := sdio.o -+ -+obj-$(CONFIG_RTW88_USB) += rtw88_usb.o -+rtw88_usb-objs := usb.o -diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c ---- a/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-22 13:52:09.000000000 -0400 -@@ -30,7 +30,8 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c +index 0975d27240e4..44a8fff34cdd 100644 +--- a/drivers/net/wireless/realtek/rtw88/pci.c ++++ b/drivers/net/wireless/realtek/rtw88/pci.c +@@ -30,7 +30,8 @@ static u32 rtw_pci_tx_queue_idx_addr[] = { [RTW_TX_QUEUE_H2C] = RTK_PCI_TXBD_IDX_H2CQ, }; @@ -1707,7 +1764,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea { switch (queue) { case RTW_TX_QUEUE_BCN: -@@ -88,13 +89,6 @@ +@@ -88,13 +89,6 @@ static void rtw_pci_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) writel(val, rtwpci->mmap + addr); } @@ -1721,7 +1778,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea static void rtw_pci_free_tx_ring_skbs(struct rtw_dev *rtwdev, struct rtw_pci_tx_ring *tx_ring) { -@@ -542,7 +536,7 @@ +@@ -542,7 +536,7 @@ static int rtw_pci_setup(struct rtw_dev *rtwdev) static void rtw_pci_dma_release(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci) { struct rtw_pci_tx_ring *tx_ring; @@ -1730,7 +1787,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea rtw_pci_reset_trx_ring(rtwdev); for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) { -@@ -608,8 +602,8 @@ +@@ -608,8 +602,8 @@ static void rtw_pci_deep_ps_enter(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *tx_ring; @@ -1740,7 +1797,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) goto enter_deep_ps; -@@ -669,37 +663,6 @@ +@@ -669,37 +663,6 @@ static void rtw_pci_deep_ps(struct rtw_dev *rtwdev, bool enter) spin_unlock_bh(&rtwpci->irq_lock); } @@ -1778,7 +1835,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea static void rtw_pci_release_rsvd_page(struct rtw_pci *rtwpci, struct rtw_pci_tx_ring *ring) { -@@ -775,8 +738,9 @@ +@@ -775,8 +738,9 @@ static void __rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 pci_queues, u8 q; for (q = 0; q < RTK_MAX_TX_QUEUE_NUM; q++) { @@ -1790,7 +1847,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea continue; if (pci_queues & BIT(q)) -@@ -797,13 +761,14 @@ +@@ -797,13 +761,14 @@ static void rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop) } else { for (i = 0; i < rtwdev->hw->queues; i++) if (queues & BIT(i)) @@ -1807,7 +1864,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *ring; -@@ -822,7 +787,7 @@ +@@ -822,7 +787,7 @@ static void rtw_pci_tx_kick_off_queue(struct rtw_dev *rtwdev, u8 queue) static void rtw_pci_tx_kick_off(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; @@ -1816,7 +1873,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) if (test_and_clear_bit(queue, rtwpci->tx_queued)) -@@ -831,7 +796,8 @@ +@@ -831,7 +796,8 @@ static void rtw_pci_tx_kick_off(struct rtw_dev *rtwdev) static int rtw_pci_tx_write_data(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, @@ -1826,7 +1883,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; const struct rtw_chip_info *chip = rtwdev->chip; -@@ -949,9 +915,9 @@ +@@ -949,9 +915,9 @@ static int rtw_pci_tx_write(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { @@ -1837,7 +1894,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea int ret; ret = rtw_pci_tx_write_data(rtwdev, pkt_info, skb, queue); -@@ -1580,7 +1546,6 @@ +@@ -1580,7 +1546,6 @@ static int rtw_pci_claim(struct rtw_dev *rtwdev, struct pci_dev *pdev) static void rtw_pci_declaim(struct rtw_dev *rtwdev, struct pci_dev *pdev) { @@ -1845,10 +1902,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea pci_disable_device(pdev); } -diff -Naur a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c ---- a/drivers/net/wireless/realtek/rtw88/phy.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/phy.c 2023-06-22 13:52:09.000000000 -0400 -@@ -300,7 +300,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/realtek/rtw88/phy.c +index bd7d05e08084..128e75a81bf3 100644 +--- a/drivers/net/wireless/realtek/rtw88/phy.c ++++ b/drivers/net/wireless/realtek/rtw88/phy.c +@@ -300,7 +300,7 @@ static void rtw_phy_stat_rssi(struct rtw_dev *rtwdev) data.rtwdev = rtwdev; data.min_rssi = U8_MAX; @@ -1857,7 +1915,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/rea dm_info->pre_min_rssi = dm_info->min_rssi; dm_info->min_rssi = data.min_rssi; -@@ -544,7 +544,7 @@ +@@ -544,7 +544,7 @@ static void rtw_phy_ra_info_update(struct rtw_dev *rtwdev) if (rtwdev->watch_dog_cnt & 0x3) return; @@ -1866,7 +1924,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/rea } static u32 rtw_phy_get_rrsr_mask(struct rtw_dev *rtwdev, u8 rate_idx) -@@ -597,7 +597,7 @@ +@@ -597,7 +597,7 @@ static void rtw_phy_rrsr_update(struct rtw_dev *rtwdev) struct rtw_dm_info *dm_info = &rtwdev->dm_info; dm_info->rrsr_mask_min = RRSR_RATE_ORDER_MAX; @@ -1875,10 +1933,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/phy.c b/drivers/net/wireless/rea rtw_write32(rtwdev, REG_RRSR, dm_info->rrsr_val_init & dm_info->rrsr_mask_min); } -diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c ---- a/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-22 13:52:09.000000000 -0400 -@@ -18,6 +18,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c +index 7ac35c368d7a..43e80a3a8136 100644 +--- a/drivers/net/wireless/realtek/rtw88/ps.c ++++ b/drivers/net/wireless/realtek/rtw88/ps.c +@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev) if (ret) rtw_err(rtwdev, "leave idle state failed\n"); @@ -1886,7 +1945,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real rtw_set_channel(rtwdev); return ret; -@@ -61,9 +62,7 @@ +@@ -61,9 +62,7 @@ int rtw_leave_ips(struct rtw_dev *rtwdev) return ret; } @@ -1897,9 +1956,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real return 0; } -diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h ---- a/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h +index 03bd8dc53f72..7c6c11d50ff3 100644 +--- a/drivers/net/wireless/realtek/rtw88/reg.h ++++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -87,6 +87,7 @@ #define BIT_LTE_MUX_CTRL_PATH BIT(26) #define REG_HCI_OPT_CTRL 0x0074 @@ -1954,10 +2014,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/rea #define REG_RCR 0x0608 #define BIT_APP_FCS BIT(31) #define BIT_APP_MIC BIT(30) -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-22 13:52:09.000000000 -0400 -@@ -210,6 +210,18 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +index 0a4f770fcbb7..c575476a0020 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +@@ -210,6 +210,18 @@ static void rtw8723de_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } @@ -1976,7 +2037,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -239,6 +251,12 @@ +@@ -239,6 +251,12 @@ static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8723de_efuse_parsing(efuse, map); break; @@ -1989,7 +2050,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -1945,6 +1963,26 @@ +@@ -1945,6 +1963,26 @@ static void rtw8723d_pwr_track(struct rtw_dev *rtwdev) dm_info->pwr_trk_triggered = false; } @@ -2016,7 +2077,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles static struct rtw_chip_ops rtw8723d_ops = { .phy_set_param = rtw8723d_phy_set_param, .read_efuse = rtw8723d_read_efuse, -@@ -1965,6 +2003,7 @@ +@@ -1965,6 +2003,7 @@ static struct rtw_chip_ops rtw8723d_ops = { .config_bfee = NULL, .set_gid_table = NULL, .cfg_csi_rate = NULL, @@ -2024,7 +2085,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles .coex_set_init = rtw8723d_coex_cfg_init, .coex_set_ant_switch = NULL, -@@ -2715,6 +2754,7 @@ +@@ -2715,6 +2754,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = { .ptct_efuse_size = 96 + 1, .txff_size = 32768, .rxff_size = 16384, @@ -2032,10 +2093,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-22 13:52:09.000000000 -0400 -@@ -41,6 +41,19 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +index 4641f6e047b4..3642a2c7f80c 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +@@ -41,6 +41,19 @@ struct rtw8723de_efuse { u8 sub_device_id[2]; }; @@ -2055,7 +2117,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles struct rtw8723d_efuse { __le16 rtl_id; u8 rsvd[2]; -@@ -69,7 +82,11 @@ +@@ -69,7 +82,11 @@ struct rtw8723d_efuse { u8 rfe_option; u8 country_code[2]; u8 res[3]; @@ -2068,10 +2130,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles }; extern const struct rtw_chip_info rtw8723d_hw_spec; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2023-06-22 13:52:09.000000000 -0400 -@@ -26,6 +26,18 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c +index 609a2b86330d..adf224618a2a 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c +@@ -26,6 +26,18 @@ static void rtw8821ce_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } @@ -2090,7 +2153,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles enum rtw8821ce_rf_set { SWITCH_TO_BTG, SWITCH_TO_WLG, -@@ -35,6 +47,7 @@ +@@ -35,6 +47,7 @@ enum rtw8821ce_rf_set { static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { @@ -2098,7 +2161,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles struct rtw_efuse *efuse = &rtwdev->efuse; struct rtw8821c_efuse *map; int i; -@@ -58,6 +71,19 @@ +@@ -58,6 +71,19 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g; efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g; @@ -2118,7 +2181,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles for (i = 0; i < 4; i++) efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i]; -@@ -68,6 +94,12 @@ +@@ -68,6 +94,12 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8821ce_efuse_parsing(efuse, map); break; @@ -2131,7 +2194,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -277,6 +309,7 @@ +@@ -277,6 +309,7 @@ static void rtw8821c_switch_rf_set(struct rtw_dev *rtwdev, u8 rf_set) static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) { @@ -2139,7 +2202,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles u32 rf_reg18; rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); -@@ -308,11 +341,10 @@ +@@ -308,11 +341,10 @@ static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) } if (channel <= 14) { @@ -2154,7 +2217,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x1); rtw_write_rf(rtwdev, RF_PATH_A, 0x64, 0xf, 0xf); } else { -@@ -1148,6 +1180,13 @@ +@@ -1148,6 +1180,13 @@ static void rtw8821c_phy_cck_pd_set(struct rtw_dev *rtwdev, u8 new_lvl) dm_info->cck_pd_default + new_lvl * 2); } @@ -2168,7 +2231,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles static struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8821c[] = { {0x0086, RTW_PWR_CUT_ALL_MSK, -@@ -1595,6 +1634,7 @@ +@@ -1595,6 +1634,7 @@ static struct rtw_chip_ops rtw8821c_ops = { .config_bfee = rtw8821c_bf_config_bfee, .set_gid_table = rtw_bf_set_gid_table, .cfg_csi_rate = rtw_bf_cfg_csi_rate, @@ -2176,7 +2239,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles .coex_set_init = rtw8821c_coex_cfg_init, .coex_set_ant_switch = rtw8821c_coex_cfg_ant_switch, -@@ -1893,6 +1933,7 @@ +@@ -1893,6 +1933,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = { .ptct_efuse_size = 96, .txff_size = 65536, .rxff_size = 16384, @@ -2184,9 +2247,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h +index 2698801fc35d..fcff31688c45 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h @@ -9,6 +9,26 @@ #define RCR_VHT_ACK BIT(26) @@ -2214,7 +2278,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireles struct rtw8821ce_efuse { u8 mac_addr[ETH_ALEN]; /* 0xd0 */ u8 vender_id[2]; -@@ -45,6 +65,11 @@ +@@ -45,6 +65,11 @@ struct rtw8821ce_efuse { u8 res7; }; @@ -2226,7 +2290,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireles struct rtw8821c_efuse { __le16 rtl_id; u8 res0[0x0e]; -@@ -73,6 +98,8 @@ +@@ -73,6 +98,8 @@ struct rtw8821c_efuse { u8 res[3]; union { struct rtw8821ce_efuse e; @@ -2235,10 +2299,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2023-06-22 13:52:09.000000000 -0400 -@@ -26,6 +26,18 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c +index 690e35c98f6e..3017a9760da8 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c +@@ -26,6 +26,18 @@ static void rtw8822be_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } @@ -2257,7 +2322,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -56,6 +68,12 @@ +@@ -56,6 +68,12 @@ static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8822be_efuse_parsing(efuse, map); break; @@ -2270,7 +2335,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -1588,6 +1606,15 @@ +@@ -1588,6 +1606,15 @@ static void rtw8822b_adaptivity(struct rtw_dev *rtwdev) rtw_phy_set_edcca_th(rtwdev, l2h, h2l); } @@ -2286,7 +2351,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822b[] = { {0x0086, RTW_PWR_CUT_ALL_MSK, -@@ -2163,6 +2190,7 @@ +@@ -2163,6 +2190,7 @@ static struct rtw_chip_ops rtw8822b_ops = { .cfg_csi_rate = rtw_bf_cfg_csi_rate, .adaptivity_init = rtw8822b_adaptivity_init, .adaptivity = rtw8822b_adaptivity, @@ -2294,7 +2359,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles .coex_set_init = rtw8822b_coex_cfg_init, .coex_set_ant_switch = rtw8822b_coex_cfg_ant_switch, -@@ -2512,6 +2540,7 @@ +@@ -2512,6 +2540,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = { .txff_size = 262144, .rxff_size = 24576, .fw_rxff_size = 12288, @@ -2302,10 +2367,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h 2023-06-22 13:52:09.000000000 -0400 -@@ -65,6 +65,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h +index 01d3644e0c94..2dc3a6660f06 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h +@@ -65,6 +65,11 @@ struct rtw8822be_efuse { u8 res7; }; @@ -2317,7 +2383,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireles struct rtw8822b_efuse { __le16 rtl_id; u8 res0[0x0e]; -@@ -92,8 +97,9 @@ +@@ -92,8 +97,9 @@ struct rtw8822b_efuse { u8 country_code[2]; u8 res[3]; union { @@ -2328,10 +2394,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2023-06-22 13:52:09.000000000 -0400 -@@ -29,6 +29,18 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c +index fccb15dfb959..cd965edc29ce 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c +@@ -29,6 +29,18 @@ static void rtw8822ce_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->e.mac_addr); } @@ -2350,7 +2417,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -58,6 +70,12 @@ +@@ -58,6 +70,12 @@ static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_PCIE: rtw8822ce_efuse_parsing(efuse, map); break; @@ -2363,7 +2430,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -4557,6 +4575,18 @@ +@@ -4557,6 +4575,18 @@ static void rtw8822c_adaptivity(struct rtw_dev *rtwdev) rtw_phy_set_edcca_th(rtwdev, l2h, h2l); } @@ -2382,7 +2449,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles static const struct rtw_pwr_seq_cmd trans_carddis_to_cardemu_8822c[] = { {0x0086, RTW_PWR_CUT_ALL_MSK, -@@ -4895,6 +4925,8 @@ +@@ -4895,6 +4925,8 @@ static const struct rtw_rfe_def rtw8822c_rfe_defs[] = { [0] = RTW_DEF_RFE(8822c, 0, 0), [1] = RTW_DEF_RFE(8822c, 0, 0), [2] = RTW_DEF_RFE(8822c, 0, 0), @@ -2391,7 +2458,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles [5] = RTW_DEF_RFE(8822c, 0, 5), [6] = RTW_DEF_RFE(8822c, 0, 0), }; -@@ -4978,6 +5010,7 @@ +@@ -4978,6 +5010,7 @@ static struct rtw_chip_ops rtw8822c_ops = { .cfo_track = rtw8822c_cfo_track, .config_tx_path = rtw8822c_config_tx_path, .config_txrx_mode = rtw8822c_config_trx_mode, @@ -2399,7 +2466,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles .coex_set_init = rtw8822c_coex_cfg_init, .coex_set_ant_switch = NULL, -@@ -5325,6 +5358,7 @@ +@@ -5325,6 +5358,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = { .txff_size = 262144, .rxff_size = 24576, .fw_rxff_size = 12288, @@ -2407,10 +2474,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles .txgi_factor = 2, .is_pwr_by_rate_dec = false, .max_power_index = 0x7f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h 2023-06-22 13:52:09.000000000 -0400 -@@ -16,6 +16,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h +index 479d5d769c52..1bc0e7f5d6bb 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h +@@ -16,6 +16,11 @@ struct rtw8822cu_efuse { u8 res2[0x3d]; }; @@ -2422,7 +2490,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireles struct rtw8822ce_efuse { u8 mac_addr[ETH_ALEN]; /* 0x120 */ u8 vender_id[2]; -@@ -91,8 +96,9 @@ +@@ -91,8 +96,9 @@ struct rtw8822c_efuse { u8 res9; u8 res10[0x42]; union { @@ -2433,14 +2501,38 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c ---- a/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-22 13:52:09.000000000 -0400 -@@ -34,43 +34,57 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c +index ab39245e9c2f..2821119dc930 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.c ++++ b/drivers/net/wireless/realtek/rtw88/tx.c +@@ -34,43 +34,57 @@ void rtw_tx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { - __le32 *txdesc = (__le32 *)skb->data; +- +- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); +- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); +- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); +- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); +- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); +- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); +- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); +- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); +- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); +- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); +- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); +- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); +- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); +- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); +- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); +- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); +- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); +- SET_TX_DESC_LS(txdesc, pkt_info->ls); +- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); +- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); +- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); +- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); + struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data; + bool more_data = false; + @@ -2483,29 +2575,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real + tx_desc->w8 = le32_encode_bits(pkt_info->en_hwseq, RTW_TX_DESC_W8_EN_HWSEQ); + + tx_desc->w9 = le32_encode_bits(pkt_info->seq, RTW_TX_DESC_W9_SW_SEQ); - -- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); -- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); -- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); -- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); -- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); -- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); -- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); -- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); -- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); -- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); -- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); -- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); -- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); -- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); -- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); -- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); -- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); -- SET_TX_DESC_LS(txdesc, pkt_info->ls); -- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); -- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); -- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); -- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); ++ if (pkt_info->rts) { - SET_TX_DESC_RTSRATE(txdesc, DESC_RATE24M); - SET_TX_DESC_DATA_RTS_SHORT(txdesc, 1); @@ -2528,7 +2598,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real } EXPORT_SYMBOL(rtw_tx_fill_tx_desc); -@@ -635,9 +649,8 @@ +@@ -635,9 +649,8 @@ static void rtw_txq_push(struct rtw_dev *rtwdev, rcu_read_unlock(); } @@ -2539,7 +2609,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real struct rtw_txq *rtwtxq, *tmp; spin_lock_bh(&rtwdev->txq_lock); -@@ -658,6 +671,13 @@ +@@ -658,6 +671,13 @@ void rtw_tx_work(struct work_struct *w) spin_unlock_bh(&rtwdev->txq_lock); } @@ -2553,7 +2623,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq) { struct rtw_txq *rtwtxq; -@@ -682,3 +702,44 @@ +@@ -682,3 +702,44 @@ void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq) list_del_init(&rtwtxq->list); spin_unlock_bh(&rtwdev->txq_lock); } @@ -2598,9 +2668,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real + return queue; +} +EXPORT_SYMBOL(rtw_tx_queue_mapping); -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h ---- a/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h +index 8419603adce4..324189606257 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.h ++++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -9,68 +9,53 @@ #define RTW_TX_PROBE_TIMEOUT msecs_to_jiffies(500) @@ -2717,7 +2788,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real enum rtw_tx_desc_queue_select { TX_DESC_QSEL_TID0 = 0, -@@ -103,6 +88,7 @@ +@@ -103,6 +88,7 @@ void rtw_tx(struct rtw_dev *rtwdev, void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_tx_work(struct work_struct *w); @@ -2725,7 +2796,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct ieee80211_sta *sta, -@@ -123,4 +109,32 @@ +@@ -123,4 +109,32 @@ rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, u8 *buf, u32 size); @@ -2758,10 +2829,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real +} + #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/util.c b/drivers/net/wireless/realtek/rtw88/util.c ---- a/drivers/net/wireless/realtek/rtw88/util.c 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/util.c 2023-06-22 13:52:09.000000000 -0400 -@@ -105,3 +105,106 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/util.c b/drivers/net/wireless/realtek/rtw88/util.c +index cdfd66a85075..ff3c269fb1a7 100644 +--- a/drivers/net/wireless/realtek/rtw88/util.c ++++ b/drivers/net/wireless/realtek/rtw88/util.c +@@ -105,3 +105,106 @@ void rtw_desc_to_mcsrate(u16 rate, u8 *mcs, u8 *nss) *mcs = rate - DESC_RATEMCS0; } } @@ -2868,9 +2940,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/util.c b/drivers/net/wireless/re + kfree(vif_entry); + } +} -diff -Naur a/drivers/net/wireless/realtek/rtw88/util.h b/drivers/net/wireless/realtek/rtw88/util.h ---- a/drivers/net/wireless/realtek/rtw88/util.h 2023-06-21 10:01:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/util.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/util.h b/drivers/net/wireless/realtek/rtw88/util.h +index 0c23b5069be0..dc8965525400 100644 +--- a/drivers/net/wireless/realtek/rtw88/util.h ++++ b/drivers/net/wireless/realtek/rtw88/util.h @@ -7,9 +7,6 @@ struct rtw_dev; @@ -2881,7 +2954,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/util.h b/drivers/net/wireless/re #define rtw_iterate_vifs_atomic(rtwdev, iterator, data) \ ieee80211_iterate_active_interfaces_atomic(rtwdev->hw, \ IEEE80211_IFACE_ITER_NORMAL, iterator, data) -@@ -20,6 +17,15 @@ +@@ -20,6 +17,15 @@ struct rtw_dev; #define rtw_iterate_keys_rcu(rtwdev, vif, iterator, data) \ ieee80211_iter_keys_rcu((rtwdev)->hw, vif, iterator, data) @@ -2897,9 +2970,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/util.h b/drivers/net/wireless/re static inline u8 *get_hdr_bssid(struct ieee80211_hdr *hdr) { __le16 fc = hdr->frame_control; -diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h ---- a/include/linux/mmc/sdio_ids.h 2023-06-09 04:34:30.000000000 -0400 -+++ b/include/linux/mmc/sdio_ids.h 2023-06-11 07:10:49.401245393 -0400 +diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h +index 74f9d9a6d330..f30a4e564754 100644 +--- a/include/linux/mmc/sdio_ids.h ++++ b/include/linux/mmc/sdio_ids.h @@ -111,6 +111,16 @@ #define SDIO_VENDOR_ID_MICROCHIP_WILC 0x0296 #define SDIO_DEVICE_ID_MICROCHIP_WILC1000 0x5347 @@ -2917,3 +2991,6 @@ diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h #define SDIO_VENDOR_ID_SIANO 0x039a #define SDIO_DEVICE_ID_SIANO_NOVA_B0 0x0201 #define SDIO_DEVICE_ID_SIANO_NICE 0x0202 +-- +2.39.2 + diff --git a/patch/misc/rtw88/6.1/002-rtw88-linux-next.patch b/patch/misc/rtw88/6.1/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 94% rename from patch/misc/rtw88/6.1/002-rtw88-linux-next.patch rename to patch/misc/rtw88/6.1/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index 0b25af4d52..ae971e8f25 100644 --- a/patch/misc/rtw88/6.1/002-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.1/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,5 +1,43 @@ ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400 +From 33e2d64ebc667de18533aadd24b9afa5a77c15a4 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Fri, 21 Jul 2023 17:05:34 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.1.y + +Signed-off-by: Patrick Yavitz +--- + .../net/wireless/realtek/rtw88/rtw8723ds.c | 41 + + .../net/wireless/realtek/rtw88/rtw8723du.c | 36 + + .../net/wireless/realtek/rtw88/rtw8821cs.c | 36 + + .../net/wireless/realtek/rtw88/rtw8821cu.c | 50 + + .../net/wireless/realtek/rtw88/rtw8822bs.c | 36 + + .../net/wireless/realtek/rtw88/rtw8822bu.c | 90 ++ + .../net/wireless/realtek/rtw88/rtw8822cs.c | 36 + + .../net/wireless/realtek/rtw88/rtw8822cu.c | 44 + + drivers/net/wireless/realtek/rtw88/sdio.c | 1416 +++++++++++++++++ + drivers/net/wireless/realtek/rtw88/sdio.h | 178 +++ + drivers/net/wireless/realtek/rtw88/usb.c | 931 +++++++++++ + drivers/net/wireless/realtek/rtw88/usb.h | 107 ++ + 12 files changed, 3001 insertions(+) + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723ds.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723du.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cu.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bu.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cu.c + create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.c + create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.h + create mode 100644 drivers/net/wireless/realtek/rtw88/usb.c + create mode 100644 drivers/net/wireless/realtek/rtw88/usb.h + +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723ds.c b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c +new file mode 100644 +index 000000000000..e5b6960ba0a0 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -42,8 +80,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723du.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723du.c b/drivers/net/wireless/realtek/rtw88/rtw8723du.c +new file mode 100644 +index 000000000000..322a805da76b +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723du.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation @@ -81,8 +122,11 @@ +MODULE_AUTHOR("Hans Ulli Kroll "); +MODULE_DESCRIPTION("Realtek 802.11n wireless 8723du driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cs.c b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c +new file mode 100644 +index 000000000000..a359413369a4 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -120,8 +164,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cu.c b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c +new file mode 100644 +index 000000000000..7a5cbdc31ef7 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821cu.c @@ -0,0 +1,50 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation @@ -173,8 +220,11 @@ +MODULE_AUTHOR("Hans Ulli Kroll "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cu driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bs.c b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c +new file mode 100644 +index 000000000000..31d8645f83bd +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Jernej Skrabec @@ -212,8 +262,11 @@ +MODULE_AUTHOR("Jernej Skrabec "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bu.c b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c +new file mode 100644 +index 000000000000..ab620a0b1dfc +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822bu.c @@ -0,0 +1,90 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation @@ -305,8 +358,11 @@ +MODULE_AUTHOR("Realtek Corporation"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bu driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cs.c b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c +new file mode 100644 +index 000000000000..975e81c824f2 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -344,8 +400,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cu.c b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c +new file mode 100644 +index 000000000000..af28ca09d41f +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822cu.c @@ -0,0 +1,44 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation @@ -391,8 +450,11 @@ +MODULE_AUTHOR("Realtek Corporation"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cu driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-07-07 19:42:40.585806232 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-07-10 05:58:23.384448785 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c +new file mode 100644 +index 000000000000..b19262ec5d8c +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -0,0 +1,1416 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (C) 2021 Martin Blumenstingl @@ -1810,8 +1872,11 @@ +MODULE_AUTHOR("Jernej Skrabec"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/sdio.h b/drivers/net/wireless/realtek/rtw88/sdio.h +new file mode 100644 +index 000000000000..3c659ed180f0 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/sdio.h @@ -0,0 +1,178 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ +/* Copyright (C) 2021 Martin Blumenstingl @@ -1991,8 +2056,11 @@ +} + +#endif ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c +new file mode 100644 +index 000000000000..4a57efdba97b +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/usb.c @@ -0,0 +1,931 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) 2018-2019 Realtek Corporation @@ -2925,8 +2993,11 @@ +MODULE_AUTHOR("Realtek Corporation"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless USB driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/usb.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/usb.h b/drivers/net/wireless/realtek/rtw88/usb.h +new file mode 100644 +index 000000000000..ad1d7955c6a5 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/usb.h @@ -0,0 +1,107 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ +/* Copyright(c) 2018-2019 Realtek Corporation @@ -3035,3 +3106,6 @@ +void rtw_usb_disconnect(struct usb_interface *intf); + +#endif +-- +2.39.2 + diff --git a/patch/misc/rtw88/6.2/001-rtw88-linux-next.patch b/patch/misc/rtw88/6.2/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 78% rename from patch/misc/rtw88/6.2/001-rtw88-linux-next.patch rename to patch/misc/rtw88/6.2/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index 58708fdc9d..dcbd7bffe4 100644 --- a/patch/misc/rtw88/6.2/001-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.2/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,7 +1,186 @@ -diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c ---- a/drivers/net/wireless/realtek/rtw88/bf.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/bf.c 2023-06-22 13:52:09.000000000 -0400 -@@ -49,19 +49,23 @@ +From d1bf4f3c75e71f744841473a6f55284f814d52e2 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Sat, 22 Jul 2023 04:30:58 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.2.y + +Signed-off-by: Patrick Yavitz +--- + drivers/net/wireless/realtek/rtw88/Kconfig | 47 +++++ + drivers/net/wireless/realtek/rtw88/Makefile | 15 ++ + drivers/net/wireless/realtek/rtw88/bf.c | 13 +- + drivers/net/wireless/realtek/rtw88/debug.c | 59 ++++-- + drivers/net/wireless/realtek/rtw88/debug.h | 1 + + drivers/net/wireless/realtek/rtw88/fw.c | 88 ++++++++- + drivers/net/wireless/realtek/rtw88/fw.h | 15 +- + drivers/net/wireless/realtek/rtw88/mac.c | 74 +++++-- + drivers/net/wireless/realtek/rtw88/mac.h | 1 - + drivers/net/wireless/realtek/rtw88/mac80211.c | 67 +++++-- + drivers/net/wireless/realtek/rtw88/main.c | 187 +++++++++++++++++- + drivers/net/wireless/realtek/rtw88/main.h | 27 ++- + drivers/net/wireless/realtek/rtw88/pci.c | 63 ++---- + drivers/net/wireless/realtek/rtw88/ps.c | 46 ++++- + drivers/net/wireless/realtek/rtw88/ps.h | 2 + + drivers/net/wireless/realtek/rtw88/reg.h | 14 ++ + drivers/net/wireless/realtek/rtw88/rtw8723d.c | 16 +- + drivers/net/wireless/realtek/rtw88/rtw8723d.h | 6 + + drivers/net/wireless/realtek/rtw88/rtw8821c.c | 32 ++- + drivers/net/wireless/realtek/rtw88/rtw8821c.h | 6 + + drivers/net/wireless/realtek/rtw88/rtw8822b.c | 10 + + drivers/net/wireless/realtek/rtw88/rtw8822b.h | 8 +- + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 10 + + drivers/net/wireless/realtek/rtw88/rtw8822c.h | 8 +- + drivers/net/wireless/realtek/rtw88/tx.c | 135 +++++++++---- + drivers/net/wireless/realtek/rtw88/tx.h | 127 ++++++------ + drivers/net/wireless/realtek/rtw88/usb.c | 20 +- + drivers/net/wireless/realtek/rtw88/usb.h | 2 +- + include/linux/mmc/sdio_ids.h | 10 + + 29 files changed, 870 insertions(+), 239 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig +index 651ab56d9c6b..cffad1c01249 100644 +--- a/drivers/net/wireless/realtek/rtw88/Kconfig ++++ b/drivers/net/wireless/realtek/rtw88/Kconfig +@@ -16,6 +16,9 @@ config RTW88_CORE + config RTW88_PCI + tristate + ++config RTW88_SDIO ++ tristate ++ + config RTW88_USB + tristate + +@@ -42,6 +45,17 @@ config RTW88_8822BE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822BS ++ tristate "Realtek 8822BS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8822B ++ help ++ Select this option will enable support for 8822BS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ + config RTW88_8822BU + tristate "Realtek 8822BU USB wireless network adapter" + depends on USB +@@ -64,6 +78,17 @@ config RTW88_8822CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822CS ++ tristate "Realtek 8822CS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8822C ++ help ++ Select this option will enable support for 8822CS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ + config RTW88_8822CU + tristate "Realtek 8822CU USB wireless network adapter" + depends on USB +@@ -86,6 +111,17 @@ config RTW88_8723DE + + 802.11n PCIe wireless network adapter + ++config RTW88_8723DS ++ tristate "Realtek 8723DS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8723D ++ help ++ Select this option will enable support for 8723DS chipset ++ ++ 802.11n SDIO wireless network adapter ++ + config RTW88_8723DU + tristate "Realtek 8723DU USB wireless network adapter" + depends on USB +@@ -108,6 +144,17 @@ config RTW88_8821CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8821CS ++ tristate "Realtek 8821CS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8821C ++ help ++ Select this option will enable support for 8821CS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ + config RTW88_8821CU + tristate "Realtek 8821CU USB wireless network adapter" + depends on USB +diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile +index fe7293ee87b4..fd212c09d88a 100644 +--- a/drivers/net/wireless/realtek/rtw88/Makefile ++++ b/drivers/net/wireless/realtek/rtw88/Makefile +@@ -26,6 +26,9 @@ rtw88_8822b-objs := rtw8822b.o rtw8822b_table.o + obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o + rtw88_8822be-objs := rtw8822be.o + ++obj-$(CONFIG_RTW88_8822BS) += rtw88_8822bs.o ++rtw88_8822bs-objs := rtw8822bs.o ++ + obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o + rtw88_8822bu-objs := rtw8822bu.o + +@@ -35,6 +38,9 @@ rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o + obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o + rtw88_8822ce-objs := rtw8822ce.o + ++obj-$(CONFIG_RTW88_8822CS) += rtw88_8822cs.o ++rtw88_8822cs-objs := rtw8822cs.o ++ + obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o + rtw88_8822cu-objs := rtw8822cu.o + +@@ -44,6 +50,9 @@ rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o + obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o + rtw88_8723de-objs := rtw8723de.o + ++obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o ++rtw88_8723ds-objs := rtw8723ds.o ++ + obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o + rtw88_8723du-objs := rtw8723du.o + +@@ -53,11 +62,17 @@ rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o + obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o + rtw88_8821ce-objs := rtw8821ce.o + ++obj-$(CONFIG_RTW88_8821CS) += rtw88_8821cs.o ++rtw88_8821cs-objs := rtw8821cs.o ++ + obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o + rtw88_8821cu-objs := rtw8821cu.o + + obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o + rtw88_pci-objs := pci.o + ++obj-$(CONFIG_RTW88_SDIO) += rtw88_sdio.o ++rtw88_sdio-objs := sdio.o ++ + obj-$(CONFIG_RTW88_USB) += rtw88_usb.o + rtw88_usb-objs := usb.o +diff --git a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/realtek/rtw88/bf.c +index 038a30b170ef..c827c4a2814b 100644 +--- a/drivers/net/wireless/realtek/rtw88/bf.c ++++ b/drivers/net/wireless/realtek/rtw88/bf.c +@@ -49,19 +49,23 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, sta = ieee80211_find_sta(vif, bssid); if (!sta) { @@ -27,7 +206,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/real } ether_addr_copy(bfee->mac_addr, bssid); -@@ -75,7 +79,7 @@ +@@ -75,7 +79,7 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, (vht_cap->cap & IEEE80211_VHT_CAP_SU_BEAMFORMER_CAPABLE)) { if (bfinfo->bfer_su_cnt >= chip->bfer_su_max_num) { rtw_dbg(rtwdev, RTW_DBG_BF, "su bfer number over limit\n"); @@ -36,7 +215,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/real } sound_dim = vht_cap->cap & -@@ -98,9 +102,6 @@ +@@ -98,9 +102,6 @@ void rtw_bf_assoc(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, rtw_chip_config_bfee(rtwdev, rtwvif, bfee, true); } @@ -46,10 +225,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/bf.c b/drivers/net/wireless/real } void rtw_bf_init_bfer_entry_mu(struct rtw_dev *rtwdev, -diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c ---- a/drivers/net/wireless/realtek/rtw88/debug.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-22 13:52:09.000000000 -0400 -@@ -183,8 +183,8 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c +index fa3d73b333ba..f8ba133baff0 100644 +--- a/drivers/net/wireless/realtek/rtw88/debug.c ++++ b/drivers/net/wireless/realtek/rtw88/debug.c +@@ -183,8 +183,8 @@ static int rtw_debugfs_copy_from_user(char tmp[], int size, tmp_len = (count > size - 1 ? size - 1 : count); @@ -60,7 +240,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r tmp[tmp_len] = '\0'; -@@ -201,13 +201,16 @@ +@@ -201,13 +201,16 @@ static ssize_t rtw_debugfs_set_read_reg(struct file *filp, char tmp[32 + 1]; u32 addr, len; int num; @@ -79,7 +259,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r if (len != 1 && len != 2 && len != 4) { rtw_warn(rtwdev, "read reg setting wrong len\n"); -@@ -288,8 +291,11 @@ +@@ -288,8 +291,11 @@ static ssize_t rtw_debugfs_set_rsvd_page(struct file *filp, char tmp[32 + 1]; u32 offset, page_num; int num; @@ -92,7 +272,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%d %d", &offset, &page_num); -@@ -314,8 +320,11 @@ +@@ -314,8 +320,11 @@ static ssize_t rtw_debugfs_set_single_input(struct file *filp, char tmp[32 + 1]; u32 input; int num; @@ -105,7 +285,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = kstrtoint(tmp, 0, &input); -@@ -338,14 +347,17 @@ +@@ -338,14 +347,17 @@ static ssize_t rtw_debugfs_set_write_reg(struct file *filp, char tmp[32 + 1]; u32 addr, val, len; int num; @@ -125,7 +305,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r switch (len) { case 1: -@@ -381,8 +393,11 @@ +@@ -381,8 +393,11 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp, char tmp[32 + 1]; u8 param[8]; int num; @@ -138,7 +318,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx", ¶m[0], ¶m[1], ¶m[2], ¶m[3], -@@ -408,14 +423,17 @@ +@@ -408,14 +423,17 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask, val; int num; @@ -158,7 +338,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } mutex_lock(&rtwdev->mutex); -@@ -438,14 +456,17 @@ +@@ -438,14 +456,17 @@ static ssize_t rtw_debugfs_set_rf_read(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask; int num; @@ -178,7 +358,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } debugfs_priv->rf_path = path; -@@ -467,7 +488,9 @@ +@@ -467,7 +488,9 @@ static ssize_t rtw_debugfs_set_fix_rate(struct file *filp, char tmp[32 + 1]; int ret; @@ -189,7 +369,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtou8(tmp, 0, &fix_rate); if (ret) { -@@ -860,7 +883,9 @@ +@@ -860,7 +883,9 @@ static ssize_t rtw_debugfs_set_coex_enable(struct file *filp, bool enable; int ret; @@ -200,7 +380,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &enable); if (ret) { -@@ -930,7 +955,9 @@ +@@ -930,7 +955,9 @@ static ssize_t rtw_debugfs_set_fw_crash(struct file *filp, bool input; int ret; @@ -211,10 +391,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &input); if (ret) -diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h ---- a/drivers/net/wireless/realtek/rtw88/debug.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/debug.h 2023-06-22 13:52:09.000000000 -0400 -@@ -24,6 +24,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h +index 066792dd96af..a9149c6c2b48 100644 +--- a/drivers/net/wireless/realtek/rtw88/debug.h ++++ b/drivers/net/wireless/realtek/rtw88/debug.h +@@ -24,6 +24,7 @@ enum rtw_debug_mask { RTW_DBG_ADAPTIVITY = 0x00008000, RTW_DBG_HW_SCAN = 0x00010000, RTW_DBG_STATE = 0x00020000, @@ -222,10 +403,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/r RTW_DBG_ALL = 0xffffffff }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c ---- a/drivers/net/wireless/realtek/rtw88/fw.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-22 13:52:09.000000000 -0400 -@@ -308,6 +308,57 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c +index 82295ac6402e..567bbedd8ee0 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.c ++++ b/drivers/net/wireless/realtek/rtw88/fw.c +@@ -308,6 +308,57 @@ void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev) } EXPORT_SYMBOL(rtw_fw_c2h_cmd_isr); @@ -283,7 +465,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, u8 *h2c) { -@@ -468,6 +519,23 @@ +@@ -468,6 +519,23 @@ void rtw_fw_query_bt_info(struct rtw_dev *rtwdev) rtw_fw_send_h2c_command(rtwdev, h2c_pkt); } @@ -307,7 +489,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw) { u8 h2c_pkt[H2C_PKT_SIZE] = {0}; -@@ -1393,6 +1461,10 @@ +@@ -1393,6 +1461,10 @@ static void rtw_build_rsvd_page_iter(void *data, u8 *mac, struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; struct rtw_rsvd_page *rsvd_pkt; @@ -318,7 +500,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real list_for_each_entry(rsvd_pkt, &rtwvif->rsvd_page_list, vif_list) { if (rsvd_pkt->type == RSVD_BEACON) list_add(&rsvd_pkt->build_list, -@@ -1614,6 +1686,7 @@ +@@ -1614,6 +1686,7 @@ void rtw_fw_update_beacon_work(struct work_struct *work) mutex_lock(&rtwdev->mutex); rtw_fw_download_rsvd_page(rtwdev); @@ -326,7 +508,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real mutex_unlock(&rtwdev->mutex); } -@@ -2155,11 +2228,19 @@ +@@ -2155,11 +2228,19 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, } rtw_fw_set_scan_offload(rtwdev, &cs_option, rtwvif, &chan_list); out: @@ -347,7 +529,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD)) return; -@@ -2244,6 +2325,7 @@ +@@ -2244,6 +2325,7 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb) if (rtw_is_op_chan(rtwdev, chan)) { rtw_store_op_chan(rtwdev, false); ieee80211_wake_queues(rtwdev->hw); @@ -355,7 +537,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } } else if (id == RTW_SCAN_NOTIFY_ID_PRESWITCH) { if (IS_CH_5G_BAND(chan)) { -@@ -2262,8 +2344,10 @@ +@@ -2262,8 +2344,10 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb) * if next channel is non-op channel. */ if (!rtw_is_op_chan(rtwdev, chan) && @@ -367,10 +549,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } rtw_dbg(rtwdev, RTW_DBG_HW_SCAN, -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h ---- a/drivers/net/wireless/realtek/rtw88/fw.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-22 13:52:09.000000000 -0400 -@@ -81,6 +81,17 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h +index 0a386e6d6e0d..43ccdf9965ac 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.h ++++ b/drivers/net/wireless/realtek/rtw88/fw.h +@@ -81,6 +81,17 @@ struct rtw_c2h_adaptivity { u8 option; } __packed; @@ -388,7 +571,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real struct rtw_h2c_cmd { __le32 msg; __le32 msg_ext; -@@ -530,6 +541,7 @@ +@@ -530,6 +541,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) #define H2C_CMD_MEDIA_STATUS_RPT 0x01 #define H2C_CMD_SET_PWR_MODE 0x20 #define H2C_CMD_LPS_PG_INFO 0x2b @@ -396,7 +579,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real #define H2C_CMD_RA_INFO 0x40 #define H2C_CMD_RSSI_MONITOR 0x42 #define H2C_CMD_BCN_FILTER_OFFLOAD_P0 0x56 -@@ -801,6 +813,7 @@ +@@ -801,6 +813,7 @@ void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset, void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_fw_send_general_info(struct rtw_dev *rtwdev); void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev); @@ -404,102 +587,200 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para); void rtw_fw_inform_rfk_status(struct rtw_dev *rtwdev, bool start); -@@ -868,5 +881,5 @@ +@@ -868,5 +881,5 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, bool enable); void rtw_hw_scan_status_report(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb); -void rtw_hw_scan_abort(struct rtw_dev *rtwdev, struct ieee80211_vif *vif); +void rtw_hw_scan_abort(struct rtw_dev *rtwdev); #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig ---- a/drivers/net/wireless/realtek/rtw88/Kconfig 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-22 13:52:09.000000000 -0400 -@@ -16,6 +16,9 @@ - config RTW88_PCI - tristate +diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c +index 8625a0a1430a..298663b03580 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac.c ++++ b/drivers/net/wireless/realtek/rtw88/mac.c +@@ -7,6 +7,7 @@ + #include "reg.h" + #include "fw.h" + #include "debug.h" ++#include "sdio.h" -+config RTW88_SDIO -+ tristate + void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, + u8 primary_ch_idx) +@@ -60,6 +61,7 @@ EXPORT_SYMBOL(rtw_set_channel_mac); + + static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) + { ++ unsigned int retry; + u32 value32; + u8 value8; + +@@ -77,6 +79,28 @@ static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) + case RTW_HCI_TYPE_PCIE: + rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS); + break; ++ case RTW_HCI_TYPE_SDIO: ++ rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT_HCI_SUS_REQ); + - config RTW88_USB - tristate - -@@ -42,6 +45,17 @@ - - 802.11ac PCIe wireless network adapter - -+config RTW88_8822BS -+ tristate "Realtek 8822BS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8822B -+ help -+ Select this option will enable support for 8822BS chipset ++ for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) { ++ if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT_HCI_RESUME_RDY) ++ break; + -+ 802.11ac SDIO wireless network adapter ++ usleep_range(10, 50); ++ } + - config RTW88_8822BU - tristate "Realtek 8822BU USB wireless network adapter" - depends on USB -@@ -64,6 +78,17 @@ ++ if (retry == RTW_PWR_POLLING_CNT) { ++ rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]"); ++ return -ETIMEDOUT; ++ } ++ ++ if (rtw_sdio_is_sdio30_supported(rtwdev)) ++ rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2, ++ BIT_SDIO_PAD_E5 >> 16); ++ else ++ rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2, ++ BIT_SDIO_PAD_E5 >> 16); ++ break; + case RTW_HCI_TYPE_USB: + break; + default: +@@ -217,10 +241,13 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev, + cut_mask = cut_version_to_mask(cut); + switch (rtw_hci_type(rtwdev)) { + case RTW_HCI_TYPE_PCIE: +- intf_mask = BIT(2); ++ intf_mask = RTW_PWR_INTF_PCI_MSK; + break; + case RTW_HCI_TYPE_USB: +- intf_mask = BIT(1); ++ intf_mask = RTW_PWR_INTF_USB_MSK; ++ break; ++ case RTW_HCI_TYPE_SDIO: ++ intf_mask = RTW_PWR_INTF_SDIO_MSK; + break; + default: + return -EINVAL; +@@ -245,6 +272,7 @@ 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; ++ u32 imr = 0; + u8 rpwm; + bool cur_pwr; + int ret; +@@ -270,17 +298,24 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) + if (pwr_on == cur_pwr) + return -EALREADY; - 802.11ac PCIe wireless network adapter ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { ++ imr = rtw_read32(rtwdev, REG_SDIO_HIMR); ++ rtw_write32(rtwdev, REG_SDIO_HIMR, 0); ++ } ++ ++ if (!pwr_on) ++ clear_bit(RTW_FLAG_POWERON, rtwdev->flags); ++ + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; + ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); +- if (ret) +- return ret; -+config RTW88_8822CS -+ tristate "Realtek 8822CS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8822C -+ help -+ Select this option will enable support for 8822CS chipset +- if (pwr_on) ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) ++ rtw_write32(rtwdev, REG_SDIO_HIMR, imr); + -+ 802.11ac SDIO wireless network adapter -+ - config RTW88_8822CU - tristate "Realtek 8822CU USB wireless network adapter" - depends on USB -@@ -86,6 +111,17 @@ ++ if (!ret && pwr_on) + set_bit(RTW_FLAG_POWERON, rtwdev->flags); +- else +- clear_bit(RTW_FLAG_POWERON, rtwdev->flags); - 802.11n PCIe wireless network adapter +- return 0; ++ return ret; + } -+config RTW88_8723DS -+ tristate "Realtek 8723DS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8723D -+ help -+ Select this option will enable support for 8723DS chipset -+ -+ 802.11n SDIO wireless network adapter -+ - config RTW88_8723DU - tristate "Realtek 8723DU USB wireless network adapter" - depends on USB -@@ -108,6 +144,17 @@ + static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) +@@ -451,6 +486,9 @@ static void download_firmware_reg_backup(struct rtw_dev *rtwdev, + rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); + rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); - 802.11ac PCIe wireless network adapter ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) ++ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); ++ + /* Disable beacon related functions */ + tmp = rtw_read8(rtwdev, REG_BCN_CTRL); + bckp[bckp_idx].len = 1; +@@ -756,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, -+config RTW88_8821CS -+ tristate "Realtek 8821CS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8821C -+ help -+ Select this option will enable support for 8821CS chipset -+ -+ 802.11ac SDIO wireless network adapter -+ - config RTW88_8821CU - tristate "Realtek 8821CU USB wireless network adapter" - depends on USB -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c ---- a/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-06-22 13:52:09.000000000 -0400 -@@ -43,7 +43,11 @@ + wlan_cpu_enable(rtwdev, true); + +- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) +- return -EBUSY; ++ if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { ++ ret = -EBUSY; ++ goto dlfw_fail; ++ } + + ret = download_firmware_validate(rtwdev); + if (ret) +@@ -1042,6 +1082,9 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) + else + return -EINVAL; + break; ++ case RTW_HCI_TYPE_SDIO: ++ rqpn = &chip->rqpn_table[0]; ++ break; + default: + return -EINVAL; + } +@@ -1060,8 +1103,12 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) + if (rtw_chip_wcpu_11ac(rtwdev)) + rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); + +- if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { ++ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); ++ rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0); ++ } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { + rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); ++ } + + return 0; + } +@@ -1074,7 +1121,7 @@ static int set_trx_fifo_info(struct rtw_dev *rtwdev) + u8 csi_buf_pg_num = chip->csi_buf_pg_num; + + /* config rsvd page num */ +- fifo->rsvd_drv_pg_num = 8; ++ fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num; + fifo->txff_pg_num = chip->txff_size >> 7; + if (rtw_chip_wcpu_11n(rtwdev)) + fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num; +@@ -1204,6 +1251,9 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev) + else + return -EINVAL; + break; ++ case RTW_HCI_TYPE_SDIO: ++ pg_tbl = &chip->page_table[0]; ++ break; + default: + return -EINVAL; + } +diff --git a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h +index 3172aa5ac4de..58c3dccc14bb 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac.h ++++ b/drivers/net/wireless/realtek/rtw88/mac.h +@@ -7,7 +7,6 @@ + + #define RTW_HW_PORT_NUM 5 + #define cut_version_to_mask(cut) (0x1 << ((cut) + 1)) +-#define SDIO_LOCAL_OFFSET 0x10250000 + #define DDMA_POLLING_COUNT 1000 + #define C2H_PKT_BUF 256 + #define REPORT_BUF 128 +diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c +index 3b92ac611d3f..a99b53d44267 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw88/mac80211.c +@@ -43,7 +43,11 @@ static void rtw_ops_wake_tx_queue(struct ieee80211_hw *hw, list_add_tail(&rtwtxq->list, &rtwdev->txqs); spin_unlock_bh(&rtwdev->txq_lock); @@ -512,7 +793,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } static int rtw_ops_start(struct ieee80211_hw *hw) -@@ -88,15 +92,6 @@ +@@ -88,15 +92,6 @@ static int rtw_ops_config(struct ieee80211_hw *hw, u32 changed) } } @@ -528,7 +809,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles if (changed & IEEE80211_CONF_CHANGE_CHANNEL) rtw_set_channel(rtwdev); -@@ -155,25 +150,32 @@ +@@ -155,25 +150,32 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; enum rtw_net_type net_type; u32 config = 0; @@ -564,7 +845,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_leave_lps_deep(rtwdev); switch (vif->type) { -@@ -195,6 +197,7 @@ +@@ -195,6 +197,7 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, break; default: WARN_ON(1); @@ -572,7 +853,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); return -EINVAL; } -@@ -206,6 +209,8 @@ +@@ -206,6 +209,8 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, rtwvif->bcn_ctrl = bcn_ctrl; config |= PORT_SET_BCN_CTRL; rtw_vif_port_config(rtwdev, rtwvif, config); @@ -581,7 +862,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); -@@ -236,6 +241,8 @@ +@@ -236,6 +241,8 @@ static void rtw_ops_remove_interface(struct ieee80211_hw *hw, rtwvif->bcn_ctrl = 0; config |= PORT_SET_BCN_CTRL; rtw_vif_port_config(rtwdev, rtwvif, config); @@ -590,7 +871,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); } -@@ -375,6 +382,7 @@ +@@ -375,6 +382,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, rtw_fw_download_rsvd_page(rtwdev); rtw_send_rsvd_page_h2c(rtwdev); @@ -598,7 +879,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc); if (rtw_bf_support) rtw_bf_assoc(rtwdev, vif, conf); -@@ -385,7 +393,8 @@ +@@ -385,7 +393,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, * when disconnected by peer */ if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) @@ -608,7 +889,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } config |= PORT_SET_NET_TYPE; -@@ -395,7 +404,7 @@ +@@ -395,7 +404,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_BSSID) { ether_addr_copy(rtwvif->bssid, conf->bssid); config |= PORT_SET_BSSID; @@ -617,7 +898,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_clear_op_chan(rtwdev); else rtw_store_op_chan(rtwdev, true); -@@ -409,6 +418,7 @@ +@@ -409,6 +418,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_BEACON) { rtw_set_dtim_period(rtwdev, conf->dtim_period); rtw_fw_download_rsvd_page(rtwdev); @@ -625,7 +906,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } if (changed & BSS_CHANGED_BEACON_ENABLED) { -@@ -428,6 +438,9 @@ +@@ -428,6 +438,9 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_ERP_SLOT) rtw_conf_tx(rtwdev, rtwvif); @@ -635,7 +916,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_vif_port_config(rtwdev, rtwvif, config); mutex_unlock(&rtwdev->mutex); -@@ -441,12 +454,29 @@ +@@ -441,12 +454,29 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw, const struct rtw_chip_info *chip = rtwdev->chip; mutex_lock(&rtwdev->mutex); @@ -665,7 +946,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles static int rtw_ops_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id, u16 ac, -@@ -849,7 +879,7 @@ +@@ -849,7 +879,7 @@ static int rtw_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, rtw_hw_scan_start(rtwdev, vif, req); ret = rtw_hw_scan_offload(rtwdev, vif, true); if (ret) { @@ -674,7 +955,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_err(rtwdev, "HW scan failed with status: %d\n", ret); } mutex_unlock(&rtwdev->mutex); -@@ -869,7 +899,7 @@ +@@ -869,7 +899,7 @@ static void rtw_ops_cancel_hw_scan(struct ieee80211_hw *hw, return; mutex_lock(&rtwdev->mutex); @@ -683,7 +964,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); } -@@ -893,7 +923,7 @@ +@@ -893,7 +923,7 @@ static void rtw_ops_sta_rc_update(struct ieee80211_hw *hw, struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; if (changed & IEEE80211_RC_BW_CHANGED) @@ -692,7 +973,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } const struct ieee80211_ops rtw_ops = { -@@ -908,6 +938,7 @@ +@@ -908,6 +938,7 @@ const struct ieee80211_ops rtw_ops = { .configure_filter = rtw_ops_configure_filter, .bss_info_changed = rtw_ops_bss_info_changed, .start_ap = rtw_ops_start_ap, @@ -700,189 +981,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles .conf_tx = rtw_ops_conf_tx, .sta_add = rtw_ops_sta_add, .sta_remove = rtw_ops_sta_remove, -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c ---- a/drivers/net/wireless/realtek/rtw88/mac.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-22 13:52:09.000000000 -0400 -@@ -7,6 +7,7 @@ - #include "reg.h" - #include "fw.h" - #include "debug.h" -+#include "sdio.h" - - void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, - u8 primary_ch_idx) -@@ -60,6 +61,7 @@ - - static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) - { -+ unsigned int retry; - u32 value32; - u8 value8; - -@@ -77,6 +79,28 @@ - case RTW_HCI_TYPE_PCIE: - rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS); - break; -+ case RTW_HCI_TYPE_SDIO: -+ rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT_HCI_SUS_REQ); -+ -+ for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) { -+ if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT_HCI_RESUME_RDY) -+ break; -+ -+ usleep_range(10, 50); -+ } -+ -+ if (retry == RTW_PWR_POLLING_CNT) { -+ rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]"); -+ return -ETIMEDOUT; -+ } -+ -+ if (rtw_sdio_is_sdio30_supported(rtwdev)) -+ rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2, -+ BIT_SDIO_PAD_E5 >> 16); -+ else -+ rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2, -+ BIT_SDIO_PAD_E5 >> 16); -+ break; - case RTW_HCI_TYPE_USB: - break; - default: -@@ -217,10 +241,13 @@ - cut_mask = cut_version_to_mask(cut); - switch (rtw_hci_type(rtwdev)) { - case RTW_HCI_TYPE_PCIE: -- intf_mask = BIT(2); -+ intf_mask = RTW_PWR_INTF_PCI_MSK; - break; - case RTW_HCI_TYPE_USB: -- intf_mask = BIT(1); -+ intf_mask = RTW_PWR_INTF_USB_MSK; -+ break; -+ case RTW_HCI_TYPE_SDIO: -+ intf_mask = RTW_PWR_INTF_SDIO_MSK; - break; - default: - return -EINVAL; -@@ -245,6 +272,7 @@ - { - const struct rtw_chip_info *chip = rtwdev->chip; - const struct rtw_pwr_seq_cmd **pwr_seq; -+ u32 imr = 0; - u8 rpwm; - bool cur_pwr; - int ret; -@@ -270,17 +298,24 @@ - if (pwr_on == cur_pwr) - return -EALREADY; - -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { -+ imr = rtw_read32(rtwdev, REG_SDIO_HIMR); -+ rtw_write32(rtwdev, REG_SDIO_HIMR, 0); -+ } -+ -+ if (!pwr_on) -+ clear_bit(RTW_FLAG_POWERON, rtwdev->flags); -+ - pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; - ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); -- if (ret) -- return ret; - -- if (pwr_on) -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) -+ rtw_write32(rtwdev, REG_SDIO_HIMR, imr); -+ -+ if (!ret && pwr_on) - set_bit(RTW_FLAG_POWERON, rtwdev->flags); -- else -- clear_bit(RTW_FLAG_POWERON, rtwdev->flags); - -- return 0; -+ return ret; - } - - static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) -@@ -451,6 +486,9 @@ - rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); - rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); - -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) -+ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); -+ - /* Disable beacon related functions */ - tmp = rtw_read8(rtwdev, REG_BCN_CTRL); - bckp[bckp_idx].len = 1; -@@ -756,8 +794,10 @@ - - wlan_cpu_enable(rtwdev, true); - -- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) -- return -EBUSY; -+ if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { -+ ret = -EBUSY; -+ goto dlfw_fail; -+ } - - ret = download_firmware_validate(rtwdev); - if (ret) -@@ -1042,6 +1082,9 @@ - else - return -EINVAL; - break; -+ case RTW_HCI_TYPE_SDIO: -+ rqpn = &chip->rqpn_table[0]; -+ break; - default: - return -EINVAL; - } -@@ -1060,8 +1103,12 @@ - if (rtw_chip_wcpu_11ac(rtwdev)) - rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); - -- if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { -+ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); -+ rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0); -+ } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { - rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); -+ } - - return 0; - } -@@ -1074,7 +1121,7 @@ - u8 csi_buf_pg_num = chip->csi_buf_pg_num; - - /* config rsvd page num */ -- fifo->rsvd_drv_pg_num = 8; -+ fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num; - fifo->txff_pg_num = chip->txff_size >> 7; - if (rtw_chip_wcpu_11n(rtwdev)) - fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num; -@@ -1204,6 +1251,9 @@ - else - return -EINVAL; - break; -+ case RTW_HCI_TYPE_SDIO: -+ pg_tbl = &chip->page_table[0]; -+ break; - default: - return -EINVAL; - } -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h ---- a/drivers/net/wireless/realtek/rtw88/mac.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac.h 2023-06-22 13:52:09.000000000 -0400 -@@ -7,7 +7,6 @@ - - #define RTW_HW_PORT_NUM 5 - #define cut_version_to_mask(cut) (0x1 << ((cut) + 1)) --#define SDIO_LOCAL_OFFSET 0x10250000 - #define DDMA_POLLING_COUNT 1000 - #define C2H_PKT_BUF 256 - #define REPORT_BUF 128 -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c ---- a/drivers/net/wireless/realtek/rtw88/main.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c +index b2e78737bd5d..c853e2f2d448 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.c ++++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -18,6 +18,7 @@ #include "debug.h" #include "bf.h" @@ -891,7 +993,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re bool rtw_disable_lps_deep_mode; EXPORT_SYMBOL(rtw_disable_lps_deep_mode); -@@ -102,6 +103,26 @@ +@@ -102,6 +103,26 @@ static struct ieee80211_rate rtw_ratetable[] = { {.bitrate = 540, .hw_value = 0x0b,}, }; @@ -918,7 +1020,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re u16 rtw_desc_to_bitrate(u8 desc_rate) { struct ieee80211_rate rate; -@@ -250,13 +271,13 @@ +@@ -250,13 +271,13 @@ static void rtw_watch_dog_work(struct work_struct *work) * more than two stations associated to the AP, then we can not enter * lps, because fw does not handle the overlapped beacon interval * @@ -935,7 +1037,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_enter_lps(rtwdev, data.rtwvif->port); rtwdev->watch_dog_cnt++; -@@ -298,22 +319,38 @@ +@@ -298,22 +319,38 @@ static u8 rtw_acquire_macid(struct rtw_dev *rtwdev) return mac_id; } @@ -974,7 +1076,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_update_sta_info(rtwdev, si, true); rtw_fw_media_status_report(rtwdev, si->mac_id, true); -@@ -332,6 +369,8 @@ +@@ -332,6 +369,8 @@ void rtw_sta_remove(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; int i; @@ -983,7 +1085,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_release_macid(rtwdev, si->mac_id); if (fw_exist) rtw_fw_media_status_report(rtwdev, si->mac_id, false); -@@ -609,6 +648,7 @@ +@@ -609,6 +648,7 @@ static void __fw_recovery_work(struct rtw_dev *rtwdev) rcu_read_unlock(); rtw_iterate_stas_atomic(rtwdev, rtw_reset_sta_iter, rtwdev); rtw_iterate_vifs_atomic(rtwdev, rtw_reset_vif_iter, rtwdev); @@ -991,7 +1093,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_enter_ips(rtwdev); } -@@ -828,6 +868,9 @@ +@@ -828,6 +868,9 @@ void rtw_set_channel(struct rtw_dev *rtwdev) rtw_update_channel(rtwdev, center_chan, primary_chan, band, bandwidth); @@ -1001,7 +1103,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re chip->ops->set_channel(rtwdev, center_chan, bandwidth, hal->current_primary_channel_index); -@@ -1785,6 +1828,10 @@ +@@ -1785,6 +1828,10 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) rtwdev->hci.rpwm_addr = 0x03d9; rtwdev->hci.cpwm_addr = 0x03da; break; @@ -1012,7 +1114,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re case RTW_HCI_TYPE_USB: rtwdev->hci.rpwm_addr = 0xfe58; rtwdev->hci.cpwm_addr = 0xfe57; -@@ -1979,7 +2026,7 @@ +@@ -1979,7 +2026,7 @@ static int rtw_chip_board_info_setup(struct rtw_dev *rtwdev) if (!rfe_def) return -ENODEV; @@ -1021,7 +1123,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_phy_init_tx_power(rtwdev); if (rfe_def->agc_btg_tbl) -@@ -2158,9 +2205,11 @@ +@@ -2158,9 +2205,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) int max_tx_headroom = 0; int ret; @@ -1034,7 +1136,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re hw->extra_tx_headroom = max_tx_headroom; hw->queues = IEEE80211_NUM_ACS; hw->txq_data_size = sizeof(struct rtw_txq); -@@ -2194,6 +2243,11 @@ +@@ -2194,6 +2243,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS; hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev); @@ -1046,7 +1148,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0); wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SCAN_RANDOM_SN); wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SET_SCAN_DWELL); -@@ -2243,6 +2297,129 @@ +@@ -2243,6 +2297,129 @@ void rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) } EXPORT_SYMBOL(rtw_unregister_hw); @@ -1176,10 +1278,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re MODULE_AUTHOR("Realtek Corporation"); MODULE_DESCRIPTION("Realtek 802.11ac wireless core module"); MODULE_LICENSE("Dual BSD/GPL"); -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h ---- a/drivers/net/wireless/realtek/rtw88/main.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.h 2023-06-22 13:52:09.000000000 -0400 -@@ -88,7 +88,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h +index d4a53d556745..f9dd2ab941c8 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.h ++++ b/drivers/net/wireless/realtek/rtw88/main.h +@@ -88,7 +88,7 @@ enum rtw_supported_band { RTW_BAND_60G = BIT(NL80211_BAND_60GHZ), }; @@ -1188,7 +1291,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re #define RTW_MAX_CHANNEL_WIDTH RTW_CHANNEL_WIDTH_80 enum rtw_bandwidth { -@@ -395,6 +395,15 @@ +@@ -395,6 +395,15 @@ enum rtw_snr { RTW_SNR_NUM }; @@ -1204,7 +1307,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re enum rtw_wow_flags { RTW_WOW_FLAG_EN_MAGIC_PKT, RTW_WOW_FLAG_EN_REKEY_PKT, -@@ -734,6 +743,7 @@ +@@ -734,6 +743,7 @@ struct rtw_txq { DECLARE_EWMA(rssi, 10, 16); struct rtw_sta_info { @@ -1212,7 +1315,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re struct ieee80211_sta *sta; struct ieee80211_vif *vif; -@@ -758,6 +768,8 @@ +@@ -758,6 +768,8 @@ struct rtw_sta_info { bool use_cfg_mask; struct cfg80211_bitrate_mask *mask; @@ -1221,7 +1324,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re }; enum rtw_bfee_role { -@@ -791,6 +803,7 @@ +@@ -791,6 +803,7 @@ struct rtw_bf_info { struct rtw_vif { enum rtw_net_type net_type; u16 aid; @@ -1229,7 +1332,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 mac_addr[ETH_ALEN]; u8 bssid[ETH_ALEN]; u8 port; -@@ -1168,6 +1181,7 @@ +@@ -1168,6 +1181,7 @@ struct rtw_chip_info { u32 txff_size; u32 rxff_size; u32 fw_rxff_size; @@ -1237,7 +1340,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 band; u8 page_size; u8 csi_buf_pg_num; -@@ -1871,7 +1885,7 @@ +@@ -1871,7 +1885,7 @@ enum rtw_sar_bands { RTW_SAR_BAND_NR, }; @@ -1246,7 +1349,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re * which might not re-use same format with array common. */ union rtw_sar_cfg { -@@ -1890,7 +1904,9 @@ +@@ -1890,7 +1904,9 @@ struct rtw_hal { u8 cut_version; u8 mp_chip; u8 oem_id; @@ -1256,7 +1359,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 ps_mode; u8 current_channel; -@@ -2020,7 +2036,7 @@ +@@ -2020,7 +2036,7 @@ struct rtw_dev { struct rtw_tx_report tx_report; struct { @@ -1265,7 +1368,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 last_box_num; u32 seq; } h2c; -@@ -2036,6 +2052,7 @@ +@@ -2036,6 +2052,7 @@ struct rtw_dev { u8 sta_cnt; u32 rts_threshold; @@ -1273,7 +1376,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re DECLARE_BITMAP(mac_id_map, RTW_MAX_MAC_ID_NUM); DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS); -@@ -2047,6 +2064,7 @@ +@@ -2047,6 +2064,7 @@ struct rtw_dev { bool need_rfk; struct completion fw_scan_density; @@ -1281,7 +1384,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re /* hci related data, must be last */ u8 priv[] __aligned(sizeof(void *)); -@@ -2188,4 +2206,7 @@ +@@ -2188,4 +2206,7 @@ void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool config_1ss); void rtw_update_channel(struct rtw_dev *rtwdev, u8 center_channel, u8 primary_channel, enum rtw_supported_band band, enum rtw_bandwidth bandwidth); @@ -1289,61 +1392,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re +bool rtw_core_check_sta_active(struct rtw_dev *rtwdev); +void rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable); #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile ---- a/drivers/net/wireless/realtek/rtw88/Makefile 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-22 13:52:09.000000000 -0400 -@@ -26,6 +26,9 @@ - obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o - rtw88_8822be-objs := rtw8822be.o - -+obj-$(CONFIG_RTW88_8822BS) += rtw88_8822bs.o -+rtw88_8822bs-objs := rtw8822bs.o -+ - obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o - rtw88_8822bu-objs := rtw8822bu.o - -@@ -35,6 +38,9 @@ - obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o - rtw88_8822ce-objs := rtw8822ce.o - -+obj-$(CONFIG_RTW88_8822CS) += rtw88_8822cs.o -+rtw88_8822cs-objs := rtw8822cs.o -+ - obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o - rtw88_8822cu-objs := rtw8822cu.o - -@@ -44,6 +50,9 @@ - obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o - rtw88_8723de-objs := rtw8723de.o - -+obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o -+rtw88_8723ds-objs := rtw8723ds.o -+ - obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o - rtw88_8723du-objs := rtw8723du.o - -@@ -53,11 +62,17 @@ - obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o - rtw88_8821ce-objs := rtw8821ce.o - -+obj-$(CONFIG_RTW88_8821CS) += rtw88_8821cs.o -+rtw88_8821cs-objs := rtw8821cs.o -+ - obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o - rtw88_8821cu-objs := rtw8821cu.o - - obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o - rtw88_pci-objs := pci.o - -+obj-$(CONFIG_RTW88_SDIO) += rtw88_sdio.o -+rtw88_sdio-objs := sdio.o -+ - obj-$(CONFIG_RTW88_USB) += rtw88_usb.o - rtw88_usb-objs := usb.o -diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c ---- a/drivers/net/wireless/realtek/rtw88/pci.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-22 13:52:09.000000000 -0400 -@@ -30,7 +30,8 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c +index 0975d27240e4..44a8fff34cdd 100644 +--- a/drivers/net/wireless/realtek/rtw88/pci.c ++++ b/drivers/net/wireless/realtek/rtw88/pci.c +@@ -30,7 +30,8 @@ static u32 rtw_pci_tx_queue_idx_addr[] = { [RTW_TX_QUEUE_H2C] = RTK_PCI_TXBD_IDX_H2CQ, }; @@ -1353,7 +1406,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea { switch (queue) { case RTW_TX_QUEUE_BCN: -@@ -88,13 +89,6 @@ +@@ -88,13 +89,6 @@ static void rtw_pci_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) writel(val, rtwpci->mmap + addr); } @@ -1367,7 +1420,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea static void rtw_pci_free_tx_ring_skbs(struct rtw_dev *rtwdev, struct rtw_pci_tx_ring *tx_ring) { -@@ -542,7 +536,7 @@ +@@ -542,7 +536,7 @@ static int rtw_pci_setup(struct rtw_dev *rtwdev) static void rtw_pci_dma_release(struct rtw_dev *rtwdev, struct rtw_pci *rtwpci) { struct rtw_pci_tx_ring *tx_ring; @@ -1376,7 +1429,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea rtw_pci_reset_trx_ring(rtwdev); for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) { -@@ -608,8 +602,8 @@ +@@ -608,8 +602,8 @@ static void rtw_pci_deep_ps_enter(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *tx_ring; @@ -1386,7 +1439,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_TX_WAKE)) goto enter_deep_ps; -@@ -669,37 +663,6 @@ +@@ -669,37 +663,6 @@ static void rtw_pci_deep_ps(struct rtw_dev *rtwdev, bool enter) spin_unlock_bh(&rtwpci->irq_lock); } @@ -1424,7 +1477,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea static void rtw_pci_release_rsvd_page(struct rtw_pci *rtwpci, struct rtw_pci_tx_ring *ring) { -@@ -775,8 +738,9 @@ +@@ -775,8 +738,9 @@ static void __rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 pci_queues, u8 q; for (q = 0; q < RTK_MAX_TX_QUEUE_NUM; q++) { @@ -1436,7 +1489,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea continue; if (pci_queues & BIT(q)) -@@ -797,13 +761,14 @@ +@@ -797,13 +761,14 @@ static void rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop) } else { for (i = 0; i < rtwdev->hw->queues; i++) if (queues & BIT(i)) @@ -1453,7 +1506,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; struct rtw_pci_tx_ring *ring; -@@ -822,7 +787,7 @@ +@@ -822,7 +787,7 @@ static void rtw_pci_tx_kick_off_queue(struct rtw_dev *rtwdev, u8 queue) static void rtw_pci_tx_kick_off(struct rtw_dev *rtwdev) { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; @@ -1462,7 +1515,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea for (queue = 0; queue < RTK_MAX_TX_QUEUE_NUM; queue++) if (test_and_clear_bit(queue, rtwpci->tx_queued)) -@@ -831,7 +796,8 @@ +@@ -831,7 +796,8 @@ static void rtw_pci_tx_kick_off(struct rtw_dev *rtwdev) static int rtw_pci_tx_write_data(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, @@ -1472,7 +1525,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea { struct rtw_pci *rtwpci = (struct rtw_pci *)rtwdev->priv; const struct rtw_chip_info *chip = rtwdev->chip; -@@ -949,9 +915,9 @@ +@@ -949,9 +915,9 @@ static int rtw_pci_tx_write(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { @@ -1483,7 +1536,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea int ret; ret = rtw_pci_tx_write_data(rtwdev, pkt_info, skb, queue); -@@ -1580,7 +1546,6 @@ +@@ -1580,7 +1546,6 @@ static int rtw_pci_claim(struct rtw_dev *rtwdev, struct pci_dev *pdev) static void rtw_pci_declaim(struct rtw_dev *rtwdev, struct pci_dev *pdev) { @@ -1491,10 +1544,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea pci_disable_device(pdev); } -diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c ---- a/drivers/net/wireless/realtek/rtw88/ps.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-22 13:52:09.000000000 -0400 -@@ -18,6 +18,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c +index 996365575f44..43e80a3a8136 100644 +--- a/drivers/net/wireless/realtek/rtw88/ps.c ++++ b/drivers/net/wireless/realtek/rtw88/ps.c +@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev) if (ret) rtw_err(rtwdev, "leave idle state failed\n"); @@ -1502,7 +1556,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real rtw_set_channel(rtwdev); return ret; -@@ -63,8 +64,6 @@ +@@ -63,8 +64,6 @@ int rtw_leave_ips(struct rtw_dev *rtwdev) rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev); @@ -1511,7 +1565,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real return 0; } -@@ -299,3 +298,46 @@ +@@ -299,3 +298,46 @@ void rtw_leave_lps_deep(struct rtw_dev *rtwdev) __rtw_leave_lps_deep(rtwdev); } @@ -1558,19 +1612,21 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real + rtw_leave_lps(rtwdev); + } +} -diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.h b/drivers/net/wireless/realtek/rtw88/ps.h ---- a/drivers/net/wireless/realtek/rtw88/ps.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/ps.h 2023-06-22 13:52:09.000000000 -0400 -@@ -23,4 +23,6 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/ps.h b/drivers/net/wireless/realtek/rtw88/ps.h +index c194386f6db5..5ae83d2526cf 100644 +--- a/drivers/net/wireless/realtek/rtw88/ps.h ++++ b/drivers/net/wireless/realtek/rtw88/ps.h +@@ -23,4 +23,6 @@ void rtw_enter_lps(struct rtw_dev *rtwdev, u8 port_id); void rtw_leave_lps(struct rtw_dev *rtwdev); void rtw_leave_lps_deep(struct rtw_dev *rtwdev); enum rtw_lps_deep_mode rtw_get_lps_deep_mode(struct rtw_dev *rtwdev); +void rtw_recalc_lps(struct rtw_dev *rtwdev, struct ieee80211_vif *new_vif); + #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h ---- a/drivers/net/wireless/realtek/rtw88/reg.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h +index 8852b24d6c2a..7c6c11d50ff3 100644 +--- a/drivers/net/wireless/realtek/rtw88/reg.h ++++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -87,6 +87,7 @@ #define BIT_LTE_MUX_CTRL_PATH BIT(26) #define REG_HCI_OPT_CTRL 0x0074 @@ -1624,10 +1680,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/rea #define REG_RCR 0x0608 #define BIT_APP_FCS BIT(31) #define BIT_APP_MIC BIT(30) -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-22 13:52:09.000000000 -0400 -@@ -216,6 +216,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +index 2d2f768bae2e..c575476a0020 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +@@ -216,6 +216,12 @@ static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1640,7 +1697,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -248,6 +254,9 @@ +@@ -248,6 +254,9 @@ static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8723du_efuse_parsing(efuse, map); break; @@ -1650,7 +1707,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -1961,15 +1970,17 @@ +@@ -1961,15 +1970,17 @@ static void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev, size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ __le16 chksum = 0; __le16 *data = (__le16 *)(txdesc); @@ -1670,7 +1727,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles } static struct rtw_chip_ops rtw8723d_ops = { -@@ -2743,6 +2754,7 @@ +@@ -2743,6 +2754,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = { .ptct_efuse_size = 96 + 1, .txff_size = 32768, .rxff_size = 16384, @@ -1678,10 +1735,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-22 13:52:09.000000000 -0400 -@@ -49,6 +49,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +index a356318a5c15..3642a2c7f80c 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +@@ -49,6 +49,11 @@ struct rtw8723du_efuse { u8 mac_addr[ETH_ALEN]; /* 0x107 */ }; @@ -1693,7 +1751,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles struct rtw8723d_efuse { __le16 rtl_id; u8 rsvd[2]; -@@ -80,6 +85,7 @@ +@@ -80,6 +85,7 @@ struct rtw8723d_efuse { union { struct rtw8723de_efuse e; struct rtw8723du_efuse u; @@ -1701,10 +1759,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2023-06-22 13:52:09.000000000 -0400 -@@ -32,6 +32,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c +index 67efa58dd78e..adf224618a2a 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c +@@ -32,6 +32,12 @@ static void rtw8821cu_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1717,7 +1776,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles enum rtw8821ce_rf_set { SWITCH_TO_BTG, SWITCH_TO_WLG, -@@ -41,6 +47,7 @@ +@@ -41,6 +47,7 @@ enum rtw8821ce_rf_set { static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { @@ -1725,7 +1784,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles struct rtw_efuse *efuse = &rtwdev->efuse; struct rtw8821c_efuse *map; int i; -@@ -64,6 +71,19 @@ +@@ -64,6 +71,19 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g; efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g; @@ -1745,7 +1804,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles for (i = 0; i < 4; i++) efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i]; -@@ -77,6 +97,9 @@ +@@ -77,6 +97,9 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8821cu_efuse_parsing(efuse, map); break; @@ -1755,7 +1814,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -286,6 +309,7 @@ +@@ -286,6 +309,7 @@ static void rtw8821c_switch_rf_set(struct rtw_dev *rtwdev, u8 rf_set) static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) { @@ -1763,7 +1822,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles u32 rf_reg18; rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); -@@ -317,11 +341,10 @@ +@@ -317,11 +341,10 @@ static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) } if (channel <= 14) { @@ -1778,7 +1837,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x1); rtw_write_rf(rtwdev, RF_PATH_A, 0x64, 0xf, 0xf); } else { -@@ -1910,6 +1933,7 @@ +@@ -1910,6 +1933,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = { .ptct_efuse_size = 96, .txff_size = 65536, .rxff_size = 16384, @@ -1786,10 +1845,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2023-06-22 13:52:09.000000000 -0400 -@@ -65,6 +65,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h +index 1c81260f3a54..fcff31688c45 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h +@@ -65,6 +65,11 @@ struct rtw8821ce_efuse { u8 res7; }; @@ -1801,7 +1861,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireles struct rtw8821c_efuse { __le16 rtl_id; u8 res0[0x0e]; -@@ -94,6 +99,7 @@ +@@ -94,6 +99,7 @@ struct rtw8821c_efuse { union { struct rtw8821ce_efuse e; struct rtw8821cu_efuse u; @@ -1809,10 +1869,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2023-06-22 13:52:09.000000000 -0400 -@@ -32,6 +32,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c +index 74dfb89b2c94..3017a9760da8 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c +@@ -32,6 +32,12 @@ static void rtw8822bu_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1825,7 +1886,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -65,6 +71,9 @@ +@@ -65,6 +71,9 @@ static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8822bu_efuse_parsing(efuse, map); break; @@ -1835,7 +1896,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -2531,6 +2540,7 @@ +@@ -2531,6 +2540,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = { .txff_size = 262144, .rxff_size = 24576, .fw_rxff_size = 12288, @@ -1843,10 +1904,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h 2023-06-22 13:52:09.000000000 -0400 -@@ -65,6 +65,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h +index 01d3644e0c94..2dc3a6660f06 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h +@@ -65,6 +65,11 @@ struct rtw8822be_efuse { u8 res7; }; @@ -1858,7 +1920,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireles struct rtw8822b_efuse { __le16 rtl_id; u8 res0[0x0e]; -@@ -92,8 +97,9 @@ +@@ -92,8 +97,9 @@ struct rtw8822b_efuse { u8 country_code[2]; u8 res[3]; union { @@ -1869,10 +1931,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2023-06-22 13:52:09.000000000 -0400 -@@ -35,6 +35,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c +index 964e27887fe2..cd965edc29ce 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c +@@ -35,6 +35,12 @@ static void rtw8822cu_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1885,7 +1948,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -67,6 +73,9 @@ +@@ -67,6 +73,9 @@ static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8822cu_efuse_parsing(efuse, map); break; @@ -1895,7 +1958,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -5349,6 +5358,7 @@ +@@ -5349,6 +5358,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = { .txff_size = 262144, .rxff_size = 24576, .fw_rxff_size = 12288, @@ -1903,10 +1966,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles .txgi_factor = 2, .is_pwr_by_rate_dec = false, .max_power_index = 0x7f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h 2023-06-22 13:52:09.000000000 -0400 -@@ -16,6 +16,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h +index 479d5d769c52..1bc0e7f5d6bb 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h +@@ -16,6 +16,11 @@ struct rtw8822cu_efuse { u8 res2[0x3d]; }; @@ -1918,7 +1982,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireles struct rtw8822ce_efuse { u8 mac_addr[ETH_ALEN]; /* 0x120 */ u8 vender_id[2]; -@@ -91,8 +96,9 @@ +@@ -91,8 +96,9 @@ struct rtw8822c_efuse { u8 res9; u8 res10[0x42]; union { @@ -1929,14 +1993,38 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c ---- a/drivers/net/wireless/realtek/rtw88/tx.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-22 13:52:09.000000000 -0400 -@@ -34,43 +34,57 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c +index ab39245e9c2f..2821119dc930 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.c ++++ b/drivers/net/wireless/realtek/rtw88/tx.c +@@ -34,43 +34,57 @@ void rtw_tx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { - __le32 *txdesc = (__le32 *)skb->data; +- +- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); +- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); +- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); +- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); +- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); +- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); +- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); +- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); +- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); +- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); +- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); +- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); +- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); +- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); +- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); +- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); +- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); +- SET_TX_DESC_LS(txdesc, pkt_info->ls); +- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); +- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); +- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); +- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); + struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data; + bool more_data = false; + @@ -1979,29 +2067,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real + tx_desc->w8 = le32_encode_bits(pkt_info->en_hwseq, RTW_TX_DESC_W8_EN_HWSEQ); + + tx_desc->w9 = le32_encode_bits(pkt_info->seq, RTW_TX_DESC_W9_SW_SEQ); - -- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); -- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); -- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); -- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); -- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); -- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); -- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); -- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); -- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); -- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); -- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); -- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); -- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); -- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); -- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); -- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); -- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); -- SET_TX_DESC_LS(txdesc, pkt_info->ls); -- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); -- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); -- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); -- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); ++ if (pkt_info->rts) { - SET_TX_DESC_RTSRATE(txdesc, DESC_RATE24M); - SET_TX_DESC_DATA_RTS_SHORT(txdesc, 1); @@ -2024,7 +2090,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real } EXPORT_SYMBOL(rtw_tx_fill_tx_desc); -@@ -635,9 +649,8 @@ +@@ -635,9 +649,8 @@ static void rtw_txq_push(struct rtw_dev *rtwdev, rcu_read_unlock(); } @@ -2035,7 +2101,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real struct rtw_txq *rtwtxq, *tmp; spin_lock_bh(&rtwdev->txq_lock); -@@ -658,6 +671,13 @@ +@@ -658,6 +671,13 @@ void rtw_tx_work(struct work_struct *w) spin_unlock_bh(&rtwdev->txq_lock); } @@ -2049,7 +2115,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq) { struct rtw_txq *rtwtxq; -@@ -682,3 +702,44 @@ +@@ -682,3 +702,44 @@ void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq) list_del_init(&rtwtxq->list); spin_unlock_bh(&rtwdev->txq_lock); } @@ -2094,9 +2160,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real + return queue; +} +EXPORT_SYMBOL(rtw_tx_queue_mapping); -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h ---- a/drivers/net/wireless/realtek/rtw88/tx.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h +index a2f3ac326041..324189606257 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.h ++++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -9,76 +9,53 @@ #define RTW_TX_PROBE_TIMEOUT msecs_to_jiffies(500) @@ -2221,7 +2288,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real enum rtw_tx_desc_queue_select { TX_DESC_QSEL_TID0 = 0, -@@ -111,6 +88,7 @@ +@@ -111,6 +88,7 @@ void rtw_tx(struct rtw_dev *rtwdev, void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_tx_work(struct work_struct *w); @@ -2229,7 +2296,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct ieee80211_sta *sta, -@@ -131,18 +109,23 @@ +@@ -131,18 +109,23 @@ rtw_tx_write_data_h2c_get(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, u8 *buf, u32 size); @@ -2255,10 +2322,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real } static inline void rtw_tx_fill_txdesc_checksum(struct rtw_dev *rtwdev, -diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c ---- a/drivers/net/wireless/realtek/rtw88/usb.c 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-22 13:52:09.000000000 -0400 -@@ -24,11 +24,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c +index a10d6fef4ffa..4a57efdba97b 100644 +--- a/drivers/net/wireless/realtek/rtw88/usb.c ++++ b/drivers/net/wireless/realtek/rtw88/usb.c +@@ -24,11 +24,12 @@ struct rtw_usb_txcb { static void rtw_usb_fill_tx_checksum(struct rtw_usb *rtwusb, struct sk_buff *skb, int agg_num) { @@ -2273,7 +2341,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea rtw_tx_fill_txdesc_checksum(rtwdev, &pkt_info, skb->data); } -@@ -306,11 +307,13 @@ +@@ -306,11 +307,13 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list) { struct rtw_dev *rtwdev = rtwusb->rtwdev; @@ -2287,7 +2355,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea if (skb_queue_empty(list)) return false; -@@ -363,9 +366,10 @@ +@@ -363,9 +366,10 @@ static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list queue: skb_queue_tail(&txcb->tx_ack_queue, skb_head); @@ -2300,7 +2368,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea return true; } -@@ -465,6 +469,9 @@ +@@ -465,6 +469,9 @@ static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb) if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))) qsel = TX_DESC_QSEL_MGMT; @@ -2310,7 +2378,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK) qsel = skb->priority; else -@@ -535,7 +542,7 @@ +@@ -535,7 +542,7 @@ static void rtw_usb_rx_handler(struct work_struct *work) } if (skb_queue_len(&rtwusb->rx_queue) >= RTW_USB_MAX_RXQ_LEN) { @@ -2319,7 +2387,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea dev_kfree_skb_any(skb); continue; } -@@ -804,6 +811,7 @@ +@@ -804,6 +811,7 @@ static void rtw_usb_intf_deinit(struct rtw_dev *rtwdev, struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); usb_put_dev(rtwusb->udev); @@ -2327,7 +2395,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea usb_set_intfdata(intf, NULL); } -@@ -832,7 +840,7 @@ +@@ -832,7 +840,7 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id) ret = rtw_usb_alloc_rx_bufs(rtwusb); if (ret) @@ -2336,10 +2404,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea ret = rtw_core_init(rtwdev); if (ret) -diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.h b/drivers/net/wireless/realtek/rtw88/usb.h ---- a/drivers/net/wireless/realtek/rtw88/usb.h 2023-05-17 07:59:13.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/usb.h 2023-06-22 13:52:09.000000000 -0400 -@@ -78,7 +78,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/usb.h b/drivers/net/wireless/realtek/rtw88/usb.h +index 30647f0dd61c..ad1d7955c6a5 100644 +--- a/drivers/net/wireless/realtek/rtw88/usb.h ++++ b/drivers/net/wireless/realtek/rtw88/usb.h +@@ -78,7 +78,7 @@ struct rtw_usb { u8 pipe_interrupt; u8 pipe_in; u8 out_ep[RTW_USB_EP_MAX]; @@ -2348,10 +2417,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.h b/drivers/net/wireless/rea u8 usb_txagg_num; struct workqueue_struct *txwq, *rxwq; -diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h ---- a/include/linux/mmc/sdio_ids.h 2023-06-09 04:48:26.000000000 -0400 -+++ b/include/linux/mmc/sdio_ids.h 2023-06-11 07:28:33.845740907 -0400 -@@ -115,6 +115,16 @@ +diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h +index f0cf9c5d6502..9041b8b1f465 100644 +--- a/include/linux/mmc/sdio_ids.h ++++ b/include/linux/mmc/sdio_ids.h +@@ -114,6 +114,16 @@ #define SDIO_VENDOR_ID_MICROCHIP_WILC 0x0296 #define SDIO_DEVICE_ID_MICROCHIP_WILC1000 0x5347 @@ -2368,3 +2438,6 @@ diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h #define SDIO_VENDOR_ID_SIANO 0x039a #define SDIO_DEVICE_ID_SIANO_NOVA_B0 0x0201 #define SDIO_DEVICE_ID_SIANO_NICE 0x0202 +-- +2.39.2 + diff --git a/patch/misc/rtw88/6.3/002-rtw88-linux-next.patch b/patch/misc/rtw88/6.2/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 94% rename from patch/misc/rtw88/6.3/002-rtw88-linux-next.patch rename to patch/misc/rtw88/6.2/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index 26c73d22fd..227df45f3f 100644 --- a/patch/misc/rtw88/6.3/002-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.2/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,5 +1,31 @@ ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400 +From 64e7de206a859ae0ef1f60439a93a22fab0b4dca Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Sat, 22 Jul 2023 04:31:58 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.2.y + +Signed-off-by: Patrick Yavitz +--- + .../net/wireless/realtek/rtw88/rtw8723ds.c | 41 + + .../net/wireless/realtek/rtw88/rtw8821cs.c | 36 + + .../net/wireless/realtek/rtw88/rtw8822bs.c | 36 + + .../net/wireless/realtek/rtw88/rtw8822cs.c | 36 + + drivers/net/wireless/realtek/rtw88/sdio.c | 1416 +++++++++++++++++ + drivers/net/wireless/realtek/rtw88/sdio.h | 178 +++ + 6 files changed, 1743 insertions(+) + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723ds.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.c + create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.h + +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723ds.c b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c +new file mode 100644 +index 000000000000..e5b6960ba0a0 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -42,8 +68,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cs.c b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c +new file mode 100644 +index 000000000000..a359413369a4 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -81,8 +110,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bs.c b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c +new file mode 100644 +index 000000000000..31d8645f83bd +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Jernej Skrabec @@ -120,8 +152,11 @@ +MODULE_AUTHOR("Jernej Skrabec "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cs.c b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c +new file mode 100644 +index 000000000000..975e81c824f2 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -159,8 +194,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-07-07 19:42:40.585806232 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-07-10 05:58:23.384448785 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c +new file mode 100644 +index 000000000000..b19262ec5d8c +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -0,0 +1,1416 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (C) 2021 Martin Blumenstingl @@ -1578,8 +1616,11 @@ +MODULE_AUTHOR("Jernej Skrabec"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/sdio.h b/drivers/net/wireless/realtek/rtw88/sdio.h +new file mode 100644 +index 000000000000..3c659ed180f0 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/sdio.h @@ -0,0 +1,178 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ +/* Copyright (C) 2021 Martin Blumenstingl @@ -1759,3 +1800,6 @@ +} + +#endif +-- +2.39.2 + diff --git a/patch/misc/rtw88/6.3/001-rtw88-linux-next.patch b/patch/misc/rtw88/6.3/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 77% rename from patch/misc/rtw88/6.3/001-rtw88-linux-next.patch rename to patch/misc/rtw88/6.3/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index c1386ee0e4..98515cc930 100644 --- a/patch/misc/rtw88/6.3/001-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.3/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,7 +1,183 @@ -diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c ---- a/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-22 13:52:09.000000000 -0400 -@@ -183,8 +183,8 @@ +From fb6b66c22c1104925d6fdba796e7f35b610c3222 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Sat, 22 Jul 2023 04:27:05 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.3.y + +Signed-off-by: Patrick Yavitz +--- + drivers/net/wireless/realtek/rtw88/Kconfig | 47 +++++ + drivers/net/wireless/realtek/rtw88/Makefile | 15 ++ + drivers/net/wireless/realtek/rtw88/debug.c | 59 ++++-- + drivers/net/wireless/realtek/rtw88/debug.h | 1 + + drivers/net/wireless/realtek/rtw88/fw.c | 88 ++++++++- + drivers/net/wireless/realtek/rtw88/fw.h | 15 +- + drivers/net/wireless/realtek/rtw88/mac.c | 70 ++++++-- + drivers/net/wireless/realtek/rtw88/mac.h | 1 - + drivers/net/wireless/realtek/rtw88/mac80211.c | 51 +++++- + drivers/net/wireless/realtek/rtw88/main.c | 168 +++++++++++++++++- + drivers/net/wireless/realtek/rtw88/main.h | 24 ++- + drivers/net/wireless/realtek/rtw88/pci.c | 13 +- + drivers/net/wireless/realtek/rtw88/ps.c | 3 +- + drivers/net/wireless/realtek/rtw88/reg.h | 14 ++ + drivers/net/wireless/realtek/rtw88/rtw8723d.c | 16 +- + drivers/net/wireless/realtek/rtw88/rtw8723d.h | 6 + + drivers/net/wireless/realtek/rtw88/rtw8821c.c | 32 +++- + drivers/net/wireless/realtek/rtw88/rtw8821c.h | 6 + + drivers/net/wireless/realtek/rtw88/rtw8822b.c | 10 ++ + drivers/net/wireless/realtek/rtw88/rtw8822b.h | 8 +- + drivers/net/wireless/realtek/rtw88/rtw8822c.c | 10 ++ + drivers/net/wireless/realtek/rtw88/rtw8822c.h | 8 +- + drivers/net/wireless/realtek/rtw88/tx.c | 94 ++++++---- + drivers/net/wireless/realtek/rtw88/tx.h | 124 ++++++------- + drivers/net/wireless/realtek/rtw88/usb.c | 15 +- + include/linux/mmc/sdio_ids.h | 10 ++ + 26 files changed, 731 insertions(+), 177 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig +index 651ab56d9c6b..cffad1c01249 100644 +--- a/drivers/net/wireless/realtek/rtw88/Kconfig ++++ b/drivers/net/wireless/realtek/rtw88/Kconfig +@@ -16,6 +16,9 @@ config RTW88_CORE + config RTW88_PCI + tristate + ++config RTW88_SDIO ++ tristate ++ + config RTW88_USB + tristate + +@@ -42,6 +45,17 @@ config RTW88_8822BE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822BS ++ tristate "Realtek 8822BS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8822B ++ help ++ Select this option will enable support for 8822BS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ + config RTW88_8822BU + tristate "Realtek 8822BU USB wireless network adapter" + depends on USB +@@ -64,6 +78,17 @@ config RTW88_8822CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8822CS ++ tristate "Realtek 8822CS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8822C ++ help ++ Select this option will enable support for 8822CS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ + config RTW88_8822CU + tristate "Realtek 8822CU USB wireless network adapter" + depends on USB +@@ -86,6 +111,17 @@ config RTW88_8723DE + + 802.11n PCIe wireless network adapter + ++config RTW88_8723DS ++ tristate "Realtek 8723DS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8723D ++ help ++ Select this option will enable support for 8723DS chipset ++ ++ 802.11n SDIO wireless network adapter ++ + config RTW88_8723DU + tristate "Realtek 8723DU USB wireless network adapter" + depends on USB +@@ -108,6 +144,17 @@ config RTW88_8821CE + + 802.11ac PCIe wireless network adapter + ++config RTW88_8821CS ++ tristate "Realtek 8821CS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8821C ++ help ++ Select this option will enable support for 8821CS chipset ++ ++ 802.11ac SDIO wireless network adapter ++ + config RTW88_8821CU + tristate "Realtek 8821CU USB wireless network adapter" + depends on USB +diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile +index fe7293ee87b4..fd212c09d88a 100644 +--- a/drivers/net/wireless/realtek/rtw88/Makefile ++++ b/drivers/net/wireless/realtek/rtw88/Makefile +@@ -26,6 +26,9 @@ rtw88_8822b-objs := rtw8822b.o rtw8822b_table.o + obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o + rtw88_8822be-objs := rtw8822be.o + ++obj-$(CONFIG_RTW88_8822BS) += rtw88_8822bs.o ++rtw88_8822bs-objs := rtw8822bs.o ++ + obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o + rtw88_8822bu-objs := rtw8822bu.o + +@@ -35,6 +38,9 @@ rtw88_8822c-objs := rtw8822c.o rtw8822c_table.o + obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o + rtw88_8822ce-objs := rtw8822ce.o + ++obj-$(CONFIG_RTW88_8822CS) += rtw88_8822cs.o ++rtw88_8822cs-objs := rtw8822cs.o ++ + obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o + rtw88_8822cu-objs := rtw8822cu.o + +@@ -44,6 +50,9 @@ rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o + obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o + rtw88_8723de-objs := rtw8723de.o + ++obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o ++rtw88_8723ds-objs := rtw8723ds.o ++ + obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o + rtw88_8723du-objs := rtw8723du.o + +@@ -53,11 +62,17 @@ rtw88_8821c-objs := rtw8821c.o rtw8821c_table.o + obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o + rtw88_8821ce-objs := rtw8821ce.o + ++obj-$(CONFIG_RTW88_8821CS) += rtw88_8821cs.o ++rtw88_8821cs-objs := rtw8821cs.o ++ + obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o + rtw88_8821cu-objs := rtw8821cu.o + + obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o + rtw88_pci-objs := pci.o + ++obj-$(CONFIG_RTW88_SDIO) += rtw88_sdio.o ++rtw88_sdio-objs := sdio.o ++ + obj-$(CONFIG_RTW88_USB) += rtw88_usb.o + rtw88_usb-objs := usb.o +diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c +index fa3d73b333ba..f8ba133baff0 100644 +--- a/drivers/net/wireless/realtek/rtw88/debug.c ++++ b/drivers/net/wireless/realtek/rtw88/debug.c +@@ -183,8 +183,8 @@ static int rtw_debugfs_copy_from_user(char tmp[], int size, tmp_len = (count > size - 1 ? size - 1 : count); @@ -12,7 +188,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r tmp[tmp_len] = '\0'; -@@ -201,13 +201,16 @@ +@@ -201,13 +201,16 @@ static ssize_t rtw_debugfs_set_read_reg(struct file *filp, char tmp[32 + 1]; u32 addr, len; int num; @@ -31,7 +207,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r if (len != 1 && len != 2 && len != 4) { rtw_warn(rtwdev, "read reg setting wrong len\n"); -@@ -288,8 +291,11 @@ +@@ -288,8 +291,11 @@ static ssize_t rtw_debugfs_set_rsvd_page(struct file *filp, char tmp[32 + 1]; u32 offset, page_num; int num; @@ -44,7 +220,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%d %d", &offset, &page_num); -@@ -314,8 +320,11 @@ +@@ -314,8 +320,11 @@ static ssize_t rtw_debugfs_set_single_input(struct file *filp, char tmp[32 + 1]; u32 input; int num; @@ -57,7 +233,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = kstrtoint(tmp, 0, &input); -@@ -338,14 +347,17 @@ +@@ -338,14 +347,17 @@ static ssize_t rtw_debugfs_set_write_reg(struct file *filp, char tmp[32 + 1]; u32 addr, val, len; int num; @@ -77,7 +253,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r switch (len) { case 1: -@@ -381,8 +393,11 @@ +@@ -381,8 +393,11 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp, char tmp[32 + 1]; u8 param[8]; int num; @@ -90,7 +266,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx", ¶m[0], ¶m[1], ¶m[2], ¶m[3], -@@ -408,14 +423,17 @@ +@@ -408,14 +423,17 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask, val; int num; @@ -110,7 +286,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } mutex_lock(&rtwdev->mutex); -@@ -438,14 +456,17 @@ +@@ -438,14 +456,17 @@ static ssize_t rtw_debugfs_set_rf_read(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask; int num; @@ -130,7 +306,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } debugfs_priv->rf_path = path; -@@ -467,7 +488,9 @@ +@@ -467,7 +488,9 @@ static ssize_t rtw_debugfs_set_fix_rate(struct file *filp, char tmp[32 + 1]; int ret; @@ -141,7 +317,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtou8(tmp, 0, &fix_rate); if (ret) { -@@ -860,7 +883,9 @@ +@@ -860,7 +883,9 @@ static ssize_t rtw_debugfs_set_coex_enable(struct file *filp, bool enable; int ret; @@ -152,7 +328,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &enable); if (ret) { -@@ -930,7 +955,9 @@ +@@ -930,7 +955,9 @@ static ssize_t rtw_debugfs_set_fw_crash(struct file *filp, bool input; int ret; @@ -163,10 +339,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &input); if (ret) -diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h ---- a/drivers/net/wireless/realtek/rtw88/debug.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/debug.h 2023-06-22 13:52:09.000000000 -0400 -@@ -24,6 +24,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/realtek/rtw88/debug.h +index 066792dd96af..a9149c6c2b48 100644 +--- a/drivers/net/wireless/realtek/rtw88/debug.h ++++ b/drivers/net/wireless/realtek/rtw88/debug.h +@@ -24,6 +24,7 @@ enum rtw_debug_mask { RTW_DBG_ADAPTIVITY = 0x00008000, RTW_DBG_HW_SCAN = 0x00010000, RTW_DBG_STATE = 0x00020000, @@ -174,10 +351,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.h b/drivers/net/wireless/r RTW_DBG_ALL = 0xffffffff }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c ---- a/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-22 13:52:09.000000000 -0400 -@@ -308,6 +308,57 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c +index 82295ac6402e..567bbedd8ee0 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.c ++++ b/drivers/net/wireless/realtek/rtw88/fw.c +@@ -308,6 +308,57 @@ void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev) } EXPORT_SYMBOL(rtw_fw_c2h_cmd_isr); @@ -235,7 +413,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, u8 *h2c) { -@@ -468,6 +519,23 @@ +@@ -468,6 +519,23 @@ void rtw_fw_query_bt_info(struct rtw_dev *rtwdev) rtw_fw_send_h2c_command(rtwdev, h2c_pkt); } @@ -259,7 +437,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw) { u8 h2c_pkt[H2C_PKT_SIZE] = {0}; -@@ -1393,6 +1461,10 @@ +@@ -1393,6 +1461,10 @@ static void rtw_build_rsvd_page_iter(void *data, u8 *mac, struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; struct rtw_rsvd_page *rsvd_pkt; @@ -270,7 +448,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real list_for_each_entry(rsvd_pkt, &rtwvif->rsvd_page_list, vif_list) { if (rsvd_pkt->type == RSVD_BEACON) list_add(&rsvd_pkt->build_list, -@@ -1614,6 +1686,7 @@ +@@ -1614,6 +1686,7 @@ void rtw_fw_update_beacon_work(struct work_struct *work) mutex_lock(&rtwdev->mutex); rtw_fw_download_rsvd_page(rtwdev); @@ -278,7 +456,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real mutex_unlock(&rtwdev->mutex); } -@@ -2155,11 +2228,19 @@ +@@ -2155,11 +2228,19 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, } rtw_fw_set_scan_offload(rtwdev, &cs_option, rtwvif, &chan_list); out: @@ -299,7 +477,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_SCAN_OFFLOAD)) return; -@@ -2244,6 +2325,7 @@ +@@ -2244,6 +2325,7 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb) if (rtw_is_op_chan(rtwdev, chan)) { rtw_store_op_chan(rtwdev, false); ieee80211_wake_queues(rtwdev->hw); @@ -307,7 +485,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } } else if (id == RTW_SCAN_NOTIFY_ID_PRESWITCH) { if (IS_CH_5G_BAND(chan)) { -@@ -2262,8 +2344,10 @@ +@@ -2262,8 +2344,10 @@ void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb) * if next channel is non-op channel. */ if (!rtw_is_op_chan(rtwdev, chan) && @@ -319,10 +497,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real } rtw_dbg(rtwdev, RTW_DBG_HW_SCAN, -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h ---- a/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-22 13:52:09.000000000 -0400 -@@ -81,6 +81,17 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h +index 0a386e6d6e0d..43ccdf9965ac 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.h ++++ b/drivers/net/wireless/realtek/rtw88/fw.h +@@ -81,6 +81,17 @@ struct rtw_c2h_adaptivity { u8 option; } __packed; @@ -340,7 +519,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real struct rtw_h2c_cmd { __le32 msg; __le32 msg_ext; -@@ -530,6 +541,7 @@ +@@ -530,6 +541,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) #define H2C_CMD_MEDIA_STATUS_RPT 0x01 #define H2C_CMD_SET_PWR_MODE 0x20 #define H2C_CMD_LPS_PG_INFO 0x2b @@ -348,7 +527,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real #define H2C_CMD_RA_INFO 0x40 #define H2C_CMD_RSSI_MONITOR 0x42 #define H2C_CMD_BCN_FILTER_OFFLOAD_P0 0x56 -@@ -801,6 +813,7 @@ +@@ -801,6 +813,7 @@ void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset, void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_fw_send_general_info(struct rtw_dev *rtwdev); void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev); @@ -356,102 +535,194 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para); void rtw_fw_inform_rfk_status(struct rtw_dev *rtwdev, bool start); -@@ -868,5 +881,5 @@ +@@ -868,5 +881,5 @@ int rtw_hw_scan_offload(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, bool enable); void rtw_hw_scan_status_report(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_hw_scan_chan_switch(struct rtw_dev *rtwdev, struct sk_buff *skb); -void rtw_hw_scan_abort(struct rtw_dev *rtwdev, struct ieee80211_vif *vif); +void rtw_hw_scan_abort(struct rtw_dev *rtwdev); #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig ---- a/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-22 13:52:09.000000000 -0400 -@@ -16,6 +16,9 @@ - config RTW88_PCI - tristate +diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c +index eda05a5d9cff..298663b03580 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac.c ++++ b/drivers/net/wireless/realtek/rtw88/mac.c +@@ -7,6 +7,7 @@ + #include "reg.h" + #include "fw.h" + #include "debug.h" ++#include "sdio.h" -+config RTW88_SDIO -+ tristate + void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, + u8 primary_ch_idx) +@@ -60,6 +61,7 @@ EXPORT_SYMBOL(rtw_set_channel_mac); + + static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) + { ++ unsigned int retry; + u32 value32; + u8 value8; + +@@ -77,6 +79,28 @@ static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) + case RTW_HCI_TYPE_PCIE: + rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS); + break; ++ case RTW_HCI_TYPE_SDIO: ++ rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT_HCI_SUS_REQ); + - config RTW88_USB - tristate - -@@ -42,6 +45,17 @@ - - 802.11ac PCIe wireless network adapter - -+config RTW88_8822BS -+ tristate "Realtek 8822BS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8822B -+ help -+ Select this option will enable support for 8822BS chipset ++ for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) { ++ if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT_HCI_RESUME_RDY) ++ break; + -+ 802.11ac SDIO wireless network adapter ++ usleep_range(10, 50); ++ } + - config RTW88_8822BU - tristate "Realtek 8822BU USB wireless network adapter" - depends on USB -@@ -64,6 +78,17 @@ ++ if (retry == RTW_PWR_POLLING_CNT) { ++ rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]"); ++ return -ETIMEDOUT; ++ } ++ ++ if (rtw_sdio_is_sdio30_supported(rtwdev)) ++ rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2, ++ BIT_SDIO_PAD_E5 >> 16); ++ else ++ rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2, ++ BIT_SDIO_PAD_E5 >> 16); ++ break; + case RTW_HCI_TYPE_USB: + break; + default: +@@ -222,6 +246,9 @@ static int rtw_pwr_seq_parser(struct rtw_dev *rtwdev, + case RTW_HCI_TYPE_USB: + intf_mask = RTW_PWR_INTF_USB_MSK; + break; ++ case RTW_HCI_TYPE_SDIO: ++ intf_mask = RTW_PWR_INTF_SDIO_MSK; ++ break; + default: + return -EINVAL; + } +@@ -245,6 +272,7 @@ 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; ++ u32 imr = 0; + u8 rpwm; + bool cur_pwr; + int ret; +@@ -270,17 +298,24 @@ static int rtw_mac_power_switch(struct rtw_dev *rtwdev, bool pwr_on) + if (pwr_on == cur_pwr) + return -EALREADY; - 802.11ac PCIe wireless network adapter ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { ++ imr = rtw_read32(rtwdev, REG_SDIO_HIMR); ++ rtw_write32(rtwdev, REG_SDIO_HIMR, 0); ++ } ++ ++ if (!pwr_on) ++ clear_bit(RTW_FLAG_POWERON, rtwdev->flags); ++ + pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; + ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); +- if (ret) +- return ret; -+config RTW88_8822CS -+ tristate "Realtek 8822CS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8822C -+ help -+ Select this option will enable support for 8822CS chipset +- if (pwr_on) ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) ++ rtw_write32(rtwdev, REG_SDIO_HIMR, imr); + -+ 802.11ac SDIO wireless network adapter -+ - config RTW88_8822CU - tristate "Realtek 8822CU USB wireless network adapter" - depends on USB -@@ -86,6 +111,17 @@ ++ if (!ret && pwr_on) + set_bit(RTW_FLAG_POWERON, rtwdev->flags); +- else +- clear_bit(RTW_FLAG_POWERON, rtwdev->flags); - 802.11n PCIe wireless network adapter +- return 0; ++ return ret; + } -+config RTW88_8723DS -+ tristate "Realtek 8723DS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8723D -+ help -+ Select this option will enable support for 8723DS chipset -+ -+ 802.11n SDIO wireless network adapter -+ - config RTW88_8723DU - tristate "Realtek 8723DU USB wireless network adapter" - depends on USB -@@ -108,6 +144,17 @@ + static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) +@@ -451,6 +486,9 @@ static void download_firmware_reg_backup(struct rtw_dev *rtwdev, + rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); + rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); - 802.11ac PCIe wireless network adapter ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) ++ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); ++ + /* Disable beacon related functions */ + tmp = rtw_read8(rtwdev, REG_BCN_CTRL); + bckp[bckp_idx].len = 1; +@@ -756,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, -+config RTW88_8821CS -+ tristate "Realtek 8821CS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8821C -+ help -+ Select this option will enable support for 8821CS chipset -+ -+ 802.11ac SDIO wireless network adapter -+ - config RTW88_8821CU - tristate "Realtek 8821CU USB wireless network adapter" - depends on USB -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c ---- a/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-06-22 13:52:09.000000000 -0400 -@@ -43,7 +43,11 @@ + wlan_cpu_enable(rtwdev, true); + +- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) +- return -EBUSY; ++ if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { ++ ret = -EBUSY; ++ goto dlfw_fail; ++ } + + ret = download_firmware_validate(rtwdev); + if (ret) +@@ -1042,6 +1082,9 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) + else + return -EINVAL; + break; ++ case RTW_HCI_TYPE_SDIO: ++ rqpn = &chip->rqpn_table[0]; ++ break; + default: + return -EINVAL; + } +@@ -1060,8 +1103,12 @@ static int txdma_queue_mapping(struct rtw_dev *rtwdev) + if (rtw_chip_wcpu_11ac(rtwdev)) + rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); + +- if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) ++ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { ++ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); ++ rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0); ++ } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { + rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); ++ } + + return 0; + } +@@ -1074,7 +1121,7 @@ static int set_trx_fifo_info(struct rtw_dev *rtwdev) + u8 csi_buf_pg_num = chip->csi_buf_pg_num; + + /* config rsvd page num */ +- fifo->rsvd_drv_pg_num = 8; ++ fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num; + fifo->txff_pg_num = chip->txff_size >> 7; + if (rtw_chip_wcpu_11n(rtwdev)) + fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num; +@@ -1204,6 +1251,9 @@ static int priority_queue_cfg(struct rtw_dev *rtwdev) + else + return -EINVAL; + break; ++ case RTW_HCI_TYPE_SDIO: ++ pg_tbl = &chip->page_table[0]; ++ break; + default: + return -EINVAL; + } +diff --git a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h +index 3172aa5ac4de..58c3dccc14bb 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac.h ++++ b/drivers/net/wireless/realtek/rtw88/mac.h +@@ -7,7 +7,6 @@ + + #define RTW_HW_PORT_NUM 5 + #define cut_version_to_mask(cut) (0x1 << ((cut) + 1)) +-#define SDIO_LOCAL_OFFSET 0x10250000 + #define DDMA_POLLING_COUNT 1000 + #define C2H_PKT_BUF 256 + #define REPORT_BUF 128 +diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c +index 0bf6882d18f1..a99b53d44267 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw88/mac80211.c +@@ -43,7 +43,11 @@ static void rtw_ops_wake_tx_queue(struct ieee80211_hw *hw, list_add_tail(&rtwtxq->list, &rtwdev->txqs); spin_unlock_bh(&rtwdev->txq_lock); @@ -464,7 +735,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } static int rtw_ops_start(struct ieee80211_hw *hw) -@@ -146,25 +150,32 @@ +@@ -146,25 +150,32 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv; enum rtw_net_type net_type; u32 config = 0; @@ -500,7 +771,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_leave_lps_deep(rtwdev); switch (vif->type) { -@@ -186,6 +197,7 @@ +@@ -186,6 +197,7 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, break; default: WARN_ON(1); @@ -508,7 +779,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); return -EINVAL; } -@@ -197,6 +209,7 @@ +@@ -197,6 +209,7 @@ static int rtw_ops_add_interface(struct ieee80211_hw *hw, rtwvif->bcn_ctrl = bcn_ctrl; config |= PORT_SET_BCN_CTRL; rtw_vif_port_config(rtwdev, rtwvif, config); @@ -516,7 +787,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_recalc_lps(rtwdev, vif); mutex_unlock(&rtwdev->mutex); -@@ -228,6 +241,7 @@ +@@ -228,6 +241,7 @@ static void rtw_ops_remove_interface(struct ieee80211_hw *hw, rtwvif->bcn_ctrl = 0; config |= PORT_SET_BCN_CTRL; rtw_vif_port_config(rtwdev, rtwvif, config); @@ -524,7 +795,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_recalc_lps(rtwdev, NULL); mutex_unlock(&rtwdev->mutex); -@@ -368,6 +382,7 @@ +@@ -368,6 +382,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, rtw_fw_download_rsvd_page(rtwdev); rtw_send_rsvd_page_h2c(rtwdev); @@ -532,7 +803,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc); if (rtw_bf_support) rtw_bf_assoc(rtwdev, vif, conf); -@@ -378,7 +393,8 @@ +@@ -378,7 +393,8 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, * when disconnected by peer */ if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags)) @@ -542,7 +813,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } config |= PORT_SET_NET_TYPE; -@@ -388,7 +404,7 @@ +@@ -388,7 +404,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_BSSID) { ether_addr_copy(rtwvif->bssid, conf->bssid); config |= PORT_SET_BSSID; @@ -551,7 +822,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_clear_op_chan(rtwdev); else rtw_store_op_chan(rtwdev, true); -@@ -402,6 +418,7 @@ +@@ -402,6 +418,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, if (changed & BSS_CHANGED_BEACON) { rtw_set_dtim_period(rtwdev, conf->dtim_period); rtw_fw_download_rsvd_page(rtwdev); @@ -559,7 +830,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles } if (changed & BSS_CHANGED_BEACON_ENABLED) { -@@ -437,12 +454,29 @@ +@@ -437,12 +454,29 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw, const struct rtw_chip_info *chip = rtwdev->chip; mutex_lock(&rtwdev->mutex); @@ -589,7 +860,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles static int rtw_ops_conf_tx(struct ieee80211_hw *hw, struct ieee80211_vif *vif, unsigned int link_id, u16 ac, -@@ -845,7 +879,7 @@ +@@ -845,7 +879,7 @@ static int rtw_ops_hw_scan(struct ieee80211_hw *hw, struct ieee80211_vif *vif, rtw_hw_scan_start(rtwdev, vif, req); ret = rtw_hw_scan_offload(rtwdev, vif, true); if (ret) { @@ -598,7 +869,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles rtw_err(rtwdev, "HW scan failed with status: %d\n", ret); } mutex_unlock(&rtwdev->mutex); -@@ -865,7 +899,7 @@ +@@ -865,7 +899,7 @@ static void rtw_ops_cancel_hw_scan(struct ieee80211_hw *hw, return; mutex_lock(&rtwdev->mutex); @@ -607,7 +878,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles mutex_unlock(&rtwdev->mutex); } -@@ -904,6 +938,7 @@ +@@ -904,6 +938,7 @@ const struct ieee80211_ops rtw_ops = { .configure_filter = rtw_ops_configure_filter, .bss_info_changed = rtw_ops_bss_info_changed, .start_ap = rtw_ops_start_ap, @@ -615,183 +886,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireles .conf_tx = rtw_ops_conf_tx, .sta_add = rtw_ops_sta_add, .sta_remove = rtw_ops_sta_remove, -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c ---- a/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-22 13:52:09.000000000 -0400 -@@ -7,6 +7,7 @@ - #include "reg.h" - #include "fw.h" - #include "debug.h" -+#include "sdio.h" - - void rtw_set_channel_mac(struct rtw_dev *rtwdev, u8 channel, u8 bw, - u8 primary_ch_idx) -@@ -60,6 +61,7 @@ - - static int rtw_mac_pre_system_cfg(struct rtw_dev *rtwdev) - { -+ unsigned int retry; - u32 value32; - u8 value8; - -@@ -77,6 +79,28 @@ - case RTW_HCI_TYPE_PCIE: - rtw_write32_set(rtwdev, REG_HCI_OPT_CTRL, BIT_USB_SUS_DIS); - break; -+ case RTW_HCI_TYPE_SDIO: -+ rtw_write8_clr(rtwdev, REG_SDIO_HSUS_CTRL, BIT_HCI_SUS_REQ); -+ -+ for (retry = 0; retry < RTW_PWR_POLLING_CNT; retry++) { -+ if (rtw_read8(rtwdev, REG_SDIO_HSUS_CTRL) & BIT_HCI_RESUME_RDY) -+ break; -+ -+ usleep_range(10, 50); -+ } -+ -+ if (retry == RTW_PWR_POLLING_CNT) { -+ rtw_err(rtwdev, "failed to poll REG_SDIO_HSUS_CTRL[1]"); -+ return -ETIMEDOUT; -+ } -+ -+ if (rtw_sdio_is_sdio30_supported(rtwdev)) -+ rtw_write8_set(rtwdev, REG_HCI_OPT_CTRL + 2, -+ BIT_SDIO_PAD_E5 >> 16); -+ else -+ rtw_write8_clr(rtwdev, REG_HCI_OPT_CTRL + 2, -+ BIT_SDIO_PAD_E5 >> 16); -+ break; - case RTW_HCI_TYPE_USB: - break; - default: -@@ -222,6 +246,9 @@ - case RTW_HCI_TYPE_USB: - intf_mask = RTW_PWR_INTF_USB_MSK; - break; -+ case RTW_HCI_TYPE_SDIO: -+ intf_mask = RTW_PWR_INTF_SDIO_MSK; -+ break; - default: - return -EINVAL; - } -@@ -245,6 +272,7 @@ - { - const struct rtw_chip_info *chip = rtwdev->chip; - const struct rtw_pwr_seq_cmd **pwr_seq; -+ u32 imr = 0; - u8 rpwm; - bool cur_pwr; - int ret; -@@ -270,17 +298,24 @@ - if (pwr_on == cur_pwr) - return -EALREADY; - -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { -+ imr = rtw_read32(rtwdev, REG_SDIO_HIMR); -+ rtw_write32(rtwdev, REG_SDIO_HIMR, 0); -+ } -+ -+ if (!pwr_on) -+ clear_bit(RTW_FLAG_POWERON, rtwdev->flags); -+ - pwr_seq = pwr_on ? chip->pwr_on_seq : chip->pwr_off_seq; - ret = rtw_pwr_seq_parser(rtwdev, pwr_seq); -- if (ret) -- return ret; - -- if (pwr_on) -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) -+ rtw_write32(rtwdev, REG_SDIO_HIMR, imr); -+ -+ if (!ret && pwr_on) - set_bit(RTW_FLAG_POWERON, rtwdev->flags); -- else -- clear_bit(RTW_FLAG_POWERON, rtwdev->flags); - -- return 0; -+ return ret; - } - - static int __rtw_mac_init_system_cfg(struct rtw_dev *rtwdev) -@@ -451,6 +486,9 @@ - rtw_write16(rtwdev, REG_FIFOPAGE_INFO_1, 0x200); - rtw_write32(rtwdev, REG_RQPN_CTRL_2, bckp[bckp_idx - 1].val); - -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) -+ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); -+ - /* Disable beacon related functions */ - tmp = rtw_read8(rtwdev, REG_BCN_CTRL); - bckp[bckp_idx].len = 1; -@@ -756,8 +794,10 @@ - - wlan_cpu_enable(rtwdev, true); - -- if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) -- return -EBUSY; -+ if (!ltecoex_reg_write(rtwdev, 0x38, ltecoex_bckp)) { -+ ret = -EBUSY; -+ goto dlfw_fail; -+ } - - ret = download_firmware_validate(rtwdev); - if (ret) -@@ -1042,6 +1082,9 @@ - else - return -EINVAL; - break; -+ case RTW_HCI_TYPE_SDIO: -+ rqpn = &chip->rqpn_table[0]; -+ break; - default: - return -EINVAL; - } -@@ -1060,8 +1103,12 @@ - if (rtw_chip_wcpu_11ac(rtwdev)) - rtw_write32(rtwdev, REG_H2CQ_CSR, BIT_H2CQ_FULL); - -- if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) -+ if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_SDIO) { -+ rtw_read32(rtwdev, REG_SDIO_FREE_TXPG); -+ rtw_write32(rtwdev, REG_SDIO_TX_CTRL, 0); -+ } else if (rtw_hci_type(rtwdev) == RTW_HCI_TYPE_USB) { - rtw_write8_set(rtwdev, REG_TXDMA_PQ_MAP, BIT_RXDMA_ARBBW_EN); -+ } - - return 0; - } -@@ -1074,7 +1121,7 @@ - u8 csi_buf_pg_num = chip->csi_buf_pg_num; - - /* config rsvd page num */ -- fifo->rsvd_drv_pg_num = 8; -+ fifo->rsvd_drv_pg_num = chip->rsvd_drv_pg_num; - fifo->txff_pg_num = chip->txff_size >> 7; - if (rtw_chip_wcpu_11n(rtwdev)) - fifo->rsvd_pg_num = fifo->rsvd_drv_pg_num; -@@ -1204,6 +1251,9 @@ - else - return -EINVAL; - break; -+ case RTW_HCI_TYPE_SDIO: -+ pg_tbl = &chip->page_table[0]; -+ break; - default: - return -EINVAL; - } -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.h b/drivers/net/wireless/realtek/rtw88/mac.h ---- a/drivers/net/wireless/realtek/rtw88/mac.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac.h 2023-06-22 13:52:09.000000000 -0400 -@@ -7,7 +7,6 @@ - - #define RTW_HW_PORT_NUM 5 - #define cut_version_to_mask(cut) (0x1 << ((cut) + 1)) --#define SDIO_LOCAL_OFFSET 0x10250000 - #define DDMA_POLLING_COUNT 1000 - #define C2H_PKT_BUF 256 - #define REPORT_BUF 128 -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c ---- a/drivers/net/wireless/realtek/rtw88/main.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c +index fc51acc9a599..c853e2f2d448 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.c ++++ b/drivers/net/wireless/realtek/rtw88/main.c @@ -18,6 +18,7 @@ #include "debug.h" #include "bf.h" @@ -800,7 +898,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re bool rtw_disable_lps_deep_mode; EXPORT_SYMBOL(rtw_disable_lps_deep_mode); -@@ -102,6 +103,26 @@ +@@ -102,6 +103,26 @@ static struct ieee80211_rate rtw_ratetable[] = { {.bitrate = 540, .hw_value = 0x0b,}, }; @@ -827,7 +925,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re u16 rtw_desc_to_bitrate(u8 desc_rate) { struct ieee80211_rate rate; -@@ -256,7 +277,7 @@ +@@ -256,7 +277,7 @@ static void rtw_watch_dog_work(struct work_struct *work) * threshold. */ if (rtwdev->ps_enabled && data.rtwvif && !ps_active && @@ -836,7 +934,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_enter_lps(rtwdev, data.rtwvif->port); rtwdev->watch_dog_cnt++; -@@ -313,12 +334,15 @@ +@@ -313,12 +334,15 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, struct ieee80211_vif *vif) { struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; @@ -852,7 +950,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re si->rtwdev = rtwdev; si->sta = sta; si->vif = vif; -@@ -624,6 +648,7 @@ +@@ -624,6 +648,7 @@ static void __fw_recovery_work(struct rtw_dev *rtwdev) rcu_read_unlock(); rtw_iterate_stas_atomic(rtwdev, rtw_reset_sta_iter, rtwdev); rtw_iterate_vifs_atomic(rtwdev, rtw_reset_vif_iter, rtwdev); @@ -860,7 +958,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_enter_ips(rtwdev); } -@@ -843,6 +868,9 @@ +@@ -843,6 +868,9 @@ void rtw_set_channel(struct rtw_dev *rtwdev) rtw_update_channel(rtwdev, center_chan, primary_chan, band, bandwidth); @@ -870,7 +968,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re chip->ops->set_channel(rtwdev, center_chan, bandwidth, hal->current_primary_channel_index); -@@ -1800,6 +1828,10 @@ +@@ -1800,6 +1828,10 @@ static int rtw_chip_parameter_setup(struct rtw_dev *rtwdev) rtwdev->hci.rpwm_addr = 0x03d9; rtwdev->hci.cpwm_addr = 0x03da; break; @@ -881,7 +979,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re case RTW_HCI_TYPE_USB: rtwdev->hci.rpwm_addr = 0xfe58; rtwdev->hci.cpwm_addr = 0xfe57; -@@ -1994,7 +2026,7 @@ +@@ -1994,7 +2026,7 @@ static int rtw_chip_board_info_setup(struct rtw_dev *rtwdev) if (!rfe_def) return -ENODEV; @@ -890,7 +988,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re rtw_phy_init_tx_power(rtwdev); if (rfe_def->agc_btg_tbl) -@@ -2173,9 +2205,11 @@ +@@ -2173,9 +2205,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) int max_tx_headroom = 0; int ret; @@ -903,7 +1001,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re hw->extra_tx_headroom = max_tx_headroom; hw->queues = IEEE80211_NUM_ACS; hw->txq_data_size = sizeof(struct rtw_txq); -@@ -2209,6 +2243,11 @@ +@@ -2209,6 +2243,11 @@ int rtw_register_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) hw->wiphy->max_scan_ssids = RTW_SCAN_MAX_SSIDS; hw->wiphy->max_scan_ie_len = rtw_get_max_scan_ie_len(rtwdev); @@ -915,7 +1013,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_CAN_REPLACE_PTK0); wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SCAN_RANDOM_SN); wiphy_ext_feature_set(hw->wiphy, NL80211_EXT_FEATURE_SET_SCAN_DWELL); -@@ -2258,6 +2297,129 @@ +@@ -2258,6 +2297,129 @@ void rtw_unregister_hw(struct rtw_dev *rtwdev, struct ieee80211_hw *hw) } EXPORT_SYMBOL(rtw_unregister_hw); @@ -1045,10 +1143,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re MODULE_AUTHOR("Realtek Corporation"); MODULE_DESCRIPTION("Realtek 802.11ac wireless core module"); MODULE_LICENSE("Dual BSD/GPL"); -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h ---- a/drivers/net/wireless/realtek/rtw88/main.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.h 2023-06-22 13:52:09.000000000 -0400 -@@ -88,7 +88,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h +index cdbcea28802d..f9dd2ab941c8 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.h ++++ b/drivers/net/wireless/realtek/rtw88/main.h +@@ -88,7 +88,7 @@ enum rtw_supported_band { RTW_BAND_60G = BIT(NL80211_BAND_60GHZ), }; @@ -1057,7 +1156,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re #define RTW_MAX_CHANNEL_WIDTH RTW_CHANNEL_WIDTH_80 enum rtw_bandwidth { -@@ -395,6 +395,15 @@ +@@ -395,6 +395,15 @@ enum rtw_snr { RTW_SNR_NUM }; @@ -1073,7 +1172,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re enum rtw_wow_flags { RTW_WOW_FLAG_EN_MAGIC_PKT, RTW_WOW_FLAG_EN_REKEY_PKT, -@@ -794,6 +803,7 @@ +@@ -794,6 +803,7 @@ struct rtw_bf_info { struct rtw_vif { enum rtw_net_type net_type; u16 aid; @@ -1081,7 +1180,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 mac_addr[ETH_ALEN]; u8 bssid[ETH_ALEN]; u8 port; -@@ -1171,6 +1181,7 @@ +@@ -1171,6 +1181,7 @@ struct rtw_chip_info { u32 txff_size; u32 rxff_size; u32 fw_rxff_size; @@ -1089,7 +1188,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 band; u8 page_size; u8 csi_buf_pg_num; -@@ -1874,7 +1885,7 @@ +@@ -1874,7 +1885,7 @@ enum rtw_sar_bands { RTW_SAR_BAND_NR, }; @@ -1098,7 +1197,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re * which might not re-use same format with array common. */ union rtw_sar_cfg { -@@ -1893,7 +1904,9 @@ +@@ -1893,7 +1904,9 @@ struct rtw_hal { u8 cut_version; u8 mp_chip; u8 oem_id; @@ -1108,7 +1207,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 ps_mode; u8 current_channel; -@@ -2023,7 +2036,7 @@ +@@ -2023,7 +2036,7 @@ struct rtw_dev { struct rtw_tx_report tx_report; struct { @@ -1117,7 +1216,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 last_box_num; u32 seq; } h2c; -@@ -2039,6 +2052,7 @@ +@@ -2039,6 +2052,7 @@ struct rtw_dev { u8 sta_cnt; u32 rts_threshold; @@ -1125,7 +1224,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re DECLARE_BITMAP(mac_id_map, RTW_MAX_MAC_ID_NUM); DECLARE_BITMAP(flags, NUM_OF_RTW_FLAGS); -@@ -2050,6 +2064,7 @@ +@@ -2050,6 +2064,7 @@ struct rtw_dev { bool need_rfk; struct completion fw_scan_density; @@ -1133,7 +1232,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re /* hci related data, must be last */ u8 priv[] __aligned(sizeof(void *)); -@@ -2191,4 +2206,7 @@ +@@ -2191,4 +2206,7 @@ void rtw_set_txrx_1ss(struct rtw_dev *rtwdev, bool config_1ss); void rtw_update_channel(struct rtw_dev *rtwdev, u8 center_channel, u8 primary_channel, enum rtw_supported_band band, enum rtw_bandwidth bandwidth); @@ -1141,61 +1240,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re +bool rtw_core_check_sta_active(struct rtw_dev *rtwdev); +void rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable); #endif -diff -Naur a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile ---- a/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-22 13:52:09.000000000 -0400 -@@ -26,6 +26,9 @@ - obj-$(CONFIG_RTW88_8822BE) += rtw88_8822be.o - rtw88_8822be-objs := rtw8822be.o - -+obj-$(CONFIG_RTW88_8822BS) += rtw88_8822bs.o -+rtw88_8822bs-objs := rtw8822bs.o -+ - obj-$(CONFIG_RTW88_8822BU) += rtw88_8822bu.o - rtw88_8822bu-objs := rtw8822bu.o - -@@ -35,6 +38,9 @@ - obj-$(CONFIG_RTW88_8822CE) += rtw88_8822ce.o - rtw88_8822ce-objs := rtw8822ce.o - -+obj-$(CONFIG_RTW88_8822CS) += rtw88_8822cs.o -+rtw88_8822cs-objs := rtw8822cs.o -+ - obj-$(CONFIG_RTW88_8822CU) += rtw88_8822cu.o - rtw88_8822cu-objs := rtw8822cu.o - -@@ -44,6 +50,9 @@ - obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o - rtw88_8723de-objs := rtw8723de.o - -+obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o -+rtw88_8723ds-objs := rtw8723ds.o -+ - obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o - rtw88_8723du-objs := rtw8723du.o - -@@ -53,11 +62,17 @@ - obj-$(CONFIG_RTW88_8821CE) += rtw88_8821ce.o - rtw88_8821ce-objs := rtw8821ce.o - -+obj-$(CONFIG_RTW88_8821CS) += rtw88_8821cs.o -+rtw88_8821cs-objs := rtw8821cs.o -+ - obj-$(CONFIG_RTW88_8821CU) += rtw88_8821cu.o - rtw88_8821cu-objs := rtw8821cu.o - - obj-$(CONFIG_RTW88_PCI) += rtw88_pci.o - rtw88_pci-objs := pci.o - -+obj-$(CONFIG_RTW88_SDIO) += rtw88_sdio.o -+rtw88_sdio-objs := sdio.o -+ - obj-$(CONFIG_RTW88_USB) += rtw88_usb.o - rtw88_usb-objs := usb.o -diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c ---- a/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-22 13:52:09.000000000 -0400 -@@ -89,13 +89,6 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c +index b4bd831c9845..44a8fff34cdd 100644 +--- a/drivers/net/wireless/realtek/rtw88/pci.c ++++ b/drivers/net/wireless/realtek/rtw88/pci.c +@@ -89,13 +89,6 @@ static void rtw_pci_write32(struct rtw_dev *rtwdev, u32 addr, u32 val) writel(val, rtwpci->mmap + addr); } @@ -1209,7 +1258,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea static void rtw_pci_free_tx_ring_skbs(struct rtw_dev *rtwdev, struct rtw_pci_tx_ring *tx_ring) { -@@ -745,8 +738,9 @@ +@@ -745,8 +738,9 @@ static void __rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 pci_queues, u8 q; for (q = 0; q < RTK_MAX_TX_QUEUE_NUM; q++) { @@ -1221,7 +1270,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea continue; if (pci_queues & BIT(q)) -@@ -1552,7 +1546,6 @@ +@@ -1552,7 +1546,6 @@ static int rtw_pci_claim(struct rtw_dev *rtwdev, struct pci_dev *pdev) static void rtw_pci_declaim(struct rtw_dev *rtwdev, struct pci_dev *pdev) { @@ -1229,10 +1278,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea pci_disable_device(pdev); } -diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c ---- a/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-22 13:52:09.000000000 -0400 -@@ -18,6 +18,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c +index 53933fb38a33..43e80a3a8136 100644 +--- a/drivers/net/wireless/realtek/rtw88/ps.c ++++ b/drivers/net/wireless/realtek/rtw88/ps.c +@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev) if (ret) rtw_err(rtwdev, "leave idle state failed\n"); @@ -1240,7 +1290,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real rtw_set_channel(rtwdev); return ret; -@@ -63,8 +64,6 @@ +@@ -63,8 +64,6 @@ int rtw_leave_ips(struct rtw_dev *rtwdev) rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev); @@ -1249,9 +1299,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real return 0; } -diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h ---- a/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h +index 8852b24d6c2a..7c6c11d50ff3 100644 +--- a/drivers/net/wireless/realtek/rtw88/reg.h ++++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -87,6 +87,7 @@ #define BIT_LTE_MUX_CTRL_PATH BIT(26) #define REG_HCI_OPT_CTRL 0x0074 @@ -1305,10 +1356,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/rea #define REG_RCR 0x0608 #define BIT_APP_FCS BIT(31) #define BIT_APP_MIC BIT(30) -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-22 13:52:09.000000000 -0400 -@@ -216,6 +216,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +index 2d2f768bae2e..c575476a0020 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +@@ -216,6 +216,12 @@ static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1321,7 +1373,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -248,6 +254,9 @@ +@@ -248,6 +254,9 @@ static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8723du_efuse_parsing(efuse, map); break; @@ -1331,7 +1383,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -1961,15 +1970,17 @@ +@@ -1961,15 +1970,17 @@ static void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev, size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ __le16 chksum = 0; __le16 *data = (__le16 *)(txdesc); @@ -1351,7 +1403,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles } static struct rtw_chip_ops rtw8723d_ops = { -@@ -2743,6 +2754,7 @@ +@@ -2743,6 +2754,7 @@ const struct rtw_chip_info rtw8723d_hw_spec = { .ptct_efuse_size = 96 + 1, .txff_size = 32768, .rxff_size = 16384, @@ -1359,10 +1411,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-22 13:52:09.000000000 -0400 -@@ -49,6 +49,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +index a356318a5c15..3642a2c7f80c 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +@@ -49,6 +49,11 @@ struct rtw8723du_efuse { u8 mac_addr[ETH_ALEN]; /* 0x107 */ }; @@ -1374,7 +1427,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles struct rtw8723d_efuse { __le16 rtl_id; u8 rsvd[2]; -@@ -80,6 +85,7 @@ +@@ -80,6 +85,7 @@ struct rtw8723d_efuse { union { struct rtw8723de_efuse e; struct rtw8723du_efuse u; @@ -1382,10 +1435,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c 2023-06-22 13:52:09.000000000 -0400 -@@ -32,6 +32,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireless/realtek/rtw88/rtw8821c.c +index 67efa58dd78e..adf224618a2a 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c +@@ -32,6 +32,12 @@ static void rtw8821cu_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1398,7 +1452,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles enum rtw8821ce_rf_set { SWITCH_TO_BTG, SWITCH_TO_WLG, -@@ -41,6 +47,7 @@ +@@ -41,6 +47,7 @@ enum rtw8821ce_rf_set { static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { @@ -1406,7 +1460,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles struct rtw_efuse *efuse = &rtwdev->efuse; struct rtw8821c_efuse *map; int i; -@@ -64,6 +71,19 @@ +@@ -64,6 +71,19 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) efuse->tx_bb_swing_setting_2g = map->tx_bb_swing_setting_2g; efuse->tx_bb_swing_setting_5g = map->tx_bb_swing_setting_5g; @@ -1426,7 +1480,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles for (i = 0; i < 4; i++) efuse->txpwr_idx_table[i] = map->txpwr_idx_table[i]; -@@ -77,6 +97,9 @@ +@@ -77,6 +97,9 @@ static int rtw8821c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8821cu_efuse_parsing(efuse, map); break; @@ -1436,7 +1490,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -286,6 +309,7 @@ +@@ -286,6 +309,7 @@ static void rtw8821c_switch_rf_set(struct rtw_dev *rtwdev, u8 rf_set) static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) { @@ -1444,7 +1498,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles u32 rf_reg18; rf_reg18 = rtw_read_rf(rtwdev, RF_PATH_A, 0x18, RFREG_MASK); -@@ -317,11 +341,10 @@ +@@ -317,11 +341,10 @@ static void rtw8821c_set_channel_rf(struct rtw_dev *rtwdev, u8 channel, u8 bw) } if (channel <= 14) { @@ -1459,7 +1513,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles rtw_write_rf(rtwdev, RF_PATH_A, RF_LUTDBG, BIT(6), 0x1); rtw_write_rf(rtwdev, RF_PATH_A, 0x64, 0xf, 0xf); } else { -@@ -1910,6 +1933,7 @@ +@@ -1910,6 +1933,7 @@ const struct rtw_chip_info rtw8821c_hw_spec = { .ptct_efuse_size = 96, .txff_size = 65536, .rxff_size = 16384, @@ -1467,10 +1521,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h 2023-06-22 13:52:09.000000000 -0400 -@@ -65,6 +65,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireless/realtek/rtw88/rtw8821c.h +index 1c81260f3a54..fcff31688c45 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.h +@@ -65,6 +65,11 @@ struct rtw8821ce_efuse { u8 res7; }; @@ -1482,7 +1537,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireles struct rtw8821c_efuse { __le16 rtl_id; u8 res0[0x0e]; -@@ -94,6 +99,7 @@ +@@ -94,6 +99,7 @@ struct rtw8821c_efuse { union { struct rtw8821ce_efuse e; struct rtw8821cu_efuse u; @@ -1490,10 +1545,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8821c.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c 2023-06-22 13:52:09.000000000 -0400 -@@ -32,6 +32,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireless/realtek/rtw88/rtw8822b.c +index 74dfb89b2c94..3017a9760da8 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c +@@ -32,6 +32,12 @@ static void rtw8822bu_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1506,7 +1562,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -65,6 +71,9 @@ +@@ -65,6 +71,9 @@ static int rtw8822b_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8822bu_efuse_parsing(efuse, map); break; @@ -1516,7 +1572,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -2531,6 +2540,7 @@ +@@ -2531,6 +2540,7 @@ const struct rtw_chip_info rtw8822b_hw_spec = { .txff_size = 262144, .rxff_size = 24576, .fw_rxff_size = 12288, @@ -1524,10 +1580,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.c b/drivers/net/wireles .txgi_factor = 1, .is_pwr_by_rate_dec = true, .max_power_index = 0x3f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h 2023-06-22 13:52:09.000000000 -0400 -@@ -65,6 +65,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireless/realtek/rtw88/rtw8822b.h +index 01d3644e0c94..2dc3a6660f06 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.h +@@ -65,6 +65,11 @@ struct rtw8822be_efuse { u8 res7; }; @@ -1539,7 +1596,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireles struct rtw8822b_efuse { __le16 rtl_id; u8 res0[0x0e]; -@@ -92,8 +97,9 @@ +@@ -92,8 +97,9 @@ struct rtw8822b_efuse { u8 country_code[2]; u8 res[3]; union { @@ -1550,10 +1607,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822b.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c 2023-06-22 13:52:09.000000000 -0400 -@@ -35,6 +35,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireless/realtek/rtw88/rtw8822c.c +index 964e27887fe2..cd965edc29ce 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c +@@ -35,6 +35,12 @@ static void rtw8822cu_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -1566,7 +1624,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -67,6 +73,9 @@ +@@ -67,6 +73,9 @@ static int rtw8822c_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8822cu_efuse_parsing(efuse, map); break; @@ -1576,7 +1634,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -5349,6 +5358,7 @@ +@@ -5349,6 +5358,7 @@ const struct rtw_chip_info rtw8822c_hw_spec = { .txff_size = 262144, .rxff_size = 24576, .fw_rxff_size = 12288, @@ -1584,10 +1642,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.c b/drivers/net/wireles .txgi_factor = 2, .is_pwr_by_rate_dec = false, .max_power_index = 0x7f, -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h 2023-06-22 13:52:09.000000000 -0400 -@@ -16,6 +16,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireless/realtek/rtw88/rtw8822c.h +index 479d5d769c52..1bc0e7f5d6bb 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.h +@@ -16,6 +16,11 @@ struct rtw8822cu_efuse { u8 res2[0x3d]; }; @@ -1599,7 +1658,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireles struct rtw8822ce_efuse { u8 mac_addr[ETH_ALEN]; /* 0x120 */ u8 vender_id[2]; -@@ -91,8 +96,9 @@ +@@ -91,8 +96,9 @@ struct rtw8822c_efuse { u8 res9; u8 res10[0x42]; union { @@ -1610,14 +1669,38 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8822c.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c ---- a/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-22 13:52:09.000000000 -0400 -@@ -34,43 +34,57 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c +index bb5c7492c98b..2821119dc930 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.c ++++ b/drivers/net/wireless/realtek/rtw88/tx.c +@@ -34,43 +34,57 @@ void rtw_tx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { - __le32 *txdesc = (__le32 *)skb->data; +- +- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); +- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); +- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); +- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); +- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); +- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); +- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); +- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); +- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); +- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); +- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); +- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); +- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); +- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); +- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); +- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); +- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); +- SET_TX_DESC_LS(txdesc, pkt_info->ls); +- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); +- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); +- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); +- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); + struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data; + bool more_data = false; + @@ -1660,29 +1743,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real + tx_desc->w8 = le32_encode_bits(pkt_info->en_hwseq, RTW_TX_DESC_W8_EN_HWSEQ); + + tx_desc->w9 = le32_encode_bits(pkt_info->seq, RTW_TX_DESC_W9_SW_SEQ); - -- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); -- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); -- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); -- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); -- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); -- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); -- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); -- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); -- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); -- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); -- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); -- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); -- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); -- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); -- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); -- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); -- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); -- SET_TX_DESC_LS(txdesc, pkt_info->ls); -- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); -- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); -- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); -- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); ++ if (pkt_info->rts) { - SET_TX_DESC_RTSRATE(txdesc, DESC_RATE24M); - SET_TX_DESC_DATA_RTS_SHORT(txdesc, 1); @@ -1705,7 +1766,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real } EXPORT_SYMBOL(rtw_tx_fill_tx_desc); -@@ -635,9 +649,8 @@ +@@ -635,9 +649,8 @@ static void rtw_txq_push(struct rtw_dev *rtwdev, rcu_read_unlock(); } @@ -1716,7 +1777,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real struct rtw_txq *rtwtxq, *tmp; spin_lock_bh(&rtwdev->txq_lock); -@@ -658,6 +671,13 @@ +@@ -658,6 +671,13 @@ void rtw_tx_work(struct work_struct *w) spin_unlock_bh(&rtwdev->txq_lock); } @@ -1730,9 +1791,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq) { struct rtw_txq *rtwtxq; -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h ---- a/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-21 10:02:19.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h +index 197d5868c8ad..324189606257 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.h ++++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -9,76 +9,53 @@ #define RTW_TX_PROBE_TIMEOUT msecs_to_jiffies(500) @@ -1857,7 +1919,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real enum rtw_tx_desc_queue_select { TX_DESC_QSEL_TID0 = 0, -@@ -111,6 +88,7 @@ +@@ -111,6 +88,7 @@ void rtw_tx(struct rtw_dev *rtwdev, void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_tx_work(struct work_struct *w); @@ -1865,7 +1927,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct ieee80211_sta *sta, -@@ -139,13 +117,15 @@ +@@ -139,13 +117,15 @@ void fill_txdesc_checksum_common(u8 *txdesc, size_t words) { __le16 chksum = 0; __le16 *data = (__le16 *)(txdesc); @@ -1883,10 +1945,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real } static inline void rtw_tx_fill_txdesc_checksum(struct rtw_dev *rtwdev, -diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c ---- a/drivers/net/wireless/realtek/rtw88/usb.c 2023-07-11 13:39:51.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-07-11 19:36:51.686164114 -0400 -@@ -24,11 +24,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c +index 976eafa739a2..4a57efdba97b 100644 +--- a/drivers/net/wireless/realtek/rtw88/usb.c ++++ b/drivers/net/wireless/realtek/rtw88/usb.c +@@ -24,11 +24,12 @@ struct rtw_usb_txcb { static void rtw_usb_fill_tx_checksum(struct rtw_usb *rtwusb, struct sk_buff *skb, int agg_num) { @@ -1901,7 +1964,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea rtw_tx_fill_txdesc_checksum(rtwdev, &pkt_info, skb->data); } -@@ -306,11 +307,13 @@ +@@ -306,11 +307,13 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list) { struct rtw_dev *rtwdev = rtwusb->rtwdev; @@ -1915,7 +1978,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea if (skb_queue_empty(list)) return false; -@@ -363,9 +366,10 @@ +@@ -363,9 +366,10 @@ static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list queue: skb_queue_tail(&txcb->tx_ack_queue, skb_head); @@ -1928,7 +1991,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea return true; } -@@ -465,6 +469,9 @@ +@@ -465,6 +469,9 @@ static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb) if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))) qsel = TX_DESC_QSEL_MGMT; @@ -1938,9 +2001,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK) qsel = skb->priority; else -diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h ---- a/include/linux/mmc/sdio_ids.h 2023-06-09 04:48:26.000000000 -0400 -+++ b/include/linux/mmc/sdio_ids.h 2023-06-11 07:28:33.845740907 -0400 +diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h +index bf3c95d8eb8a..7fada7a714fe 100644 +--- a/include/linux/mmc/sdio_ids.h ++++ b/include/linux/mmc/sdio_ids.h @@ -115,6 +115,16 @@ #define SDIO_VENDOR_ID_MICROCHIP_WILC 0x0296 #define SDIO_DEVICE_ID_MICROCHIP_WILC1000 0x5347 @@ -1958,3 +2022,6 @@ diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h #define SDIO_VENDOR_ID_SIANO 0x039a #define SDIO_DEVICE_ID_SIANO_NOVA_B0 0x0201 #define SDIO_DEVICE_ID_SIANO_NICE 0x0202 +-- +2.39.2 + diff --git a/patch/misc/rtw88/6.2/002-rtw88-linux-next.patch b/patch/misc/rtw88/6.3/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 94% rename from patch/misc/rtw88/6.2/002-rtw88-linux-next.patch rename to patch/misc/rtw88/6.3/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index 26c73d22fd..bdd0a34f3d 100644 --- a/patch/misc/rtw88/6.2/002-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.3/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,5 +1,31 @@ ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400 +From b75999653fd7dacfc8484b9d46f55927a6fcab60 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Sat, 22 Jul 2023 04:28:16 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.3.y + +Signed-off-by: Patrick Yavitz +--- + .../net/wireless/realtek/rtw88/rtw8723ds.c | 41 + + .../net/wireless/realtek/rtw88/rtw8821cs.c | 36 + + .../net/wireless/realtek/rtw88/rtw8822bs.c | 36 + + .../net/wireless/realtek/rtw88/rtw8822cs.c | 36 + + drivers/net/wireless/realtek/rtw88/sdio.c | 1416 +++++++++++++++++ + drivers/net/wireless/realtek/rtw88/sdio.h | 178 +++ + 6 files changed, 1743 insertions(+) + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723ds.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8821cs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822bs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8822cs.c + create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.c + create mode 100644 drivers/net/wireless/realtek/rtw88/sdio.h + +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723ds.c b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c +new file mode 100644 +index 000000000000..e5b6960ba0a0 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -42,8 +68,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8821cs.c b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c +new file mode 100644 +index 000000000000..a359413369a4 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8821cs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -81,8 +110,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8821cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822bs.c b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c +new file mode 100644 +index 000000000000..31d8645f83bd +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822bs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Jernej Skrabec @@ -120,8 +152,11 @@ +MODULE_AUTHOR("Jernej Skrabec "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822bs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8822cs.c b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c +new file mode 100644 +index 000000000000..975e81c824f2 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8822cs.c @@ -0,0 +1,36 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -159,8 +194,11 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11ac wireless 8822cs driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-07-07 19:42:40.585806232 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-07-10 05:58:23.384448785 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c +new file mode 100644 +index 000000000000..b19262ec5d8c +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/sdio.c @@ -0,0 +1,1416 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright (C) 2021 Martin Blumenstingl @@ -1578,8 +1616,11 @@ +MODULE_AUTHOR("Jernej Skrabec"); +MODULE_DESCRIPTION("Realtek 802.11ac wireless SDIO driver"); +MODULE_LICENSE("Dual BSD/GPL"); ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/sdio.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/sdio.h b/drivers/net/wireless/realtek/rtw88/sdio.h +new file mode 100644 +index 000000000000..3c659ed180f0 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/sdio.h @@ -0,0 +1,178 @@ +/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ +/* Copyright (C) 2021 Martin Blumenstingl @@ -1759,3 +1800,6 @@ +} + +#endif +-- +2.39.2 + diff --git a/patch/misc/rtw88/6.4/001-rtw88-linux-next.patch b/patch/misc/rtw88/6.4/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 76% rename from patch/misc/rtw88/6.4/001-rtw88-linux-next.patch rename to patch/misc/rtw88/6.4/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index 5aace69b71..30c08d0a5b 100644 --- a/patch/misc/rtw88/6.4/001-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.4/001-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,7 +1,74 @@ -diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c ---- a/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/debug.c 2023-06-22 13:52:09.000000000 -0400 -@@ -183,8 +183,8 @@ +From 33cc2c72bfd61ad4b6f481034e82cf8281b7664b Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Sat, 22 Jul 2023 04:12:37 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.4.y + +Signed-off-by: Patrick Yavitz +--- + drivers/net/wireless/realtek/rtw88/Kconfig | 11 ++ + drivers/net/wireless/realtek/rtw88/Makefile | 3 + + drivers/net/wireless/realtek/rtw88/debug.c | 59 ++++++--- + drivers/net/wireless/realtek/rtw88/fw.c | 68 ++++++++++ + drivers/net/wireless/realtek/rtw88/fw.h | 13 ++ + drivers/net/wireless/realtek/rtw88/mac.c | 6 +- + drivers/net/wireless/realtek/rtw88/mac80211.c | 9 +- + drivers/net/wireless/realtek/rtw88/main.c | 15 ++- + drivers/net/wireless/realtek/rtw88/main.h | 1 + + drivers/net/wireless/realtek/rtw88/pci.c | 5 +- + drivers/net/wireless/realtek/rtw88/ps.c | 3 +- + drivers/net/wireless/realtek/rtw88/reg.h | 2 + + drivers/net/wireless/realtek/rtw88/rtw8723d.c | 15 ++- + drivers/net/wireless/realtek/rtw88/rtw8723d.h | 6 + + drivers/net/wireless/realtek/rtw88/sdio.c | 24 +++- + drivers/net/wireless/realtek/rtw88/tx.c | 94 +++++++------ + drivers/net/wireless/realtek/rtw88/tx.h | 124 ++++++++---------- + drivers/net/wireless/realtek/rtw88/usb.c | 15 ++- + include/linux/mmc/sdio_ids.h | 3 +- + 19 files changed, 332 insertions(+), 144 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig +index 29eb2f8e0eb7..cffad1c01249 100644 +--- a/drivers/net/wireless/realtek/rtw88/Kconfig ++++ b/drivers/net/wireless/realtek/rtw88/Kconfig +@@ -111,6 +111,17 @@ config RTW88_8723DE + + 802.11n PCIe wireless network adapter + ++config RTW88_8723DS ++ tristate "Realtek 8723DS SDIO wireless network adapter" ++ depends on MMC ++ select RTW88_CORE ++ select RTW88_SDIO ++ select RTW88_8723D ++ help ++ Select this option will enable support for 8723DS chipset ++ ++ 802.11n SDIO wireless network adapter ++ + config RTW88_8723DU + tristate "Realtek 8723DU USB wireless network adapter" + depends on USB +diff --git a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile +index 82979b30ae8d..fd212c09d88a 100644 +--- a/drivers/net/wireless/realtek/rtw88/Makefile ++++ b/drivers/net/wireless/realtek/rtw88/Makefile +@@ -50,6 +50,9 @@ rtw88_8723d-objs := rtw8723d.o rtw8723d_table.o + obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o + rtw88_8723de-objs := rtw8723de.o + ++obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o ++rtw88_8723ds-objs := rtw8723ds.o ++ + obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o + rtw88_8723du-objs := rtw8723du.o + +diff --git a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/realtek/rtw88/debug.c +index fa3d73b333ba..f8ba133baff0 100644 +--- a/drivers/net/wireless/realtek/rtw88/debug.c ++++ b/drivers/net/wireless/realtek/rtw88/debug.c +@@ -183,8 +183,8 @@ static int rtw_debugfs_copy_from_user(char tmp[], int size, tmp_len = (count > size - 1 ? size - 1 : count); @@ -12,7 +79,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r tmp[tmp_len] = '\0'; -@@ -201,13 +201,16 @@ +@@ -201,13 +201,16 @@ static ssize_t rtw_debugfs_set_read_reg(struct file *filp, char tmp[32 + 1]; u32 addr, len; int num; @@ -31,7 +98,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r if (len != 1 && len != 2 && len != 4) { rtw_warn(rtwdev, "read reg setting wrong len\n"); -@@ -288,8 +291,11 @@ +@@ -288,8 +291,11 @@ static ssize_t rtw_debugfs_set_rsvd_page(struct file *filp, char tmp[32 + 1]; u32 offset, page_num; int num; @@ -44,7 +111,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%d %d", &offset, &page_num); -@@ -314,8 +320,11 @@ +@@ -314,8 +320,11 @@ static ssize_t rtw_debugfs_set_single_input(struct file *filp, char tmp[32 + 1]; u32 input; int num; @@ -57,7 +124,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = kstrtoint(tmp, 0, &input); -@@ -338,14 +347,17 @@ +@@ -338,14 +347,17 @@ static ssize_t rtw_debugfs_set_write_reg(struct file *filp, char tmp[32 + 1]; u32 addr, val, len; int num; @@ -77,7 +144,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r switch (len) { case 1: -@@ -381,8 +393,11 @@ +@@ -381,8 +393,11 @@ static ssize_t rtw_debugfs_set_h2c(struct file *filp, char tmp[32 + 1]; u8 param[8]; int num; @@ -90,7 +157,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r num = sscanf(tmp, "%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx,%hhx", ¶m[0], ¶m[1], ¶m[2], ¶m[3], -@@ -408,14 +423,17 @@ +@@ -408,14 +423,17 @@ static ssize_t rtw_debugfs_set_rf_write(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask, val; int num; @@ -110,7 +177,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } mutex_lock(&rtwdev->mutex); -@@ -438,14 +456,17 @@ +@@ -438,14 +456,17 @@ static ssize_t rtw_debugfs_set_rf_read(struct file *filp, char tmp[32 + 1]; u32 path, addr, mask; int num; @@ -130,7 +197,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r } debugfs_priv->rf_path = path; -@@ -467,7 +488,9 @@ +@@ -467,7 +488,9 @@ static ssize_t rtw_debugfs_set_fix_rate(struct file *filp, char tmp[32 + 1]; int ret; @@ -141,7 +208,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtou8(tmp, 0, &fix_rate); if (ret) { -@@ -860,7 +883,9 @@ +@@ -860,7 +883,9 @@ static ssize_t rtw_debugfs_set_coex_enable(struct file *filp, bool enable; int ret; @@ -152,7 +219,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &enable); if (ret) { -@@ -930,7 +955,9 @@ +@@ -930,7 +955,9 @@ static ssize_t rtw_debugfs_set_fw_crash(struct file *filp, bool input; int ret; @@ -163,10 +230,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/debug.c b/drivers/net/wireless/r ret = kstrtobool(tmp, &input); if (ret) -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c ---- a/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.c 2023-06-22 13:52:09.000000000 -0400 -@@ -308,6 +308,57 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/realtek/rtw88/fw.c +index 2a8ccc8a7f60..567bbedd8ee0 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.c ++++ b/drivers/net/wireless/realtek/rtw88/fw.c +@@ -308,6 +308,57 @@ void rtw_fw_c2h_cmd_isr(struct rtw_dev *rtwdev) } EXPORT_SYMBOL(rtw_fw_c2h_cmd_isr); @@ -224,7 +292,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real static void rtw_fw_send_h2c_command(struct rtw_dev *rtwdev, u8 *h2c) { -@@ -468,6 +519,23 @@ +@@ -468,6 +519,23 @@ void rtw_fw_query_bt_info(struct rtw_dev *rtwdev) rtw_fw_send_h2c_command(rtwdev, h2c_pkt); } @@ -248,10 +316,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.c b/drivers/net/wireless/real void rtw_fw_wl_ch_info(struct rtw_dev *rtwdev, u8 link, u8 ch, u8 bw) { u8 h2c_pkt[H2C_PKT_SIZE] = {0}; -diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h ---- a/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/fw.h 2023-06-22 13:52:09.000000000 -0400 -@@ -81,6 +81,17 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/realtek/rtw88/fw.h +index 397cbc3f6af6..43ccdf9965ac 100644 +--- a/drivers/net/wireless/realtek/rtw88/fw.h ++++ b/drivers/net/wireless/realtek/rtw88/fw.h +@@ -81,6 +81,17 @@ struct rtw_c2h_adaptivity { u8 option; } __packed; @@ -269,7 +338,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real struct rtw_h2c_cmd { __le32 msg; __le32 msg_ext; -@@ -530,6 +541,7 @@ +@@ -530,6 +541,7 @@ static inline void rtw_h2c_pkt_set_header(u8 *h2c_pkt, u8 sub_id) #define H2C_CMD_MEDIA_STATUS_RPT 0x01 #define H2C_CMD_SET_PWR_MODE 0x20 #define H2C_CMD_LPS_PG_INFO 0x2b @@ -277,7 +346,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real #define H2C_CMD_RA_INFO 0x40 #define H2C_CMD_RSSI_MONITOR 0x42 #define H2C_CMD_BCN_FILTER_OFFLOAD_P0 0x56 -@@ -801,6 +813,7 @@ +@@ -801,6 +813,7 @@ void rtw_fw_c2h_cmd_rx_irqsafe(struct rtw_dev *rtwdev, u32 pkt_offset, void rtw_fw_c2h_cmd_handle(struct rtw_dev *rtwdev, struct sk_buff *skb); void rtw_fw_send_general_info(struct rtw_dev *rtwdev); void rtw_fw_send_phydm_info(struct rtw_dev *rtwdev); @@ -285,71 +354,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/fw.h b/drivers/net/wireless/real void rtw_fw_do_iqk(struct rtw_dev *rtwdev, struct rtw_iqk_para *para); void rtw_fw_inform_rfk_status(struct rtw_dev *rtwdev, bool start); -diff -Naur a/drivers/net/wireless/realtek/rtw88/Kconfig b/drivers/net/wireless/realtek/rtw88/Kconfig ---- a/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Kconfig 2023-06-22 13:52:09.000000000 -0400 -@@ -111,6 +111,17 @@ - - 802.11n PCIe wireless network adapter - -+config RTW88_8723DS -+ tristate "Realtek 8723DS SDIO wireless network adapter" -+ depends on MMC -+ select RTW88_CORE -+ select RTW88_SDIO -+ select RTW88_8723D -+ help -+ Select this option will enable support for 8723DS chipset -+ -+ 802.11n SDIO wireless network adapter -+ - config RTW88_8723DU - tristate "Realtek 8723DU USB wireless network adapter" - depends on USB -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c ---- a/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-07-19 10:37:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac80211.c 2023-07-19 15:52:13.130110125 -0400 -@@ -43,7 +43,11 @@ - list_add_tail(&rtwtxq->list, &rtwdev->txqs); - spin_unlock_bh(&rtwdev->txq_lock); - -- queue_work(rtwdev->tx_wq, &rtwdev->tx_work); -+ /* ensure to dequeue EAPOL (4/4) at the right time */ -+ if (txq->ac == IEEE80211_AC_VO) -+ __rtw_tx_work(rtwdev); -+ else -+ queue_work(rtwdev->tx_wq, &rtwdev->tx_work); - } - - static int rtw_ops_start(struct ieee80211_hw *hw) -@@ -378,6 +382,7 @@ - - rtw_fw_download_rsvd_page(rtwdev); - rtw_send_rsvd_page_h2c(rtwdev); -+ rtw_fw_default_port(rtwdev, rtwvif); - rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc); - if (rtw_bf_support) - rtw_bf_assoc(rtwdev, vif, conf); -@@ -449,6 +454,7 @@ - const struct rtw_chip_info *chip = rtwdev->chip; - - mutex_lock(&rtwdev->mutex); -+ rtw_write32_set(rtwdev, REG_TCR, BIT_TCR_UPDATE_HGQMD); - rtwdev->ap_active = true; - rtw_store_op_chan(rtwdev, true); - chip->ops->phy_calibration(rtwdev); -@@ -464,6 +470,7 @@ - struct rtw_dev *rtwdev = hw->priv; - - mutex_lock(&rtwdev->mutex); -+ rtw_write32_clr(rtwdev, REG_TCR, BIT_TCR_UPDATE_HGQMD); - rtwdev->ap_active = false; - if (!rtw_core_check_sta_active(rtwdev)) - rtw_clear_op_chan(rtwdev); -diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c ---- a/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/mac.c 2023-06-22 13:52:09.000000000 -0400 -@@ -794,8 +794,10 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/realtek/rtw88/mac.c +index a168f36c38ec..298663b03580 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac.c ++++ b/drivers/net/wireless/realtek/rtw88/mac.c +@@ -794,8 +794,10 @@ static int __rtw_download_firmware(struct rtw_dev *rtwdev, wlan_cpu_enable(rtwdev, true); @@ -362,10 +371,52 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/mac.c b/drivers/net/wireless/rea ret = download_firmware_validate(rtwdev); if (ret) -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c ---- a/drivers/net/wireless/realtek/rtw88/main.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.c 2023-06-22 13:52:09.000000000 -0400 -@@ -334,12 +334,15 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/mac80211.c b/drivers/net/wireless/realtek/rtw88/mac80211.c +index 09bcc2345bb0..a99b53d44267 100644 +--- a/drivers/net/wireless/realtek/rtw88/mac80211.c ++++ b/drivers/net/wireless/realtek/rtw88/mac80211.c +@@ -43,7 +43,11 @@ static void rtw_ops_wake_tx_queue(struct ieee80211_hw *hw, + list_add_tail(&rtwtxq->list, &rtwdev->txqs); + spin_unlock_bh(&rtwdev->txq_lock); + +- queue_work(rtwdev->tx_wq, &rtwdev->tx_work); ++ /* ensure to dequeue EAPOL (4/4) at the right time */ ++ if (txq->ac == IEEE80211_AC_VO) ++ __rtw_tx_work(rtwdev); ++ else ++ queue_work(rtwdev->tx_wq, &rtwdev->tx_work); + } + + static int rtw_ops_start(struct ieee80211_hw *hw) +@@ -378,6 +382,7 @@ static void rtw_ops_bss_info_changed(struct ieee80211_hw *hw, + + rtw_fw_download_rsvd_page(rtwdev); + rtw_send_rsvd_page_h2c(rtwdev); ++ rtw_fw_default_port(rtwdev, rtwvif); + rtw_coex_media_status_notify(rtwdev, vif->cfg.assoc); + if (rtw_bf_support) + rtw_bf_assoc(rtwdev, vif, conf); +@@ -449,6 +454,7 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw, + const struct rtw_chip_info *chip = rtwdev->chip; + + mutex_lock(&rtwdev->mutex); ++ rtw_write32_set(rtwdev, REG_TCR, BIT_TCR_UPDATE_HGQMD); + rtwdev->ap_active = true; + rtw_store_op_chan(rtwdev, true); + chip->ops->phy_calibration(rtwdev); +@@ -464,6 +470,7 @@ static void rtw_ops_stop_ap(struct ieee80211_hw *hw, + struct rtw_dev *rtwdev = hw->priv; + + mutex_lock(&rtwdev->mutex); ++ rtw_write32_clr(rtwdev, REG_TCR, BIT_TCR_UPDATE_HGQMD); + rtwdev->ap_active = false; + if (!rtw_core_check_sta_active(rtwdev)) + rtw_clear_op_chan(rtwdev); +diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c +index 9447a3aae3b5..c853e2f2d448 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.c ++++ b/drivers/net/wireless/realtek/rtw88/main.c +@@ -334,12 +334,15 @@ int rtw_sta_add(struct rtw_dev *rtwdev, struct ieee80211_sta *sta, struct ieee80211_vif *vif) { struct rtw_sta_info *si = (struct rtw_sta_info *)sta->drv_priv; @@ -381,7 +432,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re si->rtwdev = rtwdev; si->sta = sta; si->vif = vif; -@@ -2340,6 +2343,9 @@ +@@ -2340,6 +2343,9 @@ static void rtw_port_switch_iter(void *data, u8 *mac, struct ieee80211_vif *vif) rtw_dbg(rtwdev, RTW_DBG_STATE, "AP port switch from %d -> %d\n", rtwvif_ap->port, rtwvif_target->port); @@ -391,7 +442,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re reg1 = &rtwvif_ap->conf->net_type; reg2 = &rtwvif_target->conf->net_type; rtw_swap_reg_mask(rtwdev, reg1, reg2); -@@ -2358,6 +2364,8 @@ +@@ -2358,6 +2364,8 @@ static void rtw_port_switch_iter(void *data, u8 *mac, struct ieee80211_vif *vif) swap(rtwvif_target->port, rtwvif_ap->port); swap(rtwvif_target->conf, rtwvif_ap->conf); @@ -400,7 +451,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re } void rtw_core_port_switch(struct rtw_dev *rtwdev, struct ieee80211_vif *vif) -@@ -2403,10 +2411,13 @@ +@@ -2403,10 +2411,13 @@ void rtw_core_enable_beacon(struct rtw_dev *rtwdev, bool enable) if (!rtwdev->ap_active) return; @@ -416,10 +467,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/re } MODULE_AUTHOR("Realtek Corporation"); -diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h ---- a/drivers/net/wireless/realtek/rtw88/main.h 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/main.h 2023-06-22 13:52:09.000000000 -0400 -@@ -803,6 +803,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/realtek/rtw88/main.h +index 9e841f6991a9..f9dd2ab941c8 100644 +--- a/drivers/net/wireless/realtek/rtw88/main.h ++++ b/drivers/net/wireless/realtek/rtw88/main.h +@@ -803,6 +803,7 @@ struct rtw_bf_info { struct rtw_vif { enum rtw_net_type net_type; u16 aid; @@ -427,23 +479,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/main.h b/drivers/net/wireless/re u8 mac_addr[ETH_ALEN]; u8 bssid[ETH_ALEN]; u8 port; -diff -Naur a/drivers/net/wireless/realtek/rtw88/Makefile b/drivers/net/wireless/realtek/rtw88/Makefile ---- a/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/Makefile 2023-06-22 13:52:09.000000000 -0400 -@@ -50,6 +50,9 @@ - obj-$(CONFIG_RTW88_8723DE) += rtw88_8723de.o - rtw88_8723de-objs := rtw8723de.o - -+obj-$(CONFIG_RTW88_8723DS) += rtw88_8723ds.o -+rtw88_8723ds-objs := rtw8723ds.o -+ - obj-$(CONFIG_RTW88_8723DU) += rtw88_8723du.o - rtw88_8723du-objs := rtw8723du.o - -diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c ---- a/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/pci.c 2023-06-22 13:52:09.000000000 -0400 -@@ -738,8 +738,9 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/realtek/rtw88/pci.c +index 672ddde80816..44a8fff34cdd 100644 +--- a/drivers/net/wireless/realtek/rtw88/pci.c ++++ b/drivers/net/wireless/realtek/rtw88/pci.c +@@ -738,8 +738,9 @@ static void __rtw_pci_flush_queues(struct rtw_dev *rtwdev, u32 pci_queues, u8 q; for (q = 0; q < RTK_MAX_TX_QUEUE_NUM; q++) { @@ -455,10 +495,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/pci.c b/drivers/net/wireless/rea continue; if (pci_queues & BIT(q)) -diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c ---- a/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/ps.c 2023-06-22 13:52:09.000000000 -0400 -@@ -18,6 +18,7 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/realtek/rtw88/ps.c +index 53933fb38a33..43e80a3a8136 100644 +--- a/drivers/net/wireless/realtek/rtw88/ps.c ++++ b/drivers/net/wireless/realtek/rtw88/ps.c +@@ -18,6 +18,7 @@ static int rtw_ips_pwr_up(struct rtw_dev *rtwdev) if (ret) rtw_err(rtwdev, "leave idle state failed\n"); @@ -466,7 +507,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real rtw_set_channel(rtwdev); return ret; -@@ -63,8 +64,6 @@ +@@ -63,8 +64,6 @@ int rtw_leave_ips(struct rtw_dev *rtwdev) rtw_iterate_vifs(rtwdev, rtw_restore_port_cfg_iter, rtwdev); @@ -475,9 +516,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/ps.c b/drivers/net/wireless/real return 0; } -diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h ---- a/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/reg.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/realtek/rtw88/reg.h +index 2a2ae2081f34..7c6c11d50ff3 100644 +--- a/drivers/net/wireless/realtek/rtw88/reg.h ++++ b/drivers/net/wireless/realtek/rtw88/reg.h @@ -378,6 +378,7 @@ #define BIT_SIFS_BK_EN BIT(12) #define REG_TXPAUSE 0x0522 @@ -494,10 +536,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/reg.h b/drivers/net/wireless/rea #define REG_RCR 0x0608 #define BIT_APP_FCS BIT(31) #define BIT_APP_MIC BIT(30) -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c 2023-06-22 13:52:09.000000000 -0400 -@@ -216,6 +216,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +index 06e7454c9ca6..c575476a0020 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c +@@ -216,6 +216,12 @@ static void rtw8723du_efuse_parsing(struct rtw_efuse *efuse, ether_addr_copy(efuse->addr, map->u.mac_addr); } @@ -510,7 +553,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) { struct rtw_efuse *efuse = &rtwdev->efuse; -@@ -248,6 +254,9 @@ +@@ -248,6 +254,9 @@ static int rtw8723d_read_efuse(struct rtw_dev *rtwdev, u8 *log_map) case RTW_HCI_TYPE_USB: rtw8723du_efuse_parsing(efuse, map); break; @@ -520,7 +563,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles default: /* unsupported now */ return -ENOTSUPP; -@@ -1961,15 +1970,17 @@ +@@ -1961,15 +1970,17 @@ static void rtw8723d_fill_txdesc_checksum(struct rtw_dev *rtwdev, size_t words = 32 / 2; /* calculate the first 32 bytes (16 words) */ __le16 chksum = 0; __le16 *data = (__le16 *)(txdesc); @@ -540,10 +583,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.c b/drivers/net/wireles } static struct rtw_chip_ops rtw8723d_ops = { -diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h ---- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h 2023-06-22 13:52:09.000000000 -0400 -@@ -49,6 +49,11 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +index a356318a5c15..3642a2c7f80c 100644 +--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.h ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.h +@@ -49,6 +49,11 @@ struct rtw8723du_efuse { u8 mac_addr[ETH_ALEN]; /* 0x107 */ }; @@ -555,7 +599,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles struct rtw8723d_efuse { __le16 rtl_id; u8 rsvd[2]; -@@ -80,6 +85,7 @@ +@@ -80,6 +85,7 @@ struct rtw8723d_efuse { union { struct rtw8723de_efuse e; struct rtw8723du_efuse u; @@ -563,10 +607,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/rtw8723d.h b/drivers/net/wireles }; }; -diff -Naur a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c ---- a/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/sdio.c 2023-06-22 13:52:09.000000000 -0400 -@@ -998,9 +998,9 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/realtek/rtw88/sdio.c +index 06fce7c3adda..2c1fb2dabd40 100644 +--- a/drivers/net/wireless/realtek/rtw88/sdio.c ++++ b/drivers/net/wireless/realtek/rtw88/sdio.c +@@ -998,9 +998,9 @@ static void rtw_sdio_rxfifo_recv(struct rtw_dev *rtwdev, u32 rx_len) static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev) { @@ -578,7 +623,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/re if (rtw_chip_wcpu_11n(rtwdev)) rx_len = rtw_read16(rtwdev, REG_SDIO_RX0_REQ_LEN); else -@@ -1012,7 +1012,25 @@ +@@ -1012,7 +1012,25 @@ static void rtw_sdio_rx_isr(struct rtw_dev *rtwdev) rtw_sdio_rxfifo_recv(rtwdev, rx_len); total_rx_bytes += rx_len; @@ -605,14 +650,38 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/sdio.c b/drivers/net/wireless/re } static void rtw_sdio_handle_interrupt(struct sdio_func *sdio_func) -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c ---- a/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-22 13:52:09.000000000 -0400 -@@ -34,43 +34,57 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c +index bb5c7492c98b..2821119dc930 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.c ++++ b/drivers/net/wireless/realtek/rtw88/tx.c +@@ -34,43 +34,57 @@ void rtw_tx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif, void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb) { - __le32 *txdesc = (__le32 *)skb->data; +- +- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); +- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); +- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); +- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); +- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); +- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); +- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); +- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); +- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); +- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); +- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); +- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); +- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); +- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); +- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); +- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); +- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); +- SET_TX_DESC_LS(txdesc, pkt_info->ls); +- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); +- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); +- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); +- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); + struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data; + bool more_data = false; + @@ -655,29 +724,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real + tx_desc->w8 = le32_encode_bits(pkt_info->en_hwseq, RTW_TX_DESC_W8_EN_HWSEQ); + + tx_desc->w9 = le32_encode_bits(pkt_info->seq, RTW_TX_DESC_W9_SW_SEQ); - -- SET_TX_DESC_TXPKTSIZE(txdesc, pkt_info->tx_pkt_size); -- SET_TX_DESC_OFFSET(txdesc, pkt_info->offset); -- SET_TX_DESC_PKT_OFFSET(txdesc, pkt_info->pkt_offset); -- SET_TX_DESC_QSEL(txdesc, pkt_info->qsel); -- SET_TX_DESC_BMC(txdesc, pkt_info->bmc); -- SET_TX_DESC_RATE_ID(txdesc, pkt_info->rate_id); -- SET_TX_DESC_DATARATE(txdesc, pkt_info->rate); -- SET_TX_DESC_DISDATAFB(txdesc, pkt_info->dis_rate_fallback); -- SET_TX_DESC_USE_RATE(txdesc, pkt_info->use_rate); -- SET_TX_DESC_SEC_TYPE(txdesc, pkt_info->sec_type); -- SET_TX_DESC_DATA_BW(txdesc, pkt_info->bw); -- SET_TX_DESC_SW_SEQ(txdesc, pkt_info->seq); -- SET_TX_DESC_MAX_AGG_NUM(txdesc, pkt_info->ampdu_factor); -- SET_TX_DESC_AMPDU_DENSITY(txdesc, pkt_info->ampdu_density); -- SET_TX_DESC_DATA_STBC(txdesc, pkt_info->stbc); -- SET_TX_DESC_DATA_LDPC(txdesc, pkt_info->ldpc); -- SET_TX_DESC_AGG_EN(txdesc, pkt_info->ampdu_en); -- SET_TX_DESC_LS(txdesc, pkt_info->ls); -- SET_TX_DESC_DATA_SHORT(txdesc, pkt_info->short_gi); -- SET_TX_DESC_SPE_RPT(txdesc, pkt_info->report); -- SET_TX_DESC_SW_DEFINE(txdesc, pkt_info->sn); -- SET_TX_DESC_USE_RTS(txdesc, pkt_info->rts); ++ if (pkt_info->rts) { - SET_TX_DESC_RTSRATE(txdesc, DESC_RATE24M); - SET_TX_DESC_DATA_RTS_SHORT(txdesc, 1); @@ -700,7 +747,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real } EXPORT_SYMBOL(rtw_tx_fill_tx_desc); -@@ -635,9 +649,8 @@ +@@ -635,9 +649,8 @@ static void rtw_txq_push(struct rtw_dev *rtwdev, rcu_read_unlock(); } @@ -711,7 +758,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real struct rtw_txq *rtwtxq, *tmp; spin_lock_bh(&rtwdev->txq_lock); -@@ -658,6 +671,13 @@ +@@ -658,6 +671,13 @@ void rtw_tx_work(struct work_struct *w) spin_unlock_bh(&rtwdev->txq_lock); } @@ -725,9 +772,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq) { struct rtw_txq *rtwtxq; -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h ---- a/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-18 17:06:27.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/realtek/rtw88/tx.h +index 197d5868c8ad..324189606257 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.h ++++ b/drivers/net/wireless/realtek/rtw88/tx.h @@ -9,76 +9,53 @@ #define RTW_TX_PROBE_TIMEOUT msecs_to_jiffies(500) @@ -852,7 +900,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real enum rtw_tx_desc_queue_select { TX_DESC_QSEL_TID0 = 0, -@@ -111,6 +88,7 @@ +@@ -111,6 +88,7 @@ void rtw_tx(struct rtw_dev *rtwdev, void rtw_txq_init(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_txq_cleanup(struct rtw_dev *rtwdev, struct ieee80211_txq *txq); void rtw_tx_work(struct work_struct *w); @@ -860,7 +908,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real void rtw_tx_pkt_info_update(struct rtw_dev *rtwdev, struct rtw_tx_pkt_info *pkt_info, struct ieee80211_sta *sta, -@@ -139,13 +117,15 @@ +@@ -139,13 +117,15 @@ void fill_txdesc_checksum_common(u8 *txdesc, size_t words) { __le16 chksum = 0; __le16 *data = (__le16 *)(txdesc); @@ -878,10 +926,11 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.h b/drivers/net/wireless/real } static inline void rtw_tx_fill_txdesc_checksum(struct rtw_dev *rtwdev, -diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c ---- a/drivers/net/wireless/realtek/rtw88/usb.c 2023-07-19 10:37:03.000000000 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-07-19 15:52:13.134110080 -0400 -@@ -24,11 +24,12 @@ +diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c +index 976eafa739a2..4a57efdba97b 100644 +--- a/drivers/net/wireless/realtek/rtw88/usb.c ++++ b/drivers/net/wireless/realtek/rtw88/usb.c +@@ -24,11 +24,12 @@ struct rtw_usb_txcb { static void rtw_usb_fill_tx_checksum(struct rtw_usb *rtwusb, struct sk_buff *skb, int agg_num) { @@ -896,7 +945,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea rtw_tx_fill_txdesc_checksum(rtwdev, &pkt_info, skb->data); } -@@ -306,11 +307,13 @@ +@@ -306,11 +307,13 @@ static int rtw_usb_write_port(struct rtw_dev *rtwdev, u8 qsel, struct sk_buff *s static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list) { struct rtw_dev *rtwdev = rtwusb->rtwdev; @@ -910,7 +959,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea if (skb_queue_empty(list)) return false; -@@ -363,9 +366,10 @@ +@@ -363,9 +366,10 @@ static bool rtw_usb_tx_agg_skb(struct rtw_usb *rtwusb, struct sk_buff_head *list queue: skb_queue_tail(&txcb->tx_ack_queue, skb_head); @@ -923,7 +972,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea return true; } -@@ -465,6 +469,9 @@ +@@ -465,6 +469,9 @@ static u8 rtw_usb_tx_queue_mapping_to_qsel(struct sk_buff *skb) if (unlikely(ieee80211_is_mgmt(fc) || ieee80211_is_ctl(fc))) qsel = TX_DESC_QSEL_MGMT; @@ -933,9 +982,10 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea else if (skb_get_queue_mapping(skb) <= IEEE80211_AC_BK) qsel = skb->priority; else -diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h ---- a/include/linux/mmc/sdio_ids.h 2023-06-18 17:06:27.000000000 -0400 -+++ b/include/linux/mmc/sdio_ids.h 2023-06-22 13:52:09.000000000 -0400 +diff --git a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h +index c653accdc7fd..7fada7a714fe 100644 +--- a/include/linux/mmc/sdio_ids.h ++++ b/include/linux/mmc/sdio_ids.h @@ -121,7 +121,8 @@ #define SDIO_DEVICE_ID_REALTEK_RTW8822BS 0xb822 #define SDIO_DEVICE_ID_REALTEK_RTW8821CS 0xc821 @@ -946,3 +996,6 @@ diff -Naur a/include/linux/mmc/sdio_ids.h b/include/linux/mmc/sdio_ids.h #define SDIO_DEVICE_ID_REALTEK_RTW8821DS 0xd821 #define SDIO_VENDOR_ID_SIANO 0x039a +-- +2.39.2 + diff --git a/patch/misc/rtw88/6.4/002-rtw88-linux-next.patch b/patch/misc/rtw88/6.4/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch similarity index 87% rename from patch/misc/rtw88/6.4/002-rtw88-linux-next.patch rename to patch/misc/rtw88/6.4/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch index c2a1200bb8..e1ae941dd0 100644 --- a/patch/misc/rtw88/6.4/002-rtw88-linux-next.patch +++ b/patch/misc/rtw88/6.4/002-drivers-net-wireless-realtek-rtw88-upstream-wireless.patch @@ -1,5 +1,21 @@ ---- /dev/null 2023-06-17 08:32:20.061755428 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c 2023-06-22 13:52:09.000000000 -0400 +From bb2ac531c8e49ac5f5c017976b86fae02c5a1193 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Sat, 22 Jul 2023 04:23:40 -0400 +Subject: [PATCH] drivers: net: wireless: realtek: rtw88: upstream wireless + +linux-next backport: linux-6.4.y + +Signed-off-by: Patrick Yavitz +--- + .../net/wireless/realtek/rtw88/rtw8723ds.c | 41 +++++++++++++++++++ + 1 file changed, 41 insertions(+) + create mode 100644 drivers/net/wireless/realtek/rtw88/rtw8723ds.c + +diff --git a/drivers/net/wireless/realtek/rtw88/rtw8723ds.c b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c +new file mode 100644 +index 000000000000..e5b6960ba0a0 +--- /dev/null ++++ b/drivers/net/wireless/realtek/rtw88/rtw8723ds.c @@ -0,0 +1,41 @@ +// SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause +/* Copyright(c) Martin Blumenstingl @@ -42,6 +58,9 @@ +MODULE_AUTHOR("Martin Blumenstingl "); +MODULE_DESCRIPTION("Realtek 802.11n wireless 8723ds driver"); +MODULE_LICENSE("Dual BSD/GPL"); +-- +2.39.2 + From: Martin Blumenstingl @ 2023-07-09 19:57 UTC (permalink / raw) To: linux-wireless Cc: linux-kernel, jernej.skrabec, pkshih, ulf.hansson, kvalo, diff --git a/patch/misc/rtw88/hack/002-rtw88-usb-make-work-queues-high-priority.patch b/patch/misc/rtw88/hack/002-rtw88-usb-make-work-queues-high-priority.patch index 81f21f48e4..0169963ef6 100644 --- a/patch/misc/rtw88/hack/002-rtw88-usb-make-work-queues-high-priority.patch +++ b/patch/misc/rtw88/hack/002-rtw88-usb-make-work-queues-high-priority.patch @@ -1,14 +1,24 @@ +From 5f7a80c5a42ec153a560bd33241908c59a1b3ac8 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Fri, 21 Jul 2023 17:10:21 -0400 +Subject: [PATCH] rtw88: usb: make work queues high priority + The rtw8822/21cu driver has problems handling high rx or tx rates compared with high load (such as high I/O) on slower systems. Examples: i.MX6 SoloX, NanoPi M1 and similar platforms. https://lore.kernel.org/linux-wireless/20230612134048.321500-1-petter@technux.se/T/#t -Signed-off-by: Patrick Yavitz -diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c ---- a/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-13 14:16:07.696892956 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/usb.c 2023-06-13 14:17:13.026863229 -0400 -@@ -716,7 +716,7 @@ +Signed-off-by: Patrick Yavitz +--- + drivers/net/wireless/realtek/rtw88/usb.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c +index 4a57efdba97b..382268706101 100644 +--- a/drivers/net/wireless/realtek/rtw88/usb.c ++++ b/drivers/net/wireless/realtek/rtw88/usb.c +@@ -723,7 +723,7 @@ static int rtw_usb_init_rx(struct rtw_dev *rtwdev) struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); int i; @@ -17,7 +27,7 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea if (!rtwusb->rxwq) { rtw_err(rtwdev, "failed to create RX work queue\n"); return -ENOMEM; -@@ -750,7 +750,7 @@ +@@ -757,7 +757,7 @@ static int rtw_usb_init_tx(struct rtw_dev *rtwdev) struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev); int i; @@ -26,3 +36,6 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/rea if (!rtwusb->txwq) { rtw_err(rtwdev, "failed to create TX work queue\n"); return -ENOMEM; +-- +2.39.2 + diff --git a/patch/misc/rtw88/hack/003-rtw88-decrease-the-log-level-of-tx-report.patch b/patch/misc/rtw88/hack/003-rtw88-decrease-the-log-level-of-tx-report.patch index 3943894b47..3704dc35a9 100644 --- a/patch/misc/rtw88/hack/003-rtw88-decrease-the-log-level-of-tx-report.patch +++ b/patch/misc/rtw88/hack/003-rtw88-decrease-the-log-level-of-tx-report.patch @@ -1,16 +1,22 @@ -From: Patrick Yavitz @ 2023-06-30 -Subject: v2: rtw88: decrease the log level of tx report +From 0a609e036b7f4a0dfd375dfcce4dffcb5f5a6150 Mon Sep 17 00:00:00 2001 +From: Patrick Yavitz +Date: Fri, 21 Jul 2023 17:13:56 -0400 +Subject: [PATCH] rtw88: decrease the log level of tx report Reduce 'failed to get tx report from firmware' dmesg spam. - https://lore.kernel.org/linux-wireless/20210713104524.47101-1-pkshih@realtek.com/ https://cgit.freebsd.org/src/commit/?id=e140d551b78670fbf99c83a59438cb13de50420f Signed-off-by: Patrick Yavitz -diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c ---- a/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-30 13:28:40.396914119 -0400 -+++ b/drivers/net/wireless/realtek/rtw88/tx.c 2023-06-30 16:57:33.868259352 -0400 -@@ -177,14 +177,16 @@ +--- + drivers/net/wireless/realtek/rtw88/tx.c | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/realtek/rtw88/tx.c +index 2821119dc930..867a1c44dca1 100644 +--- a/drivers/net/wireless/realtek/rtw88/tx.c ++++ b/drivers/net/wireless/realtek/rtw88/tx.c +@@ -177,14 +177,16 @@ void rtw_tx_report_purge_timer(struct timer_list *t) struct rtw_tx_report *tx_report = &rtwdev->tx_report; unsigned long flags; @@ -32,3 +38,6 @@ diff -Naur a/drivers/net/wireless/realtek/rtw88/tx.c b/drivers/net/wireless/real } void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff *skb, u8 sn) +-- +2.39.2 +