This contains the following commits: ``` git log --oneline v6.12.52...v6.12.61 -- drivers/net/wireless/ net/mac80211/ net/wireless/ a1eb56723b32 wifi: ath12k: correctly handle mcast packets for clients c0a9c2c1b7b9 wifi: mac80211: use wiphy_hrtimer_work for csa.switch_work d4caee32a9f8 wifi: cfg80211: add an hrtimer based delayed work item 6455948c8aab wifi: mac80211: reject address change while connecting 80dc5a2ce5b7 wifi: ath11k: Clear affinity hint before calling ath11k_pcic_free_irq() in error path acd24d509227 wifi: mac80211: skip rate verification for not captured PSDUs 53cf801b8555 wifi: ath11k: zero init info->status in wmi_process_mgmt_tx_comp() e8fa86b0bd96 wifi: mac80211_hwsim: Limit destroy_on_close radio removal to netgroup 77d4afd6c78b Revert "wifi: ath10k: avoid unnecessary wait for service ready message" 07d862c7de3d wifi: ath12k: Increase DP_REO_CMD_RING_SIZE to 256 522734fc807c wifi: mac80211: Track NAN interface start/stop 8db790c2491e wifi: ath10k: Fix connection after GTK rekeying 72f1984246e6 wifi: rtw89: renew a completion for each H2C command waiting C2H event 336da4414300 wifi: rtw89: obtain RX path from ppdu status IE00 da91687f01f4 wifi: mt76: mt7996: fix memory leak on mt7996_mcu_sta_key_tlv error a534dd44b70e wifi: mt76: mt76_eeprom_override to int aa5ed215cfe8 wifi: mt76: mt7996: Temporarily disable EPCS efe2ef24feab wifi: mt76: mt7921: Add 160MHz beamformee capability for mt7922 device 5de410dfb4d9 wifi: mac80211: Fix HE capabilities element check f157d1cb2cdc wifi: iwlwifi: fw: Add ASUS to PPAG and TAS list c9df78e84e85 wifi: mac80211: Fix 6 GHz Band capabilities element advertisement in lower bands 958234997dd5 wifi: rtw89: fix BSSID comparison for non-transmitted BSSID ca18975c4de2 wifi: rtw89: wow: remove notify during WoWLAN net-detect bc1ca06998c1 wifi: rtw88: sdio: use indirect IO for device registers before power-on 8ebef59d0294 wifi: rtw89: print just once for unknown C2H events 5596a90c8952 wifi: mac80211: fix key tailroom accounting leak 23b8682f05ec wifi: mac80211: don't mark keys for inactive links as uploaded e3373f10c6a6 wifi: ath11k: avoid bit operation on key flags 50f50dd024b4 wifi: ath11k: add support for MU EDCA 2a6cd5951ba8 wifi: ath12k: free skb during idr cleanup callback 775e37df2acc wifi: ath11k: Add missing platform IDs for quirk table c4840991ee4c wifi: ath10k: Fix memory leak on unsupported WMI command a6eed58249e7 wifi: brcmfmac: fix crash while sending Action Frames in standalone AP Mode 57100b87c778 wifi: ath12k: fix read pointer after free in ath12k_mac_assign_vif_to_vdev() 4a63523d3541 wifi: cfg80211: Add missing lock in cfg80211_check_and_end_cac() e9fd43b799d2 wifi: rtw89: avoid possible TX wait initialization race b419093e5e42 wifi: mt76: mt7921u: Add VID/PID for Netgear A7500 feb1774aaf85 wifi: mt76: mt7925u: Add VID/PID for Netgear A9000 bd3ac455a88d wifi: ath11k: HAL SRNG: don't deinitialize and re-initialize again 8055133a9f64 wifi: rtw89: avoid circular locking dependency in ser_state_run() 1c873416758f wifi: mac80211: fix Rx packet handling when pubsta information is not available 6e7d9fa61d7d wifi: ath10k: avoid unnecessary wait for service ready message 8d4f6ab4c53e wifi: ath12k: fix wrong logging ID used for CE fc00890c55e3 wifi: mt76: mt7915: fix mt7981 pre-calibration e18c4e6ba36c wifi: mt76: mt7996: Convert mt7996_wed_rro_addr to LE f481404a9826 wifi: mt76: mt7996: Fix RX packets configuration for primary WED device 57519239c76c wifi: mt76: fix potential memory leak in mt76_wmac_probe() 27c8e2e4b56f wifi: iwlwifi: Remove redundant header files 605402433eb8 wifi: mwifiex: send world regulatory domain to driver ``` The removed patch was added upstream. Link: https://github.com/openwrt/openwrt/pull/21134 Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
195 lines
7.9 KiB
Diff
195 lines
7.9 KiB
Diff
From c7706b1173c77185a2ef40c7d1811021566563f3 Mon Sep 17 00:00:00 2001
|
|
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Date: Wed, 23 Oct 2024 17:10:32 +0300
|
|
Subject: [PATCH] wifi: rtw88: Enable data rate fallback for older chips
|
|
|
|
RTL8811AU fails to perform the 4-way handshake when the AP is too far
|
|
because it transmits the EAPOL frames at MCS9 and when that doesn't
|
|
work it retries 48 times with the same rate, to no avail.
|
|
|
|
Retrying 48 times with the same rate seems pointless. Set the
|
|
appropriate field in the TX descriptor to allow it to use lower rates
|
|
when retrying.
|
|
|
|
Set it for RTL8723D and RTL8703B because they interpret this field the
|
|
same way as RTL8811A.
|
|
|
|
The newer RTL8822C, RTL8822B, RTL8821C seem to interpret this field in
|
|
the TX descriptor differently, so leave it alone for those chips.
|
|
|
|
Tested with RTL8811AU and RTL8723DU.
|
|
|
|
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Link: https://patch.msgid.link/2b3e3e6f-541b-4a3b-8ca3-65b267e6a95a@gmail.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw88/fw.c | 2 +-
|
|
drivers/net/wireless/realtek/rtw88/main.h | 1 +
|
|
drivers/net/wireless/realtek/rtw88/pci.c | 2 +-
|
|
drivers/net/wireless/realtek/rtw88/rtw8703b.c | 1 +
|
|
drivers/net/wireless/realtek/rtw88/rtw8723d.c | 1 +
|
|
drivers/net/wireless/realtek/rtw88/rtw8821c.c | 1 +
|
|
drivers/net/wireless/realtek/rtw88/rtw8822b.c | 1 +
|
|
drivers/net/wireless/realtek/rtw88/rtw8822c.c | 1 +
|
|
drivers/net/wireless/realtek/rtw88/sdio.c | 2 +-
|
|
drivers/net/wireless/realtek/rtw88/tx.c | 6 +++++-
|
|
drivers/net/wireless/realtek/rtw88/tx.h | 4 +++-
|
|
drivers/net/wireless/realtek/rtw88/usb.c | 4 ++--
|
|
12 files changed, 19 insertions(+), 7 deletions(-)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/fw.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/fw.c
|
|
@@ -1290,7 +1290,7 @@ static void rtw_fill_rsvd_page_desc(stru
|
|
rtw_tx_rsvd_page_pkt_info_update(rtwdev, &pkt_info, skb, type);
|
|
pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
|
|
memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
|
|
- rtw_tx_fill_tx_desc(&pkt_info, skb);
|
|
+ rtw_tx_fill_tx_desc(rtwdev, &pkt_info, skb);
|
|
}
|
|
|
|
static inline u8 rtw_len_to_page(unsigned int len, u8 page_size)
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.h
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.h
|
|
@@ -1204,6 +1204,7 @@ struct rtw_chip_info {
|
|
u8 usb_tx_agg_desc_num;
|
|
bool hw_feature_report;
|
|
u8 c2h_ra_report_size;
|
|
+ bool old_datarate_fb_limit;
|
|
|
|
u8 default_1ss_tx_path;
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/pci.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/pci.c
|
|
@@ -825,7 +825,7 @@ static int rtw_pci_tx_write_data(struct
|
|
pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
|
|
memset(pkt_desc, 0, tx_pkt_desc_sz);
|
|
pkt_info->qsel = rtw_pci_get_tx_qsel(skb, queue);
|
|
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
|
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
|
dma = dma_map_single(&rtwpci->pdev->dev, skb->data, skb->len,
|
|
DMA_TO_DEVICE);
|
|
if (dma_mapping_error(&rtwpci->pdev->dev, dma))
|
|
--- a/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/rtw8703b.c
|
|
@@ -1964,6 +1964,7 @@ const struct rtw_chip_info rtw8703b_hw_s
|
|
.usb_tx_agg_desc_num = 1, /* Not sure if this chip has USB interface */
|
|
.hw_feature_report = true,
|
|
.c2h_ra_report_size = 7,
|
|
+ .old_datarate_fb_limit = true,
|
|
|
|
.path_div_supported = false,
|
|
.ht_supported = true,
|
|
--- a/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/rtw8723d.c
|
|
@@ -2135,6 +2135,7 @@ const struct rtw_chip_info rtw8723d_hw_s
|
|
.usb_tx_agg_desc_num = 1,
|
|
.hw_feature_report = true,
|
|
.c2h_ra_report_size = 7,
|
|
+ .old_datarate_fb_limit = true,
|
|
.ht_supported = true,
|
|
.vht_supported = false,
|
|
.lps_deep_mode_supported = 0,
|
|
--- a/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/rtw8821c.c
|
|
@@ -1972,6 +1972,7 @@ const struct rtw_chip_info rtw8821c_hw_s
|
|
.usb_tx_agg_desc_num = 3,
|
|
.hw_feature_report = true,
|
|
.c2h_ra_report_size = 7,
|
|
+ .old_datarate_fb_limit = false,
|
|
.ht_supported = true,
|
|
.vht_supported = true,
|
|
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
|
--- a/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822b.c
|
|
@@ -2515,6 +2515,7 @@ const struct rtw_chip_info rtw8822b_hw_s
|
|
.usb_tx_agg_desc_num = 3,
|
|
.hw_feature_report = true,
|
|
.c2h_ra_report_size = 7,
|
|
+ .old_datarate_fb_limit = false,
|
|
.ht_supported = true,
|
|
.vht_supported = true,
|
|
.lps_deep_mode_supported = BIT(LPS_DEEP_MODE_LCLK),
|
|
--- a/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/rtw8822c.c
|
|
@@ -5334,6 +5334,7 @@ const struct rtw_chip_info rtw8822c_hw_s
|
|
.usb_tx_agg_desc_num = 3,
|
|
.hw_feature_report = true,
|
|
.c2h_ra_report_size = 7,
|
|
+ .old_datarate_fb_limit = false,
|
|
.default_1ss_tx_path = BB_PATH_A,
|
|
.path_div_supported = true,
|
|
.ht_supported = true,
|
|
--- a/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/sdio.c
|
|
@@ -866,7 +866,7 @@ static void rtw_sdio_tx_skb_prepare(stru
|
|
|
|
pkt_info->qsel = rtw_sdio_get_tx_qsel(rtwdev, skb, queue);
|
|
|
|
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
|
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
|
rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, pkt_desc);
|
|
}
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/tx.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/tx.c
|
|
@@ -32,7 +32,8 @@ void rtw_tx_stats(struct rtw_dev *rtwdev
|
|
}
|
|
}
|
|
|
|
-void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
|
+void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,
|
|
+ struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb)
|
|
{
|
|
struct rtw_tx_desc *tx_desc = (struct rtw_tx_desc *)skb->data;
|
|
bool more_data = false;
|
|
@@ -67,6 +68,9 @@ void rtw_tx_fill_tx_desc(struct rtw_tx_p
|
|
|
|
tx_desc->w4 = le32_encode_bits(pkt_info->rate, RTW_TX_DESC_W4_DATARATE);
|
|
|
|
+ if (rtwdev->chip->old_datarate_fb_limit)
|
|
+ tx_desc->w4 |= le32_encode_bits(0x1f, RTW_TX_DESC_W4_DATARATE_FB_LIMIT);
|
|
+
|
|
tx_desc->w5 = le32_encode_bits(pkt_info->short_gi, RTW_TX_DESC_W5_DATA_SHORT) |
|
|
le32_encode_bits(pkt_info->bw, RTW_TX_DESC_W5_DATA_BW) |
|
|
le32_encode_bits(pkt_info->ldpc, RTW_TX_DESC_W5_DATA_LDPC) |
|
|
--- a/drivers/net/wireless/realtek/rtw88/tx.h
|
|
+++ b/drivers/net/wireless/realtek/rtw88/tx.h
|
|
@@ -44,6 +44,7 @@ struct rtw_tx_desc {
|
|
#define RTW_TX_DESC_W3_NAVUSEHDR BIT(15)
|
|
#define RTW_TX_DESC_W3_MAX_AGG_NUM GENMASK(21, 17)
|
|
#define RTW_TX_DESC_W4_DATARATE GENMASK(6, 0)
|
|
+#define RTW_TX_DESC_W4_DATARATE_FB_LIMIT GENMASK(12, 8)
|
|
#define RTW_TX_DESC_W4_RTSRATE GENMASK(28, 24)
|
|
#define RTW_TX_DESC_W5_DATA_SHORT BIT(4)
|
|
#define RTW_TX_DESC_W5_DATA_BW GENMASK(6, 5)
|
|
@@ -94,7 +95,8 @@ void rtw_tx_pkt_info_update(struct rtw_d
|
|
struct rtw_tx_pkt_info *pkt_info,
|
|
struct ieee80211_sta *sta,
|
|
struct sk_buff *skb);
|
|
-void rtw_tx_fill_tx_desc(struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb);
|
|
+void rtw_tx_fill_tx_desc(struct rtw_dev *rtwdev,
|
|
+ struct rtw_tx_pkt_info *pkt_info, struct sk_buff *skb);
|
|
void rtw_tx_report_enqueue(struct rtw_dev *rtwdev, struct sk_buff *skb, u8 sn);
|
|
void rtw_tx_report_handle(struct rtw_dev *rtwdev, struct sk_buff *skb, int src);
|
|
void rtw_tx_rsvd_page_pkt_info_update(struct rtw_dev *rtwdev,
|
|
--- a/drivers/net/wireless/realtek/rtw88/usb.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/usb.c
|
|
@@ -512,7 +512,7 @@ static int rtw_usb_write_data(struct rtw
|
|
skb_put_data(skb, buf, size);
|
|
skb_push(skb, chip->tx_pkt_desc_sz);
|
|
memset(skb->data, 0, chip->tx_pkt_desc_sz);
|
|
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
|
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
|
rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
|
|
|
|
ret = rtw_usb_write_port(rtwdev, qsel, skb,
|
|
@@ -579,7 +579,7 @@ static int rtw_usb_tx_write(struct rtw_d
|
|
pkt_desc = skb_push(skb, chip->tx_pkt_desc_sz);
|
|
memset(pkt_desc, 0, chip->tx_pkt_desc_sz);
|
|
ep = qsel_to_ep(rtwusb, pkt_info->qsel);
|
|
- rtw_tx_fill_tx_desc(pkt_info, skb);
|
|
+ rtw_tx_fill_tx_desc(rtwdev, pkt_info, skb);
|
|
rtw_tx_fill_txdesc_checksum(rtwdev, pkt_info, skb->data);
|
|
tx_data = rtw_usb_get_tx_data(skb);
|
|
tx_data->sn = pkt_info->sn;
|