wifi: rtw88: disallow PS during AP mode
authorPo-Hao Huang <phhuang@realtek.com>
Fri, 14 Apr 2023 12:11:31 +0000 (20:11 +0800)
committerKalle Valo <kvalo@kernel.org>
Thu, 20 Apr 2023 12:33:47 +0000 (15:33 +0300)
Firmware can't support PS mode during AP mode, so disallow this case.

Signed-off-by: Po-Hao Huang <phhuang@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Signed-off-by: Kalle Valo <kvalo@kernel.org>
Link: https://lore.kernel.org/r/20230414121135.17828-5-pkshih@realtek.com
drivers/net/wireless/realtek/rtw88/mac80211.c
drivers/net/wireless/realtek/rtw88/main.c
drivers/net/wireless/realtek/rtw88/main.h

index 19c4d7c..1ced57b 100644 (file)
@@ -449,12 +449,24 @@ static int rtw_ops_start_ap(struct ieee80211_hw *hw,
        const struct rtw_chip_info *chip = rtwdev->chip;
 
        mutex_lock(&rtwdev->mutex);
+       rtwdev->ap_active = true;
        chip->ops->phy_calibration(rtwdev);
        mutex_unlock(&rtwdev->mutex);
 
        return 0;
 }
 
+static void rtw_ops_stop_ap(struct ieee80211_hw *hw,
+                           struct ieee80211_vif *vif,
+                           struct ieee80211_bss_conf *link_conf)
+{
+       struct rtw_dev *rtwdev = hw->priv;
+
+       mutex_lock(&rtwdev->mutex);
+       rtwdev->ap_active = false;
+       mutex_unlock(&rtwdev->mutex);
+}
+
 static int rtw_ops_conf_tx(struct ieee80211_hw *hw,
                           struct ieee80211_vif *vif,
                           unsigned int link_id, u16 ac,
@@ -916,6 +928,7 @@ const struct ieee80211_ops rtw_ops = {
        .configure_filter       = rtw_ops_configure_filter,
        .bss_info_changed       = rtw_ops_bss_info_changed,
        .start_ap               = rtw_ops_start_ap,
+       .stop_ap                = rtw_ops_stop_ap,
        .conf_tx                = rtw_ops_conf_tx,
        .sta_add                = rtw_ops_sta_add,
        .sta_remove             = rtw_ops_sta_remove,
index abebccd..4537513 100644 (file)
@@ -257,7 +257,7 @@ static void rtw_watch_dog_work(struct work_struct *work)
         * threshold.
         */
        if (rtwdev->ps_enabled && data.rtwvif && !ps_active &&
-           !rtwdev->beacon_loss)
+           !rtwdev->beacon_loss && !rtwdev->ap_active)
                rtw_enter_lps(rtwdev, data.rtwvif->port);
 
        rtwdev->watch_dog_cnt++;
index 532c562..b04ed19 100644 (file)
@@ -2058,6 +2058,7 @@ struct rtw_dev {
 
        bool need_rfk;
        struct completion fw_scan_density;
+       bool ap_active;
 
        /* hci related data, must be last */
        u8 priv[] __aligned(sizeof(void *));