42f1b26
From c18d8f5095715c56bb3cd9cba64242542632054b Mon Sep 17 00:00:00 2001
42f1b26
From: Larry Finger <Larry.Finger@lwfinger.net>
42f1b26
Date: Wed, 16 Mar 2016 13:33:34 -0500
42f1b26
Subject: rtlwifi: rtl8723be: Add antenna select module parameter
42f1b26
42f1b26
A number of new laptops have been delivered with only a single antenna.
42f1b26
In principle, this is OK; however, a problem arises when the on-board
42f1b26
EEPROM is programmed to use the other antenna connection. The option
42f1b26
of opening the computer and moving the connector is not always possible
42f1b26
as it will void the warranty in some cases. In addition, this solution
42f1b26
breaks the Windows driver when the box dual boots Linux and Windows.
42f1b26
42f1b26
A fix involving a new module parameter has been developed.  This commit
42f1b26
adds the new parameter and implements the changes needed for the driver.
42f1b26
42f1b26
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
42f1b26
Cc: Stable <stable@vger.kernel.org> [V4.0+]
42f1b26
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
42f1b26
---
42f1b26
 drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | 5 +++++
42f1b26
 drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c | 3 +++
42f1b26
 drivers/net/wireless/realtek/rtlwifi/wifi.h         | 3 +++
42f1b26
 3 files changed, 11 insertions(+)
42f1b26
42f1b26
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
42f1b26
index c983d2f..5a3df91 100644
42f1b26
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
42f1b26
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
42f1b26
@@ -2684,6 +2684,7 @@ void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
42f1b26
 					      bool auto_load_fail, u8 *hwinfo)
42f1b26
 {
42f1b26
 	struct rtl_priv *rtlpriv = rtl_priv(hw);
42f1b26
+	struct rtl_mod_params *mod_params = rtlpriv->cfg->mod_params;
42f1b26
 	u8 value;
42f1b26
 	u32 tmpu_32;
42f1b26
 
42f1b26
@@ -2702,6 +2703,10 @@ void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
42f1b26
 		rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
42f1b26
 	}
42f1b26
 
42f1b26
+	/* override ant_num / ant_path */
42f1b26
+	if (mod_params->ant_sel)
42f1b26
+		rtlpriv->btcoexist.btc_info.ant_num =
42f1b26
+			(mod_params->ant_sel == 1 ? ANT_X2 : ANT_X1);
42f1b26
 }
42f1b26
 
42f1b26
 void rtl8723be_bt_reg_init(struct ieee80211_hw *hw)
42f1b26
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
42f1b26
index a78eaed..2101793 100644
42f1b26
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
42f1b26
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
42f1b26
@@ -273,6 +273,7 @@ static struct rtl_mod_params rtl8723be_mod_params = {
42f1b26
 	.msi_support = false,
42f1b26
 	.disable_watchdog = false,
42f1b26
 	.debug = DBG_EMERG,
42f1b26
+	.ant_sel = 0,
42f1b26
 };
42f1b26
 
42f1b26
 static struct rtl_hal_cfg rtl8723be_hal_cfg = {
42f1b26
@@ -394,6 +395,7 @@ module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444);
42f1b26
 module_param_named(msi, rtl8723be_mod_params.msi_support, bool, 0444);
42f1b26
 module_param_named(disable_watchdog, rtl8723be_mod_params.disable_watchdog,
42f1b26
 		   bool, 0444);
42f1b26
+module_param_named(ant_sel, rtl8723be_mod_params.ant_sel, int, 0444);
42f1b26
 MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
42f1b26
 MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
42f1b26
 MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
42f1b26
@@ -402,6 +404,7 @@ MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n");
42f1b26
 MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
42f1b26
 MODULE_PARM_DESC(disable_watchdog,
42f1b26
 		 "Set to 1 to disable the watchdog (default 0)\n");
42f1b26
+MODULE_PARM_DESC(ant_sel, "Set to 1 or 2 to force antenna number (default 0)\n");
42f1b26
 
42f1b26
 static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
42f1b26
 
42f1b26
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
42f1b26
index 554d814..93bd7fc 100644
42f1b26
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
42f1b26
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
42f1b26
@@ -2246,6 +2246,9 @@ struct rtl_mod_params {
42f1b26
 
42f1b26
 	/* default 0: 1 means do not disable interrupts */
42f1b26
 	bool int_clear;
42f1b26
+
42f1b26
+	/* select antenna */
42f1b26
+	int ant_sel;
42f1b26
 };
42f1b26
 
42f1b26
 struct rtl_hal_usbint_cfg {
42f1b26
-- 
42f1b26
cgit v0.12
42f1b26
42f1b26
From baa1702290953295e421f0f433e2b1ff4815827c Mon Sep 17 00:00:00 2001
42f1b26
From: Larry Finger <Larry.Finger@lwfinger.net>
42f1b26
Date: Wed, 16 Mar 2016 13:33:35 -0500
42f1b26
Subject: rtlwifi: btcoexist: Implement antenna selection
42f1b26
42f1b26
The previous patch added an option to rtl8723be to manually select the
42f1b26
antenna for those cases when only a single antenna is present, and the
42f1b26
on-board EEPROM is incorrectly programmed. This patch implements the
42f1b26
necessary changes in the Bluetooth coexistence driver.
42f1b26
42f1b26
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
42f1b26
Cc: Stable <stable@vger.kernel.org> [V4.0+]
42f1b26
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
42f1b26
---
42f1b26
 .../realtek/rtlwifi/btcoexist/halbtc8723b2ant.c    |  9 ++++++--
42f1b26
 .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c       | 27 +++++++++++++++++++++-
42f1b26
 .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h       |  2 +-
42f1b26
 .../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c   |  5 +++-
42f1b26
 4 files changed, 38 insertions(+), 5 deletions(-)
42f1b26
42f1b26
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c
42f1b26
index c43ab59..77cbd10 100644
42f1b26
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c
42f1b26
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c
42f1b26
@@ -1203,7 +1203,6 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
42f1b26
 
42f1b26
 		/* Force GNT_BT to low */
42f1b26
 		btcoexist->btc_write_1byte_bitmask(btcoexist, 0x765, 0x18, 0x0);
42f1b26
-		btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
42f1b26
 
42f1b26
 		if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT) {
42f1b26
 			/* tell firmware "no antenna inverse" */
42f1b26
@@ -1211,19 +1210,25 @@ static void btc8723b2ant_set_ant_path(struct btc_coexist *btcoexist,
42f1b26
 			h2c_parameter[1] = 1;  /* ext switch type */
42f1b26
 			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
42f1b26
 						h2c_parameter);
42f1b26
+			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
42f1b26
 		} else {
42f1b26
 			/* tell firmware "antenna inverse" */
42f1b26
 			h2c_parameter[0] = 1;
42f1b26
 			h2c_parameter[1] = 1;  /* ext switch type */
42f1b26
 			btcoexist->btc_fill_h2c(btcoexist, 0x65, 2,
42f1b26
 						h2c_parameter);
42f1b26
+			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
42f1b26
 		}
42f1b26
 	}
42f1b26
 
42f1b26
 	/* ext switch setting */
42f1b26
 	if (use_ext_switch) {
42f1b26
 		/* fixed internal switch S1->WiFi, S0->BT */
42f1b26
-		btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
42f1b26
+		if (board_info->btdm_ant_pos == BTC_ANTENNA_AT_MAIN_PORT)
42f1b26
+			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x0);
42f1b26
+		else
42f1b26
+			btcoexist->btc_write_2byte(btcoexist, 0x948, 0x280);
42f1b26
+
42f1b26
 		switch (antpos_type) {
42f1b26
 		case BTC_ANT_WIFI_AT_MAIN:
42f1b26
 			/* ext switch main at wifi */
42f1b26
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
42f1b26
index b2791c8..babd149 100644
42f1b26
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
42f1b26
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
42f1b26
@@ -965,13 +965,38 @@ void exhalbtc_set_chip_type(u8 chip_type)
42f1b26
 	}
42f1b26
 }
42f1b26
 
42f1b26
-void exhalbtc_set_ant_num(u8 type, u8 ant_num)
42f1b26
+void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num)
42f1b26
 {
42f1b26
 	if (BT_COEX_ANT_TYPE_PG == type) {
42f1b26
 		gl_bt_coexist.board_info.pg_ant_num = ant_num;
42f1b26
 		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
42f1b26
+		/* The antenna position:
42f1b26
+		 * Main (default) or Aux for pgAntNum=2 && btdmAntNum =1.
42f1b26
+		 * The antenna position should be determined by
42f1b26
+		 * auto-detect mechanism.
42f1b26
+		 * The following is assumed to main,
42f1b26
+		 * and those must be modified
42f1b26
+		 * if y auto-detect mechanism is ready
42f1b26
+		 */
42f1b26
+		if ((gl_bt_coexist.board_info.pg_ant_num == 2) &&
42f1b26
+		    (gl_bt_coexist.board_info.btdm_ant_num == 1))
42f1b26
+			gl_bt_coexist.board_info.btdm_ant_pos =
42f1b26
+						       BTC_ANTENNA_AT_MAIN_PORT;
42f1b26
+		else
42f1b26
+			gl_bt_coexist.board_info.btdm_ant_pos =
42f1b26
+						       BTC_ANTENNA_AT_MAIN_PORT;
42f1b26
 	} else if (BT_COEX_ANT_TYPE_ANTDIV == type) {
42f1b26
 		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
42f1b26
+		gl_bt_coexist.board_info.btdm_ant_pos =
42f1b26
+						       BTC_ANTENNA_AT_MAIN_PORT;
42f1b26
+	} else if (type == BT_COEX_ANT_TYPE_DETECTED) {
42f1b26
+		gl_bt_coexist.board_info.btdm_ant_num = ant_num;
42f1b26
+		if (rtlpriv->cfg->mod_params->ant_sel == 1)
42f1b26
+			gl_bt_coexist.board_info.btdm_ant_pos =
42f1b26
+				BTC_ANTENNA_AT_AUX_PORT;
42f1b26
+		else
42f1b26
+			gl_bt_coexist.board_info.btdm_ant_pos =
42f1b26
+				BTC_ANTENNA_AT_MAIN_PORT;
42f1b26
 	}
42f1b26
 }
42f1b26
 
42f1b26
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
42f1b26
index 0a903ea..f41ca57 100644
42f1b26
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
42f1b26
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
42f1b26
@@ -535,7 +535,7 @@ void exhalbtc_set_bt_patch_version(u16 bt_hci_version, u16 bt_patch_version);
42f1b26
 void exhalbtc_update_min_bt_rssi(char bt_rssi);
42f1b26
 void exhalbtc_set_bt_exist(bool bt_exist);
42f1b26
 void exhalbtc_set_chip_type(u8 chip_type);
42f1b26
-void exhalbtc_set_ant_num(u8 type, u8 ant_num);
42f1b26
+void exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num);
42f1b26
 void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist);
42f1b26
 void exhalbtc_signal_compensation(struct btc_coexist *btcoexist,
42f1b26
 				  u8 *rssi_wifi, u8 *rssi_bt);
42f1b26
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
42f1b26
index b9b0cb7..d3fd921 100644
42f1b26
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
42f1b26
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
42f1b26
@@ -72,7 +72,10 @@ void rtl_btc_init_hal_vars(struct rtl_priv *rtlpriv)
42f1b26
 		 __func__, bt_type);
42f1b26
 	exhalbtc_set_chip_type(bt_type);
42f1b26
 
42f1b26
-	exhalbtc_set_ant_num(BT_COEX_ANT_TYPE_PG, ant_num);
42f1b26
+	if (rtlpriv->cfg->mod_params->ant_sel == 1)
42f1b26
+		exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_DETECTED, 1);
42f1b26
+	else
42f1b26
+		exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_PG, ant_num);
42f1b26
 }
42f1b26
 
42f1b26
 void rtl_btc_init_hw_config(struct rtl_priv *rtlpriv)
42f1b26
-- 
42f1b26
cgit v0.12
42f1b26