wifi: rtw89: fix long RX latency in low power mode
authorPing-Ke Shih <pkshih@realtek.com>
Fri, 10 Jun 2022 07:26:08 +0000 (15:26 +0800)
committerKalle Valo <kvalo@kernel.org>
Tue, 21 Jun 2022 06:15:48 +0000 (09:15 +0300)
In low power mode, regular IO is power off, so we don't schedule napi to
poll RX and TX completion. Therefore, calling ieee80211_rx_napi() with
napi instance causes long RX latency. To fix this, use NULL as argument,
and then it can use netif_receive_skb_list() to receive.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20220610072610.27095-10-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/core.c

index e6b0732836092331e4835e67a765360ccb4c8c09..a5880a54812e75e09be66c2a23b2e6bbd0a74229 100644 (file)
@@ -1483,11 +1483,17 @@ static void rtw89_core_rx_to_mac80211(struct rtw89_dev *rtwdev,
                                      struct sk_buff *skb_ppdu,
                                      struct ieee80211_rx_status *rx_status)
 {
+       struct napi_struct *napi = &rtwdev->napi;
+
+       /* In low power mode, napi isn't scheduled. Receive it to netif. */
+       if (unlikely(!test_bit(NAPI_STATE_SCHED, &napi->state)))
+               napi = NULL;
+
        rtw89_core_hw_to_sband_rate(rx_status);
        rtw89_core_rx_stats(rtwdev, phy_ppdu, desc_info, skb_ppdu);
        /* In low power mode, it does RX in thread context. */
        local_bh_disable();
-       ieee80211_rx_napi(rtwdev->hw, NULL, skb_ppdu, &rtwdev->napi);
+       ieee80211_rx_napi(rtwdev->hw, NULL, skb_ppdu, napi);
        local_bh_enable();
        rtwdev->napi_budget_countdown--;
 }