]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
rtw88: not to control LPS by each vif
authorYan-Hsuan Chuang <yhchuang@realtek.com>
Wed, 2 Oct 2019 02:31:20 +0000 (10:31 +0800)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 2 Oct 2019 04:33:42 +0000 (07:33 +0300)
The original design of LPS enter/leave routines allows
to control the LPS state by each interface. But the
hardware cannot actually handle it that way. This means
the hardware can only enter LPS once with an associated
port, so there is no need to keep tracking the state of
each vif.

Hence the logic of enter/leave LPS state can be simple,
just to check the state of the device's flag. And for
leaving LPS state, it will get the same port id to send
to inform the hardware.

Signed-off-by: Yan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
drivers/net/wireless/realtek/rtw88/coex.c
drivers/net/wireless/realtek/rtw88/mac80211.c
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

index 4a0b569a6c6b01739e10ebeadb83e835f5f1f39c..9d8cbd91e5ff87f5c5934e1b58378aebef1a19b3 100644 (file)
@@ -810,8 +810,6 @@ static void rtw_coex_ignore_wlan_act(struct rtw_dev *rtwdev, bool enable)
 static void rtw_coex_power_save_state(struct rtw_dev *rtwdev, u8 ps_type,
                                      u8 lps_val, u8 rpwm_val)
 {
-       struct rtw_lps_conf *lps_conf = &rtwdev->lps_conf;
-       struct rtw_vif *rtwvif;
        struct rtw_coex *coex = &rtwdev->coex;
        struct rtw_coex_stat *coex_stat = &coex->stat;
        u8 lps_mode = 0x0;
@@ -823,18 +821,14 @@ static void rtw_coex_power_save_state(struct rtw_dev *rtwdev, u8 ps_type,
                /* recover to original 32k low power setting */
                coex_stat->wl_force_lps_ctrl = false;
 
-               rtwvif = lps_conf->rtwvif;
-               if (rtwvif && rtw_in_lps(rtwdev))
-                       rtw_leave_lps(rtwdev, rtwvif);
+               rtw_leave_lps(rtwdev);
                break;
        case COEX_PS_LPS_OFF:
                coex_stat->wl_force_lps_ctrl = true;
                if (lps_mode)
                        rtw_fw_coex_tdma_type(rtwdev, 0x8, 0, 0, 0, 0);
 
-               rtwvif = lps_conf->rtwvif;
-               if (rtwvif && rtw_in_lps(rtwdev))
-                       rtw_leave_lps(rtwdev, rtwvif);
+               rtw_leave_lps(rtwdev);
                break;
        default:
                break;
index 6d5cce09eb149108f2f19d606f53f461f7c5a3bc..66c05c4925870deffb74d7ef9a828cccc38f18c3 100644 (file)
@@ -464,7 +464,7 @@ static void rtw_ops_sw_scan_start(struct ieee80211_hw *hw,
        struct rtw_vif *rtwvif = (struct rtw_vif *)vif->drv_priv;
        u32 config = 0;
 
-       rtw_leave_lps(rtwdev, rtwvif);
+       rtw_leave_lps(rtwdev);
 
        mutex_lock(&rtwdev->mutex);
 
index 22fc5d6f6b62058dc2c5eb22dab92bd820846264..85d83f154f712045a211745e8d7fcdbd7d18c5af 100644 (file)
@@ -181,9 +181,9 @@ 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);
+               rtw_enter_lps(rtwdev, data.rtwvif->port);
        else
-               rtw_leave_lps(rtwdev, rtwdev->lps_conf.rtwvif);
+               rtw_leave_lps(rtwdev);
 
        if (test_bit(RTW_FLAG_SCANNING, rtwdev->flags))
                return;
index 0955970d6f4d3b27df164979ef669d7e4111e58c..8472134c65b7d796ae019906df3b1ca5fb9a2707 100644 (file)
@@ -533,8 +533,6 @@ enum rtw_pwr_state {
 };
 
 struct rtw_lps_conf {
-       /* the interface to enter lps */
-       struct rtw_vif *rtwvif;
        enum rtw_lps_mode mode;
        enum rtw_pwr_state state;
        u8 awake_interval;
index ffba3bd7bb316c936822275e783aa8ac7f4b4b94..a1541774cf0d344687a83a4eb077c32769d7fed6 100644 (file)
@@ -96,36 +96,27 @@ bool rtw_in_lps(struct rtw_dev *rtwdev)
        return test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags);
 }
 
-void rtw_enter_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
+void rtw_enter_lps(struct rtw_dev *rtwdev, u8 port_id)
 {
        struct rtw_lps_conf *conf = &rtwdev->lps_conf;
 
-       if (WARN_ON(!rtwvif))
-               return;
-
-       if (rtwvif->in_lps)
+       if (test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags))
                return;
 
        conf->mode = RTW_MODE_LPS;
-       conf->rtwvif = rtwvif;
-       rtwvif->in_lps = true;
+       conf->port_id = port_id;
 
        rtw_enter_lps_core(rtwdev);
 }
 
-void rtw_leave_lps(struct rtw_dev *rtwdev, struct rtw_vif *rtwvif)
+void rtw_leave_lps(struct rtw_dev *rtwdev)
 {
        struct rtw_lps_conf *conf = &rtwdev->lps_conf;
 
-       if (WARN_ON(!rtwvif))
-               return;
-
-       if (!rtwvif->in_lps)
+       if (!test_bit(RTW_FLAG_LEISURE_PS, rtwdev->flags))
                return;
 
        conf->mode = RTW_MODE_ACTIVE;
-       conf->rtwvif = rtwvif;
-       rtwvif->in_lps = false;
 
        rtw_leave_lps_core(rtwdev);
 }
index 0ac6c2983a061710977675b6398594ab3ba69edb..d2aae613bca4642766e40b48e8bbe9e7a48b9c44 100644 (file)
@@ -10,8 +10,8 @@
 int rtw_enter_ips(struct rtw_dev *rtwdev);
 int rtw_leave_ips(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);
+void rtw_enter_lps(struct rtw_dev *rtwdev, u8 port_id);
+void rtw_leave_lps(struct rtw_dev *rtwdev);
 bool rtw_in_lps(struct rtw_dev *rtwdev);
 
 #endif