Commit 37a59b94 authored by Ching-Te Ku's avatar Ching-Te Ku Committed by Kalle Valo

rtw88: coex: modified for BT info notify

Add counter to count BT info C2H command for debug usage.
It could present the C2H channel situation.

Fix BT IQK state decision condition for counting.
The original condition is wrong, it would cause coexistence mechanism
going to the wrong strategy.

New format supports getting TDMA parameter from WL firmware, since
coexistence needs current TDMA parameter to decide strategy.

Remove unnecessary operations about scoreboard, it is not a must for
current version.
Signed-off-by: default avatarChing-Te Ku <ku920601@realtek.com>
Signed-off-by: default avatarPing-Ke Shih <pkshih@realtek.com>
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20201109085909.9143-8-pkshih@realtek.com
parent 32c3a8c7
......@@ -2335,17 +2335,19 @@ void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
struct rtw_coex *coex = &rtwdev->coex;
struct rtw_coex_stat *coex_stat = &coex->stat;
struct rtw_chip_info *chip = rtwdev->chip;
struct rtw_coex_dm *coex_dm = &coex->dm;
u32 bt_relink_time;
u8 i, rsp_source = 0, type;
bool inq_page = false;
rsp_source = buf[0] & 0xf;
if (rsp_source >= COEX_BTINFO_SRC_MAX)
rsp_source = COEX_BTINFO_SRC_WL_FW;
return;
coex_stat->cnt_bt_info_c2h[rsp_source]++;
if (rsp_source == COEX_BTINFO_SRC_BT_IQK) {
coex_stat->bt_iqk_state = buf[1];
if (coex_stat->bt_iqk_state == 1)
if (coex_stat->bt_iqk_state == 0)
coex_stat->cnt_bt[COEX_CNT_BT_IQK]++;
else if (coex_stat->bt_iqk_state == 2)
coex_stat->cnt_bt[COEX_CNT_BT_IQKFAIL]++;
......@@ -2362,6 +2364,17 @@ void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
return;
}
if (rsp_source == COEX_BTINFO_SRC_H2C60) {
for (i = 1; i <= COEX_WL_TDMA_PARA_LENGTH; i++)
coex_dm->fw_tdma_para[i - 1] = buf[i];
return;
}
if (rsp_source == COEX_BTINFO_SRC_WL_FW) {
rtw_coex_update_bt_link_info(rtwdev);
return;
}
if (rsp_source == COEX_BTINFO_SRC_BT_RSP ||
rsp_source == COEX_BTINFO_SRC_BT_ACT) {
if (coex_stat->bt_disabled) {
......@@ -2373,19 +2386,16 @@ void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
}
}
for (i = 0; i < length; i++) {
if (i < COEX_BTINFO_LENGTH_MAX)
coex_stat->bt_info_c2h[rsp_source][i] = buf[i];
else
break;
}
if (length != COEX_BTINFO_LENGTH) {
rtw_dbg(rtwdev, RTW_DBG_COEX,
"[BTCoex], Bt_info length = %d invalid!!\n", length);
if (rsp_source == COEX_BTINFO_SRC_WL_FW) {
rtw_coex_update_bt_link_info(rtwdev);
rtw_coex_run_coex(rtwdev, COEX_RSN_BTINFO);
return;
}
for (i = 0; i < COEX_BTINFO_LENGTH; i++)
coex_stat->bt_info_c2h[rsp_source][i] = buf[i];
/* get the same info from bt, skip it */
if (coex_stat->bt_info_c2h[rsp_source][1] == coex_stat->bt_info_lb2 &&
coex_stat->bt_info_c2h[rsp_source][2] == coex_stat->bt_info_lb3 &&
......@@ -2446,17 +2456,8 @@ void rtw_coex_bt_info_notify(struct rtw_dev *rtwdev, u8 *buf, u8 length)
coex_stat->cnt_bt[COEX_CNT_BT_INQ]++;
coex_stat->bt_page = ((coex_stat->bt_info_lb3 & BIT(7)) == BIT(7));
if (coex_stat->bt_page) {
if (coex_stat->bt_page)
coex_stat->cnt_bt[COEX_CNT_BT_PAGE]++;
if (coex_stat->wl_linkscan_proc ||
coex_stat->wl_hi_pri_task1 ||
coex_stat->wl_hi_pri_task2 || coex_stat->wl_gl_busy)
rtw_coex_write_scbd(rtwdev, COEX_SCBD_SCAN, true);
else
rtw_coex_write_scbd(rtwdev, COEX_SCBD_SCAN, false);
} else {
rtw_coex_write_scbd(rtwdev, COEX_SCBD_SCAN, false);
}
/* unit: % (value-100 to translate to unit: dBm in coex info) */
if (chip->bt_rssi_type == COEX_BTRSSI_RATIO) {
......
......@@ -1241,6 +1241,8 @@ struct rtw_coex_rfe {
bool wlg_at_btg;
};
#define COEX_WL_TDMA_PARA_LENGTH 5
struct rtw_coex_dm {
bool cur_ps_tdma_on;
bool cur_wl_rx_low_gain_en;
......@@ -1260,6 +1262,7 @@ struct rtw_coex_dm {
u32 cur_ant_pos_type;
u32 cur_switch_status;
u32 setting_tdma;
u8 fw_tdma_para[COEX_WL_TDMA_PARA_LENGTH];
};
#define COEX_BTINFO_SRC_WL_FW 0x0
......@@ -1267,7 +1270,8 @@ struct rtw_coex_dm {
#define COEX_BTINFO_SRC_BT_ACT 0x2
#define COEX_BTINFO_SRC_BT_IQK 0x3
#define COEX_BTINFO_SRC_BT_SCBD 0x4
#define COEX_BTINFO_SRC_MAX 0x5
#define COEX_BTINFO_SRC_H2C60 0x5
#define COEX_BTINFO_SRC_MAX 0x6
#define COEX_INFO_FTP BIT(7)
#define COEX_INFO_A2DP BIT(6)
......@@ -1278,6 +1282,7 @@ struct rtw_coex_dm {
#define COEX_INFO_SCO_ESCO BIT(1)
#define COEX_INFO_CONNECTION BIT(0)
#define COEX_BTINFO_LENGTH_MAX 10
#define COEX_BTINFO_LENGTH 7
struct rtw_coex_stat {
bool bt_disabled;
......@@ -1364,6 +1369,9 @@ struct rtw_coex_stat {
/* counters to record wifi states */
u32 cnt_wl[COEX_CNT_WL_MAX];
/* counters to record bt c2h data */
u32 cnt_bt_info_c2h[COEX_BTINFO_SRC_MAX];
u32 darfrc;
u32 darfrch;
};
......
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