]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: coex: Add coexistence policy for hardware scan
authorChing-Te Ku <ku920601@realtek.com>
Wed, 26 Jun 2024 02:31:29 +0000 (10:31 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 2 Jul 2024 11:27:46 +0000 (19:27 +0800)
Add additional policy option to let Bluetooth audio can play well
during Wi-Fi is hardware scanning.

Signed-off-by: Ching-Te Ku <ku920601@realtek.com>
Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20240626023129.7776-1-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/coex.c
drivers/net/wireless/realtek/rtw89/core.h

index d8fc93318a5167599ebca6696943125188b2bbe4..24929ef534e08b0ff81e81c1bc575c34d77ea8bf 100644 (file)
@@ -91,7 +91,7 @@ static const struct rtw89_btc_fbtc_slot s_def[] = {
        [CXST_BLK]      = __DEF_FBTC_SLOT(500, 0x55555555, SLOT_MIX),
        [CXST_E2G]      = __DEF_FBTC_SLOT(0,   0xea5a5a5a, SLOT_MIX),
        [CXST_E5G]      = __DEF_FBTC_SLOT(0,   0xffffffff, SLOT_ISO),
-       [CXST_EBT]      = __DEF_FBTC_SLOT(0,   0xe5555555, SLOT_MIX),
+       [CXST_EBT]      = __DEF_FBTC_SLOT(5,   0xe5555555, SLOT_MIX),
        [CXST_ENULL]    = __DEF_FBTC_SLOT(0,   0xaaaaaaaa, SLOT_ISO),
        [CXST_WLK]      = __DEF_FBTC_SLOT(250, 0xea5a5a5a, SLOT_MIX),
        [CXST_W1FDD]    = __DEF_FBTC_SLOT(50,  0xffffffff, SLOT_ISO),
@@ -3617,6 +3617,7 @@ void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type)
        struct rtw89_btc_wl_info *wl = &btc->cx.wl;
        u8 type, null_role;
        u32 tbl_w1, tbl_b1, tbl_b4;
+       u16 dur_2;
 
        type = FIELD_GET(BTC_CXP_MASK, policy_type);
 
@@ -3727,7 +3728,21 @@ void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type)
                if (hid->exist || hfp->exist)
                        tbl_w1 = cxtbl[16];
 
+               dur_2 = dm->e2g_slot_limit;
+
                switch (policy_type) {
+               case BTC_CXP_OFFE_2GBWISOB: /* for normal-case */
+                       _slot_set(btc, CXST_E2G, 0, tbl_w1, SLOT_ISO);
+                       _slot_set_le(btc, CXST_EBT, s_def[CXST_EBT].dur,
+                                    s_def[CXST_EBT].cxtbl, s_def[CXST_EBT].cxtype);
+                       _slot_set_dur(btc, CXST_EBT, dur_2);
+                       break;
+               case BTC_CXP_OFFE_2GISOB: /* for bt no-link */
+                       _slot_set(btc, CXST_E2G, 0, cxtbl[1], SLOT_ISO);
+                       _slot_set_le(btc, CXST_EBT, s_def[CXST_EBT].dur,
+                                    s_def[CXST_EBT].cxtbl, s_def[CXST_EBT].cxtype);
+                       _slot_set_dur(btc, CXST_EBT, dur_2);
+                       break;
                case BTC_CXP_OFFE_DEF:
                        _slot_set_le(btc, CXST_E2G, s_def[CXST_E2G].dur,
                                     s_def[CXST_E2G].cxtbl, s_def[CXST_E2G].cxtype);
@@ -3747,6 +3762,15 @@ void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type)
                        _slot_set_le(btc, CXST_ENULL, s_def[CXST_ENULL].dur,
                                     s_def[CXST_ENULL].cxtbl, s_def[CXST_ENULL].cxtype);
                        break;
+               case BTC_CXP_OFFE_2GBWMIXB:
+                       _slot_set(btc, CXST_E2G, 0, 0x55555555, SLOT_MIX);
+                       _slot_set_le(btc, CXST_EBT, s_def[CXST_EBT].dur,
+                                    cpu_to_le32(0x55555555), s_def[CXST_EBT].cxtype);
+                       break;
+               case BTC_CXP_OFFE_WL: /* for 4-way */
+                       _slot_set(btc, CXST_E2G, 0, cxtbl[1], SLOT_MIX);
+                       _slot_set(btc, CXST_EBT, 0, cxtbl[1], SLOT_MIX);
+                       break;
                default:
                        break;
                }
index e1bcac7e13242a619f42ab8111d8ac0ec09aa8af..b20a0d5c9e66af8db88a1d139f21c790816efc57 100644 (file)
@@ -1330,6 +1330,7 @@ struct rtw89_btc_wl_smap {
        u32 scan: 1;
        u32 connecting: 1;
        u32 roaming: 1;
+       u32 dbccing: 1;
        u32 transacting: 1;
        u32 _4way: 1;
        u32 rf_off: 1;