Search Linux Wireless

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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Bitterblue Smith <rtl8821cerfe2@xxxxxxxxx> 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@xxxxxxxxx>
> ---
>  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





[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux