]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
wifi: rtw89: coex: update scoreboard value according to power state for two BT
authorPing-Ke Shih <pkshih@realtek.com>
Thu, 8 Jan 2026 12:03:09 +0000 (20:03 +0800)
committerPing-Ke Shih <pkshih@realtek.com>
Tue, 13 Jan 2026 02:19:48 +0000 (10:19 +0800)
Assign timeslot to WiFi if power state is on. Since firmware isn't working
at this moment, write scoreboard register to notify BT. Extend the code to
support two BT for coming chips.

Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
Link: https://patch.msgid.link/20260108120320.2217402-3-pkshih@realtek.com
drivers/net/wireless/realtek/rtw89/mac.c

index 1a53824f58b55718fc239d51312d203e3d41f2ae..be478540f742ab9530d942ac3048c14bf285a162 100644 (file)
@@ -1492,13 +1492,27 @@ static int rtw89_mac_pwr_off_func_for_unplugged(struct rtw89_dev *rtwdev)
        return 0;
 }
 
+static void rtw89_mac_update_scoreboard(struct rtw89_dev *rtwdev, u8 val)
+{
+       const struct rtw89_chip_info *chip = rtwdev->chip;
+       u32 reg;
+       int i;
+
+       for (i = 0; i < ARRAY_SIZE(chip->btc_sb.n); i++) {
+               reg = chip->btc_sb.n[i].cfg;
+               if (!reg)
+                       continue;
+
+               rtw89_write8(rtwdev, reg + 3, val);
+       }
+}
+
 static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
 {
        const struct rtw89_mac_gen_def *mac = rtwdev->chip->mac_def;
        const struct rtw89_chip_info *chip = rtwdev->chip;
        const struct rtw89_pwr_cfg * const *cfg_seq;
        int (*cfg_func)(struct rtw89_dev *rtwdev);
-       u32 reg = chip->btc_sb.n[0].cfg;
        int ret;
 
        rtw89_mac_power_switch_boot_mode(rtwdev);
@@ -1538,14 +1552,16 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)
                set_bit(RTW89_FLAG_POWERON, rtwdev->flags);
                set_bit(RTW89_FLAG_DMAC_FUNC, rtwdev->flags);
                set_bit(RTW89_FLAG_CMAC0_FUNC, rtwdev->flags);
-               rtw89_write8(rtwdev, reg + 3, MAC_AX_NOTIFY_TP_MAJOR);
+
+               rtw89_mac_update_scoreboard(rtwdev, MAC_AX_NOTIFY_TP_MAJOR);
        } else {
                clear_bit(RTW89_FLAG_POWERON, rtwdev->flags);
                clear_bit(RTW89_FLAG_DMAC_FUNC, rtwdev->flags);
                clear_bit(RTW89_FLAG_CMAC0_FUNC, rtwdev->flags);
                clear_bit(RTW89_FLAG_CMAC1_FUNC, rtwdev->flags);
                clear_bit(RTW89_FLAG_FW_RDY, rtwdev->flags);
-               rtw89_write8(rtwdev, reg + 3, MAC_AX_NOTIFY_PWR_MAJOR);
+
+               rtw89_mac_update_scoreboard(rtwdev, MAC_AX_NOTIFY_PWR_MAJOR);
                rtw89_set_entity_state(rtwdev, RTW89_PHY_0, false);
                rtw89_set_entity_state(rtwdev, RTW89_PHY_1, false);
        }