228 lines
9.6 KiB
Diff
228 lines
9.6 KiB
Diff
|
From c18d8f5095715c56bb3cd9cba64242542632054b Mon Sep 17 00:00:00 2001
|
||
|
From: Larry Finger <Larry.Finger@lwfinger.net>
|
||
|
Date: Wed, 16 Mar 2016 13:33:34 -0500
|
||
|
Subject: rtlwifi: rtl8723be: Add antenna select module parameter
|
||
|
|
||
|
A number of new laptops have been delivered with only a single antenna.
|
||
|
In principle, this is OK; however, a problem arises when the on-board
|
||
|
EEPROM is programmed to use the other antenna connection. The option
|
||
|
of opening the computer and moving the connector is not always possible
|
||
|
as it will void the warranty in some cases. In addition, this solution
|
||
|
breaks the Windows driver when the box dual boots Linux and Windows.
|
||
|
|
||
|
A fix involving a new module parameter has been developed. This commit
|
||
|
adds the new parameter and implements the changes needed for the driver.
|
||
|
|
||
|
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
|
||
|
Cc: Stable <stable@vger.kernel.org> [V4.0+]
|
||
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||
|
---
|
||
|
drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c | 5 +++++
|
||
|
drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c | 3 +++
|
||
|
drivers/net/wireless/realtek/rtlwifi/wifi.h | 3 +++
|
||
|
3 files changed, 11 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
|
||
|
index c983d2f..5a3df91 100644
|
||
|
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
|
||
|
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/hw.c
|
||
|
@@ -2684,6 +2684,7 @@ void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
|
||
|
bool auto_load_fail, u8 *hwinfo)
|
||
|
{
|
||
|
struct rtl_priv *rtlpriv = rtl_priv(hw);
|
||
|
+ struct rtl_mod_params *mod_params = rtlpriv->cfg->mod_params;
|
||
|
u8 value;
|
||
|
u32 tmpu_32;
|
||
|
|
||
|
@@ -2702,6 +2703,10 @@ void rtl8723be_read_bt_coexist_info_from_hwpg(struct ieee80211_hw *hw,
|
||
|
rtlpriv->btcoexist.btc_info.ant_num = ANT_X2;
|
||
|
}
|
||
|
|
||
|
+ /* override ant_num / ant_path */
|
||
|
+ if (mod_params->ant_sel)
|
||
|
+ rtlpriv->btcoexist.btc_info.ant_num =
|
||
|
+ (mod_params->ant_sel == 1 ? ANT_X2 : ANT_X1);
|
||
|
}
|
||
|
|
||
|
void rtl8723be_bt_reg_init(struct ieee80211_hw *hw)
|
||
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
|
||
|
index a78eaed..2101793 100644
|
||
|
--- a/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
|
||
|
+++ b/drivers/net/wireless/realtek/rtlwifi/rtl8723be/sw.c
|
||
|
@@ -273,6 +273,7 @@ static struct rtl_mod_params rtl8723be_mod_params = {
|
||
|
.msi_support = false,
|
||
|
.disable_watchdog = false,
|
||
|
.debug = DBG_EMERG,
|
||
|
+ .ant_sel = 0,
|
||
|
};
|
||
|
|
||
|
static struct rtl_hal_cfg rtl8723be_hal_cfg = {
|
||
|
@@ -394,6 +395,7 @@ module_param_named(fwlps, rtl8723be_mod_params.fwctrl_lps, bool, 0444);
|
||
|
module_param_named(msi, rtl8723be_mod_params.msi_support, bool, 0444);
|
||
|
module_param_named(disable_watchdog, rtl8723be_mod_params.disable_watchdog,
|
||
|
bool, 0444);
|
||
|
+module_param_named(ant_sel, rtl8723be_mod_params.ant_sel, int, 0444);
|
||
|
MODULE_PARM_DESC(swenc, "Set to 1 for software crypto (default 0)\n");
|
||
|
MODULE_PARM_DESC(ips, "Set to 0 to not use link power save (default 1)\n");
|
||
|
MODULE_PARM_DESC(swlps, "Set to 1 to use SW control power save (default 0)\n");
|
||
|
@@ -402,6 +404,7 @@ MODULE_PARM_DESC(msi, "Set to 1 to use MSI interrupts mode (default 0)\n");
|
||
|
MODULE_PARM_DESC(debug, "Set debug level (0-5) (default 0)");
|
||
|
MODULE_PARM_DESC(disable_watchdog,
|
||
|
"Set to 1 to disable the watchdog (default 0)\n");
|
||
|
+MODULE_PARM_DESC(ant_sel, "Set to 1 or 2 to force antenna number (default 0)\n");
|
||
|
|
||
|
static SIMPLE_DEV_PM_OPS(rtlwifi_pm_ops, rtl_pci_suspend, rtl_pci_resume);
|
||
|
|
||
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/wifi.h b/drivers/net/wireless/realtek/rtlwifi/wifi.h
|
||
|
index 554d814..93bd7fc 100644
|
||
|
--- a/drivers/net/wireless/realtek/rtlwifi/wifi.h
|
||
|
+++ b/drivers/net/wireless/realtek/rtlwifi/wifi.h
|
||
|
@@ -2246,6 +2246,9 @@ struct rtl_mod_params {
|
||
|
|
||
|
/* default 0: 1 means do not disable interrupts */
|
||
|
bool int_clear;
|
||
|
+
|
||
|
+ /* select antenna */
|
||
|
+ int ant_sel;
|
||
|
};
|
||
|
|
||
|
struct rtl_hal_usbint_cfg {
|
||
|
--
|
||
|
cgit v0.12
|
||
|
|
||
|
From baa1702290953295e421f0f433e2b1ff4815827c Mon Sep 17 00:00:00 2001
|
||
|
From: Larry Finger <Larry.Finger@lwfinger.net>
|
||
|
Date: Wed, 16 Mar 2016 13:33:35 -0500
|
||
|
Subject: 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: Larry Finger <Larry.Finger@lwfinger.net>
|
||
|
Cc: Stable <stable@vger.kernel.org> [V4.0+]
|
||
|
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
|
||
|
---
|
||
|
.../realtek/rtlwifi/btcoexist/halbtc8723b2ant.c | 9 ++++++--
|
||
|
.../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 27 +++++++++++++++++++++-
|
||
|
.../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 2 +-
|
||
|
.../wireless/realtek/rtlwifi/btcoexist/rtl_btc.c | 5 +++-
|
||
|
4 files changed, 38 insertions(+), 5 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c
|
||
|
index c43ab59..77cbd10 100644
|
||
|
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c
|
||
|
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c
|
||
|
@@ -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 */
|
||
|
- 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) {
|
||
|
case BTC_ANT_WIFI_AT_MAIN:
|
||
|
/* ext switch main at wifi */
|
||
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
|
||
|
index b2791c8..babd149 100644
|
||
|
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
|
||
|
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
|
||
|
@@ -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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
|
||
|
index 0a903ea..f41ca57 100644
|
||
|
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
|
||
|
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
|
||
|
@@ -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);
|
||
|
diff --git a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
|
||
|
index b9b0cb7..d3fd921 100644
|
||
|
--- a/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
|
||
|
+++ b/drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c
|
||
|
@@ -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)
|
||
|
--
|
||
|
cgit v0.12
|
||
|
|