mirror of
https://github.com/openwrt/openwrt.git
synced 2025-01-06 05:54:25 +00:00
68 lines
2.6 KiB
Diff
68 lines
2.6 KiB
Diff
|
From bfcee5ee924fc5f706d20f5dc31586ca47912304 Mon Sep 17 00:00:00 2001
|
||
|
From: Bitterblue Smith <rtl8821cerfe2@gmail.com>
|
||
|
Date: Wed, 23 Oct 2024 17:14:45 +0300
|
||
|
Subject: [PATCH] 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
|
||
|
---
|
||
|
drivers/net/wireless/realtek/rtw88/coex.c | 2 +-
|
||
|
drivers/net/wireless/realtek/rtw88/coex.h | 11 +++++++++++
|
||
|
drivers/net/wireless/realtek/rtw88/main.c | 1 +
|
||
|
3 files changed, 13 insertions(+), 1 deletion(-)
|
||
|
|
||
|
--- a/drivers/net/wireless/realtek/rtw88/coex.c
|
||
|
+++ b/drivers/net/wireless/realtek/rtw88/coex.c
|
||
|
@@ -446,7 +446,7 @@ static void rtw_coex_check_rfk(struct rt
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-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;
|
||
|
--- a/drivers/net/wireless/realtek/rtw88/coex.h
|
||
|
+++ b/drivers/net/wireless/realtek/rtw88/coex.h
|
||
|
@@ -384,6 +384,7 @@ u32 rtw_coex_read_indirect_reg(struct rt
|
||
|
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(str
|
||
|
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
|
||
|
--- a/drivers/net/wireless/realtek/rtw88/main.c
|
||
|
+++ b/drivers/net/wireless/realtek/rtw88/main.c
|
||
|
@@ -274,6 +274,7 @@ static void rtw_watch_dog_work(struct wo
|
||
|
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);
|
||
|
|