Commit 61d80261 authored by Yan-Hsuan Chuang's avatar Yan-Hsuan Chuang Committed by Kalle Valo

rtlwifi: btcoex: 23b 2ant: detect if bt is slave, and modify tdma

if the bt is slave, it may receive packet at any time, so we
need to mark them as high priority packets to avoid packet loss.
Signed-off-by: default avatarYan-Hsuan Chuang <yhchuang@realtek.com>
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: Pkshih <pkshih@realtek.com>
Cc: Birming Chiu <birming@realtek.com>
Cc: Shaofu <shaofu@realtek.com>
Cc: Steven Ting <steventing@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent 155305f5
......@@ -266,6 +266,7 @@ void btc8723b2ant_limited_rx(struct btc_coexist *btcoexist, bool force_exec,
static void btc8723b2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
{
struct rtl_priv *rtlpriv = btcoexist->adapter;
struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
u32 reg_hp_txrx, reg_lp_txrx, u32tmp;
u32 reg_hp_tx = 0, reg_hp_rx = 0;
u32 reg_lp_tx = 0, reg_lp_rx = 0;
......@@ -286,6 +287,17 @@ static void btc8723b2ant_monitor_bt_ctr(struct btc_coexist *btcoexist)
coex_sta->low_priority_tx = reg_lp_tx;
coex_sta->low_priority_rx = reg_lp_rx;
if ((coex_sta->low_priority_tx > 1050) &&
(!coex_sta->c2h_bt_inquiry_page))
coex_sta->pop_event_cnt++;
if ((coex_sta->low_priority_rx >= 950) &&
(coex_sta->low_priority_rx >= coex_sta->low_priority_tx) &&
(!coex_sta->under_ips))
bt_link_info->slave_role = true;
else
bt_link_info->slave_role = false;
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
"[BTCoex], High Priority Tx/Rx(reg 0x%x)=0x%x(%d)/0x%x(%d)\n",
reg_hp_txrx, reg_hp_tx, reg_hp_tx, reg_hp_rx, reg_hp_rx);
......@@ -1084,6 +1096,8 @@ static void btc8723b2ant_ps_tdma(struct btc_coexist *btcoexist, bool force_exec,
bool turn_on, u8 type)
{
struct rtl_priv *rtlpriv = btcoexist->adapter;
struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
u8 tdma_byte4_modify = 0x0;
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
"[BTCoex], %s turn %s PS TDMA, type=%d\n",
......@@ -1104,75 +1118,92 @@ static void btc8723b2ant_ps_tdma(struct btc_coexist *btcoexist, bool force_exec,
(coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
return;
}
if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
/* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
tdma_byte4_modify = 0x1;
if (turn_on) {
switch (type) {
case 1:
default:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
0x1a, 0xe1, 0x90);
btc8723b2ant_set_fw_ps_tdma(
btcoexist, 0xe3, 0x3c,
0x03, 0xf1, 0x90 | tdma_byte4_modify);
break;
case 2:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
0x12, 0xe1, 0x90);
btc8723b2ant_set_fw_ps_tdma(
btcoexist, 0xe3, 0x2d,
0x03, 0xf1, 0x90 | tdma_byte4_modify);
break;
case 3:
/* This call breaks BT when wireless is active -
* comment it out for now until a better fix is found:
* btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
* 0x3, 0xf1, 0x90);
*/
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
0x3, 0xf1,
0x90 | tdma_byte4_modify);
break;
case 4:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
0x03, 0xf1, 0x90);
0x03, 0xf1,
0x90 | tdma_byte4_modify);
break;
case 5:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
0x1a, 0x60, 0x90);
btc8723b2ant_set_fw_ps_tdma(
btcoexist, 0xe3, 0x3c,
0x3, 0x70, 0x90 | tdma_byte4_modify);
break;
case 6:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
0x12, 0x60, 0x90);
btc8723b2ant_set_fw_ps_tdma(
btcoexist, 0xe3, 0x2d,
0x3, 0x70, 0x90 | tdma_byte4_modify);
break;
case 7:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
0x3, 0x70, 0x90);
0x3, 0x70,
0x90 | tdma_byte4_modify);
break;
case 8:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x10,
0x3, 0x70, 0x90);
0x3, 0x70,
0x90 | tdma_byte4_modify);
break;
case 9:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
0x1a, 0xe1, 0x90);
break;
case 10:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
0x12, 0xe1, 0x90);
btc8723b2ant_set_fw_ps_tdma(
btcoexist, 0xe3, 0x2d,
0x03, 0xf1, 0x90 | tdma_byte4_modify);
break;
case 11:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
0xa, 0xe1, 0x90);
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
0x3, 0xf1,
0x90 | tdma_byte4_modify);
break;
case 12:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
0x5, 0xe1, 0x90);
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
0x3, 0xf1,
0x90 | tdma_byte4_modify);
break;
case 13:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1a,
0x1a, 0x60, 0x90);
btc8723b2ant_set_fw_ps_tdma(
btcoexist, 0xe3, 0x3c,
0x3, 0x70, 0x90 | tdma_byte4_modify);
break;
case 14:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x12,
0x12, 0x60, 0x90);
btc8723b2ant_set_fw_ps_tdma(
btcoexist, 0xe3, 0x2d,
0x3, 0x70, 0x90 | tdma_byte4_modify);
break;
case 15:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
0xa, 0x60, 0x90);
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x1c,
0x3, 0x70,
0x90 | tdma_byte4_modify);
break;
case 16:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x5,
0x5, 0x60, 0x90);
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x10,
0x3, 0x70,
0x90 | tdma_byte4_modify);
break;
case 17:
btc8723b2ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x2f,
......
......@@ -459,6 +459,7 @@ struct btc_bt_link_info {
bool hid_only;
bool pan_exist;
bool pan_only;
bool slave_role;
};
enum btc_antenna_pos {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment