Commit 0d4ae142 authored by Ping-Ke Shih's avatar Ping-Ke Shih Committed by Kalle Valo

rtlwifi: btcoex: 23b 1ant: adjust wifi duration for bt a2dp

The larger the bt a2dp bit pool is, the more time bt needs to receive
them. If we do not adjust the wifi duration, the voice quality will be
low. Hence we reduce the time that wifi holds, to improve the a2dp
service.

If the bt is slave, it may receive a packet at any time, so we
need to mark them as high priority packets in case of packet loss
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: Yan-Hsuan Chuang <yhchuang@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 c01fd117
......@@ -1010,62 +1010,149 @@ static void halbtc8723b1ant_set_ant_path(struct btc_coexist *btcoexist,
static void halbtc8723b1ant_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;
bool wifi_busy = false;
u8 rssi_adjust_val = 0;
u8 ps_tdma_byte0_val = 0x51;
u8 ps_tdma_byte3_val = 0x10;
u8 ps_tdma_byte4_val = 0x50;
s8 wifi_duration_adjust = 0x0;
static bool pre_wifi_busy;
coex_dm->cur_ps_tdma_on = turn_on;
coex_dm->cur_ps_tdma = type;
btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy);
if (!force_exec) {
if (coex_dm->cur_ps_tdma_on)
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
"[BTCoex], ******** TDMA(on, %d) *********\n",
coex_dm->cur_ps_tdma);
else
RT_TRACE(rtlpriv, COMP_BT_COEXIST, DBG_LOUD,
"[BTCoex], ******** TDMA(off, %d) ********\n",
coex_dm->cur_ps_tdma);
if (wifi_busy != pre_wifi_busy) {
force_exec = true;
pre_wifi_busy = wifi_busy;
}
if (!force_exec) {
if ((coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on) &&
(coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma))
return;
}
if (coex_sta->scan_ap_num <= 5) {
wifi_duration_adjust = 5;
if (coex_sta->a2dp_bit_pool >= 35)
wifi_duration_adjust = -10;
else if (coex_sta->a2dp_bit_pool >= 45)
wifi_duration_adjust = -15;
} else if (coex_sta->scan_ap_num >= 40) {
wifi_duration_adjust = -15;
if (coex_sta->a2dp_bit_pool < 35)
wifi_duration_adjust = -5;
else if (coex_sta->a2dp_bit_pool < 45)
wifi_duration_adjust = -10;
} else if (coex_sta->scan_ap_num >= 20) {
wifi_duration_adjust = -10;
if (coex_sta->a2dp_bit_pool >= 45)
wifi_duration_adjust = -15;
} else {
wifi_duration_adjust = 0;
if (coex_sta->a2dp_bit_pool >= 35)
wifi_duration_adjust = -10;
else if (coex_sta->a2dp_bit_pool >= 45)
wifi_duration_adjust = -15;
}
if ((type == 1) || (type == 2) || (type == 9) || (type == 11) ||
(type == 101) || (type == 102) || (type == 109) || (type == 101)) {
if (!coex_sta->force_lps_on) {
/* Native power save TDMA, only for A2DP-only case
* 1/2/9/11 while wifi noisy threshold > 30
*/
/* no null-pkt */
ps_tdma_byte0_val = 0x61;
/* no tx-pause at BT-slot */
ps_tdma_byte3_val = 0x11;
/* 0x778 = d/1 toggle, no dynamic slot */
ps_tdma_byte4_val = 0x10;
} else {
/* null-pkt */
ps_tdma_byte0_val = 0x51;
/* tx-pause at BT-slot */
ps_tdma_byte3_val = 0x10;
/* 0x778 = d/1 toggle, dynamic slot */
ps_tdma_byte4_val = 0x50;
}
} else if ((type == 3) || (type == 13) || (type == 14) ||
(type == 103) || (type == 113) || (type == 114)) {
/* null-pkt */
ps_tdma_byte0_val = 0x51;
/* tx-pause at BT-slot */
ps_tdma_byte3_val = 0x10;
/* 0x778 = d/1 toggle, no dynamic slot */
ps_tdma_byte4_val = 0x10;
} else { /* native power save case */
/* no null-pkt */
ps_tdma_byte0_val = 0x61;
/* no tx-pause at BT-slot */
ps_tdma_byte3_val = 0x11;
/* 0x778 = d/1 toggle, no dynamic slot */
ps_tdma_byte4_val = 0x11;
/* psTdmaByte4Va is not define for 0x778 = d/1, 1/1 case */
}
/* if (bt_link_info->slave_role) */
if ((bt_link_info->slave_role) && (bt_link_info->a2dp_exist))
/* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */
ps_tdma_byte4_val = ps_tdma_byte4_val | 0x1;
if (type > 100) {
/* set antenna control by SW */
ps_tdma_byte0_val = ps_tdma_byte0_val | 0x82;
/* set antenna no toggle, control by antenna diversity */
ps_tdma_byte3_val = ps_tdma_byte3_val | 0x60;
}
if (turn_on) {
switch (type) {
default:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1a,
0x1a, 0x0, 0x50);
0x1a, 0x0,
ps_tdma_byte4_val);
break;
case 1:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x3a,
0x03, 0x10, 0x50);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val,
0x3a + wifi_duration_adjust, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
rssi_adjust_val = 11;
break;
case 2:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x2b,
0x03, 0x10, 0x50);
rssi_adjust_val = 14;
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val,
0x2d + wifi_duration_adjust, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 3:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x1d,
0x1d, 0x0, 0x52);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x30, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 4:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
0x3, 0x14, 0x0);
rssi_adjust_val = 17;
break;
case 5:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x15,
0x3, 0x11, 0x10);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x1f, 0x3,
ps_tdma_byte3_val, 0x11);
break;
case 6:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x20,
0x3, 0x11, 0x13);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
ps_tdma_byte3_val, 0x11);
break;
case 7:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xc,
......@@ -1076,30 +1163,41 @@ static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
0x3, 0x10, 0x0);
break;
case 9:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x21,
0x3, 0x10, 0x50);
rssi_adjust_val = 18;
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 10:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
0xa, 0x0, 0x40);
break;
case 11:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
0x03, 0x10, 0x50);
rssi_adjust_val = 20;
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 12:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x0a,
0x0a, 0x0, 0x50);
break;
case 13:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x15,
0x15, 0x0, 0x50);
if (coex_sta->scan_ap_num <= 3)
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x40, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
else
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 14:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x21,
0x3, 0x10, 0x52);
if (coex_sta->scan_ap_num <= 3)
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, 0x51, 0x30, 0x3, 0x10, 0x50);
else
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 15:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x13, 0xa,
......@@ -1108,49 +1206,44 @@ static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
case 16:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x15,
0x3, 0x10, 0x0);
rssi_adjust_val = 18;
break;
case 18:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x93, 0x25,
0x3, 0x10, 0x0);
rssi_adjust_val = 14;
break;
case 20:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x35,
0x03, 0x11, 0x10);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
ps_tdma_byte3_val, 0x10);
break;
case 21:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
0x03, 0x11, 0x11);
break;
case 22:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0x25,
0x03, 0x11, 0x10);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
ps_tdma_byte3_val, 0x10);
break;
case 23:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
0x3, 0x31, 0x18);
rssi_adjust_val = 22;
break;
case 24:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x15,
0x3, 0x31, 0x18);
rssi_adjust_val = 22;
break;
case 25:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
0x3, 0x31, 0x18);
rssi_adjust_val = 22;
break;
case 26:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0xa,
0x3, 0x31, 0x18);
rssi_adjust_val = 22;
break;
case 27:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xe3, 0x25,
0x3, 0x31, 0x98);
rssi_adjust_val = 22;
break;
case 28:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x69, 0x25,
......@@ -1161,20 +1254,22 @@ static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
0x1a, 0x1, 0x10);
break;
case 30:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x14,
0x3, 0x10, 0x50);
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x51, 0x30,
0x3, 0x10, 0x10);
break;
case 31:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x1a,
0x1a, 0, 0x58);
break;
case 32:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x61, 0xa,
0x3, 0x10, 0x0);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 33:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xa3, 0x25,
0x3, 0x30, 0x90);
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x35, 0x3,
ps_tdma_byte3_val, 0x10);
break;
case 34:
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x53, 0x1a,
......@@ -1188,16 +1283,88 @@ static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0xd3, 0x12,
0x3, 0x14, 0x50);
break;
/* SoftAP only with no sta associated, BT disable,
* TDMA mode for power saving
* here softap mode screen off will cost 70-80mA for phone
*/
case 40:
/* SoftAP only with no sta associated,BT disable ,TDMA
* mode for power saving
*
* here softap mode screen off will cost 70-80mA for
* phone
*/
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x23, 0x18,
0x00, 0x10, 0x24);
break;
case 101:
/* for 1-Ant translate to 2-Ant */
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val,
0x3a + wifi_duration_adjust, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 102:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val,
0x2d + wifi_duration_adjust, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 103:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x3a, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 105:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x15, 0x3,
ps_tdma_byte3_val, 0x11);
break;
case 106:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x20, 0x3,
ps_tdma_byte3_val, 0x11);
break;
case 109:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 111:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 113:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 114:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x21, 0x3,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 120:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x3f, 0x03,
ps_tdma_byte3_val, 0x10);
break;
case 122:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
ps_tdma_byte3_val, 0x10);
break;
case 132:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
ps_tdma_byte3_val, ps_tdma_byte4_val);
break;
case 133:
halbtc8723b1ant_set_fw_ps_tdma(
btcoexist, ps_tdma_byte0_val, 0x25, 0x03,
ps_tdma_byte3_val, 0x11);
break;
}
} else {
/* disable PS tdma */
switch (type) {
case 8: /* PTA Control */
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x8, 0x0,
......@@ -1212,19 +1379,10 @@ static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist,
/* Software control, Antenna at BT side */
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
0x0, 0x0, 0x0);
halbtc8723b1ant_set_ant_path(btcoexist,
BTC_ANT_PATH_BT,
FORCE_EXEC,
false, false);
break;
case 9:
/* Software control, Antenna at WiFi side */
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0,
0x0, 0x0, 0x0);
halbtc8723b1ant_set_ant_path(btcoexist,
BTC_ANT_PATH_WIFI,
FORCE_EXEC,
false, false);
case 1: /* 2-Ant, 0x778=3, antenna control by ant diversity */
halbtc8723b1ant_set_fw_ps_tdma(btcoexist, 0x0, 0x0, 0x0,
0x48, 0x0);
break;
}
}
......@@ -1620,6 +1778,10 @@ static void halbtc8723b1ant_action_wifi_connected_bt_acl_busy(
{
struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
if ((coex_sta->low_priority_rx >= 950) && (!coex_sta->under_ips))
bt_link_info->slave_role = true;
else
bt_link_info->slave_role = false;
if (bt_link_info->hid_only) { /* HID */
btc8723b1ant_act_bt_sco_hid_only_busy(btcoexist, wifi_status);
......
......@@ -180,6 +180,8 @@ struct coex_sta_8723b_1ant {
bool cck_lock;
bool pre_ccklock;
u8 a2dp_bit_pool;
};
/*************************************************************************
......
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