diff mbox series

[12/20] wifi: rtw88: Detect beacon loss with chips other than 8822c

Message ID aea73a7a-e791-4475-bde6-500d9f3cb2ae@gmail.com
State New
Headers show
Series wifi: rtw88: Add support for RTL8821AU and RTL8812AU | expand

Commit Message

Bitterblue Smith Aug. 11, 2024, 9:02 p.m. UTC
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>
---
 drivers/net/wireless/realtek/rtw88/main.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Ping-Ke Shih Aug. 15, 2024, 7:16 a.m. UTC | #1
Bitterblue Smith <rtl8821cerfe2@gmail.com> wrote:
> 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>
> ---
>  drivers/net/wireless/realtek/rtw88/main.c | 11 +++++++++++
>  1 file changed, 11 insertions(+)
> 
> diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
> index 3806e57400fb..62d9abc04a34 100644
> --- a/drivers/net/wireless/realtek/rtw88/main.c
> +++ b/drivers/net/wireless/realtek/rtw88/main.c
> @@ -254,6 +254,8 @@ static void rtw_watch_dog_work(struct work_struct *work)
>         if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
>                 goto unlock;
> 
> +       int received_beacons = rtwdev->dm_info.cur_pkt_count.num_bcn_pkt;
> +

Though currently compiler doesn't warn arbitrarily declare variables, we still
should declare it on top of functions.

>         /* make sure BB/RF is working for dynamic mech */
>         rtw_leave_lps(rtwdev);
>         rtw_coex_wl_status_check(rtwdev);
> @@ -270,6 +272,15 @@ static void rtw_watch_dog_work(struct work_struct *work)
>          */
>         rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data);
> 
> +       if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER) &&
> +           data.rtwvif) {
> +               int beacon_int = rtwvif_to_vif(data.rtwvif)->bss_conf.beacon_int;
> +               int watchdog_delay = 2000000 / 1024; /* TU */
> +               int expected_beacons = DIV_ROUND_UP(watchdog_delay, beacon_int);
> +
> +               rtwdev->beacon_loss = received_beacons < expected_beacons / 2;
> +       }
> +

Please move to an individual function such as rtw_sw_beacon_loss_check().


>         /* 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
> --
> 2.46.0
diff mbox series

Patch

diff --git a/drivers/net/wireless/realtek/rtw88/main.c b/drivers/net/wireless/realtek/rtw88/main.c
index 3806e57400fb..62d9abc04a34 100644
--- a/drivers/net/wireless/realtek/rtw88/main.c
+++ b/drivers/net/wireless/realtek/rtw88/main.c
@@ -254,6 +254,8 @@  static void rtw_watch_dog_work(struct work_struct *work)
 	if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
 		goto unlock;
 
+	int received_beacons = rtwdev->dm_info.cur_pkt_count.num_bcn_pkt;
+
 	/* make sure BB/RF is working for dynamic mech */
 	rtw_leave_lps(rtwdev);
 	rtw_coex_wl_status_check(rtwdev);
@@ -270,6 +272,15 @@  static void rtw_watch_dog_work(struct work_struct *work)
 	 */
 	rtw_iterate_vifs(rtwdev, rtw_vif_watch_dog_iter, &data);
 
+	if (!rtw_fw_feature_check(&rtwdev->fw, FW_FEATURE_BCN_FILTER) &&
+	    data.rtwvif) {
+		int beacon_int = rtwvif_to_vif(data.rtwvif)->bss_conf.beacon_int;
+		int watchdog_delay = 2000000 / 1024; /* TU */
+		int expected_beacons = DIV_ROUND_UP(watchdog_delay, beacon_int);
+
+		rtwdev->beacon_loss = received_beacons < expected_beacons / 2;
+	}
+
 	/* 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