mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-04 04:54:18 +00:00
36f6d6ddcd
Backport support for RTL8812AU/RTL8821AU USB adapters Manually backported patch: 045-v6.13-wifi-rtw88-Enable-the-new-RTL8821AU-RTL8812AU-driver Patches from 046 to 051 are pending. Signed-off-by: Marty Jones <mj8263788@gmail.com> Link: https://github.com/openwrt/openwrt/pull/17079 [Move BPAUTO_WANT_DEV_COREDUMP to original patch] Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
64 lines
2.5 KiB
Diff
64 lines
2.5 KiB
Diff
From 57289d30cd2ae315ab9b28213d63d1dbf8570cf3 Mon Sep 17 00:00:00 2001
|
|
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Date: Wed, 23 Oct 2024 17:13:45 +0300
|
|
Subject: [PATCH] wifi: rtw88: Detect beacon loss with chips other than 8822c
|
|
|
|
The driver is supposed to avoid entering LPS (power saving) when there
|
|
is beacon loss, but only RTL8822C detects the beacon loss (because it
|
|
has beacon filtering in the firmware).
|
|
|
|
Detect beacon loss with the other chips by checking if we received less
|
|
than half the expected number of beacons in the last 2-second interval.
|
|
|
|
This gets rid of the occasional "failed to get tx report from firmware"
|
|
warnings with RTL8821AU. It may also avoid some disconnections.
|
|
|
|
Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
|
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
|
|
Link: https://patch.msgid.link/f52b2fcf-bf94-48bc-89bd-e55ebc3a2f2d@gmail.com
|
|
---
|
|
drivers/net/wireless/realtek/rtw88/main.c | 18 ++++++++++++++++++
|
|
1 file changed, 18 insertions(+)
|
|
|
|
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
|
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
|
@@ -202,6 +202,21 @@ static void rtw_vif_watch_dog_iter(void
|
|
rtwvif->stats.rx_cnt = 0;
|
|
}
|
|
|
|
+static void rtw_sw_beacon_loss_check(struct rtw_dev *rtwdev,
|
|
+ struct rtw_vif *rtwvif, int received_beacons)
|
|
+{
|
|
+ int watchdog_delay = 2000000 / 1024; /* TU */
|
|
+ int beacon_int, expected_beacons;
|
|
+
|
|
+ if (rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER) || !rtwvif)
|
|
+ return;
|
|
+
|
|
+ beacon_int = rtwvif_to_vif(rtwvif)->bss_conf.beacon_int;
|
|
+ expected_beacons = DIV_ROUND_UP(watchdog_delay, beacon_int);
|
|
+
|
|
+ rtwdev->beacon_loss = received_beacons < expected_beacons / 2;
|
|
+}
|
|
+
|
|
/* process TX/RX statistics periodically for hardware,
|
|
* the information helps hardware to enhance performance
|
|
*/
|
|
@@ -212,6 +227,7 @@ static void rtw_watch_dog_work(struct wo
|
|
struct rtw_traffic_stats *stats = &rtwdev->stats;
|
|
struct rtw_watch_dog_iter_data data = {};
|
|
bool busy_traffic = test_bit(RTW_FLAG_BUSY_TRAFFIC, rtwdev->flags);
|
|
+ int received_beacons = rtwdev->dm_info.cur_pkt_count.num_bcn_pkt;
|
|
u32 tx_unicast_mbps, rx_unicast_mbps;
|
|
bool ps_active;
|
|
|
|
@@ -270,6 +286,8 @@ static void rtw_watch_dog_work(struct wo
|
|
*/
|
|
rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data);
|
|
|
|
+ rtw_sw_beacon_loss_check(rtwdev, data.rtwvif, received_beacons);
|
|
+
|
|
/* fw supports only one station associated to enter lps, if there are
|
|
* more than two stations associated to the AP, then we can not enter
|
|
* lps, because fw does not handle the overlapped beacon interval
|