wifi: rtw89: coex: Add LPS protocol radio state for RTL8852B
authorChing-Te Ku <ku920601@realtek.com>
Tue, 14 Mar 2023 02:06:13 +0000 (10:06 +0800)
committerKalle Valo <kvalo@kernel.org>
Mon, 3 Apr 2023 13:35:36 +0000 (16:35 +0300)
This LPS state will not turn off RF, and it can still do some basic
traffic, only RTL8852B has the state. Coexistence need let Bluetooth
know WiFi is still alive to prevent some Bluetooth performance issue.

Signed-off-by: Ching-Te Ku <ku920601@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/20230314020617.28193-2-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/coex.h

index 3dbd4ee14c70d32a9d2b0ea82ec2e5e2ee803519..bd06388ea211e4f0bf4c630c0986b04ec4be4da1 100644 (file)
@@ -5728,6 +5728,11 @@ void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_sta
                wl->status.map.lps = BTC_LPS_RF_OFF;
                wl->status.map.busy = 0;
                break;
+       case BTC_RFCTRL_LPS_WL_ON: /* LPS-Protocol (RFon) */
+               wl->status.map.rf_off = 0;
+               wl->status.map.lps = BTC_LPS_RF_ON;
+               wl->status.map.busy = 0;
+               break;
        case BTC_RFCTRL_WL_ON:
        default:
                wl->status.map.rf_off = 0;
@@ -5745,6 +5750,9 @@ void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_sta
                rtw89_btc_fw_en_rpt(rtwdev, RPT_EN_ALL, false);
                if (rf_state == BTC_RFCTRL_WL_OFF)
                        _write_scbd(rtwdev, BTC_WSCB_ALL, false);
+               else if (rf_state == BTC_RFCTRL_LPS_WL_ON &&
+                        wl->status.map.lps_pre != BTC_LPS_OFF)
+                       _update_bt_scbd(rtwdev, true);
        }
 
        btc->dm.cnt_dm[BTC_DCNT_BTCNT_HANG] = 0;
@@ -5755,7 +5763,7 @@ void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_sta
                btc->dm.tdma_instant_excute = 0;
 
        _run_coex(rtwdev, BTC_RSN_NTFY_RADIO_STATE);
-
+       btc->dm.tdma_instant_excute = 0;
        wl->status.map.rf_off_pre = wl->status.map.rf_off;
        wl->status.map.lps_pre = wl->status.map.lps;
 }
index 38cc53a505c3606076b804ae7464c55445b67a22..f16421cb30efb5c73f45d4e211bac72a79722d55 100644 (file)
@@ -131,6 +131,7 @@ enum btc_role_state {
 enum btc_rfctrl {
        BTC_RFCTRL_WL_OFF,
        BTC_RFCTRL_WL_ON,
+       BTC_RFCTRL_LPS_WL_ON,
        BTC_RFCTRL_FW_CTRL,
        BTC_RFCTRL_MAX
 };