Commit baa17022 authored by Larry Finger's avatar Larry Finger Committed by Kalle Valo

rtlwifi: btcoexist: Implement antenna selection

The previous patch added an option to rtl8723be to manually select the
antenna for those cases when only a single antenna is present, and the
on-board EEPROM is incorrectly programmed. This patch implements the
necessary changes in the Bluetooth coexistence driver.
Signed-off-by: default avatarLarry Finger <Larry.Finger@lwfinger.net>
Cc: Stable <stable@vger.kernel.org> [V4.0+]
Signed-off-by: default avatarKalle Valo <kvalo@codeaurora.org>
parent c18d8f50
...@@ -1203,7 +1203,6 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist, ...@@ -1203,7 +1203,6 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
/* Force GNT_BT to low */ /* Force GNT_BT to low */
btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0); btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) { if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
/* tell firmware "no antenna inverse" */ /* tell firmware "no antenna inverse" */
...@@ -1211,19 +1210,25 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist, ...@@ -1211,19 +1210,25 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
h2c_parameter[1] = 1; /* ext switch type */ h2c_parameter[1] = 1; /* ext switch type */
btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
h2c_parameter); h2c_parameter);
btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
} else { } else {
/* tell firmware "antenna inverse" */ /* tell firmware "antenna inverse" */
h2c_parameter[0] = 1; h2c_parameter[0] = 1;
h2c_parameter[1] = 1; /* ext switch type */ h2c_parameter[1] = 1; /* ext switch type */
btcoexist->btc_fill_h2c(btcoexist, 0x65, 2, btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
h2c_parameter); h2c_parameter);
btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
} }
} }
/* ext switch setting */ /* ext switch setting */
if (use_ext_switch) { if (use_ext_switch) {
/* fixed internal switch S1->WiFi, S0->BT */ /* fixed internal switch S1->WiFi, S0->BT */
btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0); if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
else
btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
switch (antpos_type) { switch (antpos_type) {
case BTC_ANT_WIFI_AT_MAIN: case BTC_ANT_WIFI_AT_MAIN:
/* ext switch main at wifi */ /* ext switch main at wifi */
......
...@@ -965,13 +965,38 @@ void exhalbtc_set_chip_type(u8 chip_type) ...@@ -965,13 +965,38 @@ void exhalbtc_set_chip_type(u8 chip_type)
} }
} }
void exhalbtc_set_ant_num(u8 type, u8 ant_num) void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num)
{ {
if (BT_COEX_ANT_TYPE_PG == type) { if (BT_COEX_ANT_TYPE_PG == type) {
gl_bt_coexist.board_info.pg_ant_num = ant_num; gl_bt_coexist.board_info.pg_ant_num = ant_num;
gl_bt_coexist.board_info.btdm_ant_num = ant_num; gl_bt_coexist.board_info.btdm_ant_num = ant_num;
/* The antenna position:
* Main (default) or Aux for pgAntNum=2 && btdmAntNum =1.
* The antenna position should be determined by
* auto-detect mechanism.
* The following is assumed to main,
* and those must be modified
* if y auto-detect mechanism is ready
*/
if ((gl_bt_coexist.board_info.pg_ant_num == 2) &&
(gl_bt_coexist.board_info.btdm_ant_num == 1))
gl_bt_coexist.board_info.btdm_ant_pos =
BTC_ANTENNA_AT_MAIN_PORT;
else
gl_bt_coexist.board_info.btdm_ant_pos =
BTC_ANTENNA_AT_MAIN_PORT;
} else if (BT_COEX_ANT_TYPE_ANTDIV == type) { } else if (BT_COEX_ANT_TYPE_ANTDIV == type) {
gl_bt_coexist.board_info.btdm_ant_num = ant_num; gl_bt_coexist.board_info.btdm_ant_num = ant_num;
gl_bt_coexist.board_info.btdm_ant_pos =
BTC_ANTENNA_AT_MAIN_PORT;
} else if (type == BT_COEX_ANT_TYPE_DETECTED) {
gl_bt_coexist.board_info.btdm_ant_num = ant_num;
if (rtlpriv->cfg->mod_params->ant_sel == 1)
gl_bt_coexist.board_info.btdm_ant_pos =
BTC_ANTENNA_AT_AUX_PORT;
else
gl_bt_coexist.board_info.btdm_ant_pos =
BTC_ANTENNA_AT_MAIN_PORT;
} }
} }
......
...@@ -535,7 +535,7 @@ void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version); ...@@ -535,7 +535,7 @@ void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version);
void exhalbtc_update_min_bt_rssi(char bt_rssi); void exhalbtc_update_min_bt_rssi(char bt_rssi);
void exhalbtc_set_bt_exist(bool bt_exist); void exhalbtc_set_bt_exist(bool bt_exist);
void exhalbtc_set_chip_type(u8 chip_type); void exhalbtc_set_chip_type(u8 chip_type);
void exhalbtc_set_ant_num(u8 type, u8 ant_num); void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num);
void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist); void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist);
void exhalbtc_signal_compensation(struct btc_coexist *btcoexist, void exhalbtc_signal_compensation(struct btc_coexist *btcoexist,
u8 *rssi_wifi, u8 *rssi_bt); u8 *rssi_wifi, u8 *rssi_bt);
......
...@@ -72,7 +72,10 @@ void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv) ...@@ -72,7 +72,10 @@ void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
__func__, bt_type); __func__, bt_type);
exhalbtc_set_chip_type(bt_type); exhalbtc_set_chip_type(bt_type);
exhalbtc_set_ant_num(BT_COEX_ANT_TYPE_PG, ant_num); if (rtlpriv->cfg->mod_params->ant_sel == 1)
exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_DETECTED, 1);
else
exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_PG, ant_num);
} }
void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv) void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv)
......
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