rtlwifi: btcoexist: Implement antenna selection
authorLarry Finger <Larry.Finger@lwfinger.net>
Wed, 16 Mar 2016 18:33:35 +0000 (13:33 -0500)
committerKalle Valo <kvalo@codeaurora.org>
Wed, 6 Apr 2016 18:34:01 +0000 (21:34 +0300)
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>
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h
drivers/net/wireless/realtek/rtlwifi/btcoexist/rtl_btc.c

index c43ab59..77cbd10 100644 (file)
@@ -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 */
index b2791c8..babd149 100644 (file)
@@ -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;
        }
 }
 
index 0a903ea..f41ca57 100644 (file)
@@ -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);
index b9b0cb7..d3fd921 100644 (file)
@@ -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)