forked from Openwrt-EcoNet/openwrt
Renamed 046..051 pending patches with the merged tag/hash. Two patches were skipped, they make use of WQ_BH present since v6.14:13221be720
3e3aa566dd
Manually refreshed 062-v6.14-wifi-rtw88-Add-support-for-LED-blinking.patch Manually refreshed 063-v6.14-wifi-rtw88-add-RTW88_LEDS-depends-on-LEDS_CLASS-to-K.patch Manually backported 090-v6.15-wifi-rtw88-Enable-the-new-RTL8814AE-RTL8814AU-driver.patch git log --no-merges --pretty=oneline --abbrev-commit 4c2c372de...0daa521a drivers/net/wireless/realtek/rtw88: 4c2c372de2e1 wifi: rtw88: fix the 'para' buffer size to avoid reading out of bounds f24d0d8c3cd7 wifi: rtw88: Fix the random "error beacon valid" messages for USB 80fe0bc1659c wifi: rtw88: usb: Upload the firmware in bigger chunks 490340faddea wifi: rtw88: usb: Reduce control message timeout to 500 ms b7f0cc647e52 wifi: rtw88: rtw8822bu VID/PID for BUFFALO WI-U2-866DM 2c17afde9ff6 wifi: rtw88: Handle RTL8723D(S) with blank efuse 0ffa1ba81b35 wifi: rtw88: Fix RX aggregation settings for RTL8723DS 20d3c19bd8f9 wifi: rtw88: do not ignore hardware read error during DPK fc5f5a0ec463 wifi: rtw88: sdio: call rtw_sdio_indicate_tx_status unconditionally b2effcdc2379 wifi: rtw88: sdio: map mgmt frames to queue TX_DESC_QSEL_MGMT 581cf3a9cb61 wifi: rtw88: Fix the module names printed in dmesg b8d49bb8d16a wifi: rtw88: Don't set SUPPORTS_AMSDU_IN_AMPDU for RTL8814AU 0d2a88690e58 wifi: rtw88: Set AMPDU factor to hardware for RTL8814A dcbb7bb3a364 wifi: rtw88: usb: Enable RX aggregation for RTL8814AU bf1103654df9 wifi: rtw88: usb: Enable switching the RTL8814AU to USB 3 625fbc16524a wifi: rtw88: usb: Remove redundant 'flush_workqueue()' calls 5c4cf36c538b wifi: rtw88: sdio: Remove redundant 'flush_workqueue()' calls d58ad77d5cc2 wifi: rtw88: Add __nonstring annotations for unterminated strings deb3ddeb1865 wifi: rtw88: Enable the new RTL8814AE/RTL8814AU drivers bad060e8a425 wifi: rtw88: Add rtw8814au.c dad8e8793102 wifi: rtw88: Add rtw8814ae.c 1a7545784642 wifi: rtw88: Add rtw8814a.{c,h} e38246889cc9 wifi: rtw88: Add rtw8814a_table.c (part 2/2) f4debfcb1b3c wifi: rtw88: Add rtw8814a_table.c (part 1/2) 679ec431477c wifi: rtw88: Add some definitions for RTL8814AU c374281f8285 wifi: rtw88: Extend rtw_debugfs_get_tx_pwr_tbl() for RTL8814AU cfebabdd351e wifi: rtw88: Extend rtw_debugfs_get_phy_info() for RTL8814AU 8b42c46cf665 wifi: rtw88: Extend rtw_phy_config_swing_table() for RTL8814AU 053a7aace020 wifi: rtw88: Fix rtw_rx_phy_stat() for RTL8814AU 6be7544d19fc wifi: rtw88: Fix rtw_init_vht_cap() for RTL8814AU c7eea1ba05ca wifi: rtw88: Fix rtw_init_ht_cap() for RTL8814AU 86d04f8f991a wifi: rtw88: Fix rtw_desc_to_mcsrate() to handle MCS16-31 e66bca16638e wifi: rtw88: Fix rtw_mac_power_switch() for RTL8814AU 80c4668d024f wifi: rtw88: Add support for Mercusys MA30N and D-Link DWA-T185 rev. A1 9f00e2218e15 wifi: rtw88: Fix rtw_update_sta_info() for RTL8814AU 0f98a5959657 wifi: rtw88: Extend TX power stuff for 3-4 spatial streams ad815f392003 wifi: rtw88: Rename RTW_RATE_SECTION_MAX to RTW_RATE_SECTION_NUM e66f3b5c7535 wifi: rtw88: Constify some more structs and arrays 8f0076726b66 wifi: rtw88: Extend rtw_fw_send_ra_info() for RTL8814AU d80e7d9b6ba3 wifi: rtw88: Extend rf_base_addr and rf_sipi_addr for RTL8814AU 62f726848da4 wifi: rtw88: Extend struct rtw_pwr_track_tbl for RTL8814AU 9e8243025cc0 wifi: rtw88: Fix download_firmware_validate() for RTL8814AU 8425f5c8f04d wifi: rtw88: Fix __rtw_download_firmware() for RTL8814AU 105dc94233e4 wifi: rtw88: Fix a typo of debug message in rtw8723d_iqk_check_tx_failed() 0d1d165eff9d wifi: rtw88: Don't use static local variable in rtw8821c_set_tx_power_index_by_rate 00451eb3bec7 wifi: rtw88: Don't use static local variable in rtw8822b_set_tx_power_index_by_rate b4bfbc50b1b9 wifi: rtw88: add RTW88_LEDS depends on LEDS_CLASS to Kconfig 4b6652bc6d8d wifi: rtw88: Add support for LED blinking fb2fcfbe5eef wifi: rtw88: sdio: Fix disconnection after beacon loss a806a8160a0f wifi: rtw88: 8703b: Fix RX/TX issues 5ad483955acc wifi: rtw88: Delete rf_type member of struct rtw_sta_info 5b1b9545262b wifi: rtw88: Add USB PHY configuration not backported (3e3aa566dd18 wifi: rtw88: usb: Preallocate and reuse the RX skbs) not backported (13221be72034 wifi: rtw88: Handle C2H_ADAPTIVITY in rtw_fw_c2h_cmd_handle() ) e9048e2935f7 wifi: rtw88: usb: Copy instead of cloning the RX skb 74a72c367573 wifi: rtw88: 8821a/8812a: Set ptct_efuse_size to 0 59ab27a9f20f wifi: rtw88: 8812a: Support RFE type 2 Signed-off-by: Marty Jones <mj8263788@gmail.com> Link: https://github.com/openwrt/openwrt/pull/19052 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
215 lines
7.1 KiB
Diff
215 lines
7.1 KiB
Diff
From 80fe0bc1659c0ccc79d082e426fa376be5df9c04 Mon Sep 17 00:00:00 2001
|
|
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Date: Sat, 10 May 2025 15:22:24 +0300
|
|
Subject: [PATCH] wifi: rtw88: usb: Upload the firmware in bigger chunks
|
|
|
|
RTL8811AU stops responding during the firmware download on some systems:
|
|
|
|
[ 809.256440] rtw_8821au 5-2.1:1.0: Firmware version 42.4.0, H2C version 0
|
|
[ 812.759142] rtw_8821au 5-2.1:1.0 wlp48s0f4u2u1: renamed from wlan0
|
|
[ 837.315388] rtw_8821au 1-4:1.0: write register 0x1ef4 failed with -110
|
|
[ 867.524259] rtw_8821au 1-4:1.0: write register 0x1ef8 failed with -110
|
|
[ 868.930976] rtw_8821au 5-2.1:1.0 wlp48s0f4u2u1: entered promiscuous mode
|
|
[ 897.730952] rtw_8821au 1-4:1.0: write register 0x1efc failed with -110
|
|
|
|
Maybe it takes too long when writing the firmware 4 bytes at a time.
|
|
|
|
Write 196 bytes at a time for RTL8821AU, RTL8811AU, and RTL8812AU,
|
|
and 254 bytes at a time for RTL8723DU. These are the sizes used in
|
|
their official drivers. Tested with all these chips.
|
|
|
|
Cc: stable@vger.kernel.org
|
|
Link: https://github.com/lwfinger/rtw88/issues/344
|
|
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Acked-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Link: https://patch.msgid.link/43f1daad-3ec0-4a3b-a50c-9cd9eb2c2f52@gmail.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw88/hci.h | 8 ++++
|
|
drivers/net/wireless/realtek/rtw88/mac.c | 11 +++--
|
|
drivers/net/wireless/realtek/rtw88/mac.h | 2 +
|
|
drivers/net/wireless/realtek/rtw88/pci.c | 2 +
|
|
drivers/net/wireless/realtek/rtw88/sdio.c | 2 +
|
|
drivers/net/wireless/realtek/rtw88/usb.c | 55 +++++++++++++++++++++++
|
|
6 files changed, 76 insertions(+), 4 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/hci.h
|
|
+++ b/drivers/net/wireless/realtek/rtw88/hci.h
|
|
@@ -19,6 +19,8 @@ struct rtw_hci_ops {
|
|
void (*link_ps)(struct rtw_dev *rtwdev, bool enter);
|
|
void (*interface_cfg)(struct rtw_dev *rtwdev);
|
|
void (*dynamic_rx_agg)(struct rtw_dev *rtwdev, bool enable);
|
|
+ void (*write_firmware_page)(struct rtw_dev *rtwdev, u32 page,
|
|
+ const u8 *data, u32 size);
|
|
|
|
int (*write_data_rsvd_page)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
|
|
int (*write_data_h2c)(struct rtw_dev *rtwdev, u8 *buf, u32 size);
|
|
@@ -79,6 +81,12 @@ static inline void rtw_hci_dynamic_rx_ag
|
|
rtwdev->hci.ops->dynamic_rx_agg(rtwdev, enable);
|
|
}
|
|
|
|
+static inline void rtw_hci_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
|
|
+ const u8 *data, u32 size)
|
|
+{
|
|
+ rtwdev->hci.ops->write_firmware_page(rtwdev, page, data, size);
|
|
+}
|
|
+
|
|
static inline int
|
|
rtw_hci_write_data_rsvd_page(struct rtw_dev *rtwdev, u8 *buf, u32 size)
|
|
{
|
|
--- a/drivers/net/wireless/realtek/rtw88/mac.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/mac.c
|
|
@@ -856,8 +856,8 @@ fwdl_ready:
|
|
}
|
|
}
|
|
|
|
-static void
|
|
-write_firmware_page(struct rtw_dev *rtwdev, u32 page, const u8 *data, u32 size)
|
|
+void rtw_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
|
|
+ const u8 *data, u32 size)
|
|
{
|
|
u32 val32;
|
|
u32 block_nr;
|
|
@@ -887,6 +887,7 @@ write_firmware_page(struct rtw_dev *rtwd
|
|
rtw_write32(rtwdev, write_addr, le32_to_cpu(remain_data));
|
|
}
|
|
}
|
|
+EXPORT_SYMBOL(rtw_write_firmware_page);
|
|
|
|
static int
|
|
download_firmware_legacy(struct rtw_dev *rtwdev, const u8 *data, u32 size)
|
|
@@ -904,11 +905,13 @@ download_firmware_legacy(struct rtw_dev
|
|
rtw_write8_set(rtwdev, REG_MCUFW_CTRL, BIT_FWDL_CHK_RPT);
|
|
|
|
for (page = 0; page < total_page; page++) {
|
|
- write_firmware_page(rtwdev, page, data, DLFW_PAGE_SIZE_LEGACY);
|
|
+ rtw_hci_write_firmware_page(rtwdev, page, data,
|
|
+ DLFW_PAGE_SIZE_LEGACY);
|
|
data += DLFW_PAGE_SIZE_LEGACY;
|
|
}
|
|
if (last_page_size)
|
|
- write_firmware_page(rtwdev, page, data, last_page_size);
|
|
+ rtw_hci_write_firmware_page(rtwdev, page, data,
|
|
+ last_page_size);
|
|
|
|
if (!check_hw_ready(rtwdev, REG_MCUFW_CTRL, BIT_FWDL_CHK_RPT, 1)) {
|
|
rtw_err(rtwdev, "failed to check download firmware report\n");
|
|
--- a/drivers/net/wireless/realtek/rtw88/mac.h
|
|
+++ b/drivers/net/wireless/realtek/rtw88/mac.h
|
|
@@ -34,6 +34,8 @@ int rtw_pwr_seq_parser(struct rtw_dev *r
|
|
const struct rtw_pwr_seq_cmd * const *cmd_seq);
|
|
int rtw_mac_power_on(struct rtw_dev *rtwdev);
|
|
void rtw_mac_power_off(struct rtw_dev *rtwdev);
|
|
+void rtw_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
|
|
+ const u8 *data, u32 size);
|
|
int rtw_download_firmware(struct rtw_dev *rtwdev, struct rtw_fw_state *fw);
|
|
int rtw_mac_init(struct rtw_dev *rtwdev);
|
|
void rtw_mac_flush_queues(struct rtw_dev *rtwdev, u32 queues, bool drop);
|
|
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
|
@@ -12,6 +12,7 @@
|
|
#include "fw.h"
|
|
#include "ps.h"
|
|
#include "debug.h"
|
|
+#include "mac.h"
|
|
|
|
static bool rtw_disable_msi;
|
|
static bool rtw_pci_disable_aspm;
|
|
@@ -1602,6 +1603,7 @@ static const struct rtw_hci_ops rtw_pci_
|
|
.link_ps = rtw_pci_link_ps,
|
|
.interface_cfg = rtw_pci_interface_cfg,
|
|
.dynamic_rx_agg = NULL,
|
|
+ .write_firmware_page = rtw_write_firmware_page,
|
|
|
|
.read8 = rtw_pci_read8,
|
|
.read16 = rtw_pci_read16,
|
|
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
@@ -10,6 +10,7 @@
|
|
#include <linux/mmc/host.h>
|
|
#include <linux/mmc/sdio_func.h>
|
|
#include "main.h"
|
|
+#include "mac.h"
|
|
#include "debug.h"
|
|
#include "fw.h"
|
|
#include "ps.h"
|
|
@@ -1164,6 +1165,7 @@ static const struct rtw_hci_ops rtw_sdio
|
|
.link_ps = rtw_sdio_link_ps,
|
|
.interface_cfg = rtw_sdio_interface_cfg,
|
|
.dynamic_rx_agg = NULL,
|
|
+ .write_firmware_page = rtw_write_firmware_page,
|
|
|
|
.read8 = rtw_sdio_read8,
|
|
.read16 = rtw_sdio_read16,
|
|
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
|
@@ -165,6 +165,60 @@ static void rtw_usb_write32(struct rtw_d
|
|
rtw_usb_write(rtwdev, addr, val, 4);
|
|
}
|
|
|
|
+static void rtw_usb_write_firmware_page(struct rtw_dev *rtwdev, u32 page,
|
|
+ const u8 *data, u32 size)
|
|
+{
|
|
+ struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
|
|
+ struct usb_device *udev = rtwusb->udev;
|
|
+ u32 addr = FW_START_ADDR_LEGACY;
|
|
+ u8 *data_dup, *buf;
|
|
+ u32 n, block_size;
|
|
+ int ret;
|
|
+
|
|
+ switch (rtwdev->chip->id) {
|
|
+ case RTW_CHIP_TYPE_8723D:
|
|
+ block_size = 254;
|
|
+ break;
|
|
+ default:
|
|
+ block_size = 196;
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ data_dup = kmemdup(data, size, GFP_KERNEL);
|
|
+ if (!data_dup)
|
|
+ return;
|
|
+
|
|
+ buf = data_dup;
|
|
+
|
|
+ rtw_write32_mask(rtwdev, REG_MCUFW_CTRL, BIT_ROM_PGE, page);
|
|
+
|
|
+ while (size > 0) {
|
|
+ if (size >= block_size)
|
|
+ n = block_size;
|
|
+ else if (size >= 8)
|
|
+ n = 8;
|
|
+ else
|
|
+ n = 1;
|
|
+
|
|
+ ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
|
|
+ RTW_USB_CMD_REQ, RTW_USB_CMD_WRITE,
|
|
+ addr, 0, buf, n, 500);
|
|
+ if (ret != n) {
|
|
+ if (ret != -ENODEV)
|
|
+ rtw_err(rtwdev,
|
|
+ "write 0x%x len %d failed: %d\n",
|
|
+ addr, n, ret);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ addr += n;
|
|
+ buf += n;
|
|
+ size -= n;
|
|
+ }
|
|
+
|
|
+ kfree(data_dup);
|
|
+}
|
|
+
|
|
static int dma_mapping_to_ep(enum rtw_dma_mapping dma_mapping)
|
|
{
|
|
switch (dma_mapping) {
|
|
@@ -855,6 +909,7 @@ static const struct rtw_hci_ops rtw_usb_
|
|
.link_ps = rtw_usb_link_ps,
|
|
.interface_cfg = rtw_usb_interface_cfg,
|
|
.dynamic_rx_agg = rtw_usb_dynamic_rx_agg,
|
|
+ .write_firmware_page = rtw_usb_write_firmware_page,
|
|
|
|
.write8 = rtw_usb_write8,
|
|
.write16 = rtw_usb_write16,
|