]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rtw88: not to enter or leave PS under IRQ
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Wed, 2 Oct 2019 02:31:19 +0000 (10:31 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 2 Oct 2019 04:33:41 +0000 (07:33 +0300)
Remove PS related *_irqsafe functions to avoid entering/leaving PS
under interrupt context. Instead, make PS decision in watch_dog.
This could simplify the logic and make the code look clean.

But it could have a little side-effect that if the driver is having
heavy traffic before the every-2-second watch_dog detect the traffic
and decide to leave PS, the thoughput will be lower. Once traffic is
detected by watch_dog and left PS state, the throughput will resume
to the peak the hardware ought to have again.

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/main.h
drivers/net/wireless/realtek/rtw88/ps.c
drivers/net/wireless/realtek/rtw88/ps.h
drivers/net/wireless/realtek/rtw88/rx.c
drivers/net/wireless/realtek/rtw88/tx.c

index 36ba2211faaf71fe5744326c956eb977205060c1..22fc5d6f6b62058dc2c5eb22dab92bd820846264 100644 (file)
@@ -182,6 +182,8 @@ static void rtw_watch_dog_work(struct work_struct *work)
        if (rtw_fw_support_lps &&
            data.rtwvif && !data.active && data.assoc_cnt == 1)
                rtw_enter_lps(rtwdev, data.rtwvif);
        if (rtw_fw_support_lps &&
            data.rtwvif && !data.active && data.assoc_cnt == 1)
                rtw_enter_lps(rtwdev, data.rtwvif);
+       else
+               rtw_leave_lps(rtwdev, rtwdev->lps_conf.rtwvif);
 
        if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
                return;
 
        if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
                return;
@@ -1152,7 +1154,6 @@ int rtw_core_init(struct rtw_dev *rtwdev)
                    rtw_tx_report_purge_timer, 0);
 
        INIT_DELAYED_WORK(&rtwdev->watch_dog_work, rtw_watch_dog_work);
                    rtw_tx_report_purge_timer, 0);
 
        INIT_DELAYED_WORK(&rtwdev->watch_dog_work, rtw_watch_dog_work);
-       INIT_DELAYED_WORK(&rtwdev->lps_work, rtw_lps_work);
        INIT_DELAYED_WORK(&coex->bt_relink_work, rtw_coex_bt_relink_work);
        INIT_DELAYED_WORK(&coex->bt_reenable_work, rtw_coex_bt_reenable_work);
        INIT_DELAYED_WORK(&coex->defreeze_work, rtw_coex_defreeze_work);
        INIT_DELAYED_WORK(&coex->bt_relink_work, rtw_coex_bt_relink_work);
        INIT_DELAYED_WORK(&coex->bt_reenable_work, rtw_coex_bt_reenable_work);
        INIT_DELAYED_WORK(&coex->defreeze_work, rtw_coex_defreeze_work);
index 11ab9967617b0d28c9a77637705325bc77eaa98c..0955970d6f4d3b27df164979ef669d7e4111e58c 100644 (file)
@@ -1361,7 +1361,6 @@ struct rtw_dev {
 
        /* lps power state & handler work */
        struct rtw_lps_conf lps_conf;
 
        /* lps power state & handler work */
        struct rtw_lps_conf lps_conf;
-       struct delayed_work lps_work;
 
        struct dentry *debugfs;
 
 
        struct dentry *debugfs;
 
index 4896953ec4b954a21847f1e9274301d314d67471..ffba3bd7bb316c936822275e783aa8ac7f4b4b94 100644 (file)
@@ -91,50 +91,6 @@ static void rtw_enter_lps_core(struct rtw_dev *rtwdev)
        set_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
 }
 
        set_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
 }
 
-void rtw_lps_work(struct work_struct *work)
-{
-       struct rtw_dev *rtwdev = container_of(work, struct rtw_dev,
-                                             lps_work.work);
-       struct rtw_lps_conf *conf = &rtwdev->lps_conf;
-       struct rtw_vif *rtwvif = conf->rtwvif;
-
-       if (WARN_ON(!rtwvif))
-               return;
-
-       if (conf->mode == RTW_MODE_LPS)
-               rtw_enter_lps_core(rtwdev);
-       else
-               rtw_leave_lps_core(rtwdev);
-}
-
-void rtw_enter_lps_irqsafe(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
-{
-       struct rtw_lps_conf *conf = &rtwdev->lps_conf;
-
-       if (rtwvif->in_lps)
-               return;
-
-       conf->mode = RTW_MODE_LPS;
-       conf->rtwvif = rtwvif;
-       rtwvif->in_lps = true;
-
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->lps_work, 0);
-}
-
-void rtw_leave_lps_irqsafe(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
-{
-       struct rtw_lps_conf *conf = &rtwdev->lps_conf;
-
-       if (!rtwvif->in_lps)
-               return;
-
-       conf->mode = RTW_MODE_ACTIVE;
-       conf->rtwvif = rtwvif;
-       rtwvif->in_lps = false;
-
-       ieee80211_queue_delayed_work(rtwdev->hw, &rtwdev->lps_work, 0);
-}
-
 bool rtw_in_lps(struct rtw_dev *rtwdev)
 {
        return test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
 bool rtw_in_lps(struct rtw_dev *rtwdev)
 {
        return test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
index 09e57405dc1b919e2ad311bcb1a23c4e23849c74..0ac6c2983a061710977675b6398594ab3ba69edb 100644 (file)
@@ -10,9 +10,6 @@
 int rtw_enter_ips(struct rtw_dev *rtwdev);
 int rtw_leave_ips(struct rtw_dev *rtwdev);
 
 int rtw_enter_ips(struct rtw_dev *rtwdev);
 int rtw_leave_ips(struct rtw_dev *rtwdev);
 
-void rtw_lps_work(struct work_struct *work);
-void rtw_enter_lps_irqsafe(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif);
-void rtw_leave_lps_irqsafe(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif);
 void rtw_enter_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif);
 void rtw_leave_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif);
 bool rtw_in_lps(struct rtw_dev *rtwdev);
 void rtw_enter_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif);
 void rtw_leave_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif);
 bool rtw_in_lps(struct rtw_dev *rtwdev);
index 48b9ed49b79af97341c7128f74293f8015267f99..16b22eb57171746ae452d32f781b8f2666e3907d 100644 (file)
@@ -25,8 +25,6 @@ void rtw_rx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
                        rtwvif = (struct rtw_vif *)vif->drv_priv;
                        rtwvif->stats.rx_unicast += skb->len;
                        rtwvif->stats.rx_cnt++;
                        rtwvif = (struct rtw_vif *)vif->drv_priv;
                        rtwvif->stats.rx_unicast += skb->len;
                        rtwvif->stats.rx_cnt++;
-                       if (rtwvif->stats.rx_cnt > RTW_LPS_THRESHOLD)
-                               rtw_leave_lps_irqsafe(rtwdev, rtwvif);
                }
        }
 }
                }
        }
 }
index 8eaa9809ca443964d415d753812a97c13103ac99..91bfd8c28ff7ad5caae20cd23c3c6697f9b9cb89 100644 (file)
@@ -27,8 +27,6 @@ void rtw_tx_stats(struct rtw_dev *rtwdev, struct ieee80211_vif *vif,
                        rtwvif = (struct rtw_vif *)vif->drv_priv;
                        rtwvif->stats.tx_unicast += skb->len;
                        rtwvif->stats.tx_cnt++;
                        rtwvif = (struct rtw_vif *)vif->drv_priv;
                        rtwvif->stats.tx_unicast += skb->len;
                        rtwvif->stats.tx_cnt++;
-                       if (rtwvif->stats.tx_cnt > RTW_LPS_THRESHOLD)
-                               rtw_leave_lps_irqsafe(rtwdev, rtwvif);
                }
        }
 }
                }
        }
 }