Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+7 −2
Original line number Diff line number Diff line
@@ -1203,7 +1203,6 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,

		/* Force GNT_BT to low */
		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) {
			/* tell firmware "no antenna inverse" */
@@ -1211,19 +1210,25 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
			h2c_parameter[1] = 1;  /* ext switch type */
			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
						h2c_parameter);
			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
		} else {
			/* tell firmware "antenna inverse" */
			h2c_parameter[0] = 1;
			h2c_parameter[1] = 1;  /* ext switch type */
			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
						h2c_parameter);
			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
		}
	}

	/* ext switch setting */
	if (use_ext_switch) {
		/* fixed internal switch S1->WiFi, S0->BT */
		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) {
		case BTC_ANT_WIFI_AT_MAIN:
			/* ext switch main at wifi */
+26 −1
Original line number Diff line number Diff line
@@ -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) {
		gl_bt_coexist.board_info.pg_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) {
		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;
	}
}

+1 −1
Original line number Diff line number Diff line
@@ -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_set_bt_exist(bool bt_exist);
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_signal_compensation(struct btc_coexist *btcoexist,
				  u8 *rssi_wifi, u8 *rssi_bt);
+4 −1
Original line number Diff line number Diff line
@@ -72,7 +72,10 @@ void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
		 __func__, 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)