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