wifi: rtw88: 8821a: Regularly ask for BT info updates

JIRA: https://issues.redhat.com/browse/RHEL-79791

commit bfcee5ee924fc5f706d20f5dc31586ca47912304
Author: Bitterblue Smith <rtl8821cerfe2@gmail.com>
Date:   Wed Oct 23 17:14:45 2024 +0300

    wifi: rtw88: 8821a: Regularly ask for BT info updates
    
    The RTL8821AU firmware sends C2H_BT_INFO by itself when bluetooth
    headphones are connected, but not when they are disconnected. This leads
    to the coexistence code still using the A2DP algorithm long after the
    headphones are disconnected, which means the wifi speeds are much lower
    than they should be. Work around this by asking for updates every two
    seconds if the chip is RTL8821AU.
    
    Signed-off-by: Bitterblue Smith <rtl8821cerfe2@gmail.com>
    Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
    Link: https://patch.msgid.link/358acdd2-6aae-46c1-9c66-fcce4e700b96@gmail.com

Signed-off-by: Jose Ignacio Tornos Martinez <jtornosm@redhat.com>
This commit is contained in:
Jose Ignacio Tornos Martinez 2025-04-16 17:18:14 +02:00
parent 768d75fc5a
commit 87d26ccbbf
3 changed files with 13 additions and 1 deletions

View File

@ -446,7 +446,7 @@ static void rtw_coex_check_rfk(struct rtw_dev *rtwdev)
}
}
static void rtw_coex_query_bt_info(struct rtw_dev *rtwdev)
void rtw_coex_query_bt_info(struct rtw_dev *rtwdev)
{
struct rtw_coex *coex = &rtwdev->coex;
struct rtw_coex_stat *coex_stat = &coex->stat;

View File

@ -384,6 +384,7 @@ u32 rtw_coex_read_indirect_reg(struct rtw_dev *rtwdev, u16 addr);
void rtw_coex_write_indirect_reg(struct rtw_dev *rtwdev, u16 addr,
u32 mask, u32 val);
void rtw_coex_write_scbd(struct rtw_dev *rtwdev, u16 bitpos, bool set);
void rtw_coex_query_bt_info(struct rtw_dev *rtwdev);
void rtw_coex_bt_relink_work(struct work_struct *work);
void rtw_coex_bt_reenable_work(struct work_struct *work);
@ -419,4 +420,14 @@ static inline bool rtw_coex_disabled(struct rtw_dev *rtwdev)
return coex_stat->bt_disabled;
}
static inline void rtw_coex_active_query_bt_info(struct rtw_dev *rtwdev)
{
/* The RTL8821AU firmware doesn't send C2H_BT_INFO by itself
* when bluetooth headphones are disconnected, so we have to
* ask for it regularly.
*/
if (rtwdev->chip->id == RTW_CHIP_TYPE_8821A && rtwdev->efuse.btcoex)
rtw_coex_query_bt_info(rtwdev);
}
#endif

View File

@ -274,6 +274,7 @@ static void rtw_watch_dog_work(struct work_struct *work)
rtw_leave_lps(rtwdev);
rtw_coex_wl_status_check(rtwdev);
rtw_coex_query_bt_hid_list(rtwdev);
rtw_coex_active_query_bt_info(rtwdev);
rtw_phy_dynamic_mechanism(rtwdev);