rtlwifi: Add 8822b 1ant/2ant btcoex files
[email protected]
maintainerv2 cover rtlwifi: Add 8822b 1ant/2ant btcoex files
From: Ping-Ke Shih <[email protected]>
This patchset mainly contains 8822b 1ant/2ant btcoex files and related materials, and patch 1/15 and 2/15 fix the issues reported by static checker. After this patchset, I will start to submit the new component halmac that contains many new files, so the patch will be little big.
v2: Don't change content of patch, but only comment log.
- fix typo in patch 3/15.
- Add Acked-by to patches 1/15, 2/15, 4/15
Ping-Ke Shih (15):
rtlwifi: Add modifier static to functions reported by sparse
rtlwifi: remove redundant statement found by static checker
rtlwifi: btcoex: Add enum DM_INFO for btcoex to query dm's counters
rtlwifi: btcoex: Add customer_id to do special deal to oem vendor
rtlwifi: btcoex: Get status of multichannel concurrence
rtlwifi: btcoex: Add rate table for the use of btcoex
rtlwifi: btcoex: Add interaction with phydm
rtlwifi: btcoex: Add pre- and post- normal LPS function
rtlwifi: btcoex: add assoc type v2 to connection notify
rtlwifi: btcoex: new definitions introduced by 8822be
rtlwifi: btcoex: Add new but dummy definitions introduced by 8822b
rtlwifi: btcoex: Add 8822b 1ant/2ant coex files
rtlwifi: btcoex: Add 8822b header files to precomp.h
rtlwifi: btcoex: Add 8822b to Makefile
rtlwifi: btcoex: Add 8822b routine to btc interfaces
drivers/net/wireless/realtek/rtlwifi/base.c | 1 - .../wireless/realtek/rtlwifi/btcoexist/Makefile | 3 + .../realtek/rtlwifi/btcoexist/halbt_precomp.h | 3 + .../realtek/rtlwifi/btcoexist/halbtc8723b1ant.c | 1 + .../realtek/rtlwifi/btcoexist/halbtc8723b2ant.c | 6 +- .../realtek/rtlwifi/btcoexist/halbtc8821a1ant.c | 33 - .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 4 +- .../realtek/rtlwifi/btcoexist/halbtc8822b1ant.c | 5327 +++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtc8822b1ant.h | 413 ++ .../realtek/rtlwifi/btcoexist/halbtc8822b2ant.c | 5370 ++++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtc8822b2ant.h | 434 ++ .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 186 +- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 122 + drivers/net/wireless/realtek/rtlwifi/wifi.h | 33 + 14 files changed, 11894 insertions(+), 42 deletions(-) create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b1ant.c create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b1ant.h create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b2ant.c create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b2ant.h
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v2 1/15 rtlwifi: Add modifier static to functions reported by sparse
From: Ping-Ke Shih <[email protected]>
sparse reports some functions were not declared, so add 'static' as modifier. Remove an unused function btc8821a1ant_is_wifi_status_changed() exposed due to 'static'.
--- .../realtek/rtlwifi/btcoexist/halbtc8723b1ant.c | 1 + .../realtek/rtlwifi/btcoexist/halbtc8723b2ant.c | 6 ++-- .../realtek/rtlwifi/btcoexist/halbtc8821a1ant.c | 33 ---------------------- .../realtek/rtlwifi/btcoexist/halbtc8821a2ant.c | 4 +-- 4 files changed, 6 insertions(+), 38 deletions(-)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b1ant.c +1 -0
@@ -1436,6 +1436,7 @@ static void halbtc8723b1ant_ps_tdma(struct btc_coexist *btcoexist, coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma; } +static void btc8723b1ant_tdma_dur_adj_for_acl (struct btc_coexist *btcoexist,u8 wifi_status) {
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8723b2ant.c +3 -3
@@ -833,9 +833,9 @@ static void btc8723b2ant_set_sw_fulltime_dac_swing(struct btc_coexist *btcoex,btc8723b2ant_set_dac_swing_reg (btcoex,0x18 ); } -void btc8723b2ant_dac_swing (struct btc_coexist *btcoexist, -bool force_exec,bool dac_swing_on, -u32 dac_swing_lvl) +static void btc8723b2ant_dac_swing (struct btc_coexist *btcoexist, +bool force_exec,bool dac_swing_on, +u32 dac_swing_lvl) {struct rtl_priv *rtlpriv = btcoexist->adapter;
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a1ant.c +0 -33
@@ -426,39 +426,6 @@ static void btc8821a1ant_query_bt_info(struct btc_coexist *btcoexist) btcoexist->btc_fill_h2c (btcoexist,0x61 ,1 , h2c_parameter); } -bool btc8821a1ant_is_wifi_status_changed (struct btc_coexist *btcoexist) -{ -static bool pre_wifi_busy = true; -static bool pre_under_4way = true; -static bool pre_bt_hs_on = true; -bool wifi_busy = false, under_4way = false, bt_hs_on = false; -bool wifi_connected = false; - - btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_CONNECTED , - &wifi_connected); - btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); - btcoexist->btc_get (btcoexist,BTC_GET_BL_HS_OPERATION , &bt_hs_on); - btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_4_WAY_PROGRESS , - &under_4way); - -if (wifi_connected) { -if (wifi_busy != pre_wifi_busy) { - pre_wifi_busy = wifi_busy; -return true; - } -if (under_4way != pre_under_4way) { - pre_under_4way = under_4way; -return true; - } -if (bt_hs_on != pre_bt_hs_on) { - pre_bt_hs_on = bt_hs_on; -return true; - } - } - -return false; -} -static void btc8821a1ant_update_bt_link_info (struct btc_coexist *btcoexist) {struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info;
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8821a2ant.c +2 -2
@@ -359,7 +359,7 @@ static void btc8821a2ant_query_bt_info(struct btc_coexist *btcoexist) btcoexist->btc_fill_h2c (btcoexist,0x61 ,1 , h2c_parameter); } -bool btc8821a2ant_is_wifi_status_changed (struct btc_coexist *btcoexist) +static bool btc8821a2ant_is_wifi_status_changed (struct btc_coexist *btcoexist) {static bool pre_wifi_busy = true;static bool pre_under_4way = true;
@@ -1517,7 +1517,7 @@ static void btc8821a2ant_action_bt_inquiry(struct btc_coexist *btcoexist)btc8821a2ant_sw_mechanism2 (btcoexist, false, false, false,0x18 ); } -void btc8821a2ant_action_wifi_link_process (struct btc_coexist *btcoexist) +static void btc8821a2ant_action_wifi_link_process (struct btc_coexist *btcoexist) {struct rtl_priv *rtlpriv = btcoexist->adapter;u8 u8tmpa, u8tmpb;
Signature · 1 line
2.15.1
Re: [v2, 01/15] rtlwifi: Add modifier static to functions reported by sparse
Quoted 8 lines · Ping-Ke Shih
From: Ping-Ke Shih <[email protected]>
sparse reports some functions were not declared, so add 'static' as modifier. Remove an unused function
btc8821a1ant_is_wifi_status_changed()exposed due to 'static'.Signed-off-by Ping-Ke Shih <[email protected]>Acked-by Larry Finger <[email protected]>
11 patches applied to wireless-drivers-next.git, thanks.
91b9e6844240 rtlwifi: Add modifier static to functions reported by sparse 757a9eb8df1f rtlwifi: remove redundant statement found by static checker 5ffd1155d536 rtlwifi: btcoex: Add enum DM_INFO for btcoex to query dm's counters a1ee1a09cbba rtlwifi: btcoex: Add customer_id to do special deal to oem vendor 123068f2eb30 rtlwifi: btcoex: Get status of multichannel concurrence 1f0ab4fbacc6 rtlwifi: btcoex: Add rate table for the use of btcoex 7fd34dc4d827 rtlwifi: btcoex: Add interaction with phydm c3468950ef80 rtlwifi: btcoex: Add pre- and post- normal LPS function 0843e98a3b9a rtlwifi: btcoex: add assoc type v2 to connection notify b82f5e0fd2a2 rtlwifi: btcoex: new definitions introduced by 8822be c37889472515 rtlwifi: btcoex: Add new but dummy definitions introduced by 8822b
Signature · 3 lines
https://patchwork.kernel.org/patch/10260485/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches
[email protected]
maintainerPATCH v2 2/15 rtlwifi: remove redundant statement found by static checker
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
smatch reports "rtl_is_special_data() warn: inconsistent indenting", but it is an obvious redundant statement so remove it.
--- drivers/net/wireless/realtek/rtlwifi/base.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/wireless/realtek/rtlwifi/base.c +0 -1
@@ -1549,7 +1549,6 @@ u8 rtl_is_special_data(struct ieee80211_hw *hw, struct sk_buff *skb, u8 is_tx,/* EAPOL is seens as in-4way */ rtlpriv->btcoexist.btc_info.in_4way = true; rtlpriv->btcoexist.btc_info.in_4way_ts = jiffies; - rtlpriv->btcoexist.btc_info.in_4way_ts = jiffies;RT_TRACE (rtlpriv, (COMP_SEND |COMP_RECV ),DBG_DMESG ,"802.1X %s EAPOL pkt!!\n" , (is_tx) ?"Tx" :"Rx" );
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v2 3/15 rtlwifi: btcoex: Add enum DM_INFO for btcoex to query dm's counters
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
btcoex uses dm's counters to check the environment is noisy or not. If it is clean, btcoex set more time slots to WiFi so that it can transmit as soon as possible. That will save time, and BT will have more time slots after WiFi traffic is complete.
--- drivers/net/wireless/realtek/rtlwifi/wifi.h | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)
drivers/net/wireless/realtek/rtlwifi/wifi.h +32 -0
@@ -977,6 +977,38 @@ enum rtl_spec_ver { RTL_SPEC_EXT_C2H = BIT(2), /* extend FW C2H (e.g. TX REPORT) */ }; +enum dm_info_query { +DM_INFO_FA_OFDM , +DM_INFO_FA_CCK , +DM_INFO_FA_TOTAL , +DM_INFO_CCA_OFDM , +DM_INFO_CCA_CCK , +DM_INFO_CCA_ALL , +DM_INFO_CRC32_OK_VHT , +DM_INFO_CRC32_OK_HT , +DM_INFO_CRC32_OK_LEGACY , +DM_INFO_CRC32_OK_CCK , +DM_INFO_CRC32_ERROR_VHT , +DM_INFO_CRC32_ERROR_HT , +DM_INFO_CRC32_ERROR_LEGACY , +DM_INFO_CRC32_ERROR_CCK , +DM_INFO_EDCCA_FLAG , +DM_INFO_OFDM_ENABLE , +DM_INFO_CCK_ENABLE , +DM_INFO_CRC32_OK_HT_AGG , +DM_INFO_CRC32_ERROR_HT_AGG , +DM_INFO_DBG_PORT_0 , +DM_INFO_CURR_IGI , +DM_INFO_RSSI_MIN , +DM_INFO_RSSI_MAX , +DM_INFO_CLM_RATIO , +DM_INFO_NHM_RATIO , +DM_INFO_IQK_ALL , +DM_INFO_IQK_OK , +DM_INFO_IQK_NG , +DM_INFO_SIZE , +}; +struct octet_string {u8 *octet;u16 length;
Signature · 1 line
2.15.1
Re: [PATCH v2 03/15] rtlwifi: btcoex: Add enum DM_INFO for btcoex to query dm's counters
Quoted 8 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
btcoex uses dm's counters to check the environment is noisy or not. If it is clean, btcoex set more time slots to WiFi so that it can transmit as soon as possible. That will save time, and BT will have more time slots after WiFi traffic is complete.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 48 lines
--- drivers/net/wireless/realtek/rtlwifi/wifi.h | 32 +++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+)drivers/net/wireless/realtek/rtlwifi/wifi.h +32
-0@@ -977,6 +977,38 @@ enum rtl_spec_ver { RTL_SPEC_EXT_C2H = BIT(2), /* extend FW C2H (e.g. TX REPORT) */ }; +enum dm_info_query { +DM_INFO_FA_OFDM , +DM_INFO_FA_CCK , +DM_INFO_FA_TOTAL , +DM_INFO_CCA_OFDM , +DM_INFO_CCA_CCK , +DM_INFO_CCA_ALL , +DM_INFO_CRC32_OK_VHT , +DM_INFO_CRC32_OK_HT , +DM_INFO_CRC32_OK_LEGACY , +DM_INFO_CRC32_OK_CCK , +DM_INFO_CRC32_ERROR_VHT , +DM_INFO_CRC32_ERROR_HT , +DM_INFO_CRC32_ERROR_LEGACY , +DM_INFO_CRC32_ERROR_CCK , +DM_INFO_EDCCA_FLAG , +DM_INFO_OFDM_ENABLE , +DM_INFO_CCK_ENABLE , +DM_INFO_CRC32_OK_HT_AGG , +DM_INFO_CRC32_ERROR_HT_AGG , +DM_INFO_DBG_PORT_0 , +DM_INFO_CURR_IGI , +DM_INFO_RSSI_MIN , +DM_INFO_RSSI_MAX , +DM_INFO_CLM_RATIO , +DM_INFO_NHM_RATIO , +DM_INFO_IQK_ALL , +DM_INFO_IQK_OK , +DM_INFO_IQK_NG , +DM_INFO_SIZE , +}; +struct octet_string {u8 *octet;u16 length;
[email protected]
maintainerPATCH v2 4/15 rtlwifi: btcoex: Add customer_id to do special deal to oem vendor
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
Add customer_id field in structure, and then this is a clue to implement the behavior defined by vendor LENOVO_CHINA.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 1 + drivers/net/wireless/realtek/rtlwifi/wifi.h | 1 + 2 files changed, 2 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +1 -0
@@ -154,6 +154,7 @@ struct btc_board_info {u8 rfe_type;u8 ant_div_cfg; +u8 customer_id; };enum btc_dbg_opcode {
drivers/net/wireless/realtek/rtlwifi/wifi.h +1 -0
@@ -556,6 +556,7 @@ enum rt_oem_id {RT_CID_NETGEAR =36 ,RT_CID_PLANEX =37 ,RT_CID_CC_C =38 , + RT_CID_LENOVO_CHINA = 40, }; enum hw_descs {
Signature · 1 line
2.15.1
[email protected]
maintainerPATCH v2 5/15 rtlwifi: btcoex: Get status of multichannel concurrence
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
btcoex does different decision according to MCC or SCC status, but driver is still SCC currently.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 3 +++ drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 8 ++++++++ 2 files changed, 11 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +3 -0
@@ -577,6 +577,9 @@ static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf) tmp = true; *bool_tmp = tmp;break ; +case BTC_GET_BL_WIFI_DUAL_BAND_CONNECTED : + *u8_tmp =BTC_MULTIPORT_SCC ; +break ;case BTC_GET_BL_WIFI_BUSY :if (halbtc_is_wifi_busy (rtlpriv)) *bool_tmp = true;
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +8 -0
@@ -251,6 +251,7 @@ enum btc_get_type {BTC_GET_BL_HS_OPERATION ,BTC_GET_BL_HS_CONNECTING ,BTC_GET_BL_WIFI_CONNECTED , +BTC_GET_BL_WIFI_DUAL_BAND_CONNECTED ,BTC_GET_BL_WIFI_BUSY ,BTC_GET_BL_WIFI_SCAN , BTC_GET_BL_WIFI_LINK,
@@ -436,6 +437,13 @@ enum btc_notify_type_stack_operation {BTC_STACK_OP_MAX }; +enum { +BTC_MULTIPORT_SCC , +BTC_MULTIPORT_MCC_2CHANNEL , +BTC_MULTIPORT_MCC_2BAND , +BTC_MULTIPORT_MAX +}; +struct btc_bt_info {bool bt_disabled;u8 rssi_adjust_for_agc_table_on;
Signature · 1 line
2.15.1
Re: [PATCH v2 05/15] rtlwifi: btcoex: Get status of multichannel concurrence
Quoted 6 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
btcoex does different decision according to MCC or SCC status, but driver is still SCC currently.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 46 lines
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 3 +++ drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 8 ++++++++ 2 files changed, 11 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +3
-0@@ -577,6 +577,9 @@ static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf) tmp = true; *bool_tmp = tmp;break ; +case BTC_GET_BL_WIFI_DUAL_BAND_CONNECTED : + *u8_tmp =BTC_MULTIPORT_SCC ; +break ;case BTC_GET_BL_WIFI_BUSY :if (halbtc_is_wifi_busy (rtlpriv)) *bool_tmp = true;drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +8
-0@@ -251,6 +251,7 @@ enum btc_get_type {BTC_GET_BL_HS_OPERATION ,BTC_GET_BL_HS_CONNECTING ,BTC_GET_BL_WIFI_CONNECTED , +BTC_GET_BL_WIFI_DUAL_BAND_CONNECTED ,BTC_GET_BL_WIFI_BUSY ,BTC_GET_BL_WIFI_SCAN , BTC_GET_BL_WIFI_LINK,@@ -436,6 +437,13 @@ enum btc_notify_type_stack_operation {BTC_STACK_OP_MAX }; +enum { +BTC_MULTIPORT_SCC , +BTC_MULTIPORT_MCC_2CHANNEL , +BTC_MULTIPORT_MCC_2BAND , +BTC_MULTIPORT_MAX +}; +struct btc_bt_info {bool bt_disabled;u8 rssi_adjust_for_agc_table_on;
[email protected]
maintainerPATCH v2 6/15 rtlwifi: btcoex: Add rate table for the use of btcoex
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
The btcoex use the rate to rsolve IOT issue that some APs reduce TX rate quickly, so it uses the RX rate as a clue to decide TDMA.
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +94 -0
@@ -437,6 +437,100 @@ enum btc_notify_type_stack_operation {BTC_STACK_OP_MAX }; +enum { +BTC_CCK_1 , +BTC_CCK_2 , +BTC_CCK_5_5 , +BTC_CCK_11 , +BTC_OFDM_6 , +BTC_OFDM_9 , +BTC_OFDM_12 , +BTC_OFDM_18 , +BTC_OFDM_24 , +BTC_OFDM_36 , +BTC_OFDM_48 , +BTC_OFDM_54 , +BTC_MCS_0 , +BTC_MCS_1 , +BTC_MCS_2 , +BTC_MCS_3 , +BTC_MCS_4 , +BTC_MCS_5 , +BTC_MCS_6 , +BTC_MCS_7 , +BTC_MCS_8 , +BTC_MCS_9 , +BTC_MCS_10 , +BTC_MCS_11 , +BTC_MCS_12 , +BTC_MCS_13 , +BTC_MCS_14 , +BTC_MCS_15 , +BTC_MCS_16 , +BTC_MCS_17 , +BTC_MCS_18 , +BTC_MCS_19 , +BTC_MCS_20 , +BTC_MCS_21 , +BTC_MCS_22 , +BTC_MCS_23 , +BTC_MCS_24 , +BTC_MCS_25 , +BTC_MCS_26 , +BTC_MCS_27 , +BTC_MCS_28 , +BTC_MCS_29 , +BTC_MCS_30 , +BTC_MCS_31 , +BTC_VHT_1SS_MCS_0 , +BTC_VHT_1SS_MCS_1 , +BTC_VHT_1SS_MCS_2 , +BTC_VHT_1SS_MCS_3 , +BTC_VHT_1SS_MCS_4 , +BTC_VHT_1SS_MCS_5 , +BTC_VHT_1SS_MCS_6 , +BTC_VHT_1SS_MCS_7 , +BTC_VHT_1SS_MCS_8 , +BTC_VHT_1SS_MCS_9 , +BTC_VHT_2SS_MCS_0 , +BTC_VHT_2SS_MCS_1 , +BTC_VHT_2SS_MCS_2 , +BTC_VHT_2SS_MCS_3 , +BTC_VHT_2SS_MCS_4 , +BTC_VHT_2SS_MCS_5 , +BTC_VHT_2SS_MCS_6 , +BTC_VHT_2SS_MCS_7 , +BTC_VHT_2SS_MCS_8 , +BTC_VHT_2SS_MCS_9 , +BTC_VHT_3SS_MCS_0 , +BTC_VHT_3SS_MCS_1 , +BTC_VHT_3SS_MCS_2 , +BTC_VHT_3SS_MCS_3 , +BTC_VHT_3SS_MCS_4 , +BTC_VHT_3SS_MCS_5 , +BTC_VHT_3SS_MCS_6 , +BTC_VHT_3SS_MCS_7 , +BTC_VHT_3SS_MCS_8 , +BTC_VHT_3SS_MCS_9 , +BTC_VHT_4SS_MCS_0 , +BTC_VHT_4SS_MCS_1 , +BTC_VHT_4SS_MCS_2 , +BTC_VHT_4SS_MCS_3 , +BTC_VHT_4SS_MCS_4 , +BTC_VHT_4SS_MCS_5 , +BTC_VHT_4SS_MCS_6 , +BTC_VHT_4SS_MCS_7 , +BTC_VHT_4SS_MCS_8 , +BTC_VHT_4SS_MCS_9 , +BTC_MCS_32 , +BTC_UNKNOWN , +BTC_PKT_MGNT , +BTC_PKT_CTRL , +BTC_PKT_UNKNOWN , +BTC_PKT_NOT_FOR_ME , +BTC_RATE_MAX +}; +enum {BTC_MULTIPORT_SCC ,BTC_MULTIPORT_MCC_2CHANNEL ,
Signature · 1 line
2.15.1
Re: [PATCH v2 06/15] rtlwifi: btcoex: Add rate table for the use of btcoex
Quoted 6 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
The btcoex use the rate to rsolve IOT issue that some APs reduce TX rate quickly, so it uses the RX rate as a clue to decide TDMA.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 110 lines
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +94
-0@@ -437,6 +437,100 @@ enum btc_notify_type_stack_operation {BTC_STACK_OP_MAX }; +enum { +BTC_CCK_1 , +BTC_CCK_2 , +BTC_CCK_5_5 , +BTC_CCK_11 , +BTC_OFDM_6 , +BTC_OFDM_9 , +BTC_OFDM_12 , +BTC_OFDM_18 , +BTC_OFDM_24 , +BTC_OFDM_36 , +BTC_OFDM_48 , +BTC_OFDM_54 , +BTC_MCS_0 , +BTC_MCS_1 , +BTC_MCS_2 , +BTC_MCS_3 , +BTC_MCS_4 , +BTC_MCS_5 , +BTC_MCS_6 , +BTC_MCS_7 , +BTC_MCS_8 , +BTC_MCS_9 , +BTC_MCS_10 , +BTC_MCS_11 , +BTC_MCS_12 , +BTC_MCS_13 , +BTC_MCS_14 , +BTC_MCS_15 , +BTC_MCS_16 , +BTC_MCS_17 , +BTC_MCS_18 , +BTC_MCS_19 , +BTC_MCS_20 , +BTC_MCS_21 , +BTC_MCS_22 , +BTC_MCS_23 , +BTC_MCS_24 , +BTC_MCS_25 , +BTC_MCS_26 , +BTC_MCS_27 , +BTC_MCS_28 , +BTC_MCS_29 , +BTC_MCS_30 , +BTC_MCS_31 , +BTC_VHT_1SS_MCS_0 , +BTC_VHT_1SS_MCS_1 , +BTC_VHT_1SS_MCS_2 , +BTC_VHT_1SS_MCS_3 , +BTC_VHT_1SS_MCS_4 , +BTC_VHT_1SS_MCS_5 , +BTC_VHT_1SS_MCS_6 , +BTC_VHT_1SS_MCS_7 , +BTC_VHT_1SS_MCS_8 , +BTC_VHT_1SS_MCS_9 , +BTC_VHT_2SS_MCS_0 , +BTC_VHT_2SS_MCS_1 , +BTC_VHT_2SS_MCS_2 , +BTC_VHT_2SS_MCS_3 , +BTC_VHT_2SS_MCS_4 , +BTC_VHT_2SS_MCS_5 , +BTC_VHT_2SS_MCS_6 , +BTC_VHT_2SS_MCS_7 , +BTC_VHT_2SS_MCS_8 , +BTC_VHT_2SS_MCS_9 , +BTC_VHT_3SS_MCS_0 , +BTC_VHT_3SS_MCS_1 , +BTC_VHT_3SS_MCS_2 , +BTC_VHT_3SS_MCS_3 , +BTC_VHT_3SS_MCS_4 , +BTC_VHT_3SS_MCS_5 , +BTC_VHT_3SS_MCS_6 , +BTC_VHT_3SS_MCS_7 , +BTC_VHT_3SS_MCS_8 , +BTC_VHT_3SS_MCS_9 , +BTC_VHT_4SS_MCS_0 , +BTC_VHT_4SS_MCS_1 , +BTC_VHT_4SS_MCS_2 , +BTC_VHT_4SS_MCS_3 , +BTC_VHT_4SS_MCS_4 , +BTC_VHT_4SS_MCS_5 , +BTC_VHT_4SS_MCS_6 , +BTC_VHT_4SS_MCS_7 , +BTC_VHT_4SS_MCS_8 , +BTC_VHT_4SS_MCS_9 , +BTC_MCS_32 , +BTC_UNKNOWN , +BTC_PKT_MGNT , +BTC_PKT_CTRL , +BTC_PKT_UNKNOWN , +BTC_PKT_NOT_FOR_ME , +BTC_RATE_MAX +}; +enum {BTC_MULTIPORT_SCC ,BTC_MULTIPORT_MCC_2CHANNEL ,
[email protected]
maintainerPATCH v2 7/15 rtlwifi: btcoex: Add interaction with phydm
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
Get phydm's counter and version from the module phydm that is not submitted so we implement dummy functions.
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 38 ++++++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 6 ++++ 2 files changed, 44 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +38 -0
@@ -680,6 +680,21 @@ static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf)case BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL : *u32_tmp =halbtc_get_bt_forbidden_slot_val (btcoexist);break ; +case BTC_GET_U4_WIFI_IQK_TOTAL : + *u32_tmp = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_IQK_ALL ); +break ; +case BTC_GET_U4_WIFI_IQK_OK : + *u32_tmp = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_IQK_OK ); +break ; +case BTC_GET_U4_WIFI_IQK_FAIL : + *u32_tmp = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_IQK_NG ); +break ;case BTC_GET_U1_WIFI_DOT11_CHNL : *u8_tmp = rtlphy->current_channel;break ;
@@ -1122,6 +1137,25 @@ static bool halbtc_under_ips(struct btc_coexist *btcoexist)return false; } +static +u32 halbtc_get_phydm_version (void *btc_context) +{ +return 0 ; +} + +static +void halbtc_phydm_modify_ra_pcr_threshold (void *btc_context, +u8 ra_offset_direction, +u8 ra_threshold_offset) +{ +} + +static +u32 halbtc_phydm_query_phy_counter (void *btc_context,enum dm_info_query dm_id) +{ +return 0 ; +} +static u8 halbtc_get_ant_det_val_from_bt (void *btc_context) {struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;
@@ -1245,6 +1279,10 @@ bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv) halbtc_get_bt_coex_supported_feature; btcoexist->btc_get_bt_coex_supported_version = halbtc_get_bt_coex_supported_version; + btcoexist->btc_get_bt_phydm_version = halbtc_get_phydm_version; + btcoexist->btc_phydm_modify_ra_pcr_threshold = + halbtc_phydm_modify_ra_pcr_threshold; + btcoexist->btc_phydm_query_phy_counter = halbtc_phydm_query_phy_counter; btcoexist->btc_get_ant_det_val_from_bt = halbtc_get_ant_det_val_from_bt; btcoexist->btc_get_ble_scan_type_from_bt = halbtc_get_ble_scan_type_from_bt;
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +6 -0
@@ -730,6 +730,12 @@ struct btc_coexist { u32 value);u32 (*btc_get_bt_coex_supported_feature)(void *btcoexist);u32 (*btc_get_bt_coex_supported_version)(void *btcoexist); +u32 (*btc_get_bt_phydm_version)(void *btcoexist); +void (*btc_phydm_modify_ra_pcr_threshold)(void *btcoexist, +u8 ra_offset_direction, +u8 ra_threshold_offset); +u32 (*btc_phydm_query_phy_counter)(void *btcoexist, +enum dm_info_query dm_id);u8 (*btc_get_ant_det_val_from_bt)(void *btcoexist);u8 (*btc_get_ble_scan_type_from_bt)(void *btcoexist);u32 (*btc_get_ble_scan_para_from_bt)(void *btcoexist,u8 scan_type);
Signature · 1 line
2.15.1
Re: [PATCH v2 07/15] rtlwifi: btcoex: Add interaction with phydm
Quoted 6 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
Get phydm's counter and version from the module phydm that is not submitted so we implement dummy functions.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 86 lines
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 38 ++++++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 6 ++++ 2 files changed, 44 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +38
-0@@ -680,6 +680,21 @@ static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf)case BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL : *u32_tmp =halbtc_get_bt_forbidden_slot_val (btcoexist);break ; +case BTC_GET_U4_WIFI_IQK_TOTAL : + *u32_tmp = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_IQK_ALL ); +break ; +case BTC_GET_U4_WIFI_IQK_OK : + *u32_tmp = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_IQK_OK ); +break ; +case BTC_GET_U4_WIFI_IQK_FAIL : + *u32_tmp = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_IQK_NG ); +break ;case BTC_GET_U1_WIFI_DOT11_CHNL : *u8_tmp = rtlphy->current_channel;break ;@@ -1122,6 +1137,25 @@ static bool halbtc_under_ips(struct btc_coexist *btcoexist)return false; } +static +u32 halbtc_get_phydm_version (void *btc_context) +{ +return 0 ; +} + +static +void halbtc_phydm_modify_ra_pcr_threshold (void *btc_context, +u8 ra_offset_direction, +u8 ra_threshold_offset) +{ +} + +static +u32 halbtc_phydm_query_phy_counter (void *btc_context,enum dm_info_query dm_id) +{ +return 0 ; +} +static u8 halbtc_get_ant_det_val_from_bt (void *btc_context) {struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context;@@ -1245,6 +1279,10 @@ bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv) halbtc_get_bt_coex_supported_feature; btcoexist->btc_get_bt_coex_supported_version = halbtc_get_bt_coex_supported_version; + btcoexist->btc_get_bt_phydm_version = halbtc_get_phydm_version; + btcoexist->btc_phydm_modify_ra_pcr_threshold = + halbtc_phydm_modify_ra_pcr_threshold; + btcoexist->btc_phydm_query_phy_counter = halbtc_phydm_query_phy_counter; btcoexist->btc_get_ant_det_val_from_bt = halbtc_get_ant_det_val_from_bt; btcoexist->btc_get_ble_scan_type_from_bt = halbtc_get_ble_scan_type_from_bt;drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +6
-0@@ -730,6 +730,12 @@ struct btc_coexist { u32 value);u32 (*btc_get_bt_coex_supported_feature)(void *btcoexist);u32 (*btc_get_bt_coex_supported_version)(void *btcoexist); +u32 (*btc_get_bt_phydm_version)(void *btcoexist); +void (*btc_phydm_modify_ra_pcr_threshold)(void *btcoexist, +u8 ra_offset_direction, +u8 ra_threshold_offset); +u32 (*btc_phydm_query_phy_counter)(void *btcoexist, +enum dm_info_query dm_id);u8 (*btc_get_ant_det_val_from_bt)(void *btcoexist);u8 (*btc_get_ble_scan_type_from_bt)(void *btcoexist);u32 (*btc_get_ble_scan_para_from_bt)(void *btcoexist,u8 scan_type);
[email protected]
maintainerPATCH v2 8/15 rtlwifi: btcoex: Add pre- and post- normal LPS function
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
Normal LPS is decomposed into pre- and post- parts, so we can issue H2C with TDMA parameters in the "critical section" that dirver can't change LPS state at the moment.
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 22 ++++++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 2 ++ 2 files changed, 24 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +22 -0
@@ -363,6 +363,22 @@ static void halbtc_normal_lps(struct btc_coexist *btcoexist) } } +static void halbtc_pre_normal_lps (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; + +if (btcoexist->bt_info.bt_ctrl_lps) { + btcoexist->bt_info.bt_lps_on = false; +rtl_lps_leave (rtlpriv->mac80211.hw); + } +} + +static void halbtc_post_normal_lps (struct btc_coexist *btcoexist) +{ +if (btcoexist->bt_info.bt_ctrl_lps) + btcoexist->bt_info.bt_ctrl_lps = false; +} +static void halbtc_leave_low_power (struct btc_coexist *btcoexist) { }
@@ -806,6 +822,12 @@ static bool halbtc_set(void *void_btcoexist, u8 set_type, void *in_buf)case BTC_SET_ACT_NORMAL_LPS :halbtc_normal_lps (btcoexist);break ; +case BTC_SET_ACT_PRE_NORMAL_LPS : +halbtc_pre_normal_lps (btcoexist); +break ; +case BTC_SET_ACT_POST_NORMAL_LPS : +halbtc_post_normal_lps (btcoexist); +break ;case BTC_SET_ACT_DISABLE_LOW_POWER :halbtc_disable_low_power (btcoexist, *bool_tmp);break ;
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +2 -0
@@ -349,6 +349,8 @@ enum btc_set_type {BTC_SET_ACT_LEAVE_LPS ,BTC_SET_ACT_ENTER_LPS ,BTC_SET_ACT_NORMAL_LPS , +BTC_SET_ACT_PRE_NORMAL_LPS , +BTC_SET_ACT_POST_NORMAL_LPS ,BTC_SET_ACT_INC_FORCE_EXEC_PWR_CMD_CNT ,BTC_SET_ACT_DISABLE_LOW_POWER , BTC_SET_ACT_UPDATE_RAMASK,
Signature · 1 line
2.15.1
Re: [PATCH v2 08/15] rtlwifi: btcoex: Add pre- and post- normal LPS function
Quoted 7 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
Normal LPS is decomposed into pre- and post- parts, so we can issue H2C with TDMA parameters in the "critical section" that dirver can't change LPS state at the moment.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 59 lines
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 22 ++++++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 2 ++ 2 files changed, 24 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +22
-0@@ -363,6 +363,22 @@ static void halbtc_normal_lps(struct btc_coexist *btcoexist) } } +static void halbtc_pre_normal_lps (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; + +if (btcoexist->bt_info.bt_ctrl_lps) { + btcoexist->bt_info.bt_lps_on = false; +rtl_lps_leave (rtlpriv->mac80211.hw); + } +} + +static void halbtc_post_normal_lps (struct btc_coexist *btcoexist) +{ +if (btcoexist->bt_info.bt_ctrl_lps) + btcoexist->bt_info.bt_ctrl_lps = false; +} +static void halbtc_leave_low_power (struct btc_coexist *btcoexist) { }@@ -806,6 +822,12 @@ static bool halbtc_set(void *void_btcoexist, u8 set_type, void *in_buf)case BTC_SET_ACT_NORMAL_LPS :halbtc_normal_lps (btcoexist);break ; +case BTC_SET_ACT_PRE_NORMAL_LPS : +halbtc_pre_normal_lps (btcoexist); +break ; +case BTC_SET_ACT_POST_NORMAL_LPS : +halbtc_post_normal_lps (btcoexist); +break ;case BTC_SET_ACT_DISABLE_LOW_POWER :halbtc_disable_low_power (btcoexist, *bool_tmp);break ;drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +2
-0@@ -349,6 +349,8 @@ enum btc_set_type {BTC_SET_ACT_LEAVE_LPS ,BTC_SET_ACT_ENTER_LPS ,BTC_SET_ACT_NORMAL_LPS , +BTC_SET_ACT_PRE_NORMAL_LPS , +BTC_SET_ACT_POST_NORMAL_LPS ,BTC_SET_ACT_INC_FORCE_EXEC_PWR_CMD_CNT ,BTC_SET_ACT_DISABLE_LOW_POWER , BTC_SET_ACT_UPDATE_RAMASK,
[email protected]
maintainerPATCH v2 9/15 rtlwifi: btcoex: add assoc type v2 to connection notify
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
In connection notify v1, btcoex only need to know start/end association, and it will discriminate 2G and 5G band in v2.
--- .../net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 14 +++++++++++--- .../net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +11 -3
@@ -1610,7 +1610,8 @@ void exhalbtc_scan_notify_wifi_only(struct wifi_only_cfg *wifionly_cfg,void exhalbtc_connect_notify (struct btc_coexist *btcoexist,u8 action) { -u8 asso_type; +u8 asso_type, asso_type_v2; +bool wifi_under_5g;if (!halbtc_is_bt_coexist_available (btcoexist))return ;
@@ -1618,10 +1619,17 @@ void exhalbtc_connect_notify(struct btc_coexist *btcoexist, u8 action)if (btcoexist->manual_control)return ; -if (action) + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_UNDER_5G , &wifi_under_5g); + +if (action) { asso_type =BTC_ASSOCIATE_START ; -else + asso_type_v2 = wifi_under_5g ?BTC_ASSOCIATE_5G_START : +BTC_ASSOCIATE_START ; + }else { asso_type =BTC_ASSOCIATE_FINISH ; + asso_type_v2 = wifi_under_5g ?BTC_ASSOCIATE_5G_FINISH : +BTC_ASSOCIATE_FINISH ; + }halbtc_leave_low_power (btcoexist);
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +2 -0
@@ -401,6 +401,8 @@ enum btc_notify_type_switchband {enum btc_notify_type_associate {BTC_ASSOCIATE_FINISH =0x0 ,BTC_ASSOCIATE_START =0x1 , +BTC_ASSOCIATE_5G_FINISH =0x2 , +BTC_ASSOCIATE_5G_START =0x3 ,BTC_ASSOCIATE_MAX };
Signature · 1 line
2.15.1
Re: [PATCH v2 09/15] rtlwifi: btcoex: add assoc type v2 to connection notify
Quoted 6 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
In connection notify v1, btcoex only need to know start/end association, and it will discriminate 2G and 5G band in v2.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 53 lines
--- .../net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 14 +++++++++++--- .../net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +11
-3@@ -1610,7 +1610,8 @@ void exhalbtc_scan_notify_wifi_only(struct wifi_only_cfg *wifionly_cfg,void exhalbtc_connect_notify (struct btc_coexist *btcoexist,u8 action) { -u8 asso_type; +u8 asso_type, asso_type_v2; +bool wifi_under_5g;if (!halbtc_is_bt_coexist_available (btcoexist))return ;@@ -1618,10 +1619,17 @@ void exhalbtc_connect_notify(struct btc_coexist *btcoexist, u8 action)if (btcoexist->manual_control)return ; -if (action) + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_UNDER_5G , &wifi_under_5g); + +if (action) { asso_type =BTC_ASSOCIATE_START ; -else + asso_type_v2 = wifi_under_5g ?BTC_ASSOCIATE_5G_START : +BTC_ASSOCIATE_START ; + }else { asso_type =BTC_ASSOCIATE_FINISH ; + asso_type_v2 = wifi_under_5g ?BTC_ASSOCIATE_5G_FINISH : +BTC_ASSOCIATE_FINISH ; + }halbtc_leave_low_power (btcoexist);drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +2
-0@@ -401,6 +401,8 @@ enum btc_notify_type_switchband {enum btc_notify_type_associate {BTC_ASSOCIATE_FINISH =0x0 ,BTC_ASSOCIATE_START =0x1 , +BTC_ASSOCIATE_5G_FINISH =0x2 , +BTC_ASSOCIATE_5G_START =0x3 ,BTC_ASSOCIATE_MAX };
[email protected]
maintainerPATCH v2 10/15 rtlwifi: btcoex: new definitions introduced by 8822be
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
New constant and variables definitions are used by btcoex of 8822b, so this commit add them.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +6 -0
@@ -62,6 +62,8 @@#define BTC_ANT_PATH_WIFI 0#define BTC_ANT_PATH_BT 1#define BTC_ANT_PATH_PTA 2 +#define BTC_ANT_PATH_WIFI5G 3 +#define BTC_ANT_PATH_AUTO 4/* dual Antenna definition */ #define BTC_ANT_WIFI_AT_MAIN 0#define BTC_ANT_WIFI_AT_AUX 1
@@ -205,6 +207,7 @@ enum btc_wifi_traffic_dir {enum btc_wifi_pnp {BTC_WIFI_PNP_WAKE_UP =0x0 ,BTC_WIFI_PNP_SLEEP =0x1 , +BTC_WIFI_PNP_SLEEP_KEEP_ANT =0x2 ,BTC_WIFI_PNP_MAX };
@@ -387,6 +390,7 @@ enum btc_notify_type_lps {enum btc_notify_type_scan {BTC_SCAN_FINISH =0x0 ,BTC_SCAN_START =0x1 , +BTC_SCAN_START_2G =0x2 ,BTC_SCAN_MAX };
@@ -561,6 +565,7 @@ struct btc_bt_info {u16 bt_hci_ver;u16 bt_real_fw_ver;u8 bt_fw_ver; +u32 bt_get_fw_ver;bool bt_disable_low_pwr;
@@ -632,6 +637,7 @@ struct btc_bt_link_info {bool pan_exist;bool pan_only;bool slave_role; +bool acl_busy; };enum btc_antenna_pos {
Signature · 1 line
2.15.1
Re: [PATCH v2 10/15] rtlwifi: btcoex: new definitions introduced by 8822be
Quoted 6 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
New constant and variables definitions are used by btcoex of 8822b, so this commit add them.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 50 lines
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 6 ++++++ 1 file changed, 6 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +6
-0@@ -62,6 +62,8 @@#define BTC_ANT_PATH_WIFI 0#define BTC_ANT_PATH_BT 1#define BTC_ANT_PATH_PTA 2 +#define BTC_ANT_PATH_WIFI5G 3 +#define BTC_ANT_PATH_AUTO 4/* dual Antenna definition */ #define BTC_ANT_WIFI_AT_MAIN 0#define BTC_ANT_WIFI_AT_AUX 1@@ -205,6 +207,7 @@ enum btc_wifi_traffic_dir {enum btc_wifi_pnp {BTC_WIFI_PNP_WAKE_UP =0x0 ,BTC_WIFI_PNP_SLEEP =0x1 , +BTC_WIFI_PNP_SLEEP_KEEP_ANT =0x2 ,BTC_WIFI_PNP_MAX };@@ -387,6 +390,7 @@ enum btc_notify_type_lps {enum btc_notify_type_scan {BTC_SCAN_FINISH =0x0 ,BTC_SCAN_START =0x1 , +BTC_SCAN_START_2G =0x2 ,BTC_SCAN_MAX };@@ -561,6 +565,7 @@ struct btc_bt_info {u16 bt_hci_ver;u16 bt_real_fw_ver;u8 bt_fw_ver; +u32 bt_get_fw_ver;bool bt_disable_low_pwr;@@ -632,6 +637,7 @@ struct btc_bt_link_info {bool pan_exist;bool pan_only;bool slave_role; +bool acl_busy; };enum btc_antenna_pos {
[email protected]
maintainerPATCH v2 11/15 rtlwifi: btcoex: Add new but dummy definitions introduced by 8822b
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
btcoex support multiple platforms, but this drivers doesn't support full functions yet, so this commit adds dummy definitions.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 9 +++++++++ drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 3 +++ 2 files changed, 12 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +9 -0
@@ -656,6 +656,9 @@ static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf)case BTC_GET_BL_IS_ASUS_8723B : *bool_tmp = false;break ; +case BTC_GET_BL_RF4CE_CONNECTED : + *bool_tmp = false; +break ;case BTC_GET_S4_WIFI_RSSI : *s32_tmp =halbtc_get_wifi_rssi (rtlpriv);break ;
@@ -1141,6 +1144,11 @@ static void halbtc_display_dbg_msg(void *bt_context, u8 disp_type, } } +static u32 halbtc_get_bt_reg (void *btc_context,u8 reg_type,u32 offset) +{ +return 0 ; +} +static bool halbtc_under_ips (struct btc_coexist *btcoexist) {struct rtl_priv *rtlpriv = btcoexist->adapter;
@@ -1291,6 +1299,7 @@ bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv) btcoexist->btc_get = halbtc_get; btcoexist->btc_set = halbtc_set; btcoexist->btc_set_bt_reg = halbtc_set_bt_reg; + btcoexist->btc_get_bt_reg = halbtc_get_bt_reg; btcoexist->bt_info.bt_ctrl_buf_size = false; btcoexist->bt_info.agg_buf_size =5 ;
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +3 -0
@@ -338,6 +338,7 @@ enum btc_set_type {BTC_SET_ACT_GET_BT_RSSI ,BTC_SET_ACT_AGGREGATE_CTRL ,BTC_SET_ACT_ANTPOSREGRISTRY_CTRL , + BTC_SET_MIMO_PS_MODE,/********* for 1Ant **********/ /* type bool */
@@ -356,6 +357,7 @@ enum btc_set_type {BTC_SET_ACT_POST_NORMAL_LPS ,BTC_SET_ACT_INC_FORCE_EXEC_PWR_CMD_CNT ,BTC_SET_ACT_DISABLE_LOW_POWER , +BTC_SET_BL_BT_LNA_CONSTRAIN_LEVEL ,BTC_SET_ACT_UPDATE_RAMASK , BTC_SET_ACT_SEND_MIMO_PS,/* BT Coex related */
@@ -738,6 +740,7 @@ struct btc_coexist {void (*btc_set_bt_reg)(void *btc_context,u8 reg_type,u32 offset,u32 value); +u32 (*btc_get_bt_reg)(void *btc_context,u8 reg_type,u32 offset);u32 (*btc_get_bt_coex_supported_feature)(void *btcoexist);u32 (*btc_get_bt_coex_supported_version)(void *btcoexist);u32 (*btc_get_bt_phydm_version)(void *btcoexist);
Signature · 1 line
2.15.1
Re: [PATCH v2 11/15] rtlwifi: btcoex: Add new but dummy definitions introduced by 8822b
Quoted 6 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
btcoex support multiple platforms, but this drivers doesn't support full functions yet, so this commit adds dummy definitions.
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 68 lines
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 9 +++++++++ drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h | 3 +++ 2 files changed, 12 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +9
-0@@ -656,6 +656,9 @@ static bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf)case BTC_GET_BL_IS_ASUS_8723B : *bool_tmp = false;break ; +case BTC_GET_BL_RF4CE_CONNECTED : + *bool_tmp = false; +break ;case BTC_GET_S4_WIFI_RSSI : *s32_tmp =halbtc_get_wifi_rssi (rtlpriv);break ;@@ -1141,6 +1144,11 @@ static void halbtc_display_dbg_msg(void *bt_context, u8 disp_type, } } +static u32 halbtc_get_bt_reg (void *btc_context,u8 reg_type,u32 offset) +{ +return 0 ; +} +static bool halbtc_under_ips (struct btc_coexist *btcoexist) {struct rtl_priv *rtlpriv = btcoexist->adapter;@@ -1291,6 +1299,7 @@ bool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv) btcoexist->btc_get = halbtc_get; btcoexist->btc_set = halbtc_set; btcoexist->btc_set_bt_reg = halbtc_set_bt_reg; + btcoexist->btc_get_bt_reg = halbtc_get_bt_reg; btcoexist->bt_info.bt_ctrl_buf_size = false; btcoexist->bt_info.agg_buf_size =5 ;drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.h +3
-0@@ -338,6 +338,7 @@ enum btc_set_type {BTC_SET_ACT_GET_BT_RSSI ,BTC_SET_ACT_AGGREGATE_CTRL ,BTC_SET_ACT_ANTPOSREGRISTRY_CTRL , + BTC_SET_MIMO_PS_MODE,/********* for 1Ant **********/ /* type bool */ @@ -356,6 +357,7 @@ enum btc_set_type {BTC_SET_ACT_POST_NORMAL_LPS ,BTC_SET_ACT_INC_FORCE_EXEC_PWR_CMD_CNT ,BTC_SET_ACT_DISABLE_LOW_POWER , +BTC_SET_BL_BT_LNA_CONSTRAIN_LEVEL ,BTC_SET_ACT_UPDATE_RAMASK , BTC_SET_ACT_SEND_MIMO_PS,/* BT Coex related */ @@ -738,6 +740,7 @@ struct btc_coexist {void (*btc_set_bt_reg)(void *btc_context,u8 reg_type,u32 offset,u32 value); +u32 (*btc_get_bt_reg)(void *btc_context,u8 reg_type,u32 offset);u32 (*btc_get_bt_coex_supported_feature)(void *btcoexist);u32 (*btc_get_bt_coex_supported_version)(void *btcoexist);u32 (*btc_get_bt_phydm_version)(void *btcoexist);
[email protected]
maintainerPATCH v2 12/15 rtlwifi: btcoex: Add 8822b 1ant/2ant coex files
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
There are two or three physical antenna in 8822be WiFi modules, so btcoex introduce two coex files to handle these two cases.
--- .../realtek/rtlwifi/btcoexist/halbtc8822b1ant.c | 5327 +++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtc8822b1ant.h | 413 ++ .../realtek/rtlwifi/btcoexist/halbtc8822b2ant.c | 5370 ++++++++++++++++++++ .../realtek/rtlwifi/btcoexist/halbtc8822b2ant.h | 434 ++ 4 files changed, 11544 insertions(+) create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b1ant.c create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b1ant.h create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b2ant.c create mode 100644 drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b2ant.h
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b1ant.c new file +5327 -0
@@ -0,0 +1,5327 @@ +/****************************************************************************** +* +* Copyright(c) 2016 - 2017 Realtek Corporation. +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of version 2 of the GNU General Public License as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, but WITHOUT +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +* more details. +* +*****************************************************************************/ + +/* ************************************************************ +* Description: +* +* This file is for RTL8822B Co-exist mechanism +* +* History +* 2012/11/15 Cosa first check in. +* +* *************************************************************/ + +/* ************************************************************ +* include files +* *************************************************************/ +/*only for rf4ce*/ +#include "halbt_precomp.h" + +/* ************************************************************ +* Global variables, these are static variables +* *************************************************************/ +static struct coex_dm_8822b_1ant glcoex_dm_8822b_1ant; +static struct coex_dm_8822b_1ant *coex_dm = &glcoex_dm_8822b_1ant; +static struct coex_sta_8822b_1ant glcoex_sta_8822b_1ant; +static struct coex_sta_8822b_1ant *coex_sta = &glcoex_sta_8822b_1ant; +static struct rfe_type_8822b_1ant gl_rfe_type_8822b_1ant; +static struct rfe_type_8822b_1ant *rfe_type = &gl_rfe_type_8822b_1ant; + +static const char *const glbt_info_src_8822b_1ant[] = { +"BT Info[wifi fw]" , +"BT Info[bt rsp]" , +"BT Info[bt auto report]" , +}; + +static u32 glcoex_ver_date_8822b_1ant =20180112 ; +static u32 glcoex_ver_8822b_1ant =0x59 ; +static u32 glcoex_ver_btdesired_8822b_1ant =0x56 ; + +/* ************************************************************ +* local function proto type if needed +* ************************************************************ +* ************************************************************ +* local function start with halbtc8822b1ant_ +* *************************************************************/ + +static u8 halbtc8822b1ant_wifi_rssi_state (struct btc_coexist *btcoexist, +u8 *pprewifi_rssi_state,u8 level_num, +u8 rssi_thresh,u8 rssi_thresh1) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +s32 wifi_rssi =0 ; +u8 wifi_rssi_state = *pprewifi_rssi_state; + + btcoexist->btc_get (btcoexist,BTC_GET_S4_WIFI_RSSI , &wifi_rssi); + +if (level_num ==2 ) { +if ((*pprewifi_rssi_state ==BTC_RSSI_STATE_LOW ) || + (*pprewifi_rssi_state ==BTC_RSSI_STATE_STAY_LOW )) { +if (wifi_rssi >= (rssi_thresh + +BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT )) + wifi_rssi_state =BTC_RSSI_STATE_HIGH ; +else + wifi_rssi_state =BTC_RSSI_STATE_STAY_LOW ; + }else { +if (wifi_rssi < rssi_thresh) + wifi_rssi_state =BTC_RSSI_STATE_LOW ; +else + wifi_rssi_state =BTC_RSSI_STATE_STAY_HIGH ; + } + }else if (level_num ==3 ) { +if (rssi_thresh > rssi_thresh1) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], wifi RSSI thresh error!!\n" ); +return *pprewifi_rssi_state; + } + +if ((*pprewifi_rssi_state ==BTC_RSSI_STATE_LOW ) || + (*pprewifi_rssi_state ==BTC_RSSI_STATE_STAY_LOW )) { +if (wifi_rssi >= (rssi_thresh + +BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT )) + wifi_rssi_state =BTC_RSSI_STATE_MEDIUM ; +else + wifi_rssi_state =BTC_RSSI_STATE_STAY_LOW ; + }else if ((*pprewifi_rssi_state ==BTC_RSSI_STATE_MEDIUM ) || + (*pprewifi_rssi_state == +BTC_RSSI_STATE_STAY_MEDIUM )) { +if (wifi_rssi >= (rssi_thresh1 + +BTC_RSSI_COEX_THRESH_TOL_8822B_1ANT )) + wifi_rssi_state =BTC_RSSI_STATE_HIGH ; +else if (wifi_rssi < rssi_thresh) + wifi_rssi_state =BTC_RSSI_STATE_LOW ; +else + wifi_rssi_state =BTC_RSSI_STATE_STAY_MEDIUM ; + }else { +if (wifi_rssi < rssi_thresh1) + wifi_rssi_state =BTC_RSSI_STATE_MEDIUM ; +else + wifi_rssi_state =BTC_RSSI_STATE_STAY_HIGH ; + } + } + + *pprewifi_rssi_state = wifi_rssi_state; + +return wifi_rssi_state; +} + +/* rx agg size setting : +* 1: true / don't care / don't care +* max: false / false / don't care +* 7: false / true / 7 +*/ + +static void halbtc8822b1ant_limited_rx (struct btc_coexist *btcoexist, +bool force_exec, +bool rej_ap_agg_pkt, +bool bt_ctrl_agg_buf_size, +u8 agg_buf_size) +{ +bool reject_rx_agg = rej_ap_agg_pkt; +bool bt_ctrl_rx_agg_size = bt_ctrl_agg_buf_size; +u8 rx_agg_size = agg_buf_size; + +/* ============================================ */ +/* Rx Aggregation related setting */ +/* ============================================ */ + btcoexist->btc_set (btcoexist,BTC_SET_BL_TO_REJ_AP_AGG_PKT , + &reject_rx_agg); +/* decide BT control aggregation buf size or not */ + btcoexist->btc_set (btcoexist,BTC_SET_BL_BT_CTRL_AGG_SIZE , + &bt_ctrl_rx_agg_size); +/* aggregation buf size, only work when BT control Rx aggregation size*/ + btcoexist->btc_set (btcoexist,BTC_SET_U1_AGG_BUF_SIZE , &rx_agg_size); +/* real update aggregation setting */ + btcoexist->btc_set (btcoexist,BTC_SET_ACT_AGGREGATE_CTRL ,NULL ); +} + +static void halbtc8822b1ant_query_bt_info (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +u8 h2c_parameter[1 ] = {0 }; + +if (coex_sta->bt_disabled) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], No query BT info because BT is disabled!\n" ); +return ; + } + + h2c_parameter[0 ] |=BIT (0 );/* trigger */ + + btcoexist->btc_fill_h2c (btcoexist,0x61 ,1 , h2c_parameter); + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], WL query BT info!!\n" ); +} + +static void halbtc8822b1ant_monitor_bt_ctr (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +u32 reg_hp_txrx, reg_lp_txrx, u32tmp; +u32 reg_hp_tx =0 , reg_hp_rx =0 , reg_lp_tx =0 , reg_lp_rx =0 ; +static u8 num_of_bt_counter_chk, cnt_slave, cnt_autoslot_hang; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + + reg_hp_txrx =0x770 ; + reg_lp_txrx =0x774 ; + + u32tmp = btcoexist->btc_read_4byte (btcoexist, reg_hp_txrx); + reg_hp_tx = u32tmp &MASKLWORD ; + reg_hp_rx = (u32tmp &MASKHWORD ) >>16 ; + + u32tmp = btcoexist->btc_read_4byte (btcoexist, reg_lp_txrx); + reg_lp_tx = u32tmp &MASKLWORD ; + reg_lp_rx = (u32tmp &MASKHWORD ) >>16 ; + + coex_sta->high_priority_tx = reg_hp_tx; + coex_sta->high_priority_rx = reg_hp_rx; + coex_sta->low_priority_tx = reg_lp_tx; + coex_sta->low_priority_rx = reg_lp_rx; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Hi-Pri Rx/Tx: %d/%d, Lo-Pri Rx/Tx: %d/%d\n" , + reg_hp_rx, reg_hp_tx, reg_lp_rx, reg_lp_tx); + +/* reset counter */ + btcoexist->btc_write_1byte (btcoexist,0x76e ,0xc ); + +if (coex_sta->low_priority_tx >1150 && + !coex_sta->c2h_bt_inquiry_page) + coex_sta->pop_event_cnt++; + +if (coex_sta->low_priority_rx >=1150 && + coex_sta->low_priority_rx >= coex_sta->low_priority_tx && + !coex_sta->under_ips && !coex_sta->c2h_bt_inquiry_page && + coex_sta->bt_link_exist) { +if (cnt_slave >=3 ) { + bt_link_info->slave_role = true; + cnt_slave =3 ; + }else { + cnt_slave++; + } + }else { +if (cnt_slave ==0 ) { + bt_link_info->slave_role = false; + cnt_slave =0 ; + }else { + cnt_slave--; + } + } + +if (coex_sta->is_tdma_btautoslot) { +if (coex_sta->low_priority_tx >=1300 && + coex_sta->low_priority_rx <=150 ) { +if (cnt_autoslot_hang >=2 ) { + coex_sta->is_tdma_btautoslot_hang = true; + cnt_autoslot_hang =2 ; + }else { + cnt_autoslot_hang++; + } + }else { +if (cnt_autoslot_hang ==0 ) { + coex_sta->is_tdma_btautoslot_hang = false; + cnt_autoslot_hang =0 ; + }else { + cnt_autoslot_hang--; + } + } + } + +if (bt_link_info->hid_only) { +if (coex_sta->low_priority_tx >50 ) + coex_sta->is_hid_low_pri_tx_overhead = true; +else + coex_sta->is_hid_low_pri_tx_overhead = false; + } + +if (coex_sta->high_priority_tx ==0 && + coex_sta->high_priority_rx ==0 && + coex_sta->low_priority_tx ==0 && + coex_sta->low_priority_rx ==0 ) { + num_of_bt_counter_chk++; + +if (num_of_bt_counter_chk >=3 ) { +halbtc8822b1ant_query_bt_info (btcoexist); + num_of_bt_counter_chk =0 ; + } + } +} + +static void halbtc8822b1ant_monitor_wifi_ctr (struct btc_coexist *btcoexist) +{ +s32 wifi_rssi =0 ; +bool wifi_busy = false, wifi_under_b_mode = false, wifi_scan = false; +static u8 wl_noisy_count0, wl_noisy_count1 =3 , wl_noisy_count2; +u32 cnt_cck; +static u8 cnt_ccklocking; +u8 h2c_parameter[1 ] = {0 }; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + +/* Only enable for windows becaus 8821cu H2C 0x69 unknown fail @linux */ +if (btcoexist->chip_interface !=BTC_INTF_USB ) { +/*send h2c to query WL FW dbg info */ +if ((coex_dm->cur_ps_tdma_on && coex_sta->force_lps_ctrl) || + (coex_sta->acl_busy && bt_link_info->a2dp_exist)) { + h2c_parameter[0 ] =0x8 ; + btcoexist->btc_fill_h2c (btcoexist,0x69 ,1 , + h2c_parameter); + } + } + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); + btcoexist->btc_get (btcoexist,BTC_GET_S4_WIFI_RSSI , &wifi_rssi); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_UNDER_B_MODE , + &wifi_under_b_mode); + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_SCAN , &wifi_scan); + + coex_sta->crc_ok_cck = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_OK_CCK ); + coex_sta->crc_ok_11g = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_OK_LEGACY ); + coex_sta->crc_ok_11n = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_OK_HT ); + coex_sta->crc_ok_11n_vht = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_OK_VHT ); + + coex_sta->crc_err_cck = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_ERROR_CCK ); + coex_sta->crc_err_11g = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_ERROR_LEGACY ); + coex_sta->crc_err_11n = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_ERROR_HT ); + coex_sta->crc_err_11n_vht = + btcoexist->btc_phydm_query_phy_counter (btcoexist, +DM_INFO_CRC32_ERROR_VHT ); + +/* CCK lock identification */ +if (coex_sta->cck_lock) + cnt_ccklocking++; +else if (cnt_ccklocking !=0 ) + cnt_ccklocking--; + +if (cnt_ccklocking >=3 ) { + cnt_ccklocking =3 ; + coex_sta->cck_lock_ever = true; + } + +/* WiFi environment noisy identification */ + cnt_cck = coex_sta->crc_ok_cck + coex_sta->crc_err_cck; + +if (!wifi_busy && !coex_sta->cck_lock) { +if (cnt_cck >250 ) { +if (wl_noisy_count2 <3 ) + wl_noisy_count2++; + +if (wl_noisy_count2 ==3 ) { + wl_noisy_count0 =0 ; + wl_noisy_count1 =0 ; + } + + }else if (cnt_cck <50 ) { +if (wl_noisy_count0 <3 ) + wl_noisy_count0++; + +if (wl_noisy_count0 ==3 ) { + wl_noisy_count1 =0 ; + wl_noisy_count2 =0 ; + } + + }else { +if (wl_noisy_count1 <3 ) + wl_noisy_count1++; + +if (wl_noisy_count1 ==3 ) { + wl_noisy_count0 =0 ; + wl_noisy_count2 =0 ; + } + } + +if (wl_noisy_count2 ==3 ) + coex_sta->wl_noisy_level =2 ; +else if (wl_noisy_count1 ==3 ) + coex_sta->wl_noisy_level =1 ; +else + coex_sta->wl_noisy_level =0 ; + } +} + +static bool +halbtc8822b1ant_is_wifibt_status_changed (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +static bool pre_wifi_busy, pre_under_4way, + pre_bt_hs_on, pre_rf4ce_enabled, + pre_bt_off, pre_bt_slave, + pre_hid_low_pri_tx_overhead, + pre_wifi_under_lps, pre_bt_setup_link; +static u8 pre_hid_busy_num, pre_wl_noisy_level; +bool wifi_busy = false, under_4way = false, bt_hs_on = false, + rf4ce_enabled = false; +bool wifi_connected = false; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; +static u8 cnt_wifi_busytoidle; +u32 wifi_link_status =0 , num_of_wifi_link =0 ; +static u32 pre_num_of_wifi_link; + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_CONNECTED , + &wifi_connected); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); + btcoexist->btc_get (btcoexist,BTC_GET_BL_HS_OPERATION , &bt_hs_on); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_4_WAY_PROGRESS , + &under_4way); + btcoexist->btc_get (btcoexist,BTC_GET_U4_WIFI_LINK_STATUS , + &wifi_link_status); + +if (wifi_busy) { + coex_sta->gl_wifi_busy = true; + cnt_wifi_busytoidle =3 ; + }else { +if (coex_sta->gl_wifi_busy && cnt_wifi_busytoidle >0 ) + cnt_wifi_busytoidle--; +else if (cnt_wifi_busytoidle ==0 ) + coex_sta->gl_wifi_busy = false; + } + +if (coex_sta->bt_disabled != pre_bt_off) { + pre_bt_off = coex_sta->bt_disabled; + +if (coex_sta->bt_disabled) +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT is disabled !!\n" ); +else +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT is enabled !!\n" ); + + coex_sta->bt_coex_supported_feature =0 ; + coex_sta->bt_coex_supported_version =0 ; + coex_sta->bt_ble_scan_type =0 ; + coex_sta->bt_ble_scan_para[0 ] =0 ; + coex_sta->bt_ble_scan_para[1 ] =0 ; + coex_sta->bt_ble_scan_para[2 ] =0 ; + coex_sta->bt_reg_vendor_ac =0xffff ; + coex_sta->bt_reg_vendor_ae =0xffff ; + coex_sta->legacy_forbidden_slot =0 ; + coex_sta->le_forbidden_slot =0 ; + coex_sta->bt_a2dp_vendor_id =0 ; + coex_sta->bt_a2dp_device_name =0 ; +return true; + } + + num_of_wifi_link = wifi_link_status >>16 ; + +if (num_of_wifi_link != pre_num_of_wifi_link) { + pre_num_of_wifi_link = num_of_wifi_link; +return true; + } + + btcoexist->btc_get (btcoexist,BTC_GET_BL_RF4CE_CONNECTED , + &rf4ce_enabled); + +if (rf4ce_enabled != pre_rf4ce_enabled) { + pre_rf4ce_enabled = rf4ce_enabled; + +if (rf4ce_enabled) +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], rf4ce is enabled !!\n" ); +else +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], rf4ce is disabled !!\n" ); + +return true; + } + +if (wifi_connected) { +if (wifi_busy != pre_wifi_busy) { + pre_wifi_busy = wifi_busy; +return true; + } +if (under_4way != pre_under_4way) { + pre_under_4way = under_4way; +return true; + } +if (bt_hs_on != pre_bt_hs_on) { + pre_bt_hs_on = bt_hs_on; +return true; + } +if (coex_sta->wl_noisy_level != pre_wl_noisy_level) { + pre_wl_noisy_level = coex_sta->wl_noisy_level; +return true; + } +if (coex_sta->under_lps != pre_wifi_under_lps) { + pre_wifi_under_lps = coex_sta->under_lps; +if (coex_sta->under_lps) +return true; + } + } + +if (!coex_sta->bt_disabled) { +if (coex_sta->hid_busy_num != pre_hid_busy_num) { + pre_hid_busy_num = coex_sta->hid_busy_num; +return true; + } + +if (bt_link_info->slave_role != pre_bt_slave) { + pre_bt_slave = bt_link_info->slave_role; +return true; + } + +if (pre_hid_low_pri_tx_overhead != + coex_sta->is_hid_low_pri_tx_overhead) { + pre_hid_low_pri_tx_overhead = + coex_sta->is_hid_low_pri_tx_overhead; +return true; + } + +if (pre_bt_setup_link != coex_sta->is_setup_link) { + pre_bt_setup_link = coex_sta->is_setup_link; +return true; + } + } + +return false; +} + +static void halbtc8822b1ant_update_bt_link_info (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; +bool bt_hs_on = false; +bool bt_busy = false; +u32 val =0 ; +static u8 pre_num_of_profile, cur_num_of_profile, cnt; +bool increase_scan_dev_num = false; + +if (coex_sta->is_ble_scan_toggle) { +u32 *p =NULL ; +u8 scantype; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT ext info bit4 check, query BLE Scan type!!\n" ); + coex_sta->bt_ble_scan_type = + btcoexist->btc_get_ble_scan_type_from_bt (btcoexist); + +if ((coex_sta->bt_ble_scan_type &0x1 ) ==0x1 ) { + p = &coex_sta->bt_ble_scan_para[0 ]; + scantype =0x1 ; + } + +if ((coex_sta->bt_ble_scan_type &0x2 ) ==0x2 ) { + p = &coex_sta->bt_ble_scan_para[1 ]; + scantype =0x2 ; + } + +if ((coex_sta->bt_ble_scan_type &0x4 ) ==0x4 ) { + p = &coex_sta->bt_ble_scan_para[2 ]; + scantype =0x4 ; + } + +if (p) + *p = btcoexist->btc_get_ble_scan_para_from_bt (btcoexist, + scantype); + } + + coex_sta->num_of_profile =0 ; + +/* set link exist status */ +if (!(coex_sta->bt_info &BT_INFO_8822B_1ANT_B_CONNECTION )) { + coex_sta->bt_link_exist = false; + coex_sta->pan_exist = false; + coex_sta->a2dp_exist = false; + coex_sta->hid_exist = false; + coex_sta->sco_exist = false; + coex_sta->msft_mr_exist = false; + }else {/* connection exists */ + coex_sta->bt_link_exist = true; +if (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_FTP ) { + coex_sta->pan_exist = true; + coex_sta->num_of_profile++; + }else { + coex_sta->pan_exist = false; + } + +if (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_A2DP ) { + coex_sta->a2dp_exist = true; + coex_sta->num_of_profile++; + }else { + coex_sta->a2dp_exist = false; + } + +if (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_HID ) { + coex_sta->hid_exist = true; + coex_sta->num_of_profile++; + }else { + coex_sta->hid_exist = false; + } + +if (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_SCO_ESCO ) { + coex_sta->sco_exist = true; + coex_sta->num_of_profile++; + }else { + coex_sta->sco_exist = false; + } + +if (coex_sta->hid_busy_num ==0 && + coex_sta->hid_pair_cnt >0 ) + coex_sta->msft_mr_exist = true; +else + coex_sta->msft_mr_exist = false; + } + + btcoexist->btc_get (btcoexist,BTC_GET_BL_HS_OPERATION , &bt_hs_on); + + bt_link_info->bt_link_exist = coex_sta->bt_link_exist; + bt_link_info->sco_exist = coex_sta->sco_exist; + bt_link_info->a2dp_exist = coex_sta->a2dp_exist; + bt_link_info->pan_exist = coex_sta->pan_exist; + bt_link_info->hid_exist = coex_sta->hid_exist; + bt_link_info->acl_busy = coex_sta->acl_busy; + +/* work around for HS mode. */ +if (bt_hs_on) { + bt_link_info->pan_exist = true; + bt_link_info->bt_link_exist = true; + } + +/* check if Sco only */ +if (bt_link_info->sco_exist && !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && !bt_link_info->hid_exist) + bt_link_info->sco_only = true; +else + bt_link_info->sco_only = false; + +/* check if A2dp only */ +if (!bt_link_info->sco_exist && bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && !bt_link_info->hid_exist) + bt_link_info->a2dp_only = true; +else + bt_link_info->a2dp_only = false; + +/* check if Pan only */ +if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist && + bt_link_info->pan_exist && !bt_link_info->hid_exist) + bt_link_info->pan_only = true; +else + bt_link_info->pan_only = false; + +/* check if Hid only */ +if (!bt_link_info->sco_exist && !bt_link_info->a2dp_exist && + !bt_link_info->pan_exist && bt_link_info->hid_exist) + bt_link_info->hid_only = true; +else + bt_link_info->hid_only = false; + +if (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_INQ_PAGE ) { + coex_dm->bt_status =BT_8822B_1ANT_BT_STATUS_INQ_PAGE ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT Inq/page!!!\n" ); + }else if (!(coex_sta->bt_info &BT_INFO_8822B_1ANT_B_CONNECTION )) { + coex_dm->bt_status =BT_8822B_1ANT_BT_STATUS_NCONNECTED_IDLE ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT Non-Connected idle!!!\n" ); + }else if (coex_sta->bt_info ==BT_INFO_8822B_1ANT_B_CONNECTION ) { +/* connection exists but no busy */ + +if (coex_sta->msft_mr_exist) { + coex_dm->bt_status =BT_8822B_1ANT_BT_STATUS_ACL_BUSY ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT ACL busy!!\n" ); + }else { + coex_dm->bt_status = +BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT Connected-idle!!!\n" ); + } + }else if (((coex_sta->bt_info &BT_INFO_8822B_1ANT_B_SCO_ESCO ) || + (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_SCO_BUSY )) && + (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_ACL_BUSY )) { + coex_dm->bt_status =BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT ACL SCO busy!!!\n" ); + }else if ((coex_sta->bt_info &BT_INFO_8822B_1ANT_B_SCO_ESCO ) || + (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_SCO_BUSY )) { + coex_dm->bt_status =BT_8822B_1ANT_BT_STATUS_SCO_BUSY ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT SCO busy!!!\n" ); + }else if (coex_sta->bt_info &BT_INFO_8822B_1ANT_B_ACL_BUSY ) { + coex_dm->bt_status =BT_8822B_1ANT_BT_STATUS_ACL_BUSY ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT ACL busy!!!\n" ); + }else { + coex_dm->bt_status =BT_8822B_1ANT_BT_STATUS_MAX ; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), BT Non-Defined state!!!\n" ); + } + +if (coex_dm->bt_status ==BT_8822B_1ANT_BT_STATUS_ACL_BUSY || + coex_dm->bt_status ==BT_8822B_1ANT_BT_STATUS_SCO_BUSY || + coex_dm->bt_status ==BT_8822B_1ANT_BT_STATUS_ACL_SCO_BUSY ) { + bt_busy = true; + increase_scan_dev_num = true; + }else { + bt_busy = false; + increase_scan_dev_num = false; + } + + btcoexist->btc_set (btcoexist,BTC_SET_BL_BT_TRAFFIC_BUSY , &bt_busy); + btcoexist->btc_set (btcoexist,BTC_SET_BL_INC_SCAN_DEV_NUM , + &increase_scan_dev_num); + + cur_num_of_profile = coex_sta->num_of_profile; + +if (cur_num_of_profile != pre_num_of_profile) + cnt =2 ; + +if (bt_link_info->a2dp_exist) { +if ((coex_sta->bt_a2dp_vendor_id ==0 && + coex_sta->bt_a2dp_device_name ==0 ) || + cur_num_of_profile != pre_num_of_profile) { + btcoexist->btc_get (btcoexist,BTC_GET_U4_BT_DEVICE_INFO , + &val); + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), get BT DEVICE_INFO = %x\n" , + val); + + coex_sta->bt_a2dp_vendor_id = (u8)(val &0xff ); + coex_sta->bt_a2dp_device_name = (val &0xffffff00 ) >>8 ; + } + +if ((coex_sta->legacy_forbidden_slot ==0 && + coex_sta->le_forbidden_slot ==0 ) || + cur_num_of_profile != pre_num_of_profile || cnt >0 ) { +if (cnt >0 ) + cnt--; + + btcoexist->btc_get (btcoexist, +BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL , + &val); + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BtInfoNotify(), get BT FORBIDDEN_SLOT_VAL = %x\n" , + val); + + coex_sta->legacy_forbidden_slot = (u16)(val &0xffff ); + coex_sta->le_forbidden_slot = + (u16)((val &0xffff0000 ) >>16 ); + } + } + + pre_num_of_profile = coex_sta->num_of_profile; +} + +static void +halbtc8822b1ant_update_wifi_ch_info (struct btc_coexist *btcoexist,u8 type) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +u8 h2c_parameter[3 ] = {0 }, i; +u32 wifi_bw; +u8 wifi_central_chnl =0 ; +u8 wifi_5g_chnl[19 ] = {120 ,124 ,128 ,132 ,136 ,140 ,144 ,149 ,153 ,157 , +118 ,126 ,134 ,142 ,151 ,159 ,122 ,138 ,155 }; +u8 bt_skip_cneter_chanl[19 ] = {2 ,8 ,17 ,26 ,34 ,42 ,51 ,62 ,71 ,77 , +2 ,12 ,29 ,46 ,66 ,76 ,10 ,37 ,68 }; +u8 bt_skip_span[19 ] = {4 ,8 ,8 ,10 ,8 ,10 ,8 ,8 ,10 ,4 , +4 ,16 ,16 ,16 ,16 ,4 ,20 ,34 ,20 }; +bool wifi_under_5g = false; + + btcoexist->btc_get (btcoexist,BTC_GET_U4_WIFI_BW , &wifi_bw); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_UNDER_5G , &wifi_under_5g); + +if (type ==BTC_MEDIA_CONNECT ) { + btcoexist->btc_get (btcoexist,BTC_GET_U1_WIFI_CENTRAL_CHNL , + &wifi_central_chnl); + coex_sta->wl_center_channel = wifi_central_chnl; + +if (!wifi_under_5g) { + h2c_parameter[0 ] =0x1 ; + h2c_parameter[1 ] = wifi_central_chnl; + +if (wifi_bw ==BTC_WIFI_BW_HT40 ) + h2c_parameter[2 ] =0x30 ; +else + h2c_parameter[2 ] =0x30 ; + }else {/* for 5G */ + +for (i =0 ; i <=18 ; i++) { +if (wifi_central_chnl == wifi_5g_chnl[i]) +break ; + } + +if (i <=18 ) { + h2c_parameter[0 ] =0x3 ; + h2c_parameter[1 ] = bt_skip_cneter_chanl[i]; + h2c_parameter[2 ] = bt_skip_span[i]; + } + } + } + + coex_dm->wifi_chnl_info[0 ] = h2c_parameter[0 ]; + coex_dm->wifi_chnl_info[1 ] = h2c_parameter[1 ]; + coex_dm->wifi_chnl_info[2 ] = h2c_parameter[2 ]; + + btcoexist->btc_fill_h2c (btcoexist,0x66 ,3 , h2c_parameter); + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], para[0:2] = 0x%x 0x%x 0x%x\n" , h2c_parameter[0 ], + h2c_parameter[1 ], h2c_parameter[2 ]); +} + +static u8 halbtc8822b1ant_action_algorithm (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; +bool bt_hs_on = false; +u8 algorithm =BT_8822B_1ANT_COEX_UNDEFINED ; +u8 num_of_diff_profile =0 ; + + btcoexist->btc_get (btcoexist,BTC_GET_BL_HS_OPERATION , &bt_hs_on); + +if (!bt_link_info->bt_link_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], No BT link exists!!!\n" ); +return algorithm; + } + +if (bt_link_info->sco_exist) + num_of_diff_profile++; +if (bt_link_info->hid_exist) + num_of_diff_profile++; +if (bt_link_info->pan_exist) + num_of_diff_profile++; +if (bt_link_info->a2dp_exist) + num_of_diff_profile++; + +if (num_of_diff_profile ==1 ) { +if (bt_link_info->sco_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT Profile = SCO only\n" ); + algorithm =BT_8822B_1ANT_COEX_SCO ; + }else { +if (bt_link_info->hid_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT Profile = HID only\n" ); + algorithm =BT_8822B_1ANT_COEX_HID ; + }else if (bt_link_info->a2dp_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT Profile = A2DP only\n" ); + algorithm =BT_8822B_1ANT_COEX_A2DP ; + }else if (bt_link_info->pan_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = PAN(HS) only\n" ); + algorithm = +BT_8822B_1ANT_COEX_PANHS ; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = PAN(EDR) only\n" ); + algorithm =BT_8822B_1ANT_COEX_PAN ; + } + } + } + }else if (num_of_diff_profile ==2 ) { +if (bt_link_info->sco_exist) { +if (bt_link_info->hid_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT Profile = SCO + HID\n" ); + algorithm =BT_8822B_1ANT_COEX_HID ; + }else if (bt_link_info->a2dp_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT Profile = SCO + A2DP ==> SCO\n" ); + algorithm =BT_8822B_1ANT_COEX_SCO ; + }else if (bt_link_info->pan_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = SCO + PAN(HS)\n" ); + algorithm =BT_8822B_1ANT_COEX_SCO ; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = SCO + PAN(EDR)\n" ); + algorithm =BT_8822B_1ANT_COEX_PAN_HID ; + } + } + }else { +if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT Profile = HID + A2DP\n" ); + algorithm =BT_8822B_1ANT_COEX_HID_A2DP ; + }else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = HID + PAN(HS)\n" ); + algorithm = +BT_8822B_1ANT_COEX_HID_A2DP ; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = HID + PAN(EDR)\n" ); + algorithm =BT_8822B_1ANT_COEX_PAN_HID ; + } + }else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = A2DP + PAN(HS)\n" ); + algorithm = +BT_8822B_1ANT_COEX_A2DP_PANHS ; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = A2DP + PAN(EDR)\n" ); + algorithm =BT_8822B_1ANT_COEX_PAN_A2DP ; + } + } + } + }else if (num_of_diff_profile ==3 ) { +if (bt_link_info->sco_exist) { +if (bt_link_info->hid_exist && + bt_link_info->a2dp_exist) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT Profile = SCO + HID + A2DP ==> HID\n" ); + algorithm =BT_8822B_1ANT_COEX_HID ; + }else if (bt_link_info->hid_exist && + bt_link_info->pan_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = SCO + HID + PAN(HS)\n" ); + algorithm = +BT_8822B_1ANT_COEX_HID_A2DP ; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = SCO + HID + PAN(EDR)\n" ); + algorithm =BT_8822B_1ANT_COEX_PAN_HID ; + } + }else if (bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = SCO + A2DP + PAN(HS)\n" ); + algorithm =BT_8822B_1ANT_COEX_SCO ; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = SCO + A2DP + PAN(EDR) ==> HID\n" ); + algorithm =BT_8822B_1ANT_COEX_PAN_HID ; + } + } + }else { +if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = HID + A2DP + PAN(HS)\n" ); + algorithm = +BT_8822B_1ANT_COEX_HID_A2DP ; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = HID + A2DP + PAN(EDR)\n" ); + algorithm = +BT_8822B_1ANT_COEX_HID_A2DP_PAN ; + } + } + } + }else if (num_of_diff_profile >=3 ) { +if (bt_link_info->sco_exist) { +if (bt_link_info->hid_exist && + bt_link_info->pan_exist && + bt_link_info->a2dp_exist) { +if (bt_hs_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], Error!!! BT Profile = SCO + HID + A2DP + PAN(HS)\n" ); + + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST , +DBG_LOUD , +"[BTCoex], BT Profile = SCO + HID + A2DP + PAN(EDR)==>PAN(EDR)+HID\n" ); + algorithm =BT_8822B_1ANT_COEX_PAN_HID ; + } + } + } + } + +return algorithm; +} + +static void halbtc8822b1ant_low_penalty_ra (struct btc_coexist *btcoexist, +bool force_exec, +bool low_penalty_ra) +{ + coex_dm->cur_low_penalty_ra = low_penalty_ra; + +if (!force_exec) { +if (coex_dm->pre_low_penalty_ra == coex_dm->cur_low_penalty_ra) +return ; + } + +if (low_penalty_ra) + btcoexist->btc_phydm_modify_ra_pcr_threshold (btcoexist,0 ,10 ); +else + btcoexist->btc_phydm_modify_ra_pcr_threshold (btcoexist,0 ,0 ); + + coex_dm->pre_low_penalty_ra = coex_dm->cur_low_penalty_ra; +} + +static void halbtc8822b1ant_mimo_ps (struct btc_coexist *btcoexist, +bool force_exec,u8 state) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +static u8 pre_state; + +if (!force_exec) { +if (state == pre_state) +return ; + } + + pre_state = state; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], %s(), state = %d\n" , __func__, state); + + btcoexist->btc_set (btcoexist,BTC_SET_MIMO_PS_MODE , &state); +} + +static void halbtc8822b1ant_write_score_board (struct btc_coexist *btcoexist, +u16 bitpos,bool state) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +static u16 originalval =0x8002 , preval; + +if (state) + originalval = originalval | bitpos; +else + originalval = originalval & (~bitpos); + + coex_sta->score_board_WB = originalval; + +if (originalval != preval) { + preval = originalval; + btcoexist->btc_write_2byte (btcoexist,0xaa , originalval); + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], %s: return for nochange\n" , __func__); + } +} + +static void halbtc8822b1ant_read_score_board (struct btc_coexist *btcoexist, +u16 *score_board_val) +{ + *score_board_val = + (btcoexist->btc_read_2byte (btcoexist,0xaa )) &0x7fff ; +} + +static void halbtc8822b1ant_post_state_to_bt (struct btc_coexist *btcoexist, +u16 type,bool state) +{ +halbtc8822b1ant_write_score_board (btcoexist, (u16 )type, state); +} + +static void halbtc8822b1ant_adjust_wl_tx_power (struct btc_coexist *btcoexist, +bool force_exec, +u8 fw_dac_swing_lvl) +{ + coex_dm->cur_fw_dac_swing_lvl = fw_dac_swing_lvl; + +if (!force_exec) { +if (coex_dm->pre_fw_dac_swing_lvl == + coex_dm->cur_fw_dac_swing_lvl) +return ; + } + + btcoexist->btc_write_1byte_bitmask (btcoexist,0xc5b ,0xff , + fw_dac_swing_lvl); + btcoexist->btc_write_1byte_bitmask (btcoexist,0xe5b ,0xff , + fw_dac_swing_lvl); + + coex_dm->pre_fw_dac_swing_lvl = coex_dm->cur_fw_dac_swing_lvl; +} + +static void halbtc8822b1ant_adjust_bt_tx_power (struct btc_coexist *btcoexist, +bool force_exec, +u8 dec_bt_pwr_lvl) +{ +u8 h2c_parameter[1 ] = {0 }; + + coex_dm->cur_bt_dec_pwr_lvl = dec_bt_pwr_lvl; + +if (!force_exec) { +if (coex_dm->pre_bt_dec_pwr_lvl == coex_dm->cur_bt_dec_pwr_lvl) +return ; + } + + h2c_parameter[0 ] =0 - dec_bt_pwr_lvl; + + btcoexist->btc_fill_h2c (btcoexist,0x62 ,1 , h2c_parameter); + + coex_dm->pre_bt_dec_pwr_lvl = coex_dm->cur_bt_dec_pwr_lvl; +} + +static void halbtc8822b1ant_adjust_wl_rx_gain (struct btc_coexist *btcoexist, +bool force_exec, +bool agc_table_en) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +u32 rx_gain_value_enable[] = { +0xff000003 ,0xea240003 ,0xe9260003 ,0xe8280003 ,0xe72a0003 , +0xe62c0003 ,0xaf2e0003 ,0xae300003 ,0xad320003 ,0xac340003 , +0xab360003 ,0x8d380003 ,0x8c3a0003 ,0x8b3c0003 ,0x8a3e0003 , +0x6e400003 ,0x6d420003 ,0x6c440003 ,0x6b460003 ,0x6a480003 , +0x694a0003 ,0x684c0003 ,0x674e0003 ,0x66500003 ,0x65520003 , +0x64540003 ,0x64560003 ,0x007e0403 }; + +u32 rx_gain_value_disable[] = { +0xff000003 ,0xeb240003 ,0xea260003 ,0xe9280003 ,0xe82a0003 , +0xe72c0003 ,0xe62e0003 ,0xe5300003 ,0xc8320003 ,0xc7340003 , +0xc6360003 ,0xc5380003 ,0xc43a0003 ,0xc33c0003 ,0xc23e0003 , +0xc1400003 ,0xc0420003 ,0xa5440003 ,0xa4460003 ,0xa3480003 , +0xa24a0003 ,0xa14c0003 ,0x834e0003 ,0x82500003 ,0x81520003 , +0x80540003 ,0x65560003 ,0x007e0403 }; + +u8 i; + + coex_dm->cur_agc_table_en = agc_table_en; + +if (!force_exec) { +if (coex_dm->pre_agc_table_en == coex_dm->cur_agc_table_en) +return ; + } + +if (agc_table_en) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BB Agc Table On!\n" ); + +for (i =0 ; i <ARRAY_SIZE (rx_gain_value_enable); i++) { + btcoexist->btc_write_4byte (btcoexist,0x81c , + rx_gain_value_enable[i]); + +if (rx_gain_value_enable[i] ==0x007e0403 ) +break ; + } + + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BB Agc Table Off!\n" ); + +for (i =0 ; i <ARRAY_SIZE (rx_gain_value_disable); i++) { + btcoexist->btc_write_4byte (btcoexist,0x81c , + rx_gain_value_disable[i]); + +if (rx_gain_value_disable[i] ==0x007e0403 ) +break ; + } + } + + coex_dm->pre_agc_table_en = coex_dm->cur_agc_table_en; +} + +static void halbtc8822b1ant_adjust_bt_rx_gain (struct btc_coexist *btcoexist, +bool force_exec, +bool rx_gain_en) +{ +/* use scoreboard[4] to notify BT Rx gain table change */ +halbtc8822b1ant_post_state_to_bt (btcoexist, +BT_8822B_1ANT_SCBD_RXGAIN , + rx_gain_en); +} + +static void +halbtc8822b1ant_monitor_bt_enable_disable (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +static u32 bt_disable_cnt; +bool bt_active = true, bt_disabled = false, wifi_under_5g = false; +u16 u16tmp; + +/* This function check if bt is disabled */ + +/* Read BT on/off status from scoreboard[1], +* enable this only if BT patch support this feature +*/ +halbtc8822b1ant_read_score_board (btcoexist, &u16tmp); + + bt_active = u16tmp &BIT (1 ); + +if (bt_active) { + bt_disable_cnt =0 ; + bt_disabled = false; + btcoexist->btc_set (btcoexist,BTC_SET_BL_BT_DISABLE , + &bt_disabled); + }else { + bt_disable_cnt++; +if (bt_disable_cnt >=2 ) { + bt_disabled = true; + bt_disable_cnt =2 ; + } + + btcoexist->btc_set (btcoexist,BTC_SET_BL_BT_DISABLE , + &bt_disabled); + } + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_UNDER_5G , &wifi_under_5g); + +if ((wifi_under_5g) || (bt_disabled)) +halbtc8822b1ant_low_penalty_ra (btcoexist,NORMAL_EXEC , false); +else +halbtc8822b1ant_low_penalty_ra (btcoexist,NORMAL_EXEC , true); + +if (coex_sta->bt_disabled != bt_disabled) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], BT is from %s to %s!!\n" , + (coex_sta->bt_disabled ?"disabled" :"enabled" ), + (bt_disabled ?"disabled" :"enabled" )); + coex_sta->bt_disabled = bt_disabled; + +/*for win10 RS3 BT disable->enable trigger wifi scan issue */ +if (!coex_sta->bt_disabled) { + coex_sta->is_bt_reenable = true; + coex_sta->cnt_bt_reenable =15 ; + }else { + coex_sta->is_bt_reenable = false; + coex_sta->cnt_bt_reenable =0 ; + } + } +} + +static void halbtc8822b1ant_enable_gnt_to_gpio (struct btc_coexist *btcoexist, +bool isenable) +{ +static u8 bit_val[5 ] = {0 ,0 ,0 ,0 ,0 }; +static bool state; + +if (!btcoexist->dbg_mode_1ant) +return ; + +if (state == isenable) +return ; + + state = isenable; + +if (isenable) { +/* enable GNT_WL, GNT_BT to GPIO for debug */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x73 ,0x8 ,0x1 ); + +/* store original value */ + bit_val[0 ] = (btcoexist->btc_read_1byte (btcoexist,0x66 ) & +BIT (4 )) >>4 ;/*0x66[4] */ + bit_val[1 ] = (btcoexist->btc_read_1byte (btcoexist,0x67 ) & +BIT (0 ));/*0x66[8] */ + bit_val[2 ] = (btcoexist->btc_read_1byte (btcoexist,0x42 ) & +BIT (3 )) >>3 ;/*0x40[19] */ + bit_val[3 ] = (btcoexist->btc_read_1byte (btcoexist,0x65 ) & +BIT (7 )) >>7 ;/*0x64[15] */ + bit_val[4 ] = (btcoexist->btc_read_1byte (btcoexist,0x72 ) & +BIT (2 )) >>2 ;/*0x70[18] */ + +/* switch GPIO Mux */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x66 ,BIT (4 ), +0x0 );/*0x66[4] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x67 ,BIT (0 ), +0x0 );/*0x66[8] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x42 ,BIT (3 ), +0x0 );/*0x40[19] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x65 ,BIT (7 ), +0x0 );/*0x64[15] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x72 ,BIT (2 ), +0x0 );/*0x70[18] = 0 */ + + }else { + btcoexist->btc_write_1byte_bitmask (btcoexist,0x73 ,0x8 ,0x0 ); + +/* Restore original value */ +/* switch GPIO Mux */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x66 ,BIT (4 ), + bit_val[0 ]);/*0x66[4] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x67 ,BIT (0 ), + bit_val[1 ]);/*0x66[8] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x42 ,BIT (3 ), + bit_val[2 ]);/*0x40[19] = 0*/ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x65 ,BIT (7 ), + bit_val[3 ]);/*0x64[15] = 0*/ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x72 ,BIT (2 ), + bit_val[4 ]);/*0x70[18] = 0*/ + } +} + +static +u32 halbtc8822b1ant_ltecoex_read_reg (struct btc_coexist *btcoexist, +u16 reg_addr) +{ +u32 delay_count =0 ; + +/* wait for ready bit before access 0x1700 */ +while (1 ) { +if ((btcoexist->btc_read_1byte (btcoexist,0x1703 ) & +BIT (5 )) ==0 ) { +mdelay (10 ); + delay_count++; +if (delay_count >=10 ) { + delay_count =0 ; +break ; + } + }else { +break ; + } + } + + btcoexist->btc_write_4byte (btcoexist,0x1700 ,0x800F0000 | reg_addr); + +return btcoexist->btc_read_4byte (btcoexist,0x1708 );/* get read data */ +} + +static +void halbtc8822b1ant_ltecoex_write_reg (struct btc_coexist *btcoexist, +u16 reg_addr,u32 bit_mask, +u32 reg_value) +{ +u32 val, i =0 , bitpos =0 , delay_count =0 ; + +if (bit_mask ==0x0 ) +return ; + +if (bit_mask ==0xffffffff ) { +/* wait for ready bit before access 0x1700/0x1704 */ +while (1 ) { +if ((btcoexist->btc_read_1byte (btcoexist,0x1703 ) & +BIT (5 )) ==0 ) { +mdelay (10 ); + delay_count++; +if (delay_count >=10 ) { + delay_count =0 ; +break ; + } + }else { +break ; + } + } + + btcoexist->btc_write_4byte (btcoexist,0x1704 , + reg_value);/* put write data */ + + btcoexist->btc_write_4byte (btcoexist,0x1700 , +0xc00F0000 | reg_addr); + }else { +for (i =0 ; i <=31 ; i++) { +if (((bit_mask >> i) &0x1 ) ==0x1 ) { + bitpos = i; +break ; + } + } + +/* read back register value before write */ + val =halbtc8822b1ant_ltecoex_read_reg (btcoexist, reg_addr); + val = (val & (~bit_mask)) | (reg_value << bitpos); + +/* wait for ready bit before access 0x1700/0x1704 */ +while (1 ) { +if ((btcoexist->btc_read_1byte (btcoexist,0x1703 ) & +BIT (5 )) ==0 ) { +mdelay (10 ); + delay_count++; +if (delay_count >=10 ) { + delay_count =0 ; +break ; + } + }else { +break ; + } + } + + btcoexist->btc_write_4byte (btcoexist,0x1704 , + val);/* put write data */ + + btcoexist->btc_write_4byte (btcoexist,0x1700 , +0xc00F0000 | reg_addr); + } +} + +static +void halbtc8822b1ant_ltecoex_enable (struct btc_coexist *btcoexist, +bool enable) +{ +u8 val; + + val = (enable) ?1 :0 ; +/* 0x38[7] */ +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 ,0x80 , val); +} + +static +void hallbtc882b1ant_ltecoex_ctrl_owner (struct btc_coexist *btcoexist, +bool wifi_control) +{ +u8 val; + + val = (wifi_control) ?1 :0 ; +/* 0x70[26] */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x73 ,0x4 , val); +} + +static void halbtc8822b1ant_set_gnt_bt (struct btc_coexist *btcoexist, +u8 control_block,u8 sw_control, +u8 state) +{ +u32 val =0 , bit_mask; + + state = state &0x1 ; +/*LTE indirect 0x38=0xccxx (sw : gnt_wl=1,sw gnt_bt=1) +*0x38=0xddxx (sw : gnt_bt=1 , sw gnt_wl=0) +*0x38=0x55xx(hw pta :gnt_wl /gnt_bt ) +*/ + val = (sw_control) ? ((state <<1 ) |0x1 ) :0 ; + +switch (control_block) { +case BT_8822B_1ANT_GNT_BLOCK_RFC_BB : +default : +/* 0x38[15:14] */ + bit_mask =0xc000 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +/* 0x38[11:10] */ + bit_mask =0x0c00 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +break ; +case BT_8822B_1ANT_GNT_BLOCK_RFC : +/* 0x38[15:14] */ + bit_mask =0xc000 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +break ; +case BT_8822B_1ANT_GNT_BLOCK_BB : +/* 0x38[11:10] */ + bit_mask =0x0c00 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +break ; + } +} + +static void halbtc8822b1ant_set_gnt_wl (struct btc_coexist *btcoexist, +u8 control_block,u8 sw_control, +u8 state) +{ +u32 val =0 , bit_mask; +/*LTE indirect 0x38=0xccxx (sw : gnt_wl=1,sw gnt_bt=1) +*0x38=0xddxx (sw : gnt_bt=1 , sw gnt_wl=0) +*0x38=0x55xx(hw pta :gnt_wl /gnt_bt ) +*/ + + state = state &0x1 ; + val = (sw_control) ? ((state <<1 ) |0x1 ) :0 ; + +switch (control_block) { +case BT_8822B_1ANT_GNT_BLOCK_RFC_BB : +default : +/* 0x38[13:12] */ + bit_mask =0x3000 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +/* 0x38[9:8] */ + bit_mask =0x0300 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +break ; +case BT_8822B_1ANT_GNT_BLOCK_RFC : +/* 0x38[13:12] */ + bit_mask =0x3000 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +break ; +case BT_8822B_1ANT_GNT_BLOCK_BB : +/* 0x38[9:8] */ + bit_mask =0x0300 ; +halbtc8822b1ant_ltecoex_write_reg (btcoexist,0x38 , + bit_mask, val); +break ; + } +} + +static +void hallbtc882b1ant_ltecoex_table (struct btc_coexist *btcoexist, +u8 table_type,u16 table_content) +{ +u16 reg_addr =0x0000 ; + +switch (table_type) { +case BT_8822B_1ANT_CTT_WL_VS_LTE : + reg_addr =0xa0 ; +break ; +case BT_8822B_1ANT_CTT_BT_VS_LTE : + reg_addr =0xa4 ; +break ; + } + +if (reg_addr ==0x0000 ) +return ; + +/* 0xa0[15:0] or 0xa4[15:0] */ +halbtc8822b1ant_ltecoex_write_reg (btcoexist, reg_addr,0xffff , + table_content); +} + +static +void halbtc8822b1ant_set_coex_table (struct btc_coexist *btcoexist,u32 val0x6c0, +u32 val0x6c4,u32 val0x6c8,u8 val0x6cc) +{ + btcoexist->btc_write_4byte (btcoexist,0x6c0 , val0x6c0); + + btcoexist->btc_write_4byte (btcoexist,0x6c4 , val0x6c4); + + btcoexist->btc_write_4byte (btcoexist,0x6c8 , val0x6c8); + + btcoexist->btc_write_1byte (btcoexist,0x6cc , val0x6cc); +} + +static +void halbtc8822b1ant_coex_table (struct btc_coexist *btcoexist, +bool force_exec,u32 val0x6c0,u32 val0x6c4, +u32 val0x6c8,u8 val0x6cc) +{ + coex_dm->cur_val0x6c0 = val0x6c0; + coex_dm->cur_val0x6c4 = val0x6c4; + coex_dm->cur_val0x6c8 = val0x6c8; + coex_dm->cur_val0x6cc = val0x6cc; + +if (!force_exec) { +if (coex_dm->pre_val0x6c0 == coex_dm->cur_val0x6c0 && + coex_dm->pre_val0x6c4 == coex_dm->cur_val0x6c4 && + coex_dm->pre_val0x6c8 == coex_dm->cur_val0x6c8 && + coex_dm->pre_val0x6cc == coex_dm->cur_val0x6cc) +return ; + } +halbtc8822b1ant_set_coex_table (btcoexist, val0x6c0, val0x6c4, val0x6c8, + val0x6cc); + + coex_dm->pre_val0x6c0 = coex_dm->cur_val0x6c0; + coex_dm->pre_val0x6c4 = coex_dm->cur_val0x6c4; + coex_dm->pre_val0x6c8 = coex_dm->cur_val0x6c8; + coex_dm->pre_val0x6cc = coex_dm->cur_val0x6cc; +} + +static +void halbtc8822b1ant_coex_table_type (struct btc_coexist *btcoexist, +bool force_exec,u8 type) +{ +u32 break_table; +u8 select_table; + + coex_sta->coex_table_type = type; + +if (coex_sta->concurrent_rx_mode_on) { +/* set WL hi-pri can break BT */ + break_table =0xf0ffffff ; +/* set Tx response = Hi-Pri (ex: Transmitting ACK,BA,CTS) */ + select_table =0xb ; + }else { + break_table =0xffffff ; + select_table =0x3 ; + } + +switch (type) { +case 0 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0x55555555 , break_table, + select_table); +break ; +case 1 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0x5a5a5a5a , break_table, + select_table); +break ; +case 2 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaa5a5a5a , +0xaa5a5a5a , break_table, + select_table); +break ; +case 3 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0xaa5a5a5a , break_table, + select_table); +break ; +case 4 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaa555555 , +0xaa5a5a5a , break_table, + select_table); +break ; +case 5 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x5a5a5a5a , +0x5a5a5a5a , break_table, + select_table); +break ; +case 6 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0xaa5a5a5a , break_table, + select_table); +break ; +case 7 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaaaaaaaa , +0xaaaaaaaa , break_table, + select_table); +break ; +case 8 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xffffffff , +0xffffffff , break_table, + select_table); +break ; +case 9 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x5a5a5555 , +0xaaaa5a5a , break_table, + select_table); +break ; +case 10 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaaaa5aaa , +0xaaaa5aaa , break_table, + select_table); +break ; +case 11 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xa5a55555 , +0xaaaa5a5a , break_table, + select_table); +break ; +case 12 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaaaaa5aa , +0xaaaaa5aa , break_table, + select_table); +break ; +case 13 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaa5555aa , +0xaa5a5a5a , break_table, + select_table); +break ; +case 14 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaa5555aa , +0x5a5a5a5a , break_table, + select_table); +break ; +case 15 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0xaaaa55aa , break_table, + select_table); +break ; +case 16 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x5a5a555a , +0x5a5a555a , break_table, + select_table); +break ; +case 17 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaaaa55aa , +0xaaaa55aa , break_table, + select_table); +break ; +case 18 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0x5aaa5a5a , break_table, + select_table); +break ; +case 19 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xa5555555 , +0xaaaa5aaa , break_table, + select_table); +break ; +case 20 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0xaaaa5aaa , break_table, + select_table); +break ; +case 21 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0xaaaa5afa , break_table, + select_table); +break ; +case 22 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xaaffffaa , +0xfafafafa , break_table, + select_table); +break ; +case 23 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xffff55ff , +0xfafafafa , break_table, + select_table); +break ; +case 24 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0x55555555 , +0xfafafafa , break_table, + select_table); +break ; +case 25 : +halbtc8822b1ant_coex_table (btcoexist, force_exec,0xffffffff , +0xaa5a5a5a , break_table, + select_table); +break ; +default : +break ; + } +} + +static +void halbtc8822b1ant_set_fw_ignore_wlan_act (struct btc_coexist *btcoexist, +bool enable) +{ +u8 h2c_parameter[1 ] = {0 }; + +if (enable) + h2c_parameter[0 ] |=BIT (0 );/* function enable */ + + btcoexist->btc_fill_h2c (btcoexist,0x63 ,1 , h2c_parameter); +} + +static +void halbtc8822b1ant_ignore_wlan_act (struct btc_coexist *btcoexist, +bool force_exec,bool enable) +{ + coex_dm->cur_ignore_wlan_act = enable; + +if (!force_exec) { +if (coex_dm->pre_ignore_wlan_act == + coex_dm->cur_ignore_wlan_act) { + coex_dm->pre_ignore_wlan_act = + coex_dm->cur_ignore_wlan_act; +return ; + } + } + +halbtc8822b1ant_set_fw_ignore_wlan_act (btcoexist, enable); + + coex_dm->pre_ignore_wlan_act = coex_dm->cur_ignore_wlan_act; +} + +static +void halbtc8822b1ant_set_lps_rpwm (struct btc_coexist *btcoexist,u8 lps_val, +u8 rpwm_val) +{ +u8 lps = lps_val; +u8 rpwm = rpwm_val; + + btcoexist->btc_set (btcoexist,BTC_SET_U1_LPS_VAL , &lps); + btcoexist->btc_set (btcoexist,BTC_SET_U1_RPWM_VAL , &rpwm); +} + +static +void halbtc8822b1ant_lps_rpwm (struct btc_coexist *btcoexist,bool force_exec, +u8 lps_val,u8 rpwm_val) +{ + coex_dm->cur_lps = lps_val; + coex_dm->cur_rpwm = rpwm_val; + +if (!force_exec) { +if (coex_dm->pre_lps == coex_dm->cur_lps && + coex_dm->pre_rpwm == coex_dm->cur_rpwm) +return ; + } +halbtc8822b1ant_set_lps_rpwm (btcoexist, lps_val, rpwm_val); + + coex_dm->pre_lps = coex_dm->cur_lps; + coex_dm->pre_rpwm = coex_dm->cur_rpwm; +} + +static void +halbtc8822b1ant_ps_tdma_check (struct btc_coexist *btcoexist, +bool new_ps_state) +{ +u8 lps_mode =0x0 ; +u8 h2c_parameter[5 ] = {0x8 ,0 ,0 ,0 ,0 }; + + btcoexist->btc_get (btcoexist,BTC_GET_U1_LPS_MODE , &lps_mode); + +if (lps_mode) {/* already under LPS state */ +if (new_ps_state) { +/* keep state under LPS, do nothing. */ + }else { +/* will leave LPS state, turn off psTdma first */ + + btcoexist->btc_fill_h2c (btcoexist,0x60 ,5 , + h2c_parameter); + } + }else {/* NO PS state */ +if (new_ps_state) { +/* will enter LPS state, turn off psTdma first */ + + btcoexist->btc_fill_h2c (btcoexist,0x60 ,5 , + h2c_parameter); + }else { +/* keep state under NO PS state, do nothing. */ + } + } +} + +static bool +halbtc8822b1ant_power_save_state (struct btc_coexist *btcoexist, +u8 ps_type,u8 lps_val,u8 rpwm_val) +{ +bool low_pwr_disable = false, result = true; + +switch (ps_type) { +case BTC_PS_WIFI_NATIVE : +/* recover to original 32k low power setting */ + coex_sta->force_lps_ctrl = false; + low_pwr_disable = false; +/* btcoexist->btc_set(btcoexist, +* over to original 32k low power setting +*/ + + btcoexist->btc_set (btcoexist,BTC_SET_ACT_PRE_NORMAL_LPS ,NULL ); +break ; +case BTC_PS_LPS_ON : + + coex_sta->force_lps_ctrl = true; +halbtc8822b1ant_ps_tdma_check (btcoexist, true); +halbtc8822b1ant_lps_rpwm (btcoexist,NORMAL_EXEC , lps_val, + rpwm_val); +/* when coex force to enter LPS, do not enter 32k low power. */ + low_pwr_disable = true; + btcoexist->btc_set (btcoexist,BTC_SET_ACT_DISABLE_LOW_POWER , + &low_pwr_disable); +/* power save must executed before psTdma. */ + btcoexist->btc_set (btcoexist,BTC_SET_ACT_ENTER_LPS ,NULL ); + +break ; +case BTC_PS_LPS_OFF : + + coex_sta->force_lps_ctrl = true; +halbtc8822b1ant_ps_tdma_check (btcoexist, false); + result = btcoexist->btc_set (btcoexist,BTC_SET_ACT_LEAVE_LPS , +NULL ); + +break ; +default : +break ; + } + +return result; +} + +static +void halbtc8822b1ant_set_fw_pstdma (struct btc_coexist *btcoexist,u8 byte1, +u8 byte2,u8 byte3,u8 byte4,u8 byte5) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +u8 h2c_parameter[5 ] = {0 }; +u8 real_byte1 = byte1, real_byte5 = byte5; +bool ap_enable = false, result = false; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; +u8 ps_type =BTC_PS_WIFI_NATIVE ; + +if (byte5 &BIT (2 )) + coex_sta->is_tdma_btautoslot = true; +else + coex_sta->is_tdma_btautoslot = false; + +/* release bt-auto slot for auto-slot hang is detected!! */ +if (coex_sta->is_tdma_btautoslot) +if (coex_sta->is_tdma_btautoslot_hang || + bt_link_info->slave_role) + byte5 = byte5 &0xfb ; + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_AP_MODE_ENABLE , + &ap_enable); + +if ((ap_enable) && (byte1 &BIT (4 ) && !(byte1 &BIT (5 )))) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], %s == FW for 1Ant AP mode\n" , __func__); + + real_byte1 &= ~BIT (4 ); + real_byte1 |=BIT (5 ); + + real_byte5 |=BIT (5 ); + real_byte5 &= ~BIT (6 ); + + ps_type =BTC_PS_WIFI_NATIVE ; +halbtc8822b1ant_power_save_state (btcoexist, ps_type,0x0 ,0x0 ); + + }else if (byte1 &BIT (4 ) && !(byte1 &BIT (5 ))) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], %s == Force LPS (byte1 = 0x%x)\n" , + __func__, byte1); + + ps_type =BTC_PS_LPS_OFF ; +if (!halbtc8822b1ant_power_save_state (btcoexist, ps_type,0x50 , +0x4 )) + result = true; + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], %s == native power save (byte1 = 0x%x)\n" , + __func__, byte1); + + ps_type =BTC_PS_WIFI_NATIVE ; +halbtc8822b1ant_power_save_state (btcoexist, ps_type,0x0 ,0x0 ); + } + + coex_sta->is_set_ps_state_fail = result; + +if (!coex_sta->is_set_ps_state_fail) { + h2c_parameter[0 ] = real_byte1; + h2c_parameter[1 ] = byte2; + h2c_parameter[2 ] = byte3; + h2c_parameter[3 ] = byte4; + h2c_parameter[4 ] = real_byte5; + + coex_dm->ps_tdma_para[0 ] = real_byte1; + coex_dm->ps_tdma_para[1 ] = byte2; + coex_dm->ps_tdma_para[2 ] = byte3; + coex_dm->ps_tdma_para[3 ] = byte4; + coex_dm->ps_tdma_para[4 ] = real_byte5; + + btcoexist->btc_fill_h2c (btcoexist,0x60 ,5 , h2c_parameter); + + }else { + coex_sta->cnt_set_ps_state_fail++; +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], %s == Force Leave LPS Fail (cnt = %d)\n" , + __func__, coex_sta->cnt_set_ps_state_fail); + } + +if (ps_type ==BTC_PS_WIFI_NATIVE ) + btcoexist->btc_set (btcoexist,BTC_SET_ACT_POST_NORMAL_LPS , +NULL ); +} + +static +void halbtc8822b1ant_ps_tdma (struct btc_coexist *btcoexist,bool force_exec, +bool turn_on,u8 type) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; +bool wifi_busy = false; +static u8 tdma_byte4_modify, pre_ps_tdma_byte4_modify; +static bool pre_wifi_busy; + + coex_dm->cur_ps_tdma_on = turn_on; + coex_dm->cur_ps_tdma = type; + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); + +if (wifi_busy != pre_wifi_busy) { + force_exec = true; + pre_wifi_busy = wifi_busy; + } + +/* 0x778 = 0x1 at wifi slot (no blocking BT Low-Pri pkts) */ +if (bt_link_info->slave_role) + tdma_byte4_modify =0x1 ; +else + tdma_byte4_modify =0x0 ; + +if (pre_ps_tdma_byte4_modify != tdma_byte4_modify) { + force_exec = true; + pre_ps_tdma_byte4_modify = tdma_byte4_modify; + } + +if (!force_exec) { +if (coex_dm->pre_ps_tdma_on == coex_dm->cur_ps_tdma_on && + coex_dm->pre_ps_tdma == coex_dm->cur_ps_tdma) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Skip TDMA because no change TDMA(%s, %d)\n" , + (coex_dm->cur_ps_tdma_on ?"on" :"off" ), + coex_dm->cur_ps_tdma); +return ; + } + } + +if (coex_dm->cur_ps_tdma_on) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** TDMA(on, %d) **********\n" , + coex_dm->cur_ps_tdma); + +/* enable TBTT nterrupt */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x550 ,0x8 ,0x1 ); + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** TDMA(off, %d) **********\n" , + coex_dm->cur_ps_tdma); + } + +if (turn_on) { +/* enable TBTT nterrupt */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x550 ,0x8 ,0x1 ); + +switch (type) { +default : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x35 , +0x03 ,0x11 ,0x11 ); +break ; +case 1 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x3a , +0x03 ,0x11 ,0x10 ); +break ; +case 3 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x30 , +0x03 ,0x10 ,0x50 ); +break ; +case 4 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x21 , +0x03 ,0x10 ,0x50 ); +break ; +case 5 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x15 , +0x3 ,0x11 ,0x11 ); +break ; +case 6 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x20 , +0x3 ,0x11 ,0x11 ); +break ; +case 7 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x10 , +0x03 ,0x10 , +0x54 | tdma_byte4_modify); +break ; +case 8 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x10 , +0x03 ,0x10 , +0x14 | tdma_byte4_modify); +break ; +case 10 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x4a , +0x03 ,0x10 ,0x50 ); +break ; +case 11 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x25 , +0x03 ,0x11 ,0x11 ); +break ; +case 12 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x30 , +0x03 ,0x10 , +0x50 | tdma_byte4_modify); +break ; +case 13 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x10 , +0x07 ,0x10 ,0x54 ); +break ; +case 14 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x15 , +0x03 ,0x10 , +0x50 | tdma_byte4_modify); +break ; +case 15 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x20 , +0x03 ,0x10 , +0x10 | tdma_byte4_modify); +break ; +case 17 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x10 , +0x03 ,0x11 , +0x14 | tdma_byte4_modify); +break ; +case 18 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x30 , +0x03 ,0x10 ,0x50 ); +break ; +case 20 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x30 , +0x03 ,0x11 ,0x10 ); +break ; +case 21 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x30 , +0x03 ,0x11 ,0x10 ); +break ; +case 22 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x25 , +0x03 ,0x11 ,0x10 ); +break ; +case 25 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x3a , +0x3 ,0x11 ,0x50 ); +break ; +case 26 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x10 , +0x03 ,0x10 ,0x55 ); +break ; +case 27 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x10 , +0x03 ,0x11 ,0x15 ); +break ; +case 32 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x35 , +0x3 ,0x11 ,0x11 ); +break ; +case 33 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x35 , +0x03 ,0x11 ,0x10 ); +break ; +case 36 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x48 , +0x03 ,0x11 ,0x10 ); +break ; +case 41 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x45 , +0x3 ,0x11 ,0x11 ); +break ; +case 42 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x1e , +0x3 ,0x10 , +0x14 | tdma_byte4_modify); +break ; +case 43 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x45 , +0x3 ,0x10 ,0x14 ); +break ; +case 44 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x25 , +0x3 ,0x10 ,0x10 ); +break ; +case 45 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x29 , +0x3 ,0x10 ,0x10 ); +break ; +case 46 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x1a , +0x3 ,0x10 ,0x10 ); +break ; +case 47 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x32 , +0x3 ,0x10 ,0x10 ); +break ; +case 48 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x29 , +0x3 ,0x10 ,0x10 ); +break ; +case 49 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x55 ,0x10 , +0x3 ,0x10 ,0x54 ); +break ; +case 50 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x4a , +0x3 ,0x10 ,0x10 ); +break ; +case 51 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x61 ,0x35 , +0x3 ,0x10 ,0x11 ); +break ; +case 52 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x0a , +0x3 ,0x10 ,0x10 ); +break ; +case 105 : +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x51 ,0x3f , +0x3 ,0x10 ,0x50 ); +break ; + } + }else { +switch (type) { +case 0 : +default :/* Software control, Antenna at BT side */ +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x0 ,0x0 ,0x0 , +0x0 ,0x0 ); +break ; +case 8 :/* PTA Control */ +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x8 ,0x0 ,0x0 , +0x0 ,0x0 ); +break ; +case 9 :/* Software control, Antenna at WiFi side */ +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x0 ,0x0 ,0x0 , +0x0 ,0x0 ); +break ; +case 10 :/* under 5G , 0x778=1*/ +halbtc8822b1ant_set_fw_pstdma (btcoexist,0x0 ,0x0 ,0x0 , +0x0 ,0x0 ); +break ; + } + } + +if (!coex_sta->is_set_ps_state_fail) { +/* update pre state */ + coex_dm->pre_ps_tdma_on = coex_dm->cur_ps_tdma_on; + coex_dm->pre_ps_tdma = coex_dm->cur_ps_tdma; + } +} + +/* rf4 type by efuse, and for ant at main aux inverse use, +* because is 2x2, and control types are the same, does not need +*/ + +static void halbtc8822b1ant_set_rfe_type (struct btc_coexist *btcoexist) +{ +struct btc_board_info *board_info = &btcoexist->board_info; + +/* Ext switch buffer mux */ + btcoexist->btc_write_1byte (btcoexist,0x974 ,0xff ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0x1991 ,0x3 ,0x0 ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcbe ,0x8 ,0x0 ); + +/* the following setup should be got from Efuse in the future */ + rfe_type->rfe_module_type = board_info->rfe_type; + + rfe_type->ext_ant_switch_ctrl_polarity =0 ; + rfe_type->ext_ant_switch_exist = true; + rfe_type->ext_ant_switch_type =BT_8822B_1ANT_SWITCH_USE_SPDT ; +} + +/*anttenna control by bb mac bt antdiv pta to write 0x4c 0xcb4,0xcbd*/ + +static +void hallbtc882b1ant_set_ant_switch (struct btc_coexist *btcoexist, +bool force_exec,u8 ctrl_type, +u8 pos_type) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +bool switch_polatiry_inverse = false; +u8 regval_0xcbd =0 , regval_0x64; +u32 u32tmp1 =0 , u32tmp2 =0 , u32tmp3 =0 ; + +/* Ext switch buffer mux */ + btcoexist->btc_write_1byte (btcoexist,0x974 ,0xff ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0x1991 ,0x3 ,0x0 ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcbe ,0x8 ,0x0 ); + +if (!rfe_type->ext_ant_switch_exist) +return ; + + coex_dm->cur_ext_ant_switch_status = (ctrl_type <<8 ) + pos_type; + +if (!force_exec) { +if (coex_dm->pre_ext_ant_switch_status == + coex_dm->cur_ext_ant_switch_status) +return ; + } + + coex_dm->pre_ext_ant_switch_status = coex_dm->cur_ext_ant_switch_status; + +/* swap control polarity if use different switch control polarity*/ +/* Normal switch polarity for SPDT, +* 0xcbd[1:0] = 2b'01 => Ant to BTG, WLA +* 0xcbd[1:0] = 2b'10 => Ant to WLG +*/ + switch_polatiry_inverse = (rfe_type->ext_ant_switch_ctrl_polarity ==1 ? + ~switch_polatiry_inverse : + switch_polatiry_inverse); + +switch (pos_type) { +default : +case BT_8822B_1ANT_SWITCH_TO_BT : +case BT_8822B_1ANT_SWITCH_TO_NOCARE : +case BT_8822B_1ANT_SWITCH_TO_WLA : +case BT_8822B_1ANT_SWITCH_TO_S0WLG_S1BT : + +break ; +case BT_8822B_1ANT_SWITCH_TO_WLG : + +break ; + } + +if (rfe_type->ext_ant_switch_type == +BT_8822B_1ANT_SWITCH_USE_SPDT ) { +switch (ctrl_type) { +default : +case BT_8822B_1ANT_SWITCH_CTRL_BY_BBSW : +/* 0x4c[23] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4e , +0x80 ,0x0 ); +/* 0x4c[24] = 1 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4f , +0x01 ,0x1 ); +/* BB SW, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin*/ + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcb4 , +0xff ,0x77 ); + +/* 0xcbd[1:0] = 2b'01 for no switch_polatiry_inverse, +* ANTSWB =1, ANTSW =0 +*/ +if (pos_type == +BT_8822B_1ANT_SWITCH_TO_S0WLG_S1BT ) + regval_0xcbd =0x3 ; +else if (pos_type == +BT_8822B_1ANT_SWITCH_TO_WLG ) + regval_0xcbd = + (!switch_polatiry_inverse ?0x2 :0x1 ); +else + regval_0xcbd = + (!switch_polatiry_inverse ?0x1 :0x2 ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcbd , +0x3 , regval_0xcbd); + +break ; +case BT_8822B_1ANT_SWITCH_CTRL_BY_PTA : +/* 0x4c[23] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4e , +0x80 ,0x0 ); +/* 0x4c[24] = 1 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4f , +0x01 ,0x1 ); +/* PTA, DPDT use RFE_ctrl8 and RFE_ctrl9 as ctrl pin */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcb4 , +0xff ,0x66 ); + +/* 0xcbd[1:0] = 2b'10 for no switch_polatiry_inverse, +* ANTSWB =1, ANTSW =0 @ GNT_BT=1 +*/ + regval_0xcbd = (!switch_polatiry_inverse ?0x2 :0x1 ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcbd , +0x3 , regval_0xcbd); + +break ; +case BT_8822B_1ANT_SWITCH_CTRL_BY_ANTDIV : +/* 0x4c[23] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4e , +0x80 ,0x0 ); +/* 0x4c[24] = 1 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4f , +0x01 ,0x1 ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcb4 , +0xff ,0x88 ); + +/* no regval_0xcbd setup required, because +* antenna switch control value by antenna diversity +*/ + +break ; +case BT_8822B_1ANT_SWITCH_CTRL_BY_MAC : +/* 0x4c[23] = 1 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4e , +0x80 ,0x1 ); + +/* 0x64[0] = 1b'0 for no switch_polatiry_inverse, +* DPDT_SEL_N =1, DPDT_SEL_P =0 +*/ + regval_0x64 = (!switch_polatiry_inverse ?0x0 :0x1 ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0x64 ,0x1 , + regval_0x64); +break ; +case BT_8822B_1ANT_SWITCH_CTRL_BY_BT : +/* 0x4c[23] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4e , +0x80 ,0x0 ); +/* 0x4c[24] = 0 */ + btcoexist->btc_write_1byte_bitmask (btcoexist,0x4f , +0x01 ,0x0 ); + +/* no setup required, because antenna switch control +* value by BT vendor 0xac[1:0] +*/ +break ; + } + } + + u32tmp1 = btcoexist->btc_read_4byte (btcoexist,0xcbc ); + u32tmp2 = btcoexist->btc_read_4byte (btcoexist,0x4c ); + u32tmp3 = btcoexist->btc_read_4byte (btcoexist,0x64 ) &0xff ; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], (After Ext Ant switch setup) 0xcbc = 0x%08x, 0x4c = 0x%08x, 0x64= 0x%02x\n" , + u32tmp1, u32tmp2, u32tmp3); +} + +/* set gnt_wl gnt_bt control by sw high low, or +* hwpta while in power on, ini, wlan off, wlan only, wl2g non-currrent, +* wl2g current, wl5g +*/ + +static +void halbtc8822b1ant_set_ant_path (struct btc_coexist *btcoexist, +u8 ant_pos_type,bool force_exec,u8 phase) + +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +u8 u8tmp =0 ; +u32 u32tmp1 =0 ; +u32 u32tmp2 =0 , u32tmp3 =0 ; + + u32tmp1 =halbtc8822b1ant_ltecoex_read_reg (btcoexist,0x38 ); + +/* To avoid indirect access fail */ +if (((u32tmp1 &0xf000 ) >>12 ) != ((u32tmp1 &0x0f00 ) >>8 )) { + force_exec = true; + coex_sta->gnt_error_cnt++; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex],(Before Ant Setup) 0x38= 0x%x\n" , + u32tmp1); + } + +/* Ext switch buffer mux */ + btcoexist->btc_write_1byte (btcoexist,0x974 ,0xff ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0x1991 ,0x3 ,0x0 ); + btcoexist->btc_write_1byte_bitmask (btcoexist,0xcbe ,0x8 ,0x0 ); + + coex_dm->cur_ant_pos_type = (ant_pos_type <<8 ) + phase; + +if (!force_exec) { +if (coex_dm->cur_ant_pos_type == coex_dm->pre_ant_pos_type) +return ; + } + + coex_dm->pre_ant_pos_type = coex_dm->cur_ant_pos_type; + +if (btcoexist->dbg_mode_1ant) { + u32tmp1 =halbtc8822b1ant_ltecoex_read_reg (btcoexist,0x38 ); + u32tmp2 =halbtc8822b1ant_ltecoex_read_reg (btcoexist,0x54 ); + u32tmp3 = btcoexist->btc_read_4byte (btcoexist,0xcb4 ); + + u8tmp = btcoexist->btc_read_1byte (btcoexist,0x73 ); + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (Before Ant Setup) 0xcb4 = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x**********\n" , + u32tmp3, u8tmp, u32tmp1, u32tmp2); + } + +switch (phase) { +case BT_8822B_1ANT_PHASE_POWERON : +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_COEX_POWERON) **********\n" ); + +/* set Path control owner to BT at power-on step */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_BTSIDE ); + +/* set GNT_BT to SW high */ +halbtc8822b1ant_set_gnt_bt (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_HIGH ); +/* Set GNT_WL to SW high */ +halbtc8822b1ant_set_gnt_wl (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_HIGH ); + +if (ant_pos_type ==BTC_ANT_PATH_AUTO ) + ant_pos_type =BTC_ANT_PATH_BT ; + + coex_sta->run_time_state = false; +break ; +case BT_8822B_1ANT_PHASE_INIT : +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_COEX_INIT) **********\n" ); + +halbtc8822b1ant_ltecoex_enable (btcoexist,0x0 ); + +hallbtc882b1ant_ltecoex_table (btcoexist, +BT_8822B_1ANT_CTT_WL_VS_LTE , +0xffff ); + +hallbtc882b1ant_ltecoex_table (btcoexist, +BT_8822B_1ANT_CTT_BT_VS_LTE , +0xffff ); + +/* set GNT_BT to SW high */ +halbtc8822b1ant_set_gnt_bt (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_HIGH ); + +/* set GNT_WL to SW low */ +halbtc8822b1ant_set_gnt_wl (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_LOW ); + +/* set Path control owner to WL at initial step */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_WLSIDE ); + + coex_sta->run_time_state = false; + +if (ant_pos_type ==BTC_ANT_PATH_AUTO ) + ant_pos_type =BTC_ANT_PATH_BT ; + +break ; +case BT_8822B_1ANT_PHASE_WONLY : +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_WLANONLY_INIT) **********\n" ); + +halbtc8822b1ant_ltecoex_enable (btcoexist,0x0 ); + +hallbtc882b1ant_ltecoex_table (btcoexist, +BT_8822B_1ANT_CTT_WL_VS_LTE , +0xffff ); + +hallbtc882b1ant_ltecoex_table (btcoexist, +BT_8822B_1ANT_CTT_BT_VS_LTE , +0xffff ); + +/* set GNT_BT to SW Low */ +halbtc8822b1ant_set_gnt_bt (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_LOW ); + +/* Set GNT_WL to SW high */ +halbtc8822b1ant_set_gnt_wl (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_HIGH ); + +/* set Path control owner to WL at initial step */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_WLSIDE ); + + coex_sta->run_time_state = false; + +if (ant_pos_type ==BTC_ANT_PATH_AUTO ) + ant_pos_type =BTC_ANT_PATH_WIFI ; + +break ; +case BT_8822B_1ANT_PHASE_WOFF : +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_WLAN_OFF) **********\n" ); + +/* Disable LTE Coex Function in WiFi side */ +halbtc8822b1ant_ltecoex_enable (btcoexist,0x0 ); + +/* set Path control owner to BT */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_BTSIDE ); + +/* Set Ext Ant Switch to BT control at wifi off step */ +hallbtc882b1ant_set_ant_switch (btcoexist,FORCE_EXEC , +BT_8822B_1ANT_SWITCH_CTRL_BY_BT , +BT_8822B_1ANT_SWITCH_TO_NOCARE ); + + coex_sta->run_time_state = false; + +break ; +case BT_8822B_1ANT_PHASE_2G : +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_2G_RUNTIME) **********\n" ); + +/* set GNT_BT to PTA */ +halbtc8822b1ant_set_gnt_bt (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_PTA , +BT_8822B_1ANT_SIG_STA_SET_BY_HW ); + +/* Set GNT_WL to PTA */ +halbtc8822b1ant_set_gnt_wl (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_PTA , +BT_8822B_1ANT_SIG_STA_SET_BY_HW ); + +/* set Path control owner to WL at runtime step */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_WLSIDE ); + + coex_sta->run_time_state = true; + +if (ant_pos_type ==BTC_ANT_PATH_AUTO ) + ant_pos_type =BTC_ANT_PATH_PTA ; + +break ; +case BT_8822B_1ANT_PHASE_5G : +case BT_8822B_1ANT_PHASE_2G_WL : +case BT_8822B_1ANT_PHASE_2G_BT : + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (set_ant_path - %d)\n" , + phase); + +/* set GNT_BT to SW Hi */ +halbtc8822b1ant_set_gnt_bt (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_HIGH ); + +/* Set GNT_WL to SW Hi */ +halbtc8822b1ant_set_gnt_wl (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_HIGH ); + +/* set Path control owner to WL at runtime step */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_WLSIDE ); + + coex_sta->run_time_state = true; + +if (phase ==BT_8822B_1ANT_PHASE_2G_WL ) + ant_pos_type =BTC_ANT_PATH_WIFI ; +else if (phase ==BT_8822B_1ANT_PHASE_2G_BT ) + ant_pos_type =BTC_ANT_PATH_BT ; +if (ant_pos_type ==BTC_ANT_PATH_AUTO ) + ant_pos_type =BTC_ANT_PATH_WIFI5G ; + +break ; +case BT_8822B_1ANT_PHASE_BTMP : +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (set_ant_path - 1ANT_PHASE_BTMPMODE) **********\n" ); + +/* Disable LTE Coex Function in WiFi side */ +halbtc8822b1ant_ltecoex_enable (btcoexist,0x0 ); + +/* set GNT_BT to SW Hi */ +halbtc8822b1ant_set_gnt_bt (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_HIGH ); + +/* Set GNT_WL to SW Lo */ +halbtc8822b1ant_set_gnt_wl (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_SW , +BT_8822B_1ANT_SIG_STA_SET_TO_LOW ); + +/* set Path control owner to WL */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_WLSIDE ); + + coex_sta->run_time_state = false; + +/* Set Ext Ant Switch to BT side at BT MP mode */ +if (ant_pos_type ==BTC_ANT_PATH_AUTO ) + ant_pos_type =BTC_ANT_PATH_BT ; + +break ; +case BT_8822B_1ANT_PHASE_MCC : +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], (set_ant_path - 1ANT_PHASE_MCC_DUALBAND_RUNTIME)\n" ); + +/* set GNT_BT to PTA */ +halbtc8822b1ant_set_gnt_bt (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_PTA , +BT_8822B_1ANT_SIG_STA_SET_BY_HW ); + +/* Set GNT_WL to PTA */ +halbtc8822b1ant_set_gnt_wl (btcoexist, +BT_8822B_1ANT_GNT_BLOCK_RFC_BB , +BT_8822B_1ANT_GNT_CTRL_BY_PTA , +BT_8822B_1ANT_SIG_STA_SET_BY_HW ); + +/* set Path control owner to WL at runtime step */ +hallbtc882b1ant_ltecoex_ctrl_owner (btcoexist, +BT_8822B_1ANT_PCO_WLSIDE ); + + coex_sta->run_time_state = true; + +if (ant_pos_type ==BTC_ANT_PATH_AUTO ) + ant_pos_type =BTC_ANT_PATH_PTA ; + +break ; + } + +if (phase !=BT_8822B_1ANT_PHASE_WOFF && + phase !=BT_8822B_1ANT_PHASE_MCC ) { +u8 ctrl_type, pos_type; + +switch (ant_pos_type) { +case BTC_ANT_PATH_WIFI : +if (phase ==BT_8822B_1ANT_PHASE_2G_WL ) { + ctrl_type =BT_8822B_1ANT_SWITCH_CTRL_BY_BBSW ; + pos_type =BT_8822B_1ANT_SWITCH_TO_S0WLG_S1BT ; + }else { + ctrl_type =BT_8822B_1ANT_SWITCH_CTRL_BY_BBSW ; + pos_type =BT_8822B_1ANT_SWITCH_TO_WLG ; + } +break ; +case BTC_ANT_PATH_WIFI5G : + ctrl_type =BT_8822B_1ANT_SWITCH_CTRL_BY_BBSW ; + pos_type =BT_8822B_1ANT_SWITCH_TO_WLA ; +break ; +case BTC_ANT_PATH_BT : + ctrl_type =BT_8822B_1ANT_SWITCH_CTRL_BY_BBSW ; + pos_type =BT_8822B_1ANT_SWITCH_TO_BT ; +break ; +default : +case BTC_ANT_PATH_PTA : + ctrl_type =BT_8822B_1ANT_SWITCH_CTRL_BY_PTA ; + pos_type =BT_8822B_1ANT_SWITCH_TO_NOCARE ; +break ; + } + +hallbtc882b1ant_set_ant_switch (btcoexist, force_exec, + ctrl_type, pos_type); + } + +if (btcoexist->dbg_mode_1ant) { + u32tmp1 =halbtc8822b1ant_ltecoex_read_reg (btcoexist,0x38 ); + u32tmp2 =halbtc8822b1ant_ltecoex_read_reg (btcoexist,0x54 ); + u32tmp3 = btcoexist->btc_read_4byte (btcoexist,0xcbd ); + + u8tmp = btcoexist->btc_read_1byte (btcoexist,0x73 ); + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], (After Ant Setup) 0xcbd = 0x%x, 0x73 = 0x%x, 0x38= 0x%x, 0x54= 0x%x\n" , + u32tmp3, u8tmp, u32tmp1, u32tmp2); + } +} + +static bool halbtc8822b1ant_is_common_action (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +bool common = false, wifi_connected = false, wifi_busy = false; + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_CONNECTED , + &wifi_connected); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); + +if (!wifi_connected && + coex_dm->bt_status ==BT_8822B_1ANT_BT_STATUS_NCONNECTED_IDLE ) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Wifi non connected-idle + BT non connected-idle!!\n" ); + common = true; + }else if (wifi_connected && + (coex_dm->bt_status == +BT_8822B_1ANT_BT_STATUS_NCONNECTED_IDLE )) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Wifi connected + BT non connected-idle!!\n" ); + common = true; + }else if (!wifi_connected && + (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE == + coex_dm->bt_status)) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Wifi non connected-idle + BT connected-idle!!\n" ); + common = true; + }else if (wifi_connected && + (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE == + coex_dm->bt_status)) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Wifi connected + BT connected-idle!!\n" ); + common = true; + }else if (!wifi_connected && + (BT_8822B_1ANT_BT_STATUS_CONNECTED_IDLE != + coex_dm->bt_status)) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Wifi non connected-idle + BT Busy!!\n" ); + common = true; + }else { +if (wifi_busy) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Wifi Connected-Busy + BT Busy!!\n" ); + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], Wifi Connected-Idle + BT Busy!!\n" ); + } + + common = false; + } + +return common; +} + +static void halbtc8822b1ant_action_bt_whql_test (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex],action_bt_whck_test\n" ); + +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC ,0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , false); + +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , false,8 ); + +halbtc8822b1ant_set_ant_path (btcoexist,BTC_ANT_PATH_AUTO ,NORMAL_EXEC , +BT_8822B_1ANT_PHASE_2G ); +} + +static void halbtc8822b1ant_action_bt_relink (struct btc_coexist *btcoexist) +{ +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; + +if ((!coex_sta->is_bt_multi_link && !bt_link_info->pan_exist) || + (bt_link_info->a2dp_exist && bt_link_info->hid_exist)) { +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC , +0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , + false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , + false); + +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , false,8 ); + } +} + +static void halbtc8822b1ant_action_bt_idle (struct btc_coexist *btcoexist) +{ +bool wifi_busy = false; + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); + +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC ,0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , false); + +if (!wifi_busy) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,23 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,32 ); + + }else {/* if wl busy */ + +if (BT_8822B_1ANT_BT_STATUS_NCONNECTED_IDLE == + coex_dm->bt_status) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC , +23 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +33 ); + }else { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC , +23 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +32 ); + } + } +} + +/*"""bt inquiry"""" + wifi any + bt any*/ + +static void halbtc8822b1ant_action_bt_inquiry (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; +bool wifi_connected = false, wifi_busy = false, bt_busy = false; +bool wifi_scan = false, link = false, roam = false; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (bt inquiry) **********\n" ); + +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC ,0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , false); + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_CONNECTED , + &wifi_connected); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); + btcoexist->btc_set (btcoexist,BTC_SET_BL_BT_TRAFFIC_BUSY , &bt_busy); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_SCAN , &wifi_scan); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_LINK , &link); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_ROAM , &roam); + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** scan = %d, link =%d, roam = %d**********\n" , + wifi_scan, link, roam); + +if (link || roam || coex_sta->wifi_is_high_pri_task) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (bt inquiry wifi connect or scan ) **********\n" ); + +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,6 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,1 ); + + }else if ((wifi_scan) && (coex_sta->bt_create_connection)) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,1 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,22 ); + + }else if ((!wifi_connected) && (!wifi_scan)) { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (bt inquiry wifi non connect) **********\n" ); + +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , false,8 ); + + }else if ((bt_link_info->a2dp_exist) && (bt_link_info->pan_exist)) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,4 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,22 ); + }else if (bt_link_info->a2dp_exist) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,23 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,32 ); + }else if (wifi_scan) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,4 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,20 ); + }else if (wifi_busy) { +/*aaaa->55aa for bt connect while wl busy*/ +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,23 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,32 ); + }else { +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], ********** (bt inquiry wifi connect) **********\n" ); + +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,23 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,32 ); + } +} + +static +void halbtc8822b1ant_action_bt_sco_hid_busy (struct btc_coexist *btcoexist) +{ +struct btc_bt_link_info *bt_link_info = &btcoexist->bt_link_info; +bool wifi_connected = false, wifi_busy = false; +u32 wifi_bw =1 ; + +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC ,0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , false); + + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_CONNECTED , + &wifi_connected); + btcoexist->btc_get (btcoexist,BTC_GET_U4_WIFI_BW , &wifi_bw); + btcoexist->btc_get (btcoexist,BTC_GET_BL_WIFI_BUSY , &wifi_busy); + +if (coex_sta->msft_mr_exist) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,8 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , false,8 ); + + }else if (bt_link_info->sco_exist) { +if (coex_sta->is_bt_multi_link) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC , +1 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +25 ); + }else { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC , +5 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +5 ); + } + }else if (coex_sta->is_hid_rcu) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,3 ); + +if (wifi_busy) +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +36 ); +else +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +6 ); + }else { +if (coex_sta->is_hid_low_pri_tx_overhead) { +if (coex_sta->hid_busy_num <2 ) +halbtc8822b1ant_coex_table_type (btcoexist, +NORMAL_EXEC ,1 ); +else +halbtc8822b1ant_coex_table_type (btcoexist, +NORMAL_EXEC ,6 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +18 ); + }else if (coex_sta->hid_busy_num <2 ) { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC , +1 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +11 ); + }else if (wifi_bw ==0 ) {/* if 11bg mode */ +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC , +11 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +11 ); + }else { +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC , +6 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true, +11 ); + } + } +} + +static void halbtc8822b1ant_action_bt_mr (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], RunCoexistMechanism(), microsoft MR!!\n" ); + +if (coex_sta->wl_center_channel <=14 ) { +halbtc8822b1ant_set_ant_path (btcoexist, +BTC_ANT_PATH_AUTO ,NORMAL_EXEC , +BT_8822B_1ANT_PHASE_2G_WL ); + +halbtc8822b1ant_action_bt_sco_hid_busy (btcoexist); + +/* Enter MIMO Power Save, 0:enable */ +halbtc8822b1ant_mimo_ps (btcoexist,NORMAL_EXEC ,0 ); + }else { +halbtc8822b1ant_set_ant_path (btcoexist,BTC_ANT_PATH_AUTO , +NORMAL_EXEC , +BT_8822B_1ANT_PHASE_5G ); + +halbtc8822b1ant_action_bt_sco_hid_busy (btcoexist); + +/* No MIMO Power Save, 3:disable */ +halbtc8822b1ant_mimo_ps (btcoexist,NORMAL_EXEC ,3 ); + } +} + +static void halbtc8822b1ant_action_rf4ce (struct btc_coexist *btcoexist) +{ +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC ,0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , false); + +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,1 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , true,50 ); +} + +static void halbtc8822b1ant_action_wifi_under5g (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; + +RT_TRACE (rtlpriv,COMP_BT_COEXIST ,DBG_LOUD , +"[BTCoex], under 5g start\n" ); + +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC ,0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , false); + +halbtc8822b1ant_set_ant_path (btcoexist,BTC_ANT_PATH_AUTO ,FORCE_EXEC , +BT_8822B_1ANT_PHASE_5G ); + +halbtc8822b1ant_coex_table_type (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_ps_tdma (btcoexist,NORMAL_EXEC , false,8 ); +} + +static void halbtc8822b1ant_action_wifi_only (struct btc_coexist *btcoexist) +{ +struct rtl_priv *rtlpriv = btcoexist->adapter; +bool wifi_under_5g = false, rf4ce_enabled = false, + wifi_connected = false; + +halbtc8822b1ant_adjust_wl_tx_power (btcoexist,NORMAL_EXEC ,0xd8 ); +halbtc8822b1ant_adjust_bt_tx_power (btcoexist,NORMAL_EXEC ,0 ); +halbtc8822b1ant_adjust_wl_rx_gain (btcoexist,NORMAL_EXEC , false); +halbtc8822b1ant_adjust_bt_rx_gain (btcoexist,NORMAL_EXEC , false); + + btcoexist->btc_get(btcoexist, BTC_GET_BL_RF4CE_CONNECTED,
Lines of this file are not shown. View the raw message.
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b1ant.h new file +413 -0
413 lines not on this page · raw message
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b2ant.c new file +5370 -0
5,370 lines not on this page · raw message
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtc8822b2ant.h new file +434 -0
434 lines not on this page · raw message
The rest of this diff is not shown. View the raw message.
Signature · 1 line
2.15.1
Part of the diff is not shown here. View the raw message.
Re: [PATCH v2 12/15] rtlwifi: btcoex: Add 8822b 1ant/2ant coex files
Quoted 1 line · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
[email protected]
maintainerPATCH v2 13/15 rtlwifi: btcoex: Add 8822b header files to precomp.h
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
Add 8822b header files to precomp.h for routing functions.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbt_precomp.h | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbt_precomp.h +3 -0
@@ -48,6 +48,9 @@#include "halbtc8723b2ant.h" #include "halbtc8821a2ant.h" #include "halbtc8821a1ant.h" +#include "halbtc8822b1ant.h" +#include "halbtc8822b2ant.h" +#include "halbtc8822bwifionly.h" #define GetDefaultAdapter (padapter) padapter
Signature · 1 line
2.15.1
Re: [PATCH v2 13/15] rtlwifi: btcoex: Add 8822b header files to precomp.h
Quoted 5 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
Add 8822b header files to
precomp.hfor routing functions.Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 19 lines
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/halbt_precomp.h | 3 +++ 1 file changed, 3 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbt_precomp.h +3
-0@@ -48,6 +48,9 @@#include "halbtc8723b2ant.h" #include "halbtc8821a2ant.h" #include "halbtc8821a1ant.h" +#include "halbtc8822b1ant.h" +#include "halbtc8822b2ant.h" +#include "halbtc8822bwifionly.h" #define GetDefaultAdapter (padapter) padapter
[email protected]
maintainerPATCH v2 14/15 rtlwifi: btcoex: Add 8822b to Makefile
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
Add btcoex of 8822b to Makefile.
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile +3 -0
@@ -4,6 +4,9 @@ btcoexist-objs := halbtc8192e2ant.o \ halbtc8723b2ant.o \ halbtc8821a1ant.o \ halbtc8821a2ant.o \ + halbtc8822b1ant.o \ + halbtc8822b2ant.o \ + halbtc8822bwifionly.o \ halbtcoutsrc.o \ rtl_btc.o
Signature · 1 line
2.15.1
Re: [PATCH v2 14/15] rtlwifi: btcoex: Add 8822b to Makefile
Quoted 5 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
Add btcoex of 8822b to
Makefile.Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 19 lines
--- drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile | 3 +++ 1 file changed, 3 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/Makefile +3
-0@@ -4,6 +4,9 @@ btcoexist-objs := halbtc8192e2ant.o \ halbtc8723b2ant.o \ halbtc8821a1ant.o \ halbtc8821a2ant.o \ + halbtc8822b1ant.o \ + halbtc8822b2ant.o \ + halbtc8822bwifionly.o \ halbtcoutsrc.o \ rtl_btc.o
[email protected]
maintainerPATCH v2 15/15 rtlwifi: btcoex: Add 8822b routine to btc interfaces
In reply to [email protected]From: Ping-Ke Shih <[email protected]>
Add 8822b routines to run btcoex algorithm
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 100 +++++++++++++++++++++ 1 file changed, 100 insertions(+)
drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +100 -0
@@ -1441,6 +1441,11 @@ void exhalbtc_power_on_setting(struct btc_coexist *btcoexist)ex_btc8723b2ant_power_on_setting (btcoexist); else if (btcoexist->board_info.btdm_ant_num == 1) ex_btc8723b1ant_power_on_setting(btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_power_on_setting (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_power_on_setting (btcoexist); } }
@@ -1454,6 +1459,11 @@ void exhalbtc_pre_load_firmware(struct btc_coexist *btcoexist)if (IS_HARDWARE_TYPE_8723B (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8723b2ant_pre_load_firmware (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_pre_load_firmware (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_pre_load_firmware (btcoexist); } }
@@ -1479,11 +1489,21 @@ void exhalbtc_init_hw_config(struct btc_coexist *btcoexist, bool wifi_only) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_init_hwconfig (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_init_hw_config (btcoexist, wifi_only); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_init_hw_config (btcoexist, wifi_only); + +halbtc_set_default_port_id_cmd (btcoexist); +halbtc_send_wifi_port_id_cmd (btcoexist); } }void exhalbtc_init_hw_config_wifi_only (struct wifi_only_cfg *wifionly_cfg) { +if (IS_HARDWARE_TYPE_8822B (wifionly_cfg->adapter)) +ex_hal8822b_wifi_only_hw_config (wifionly_cfg); }void exhalbtc_init_coex_dm (struct btc_coexist *btcoexist)
@@ -1506,6 +1526,11 @@ void exhalbtc_init_coex_dm(struct btc_coexist *btcoexist) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_init_coex_dm (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_init_coex_dm (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_init_coex_dm (btcoexist); } btcoexist->initilized = true;
@@ -1541,6 +1566,11 @@ void exhalbtc_ips_notify(struct btc_coexist *btcoexist, u8 type) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_ips_notify (btcoexist, ips_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_ips_notify (btcoexist, ips_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_ips_notify (btcoexist, ips_type); }halbtc_normal_low_power (btcoexist);
@@ -1574,6 +1604,11 @@ void exhalbtc_lps_notify(struct btc_coexist *btcoexist, u8 type) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_lps_notify (btcoexist, lps_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_lps_notify (btcoexist, lps_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_lps_notify (btcoexist, lps_type); } }
@@ -1607,6 +1642,11 @@ void exhalbtc_scan_notify(struct btc_coexist *btcoexist, u8 type) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_scan_notify (btcoexist, scan_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_scan_notify (btcoexist, scan_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_scan_notify (btcoexist, scan_type); }halbtc_normal_low_power (btcoexist);
@@ -1615,6 +1655,8 @@ void exhalbtc_scan_notify(struct btc_coexist *btcoexist, u8 type)void exhalbtc_scan_notify_wifi_only (struct wifi_only_cfg *wifionly_cfg,u8 is_5g) { +if (IS_HARDWARE_TYPE_8822B (wifionly_cfg->adapter)) +ex_hal8822b_wifi_only_scannotify (wifionly_cfg, is_5g); }void exhalbtc_connect_notify (struct btc_coexist *btcoexist,u8 action)
@@ -1655,6 +1697,11 @@ void exhalbtc_connect_notify(struct btc_coexist *btcoexist, u8 action) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_connect_notify (btcoexist, asso_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_connect_notify (btcoexist, asso_type_v2); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_connect_notify (btcoexist, asso_type_v2); }halbtc_normal_low_power (btcoexist);
@@ -1691,6 +1738,11 @@ void exhalbtc_mediastatus_notify(struct btc_coexist *btcoexist, }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_media_status_notify (btcoexist, status); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_media_status_notify (btcoexist, status); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_media_status_notify (btcoexist, status); }halbtc_normal_low_power (btcoexist);
@@ -1737,6 +1789,13 @@ void exhalbtc_special_packet_notify(struct btc_coexist *btcoexist, u8 pkt_type)if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_special_packet_notify (btcoexist, packet_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_specific_packet_notify (btcoexist, + packet_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_specific_packet_notify (btcoexist, + packet_type); }halbtc_normal_low_power (btcoexist);
@@ -1769,6 +1828,13 @@ void exhalbtc_bt_info_notify(struct btc_coexist *btcoexist,if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_bt_info_notify (btcoexist, tmp_buf, length); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_bt_info_notify (btcoexist, tmp_buf, + length); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_bt_info_notify (btcoexist, tmp_buf, + length); }halbtc_normal_low_power (btcoexist);
@@ -1784,6 +1850,11 @@ void exhalbtc_rf_status_notify(struct btc_coexist *btcoexist, u8 type)if (btcoexist->board_info.btdm_ant_num ==1 )ex_btc8723b1ant_rf_status_notify (btcoexist, type); }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) { + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_rf_status_notify (btcoexist, type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_rf_status_notify (btcoexist, type); } }
@@ -1829,6 +1900,11 @@ void exhalbtc_halt_notify(struct btc_coexist *btcoexist) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_halt_notify (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_halt_notify (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_halt_notify (btcoexist); } btcoexist->binded = false;
@@ -1855,6 +1931,11 @@ void exhalbtc_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)else if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8821a2ant_pnp_notify (btcoexist, pnp_state); }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) { + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_pnp_notify (btcoexist, pnp_state); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_pnp_notify (btcoexist, pnp_state); } }
@@ -1905,6 +1986,11 @@ void exhalbtc_periodical(struct btc_coexist *btcoexist) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_periodical (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_periodical (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_periodical (btcoexist); }halbtc_normal_low_power (btcoexist);
@@ -2038,6 +2124,11 @@ void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist, }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_display_coex_info (btcoexist, m); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_display_coex_info (btcoexist, m); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_display_coex_info (btcoexist, m); }halbtc_normal_low_power (btcoexist);
@@ -2053,10 +2144,19 @@ void exhalbtc_switch_band_notify(struct btc_coexist *btcoexist, u8 type)halbtc_leave_low_power (btcoexist); +if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_switchband_notify (btcoexist, type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_switchband_notify (btcoexist, type); + } +halbtc_normal_low_power (btcoexist); }void exhalbtc_switch_band_notify_wifi_only (struct wifi_only_cfg *wifionly_cfg,u8 is_5g) { +if (IS_HARDWARE_TYPE_8822B (wifionly_cfg->adapter)) +ex_hal8822b_wifi_only_switchbandnotify (wifionly_cfg, is_5g); }
Signature · 1 line
2.15.1
Re: [PATCH v2 15/15] rtlwifi: btcoex: Add 8822b routine to btc interfaces
Quoted 5 lines · On 03/05/2018 07:25 PM, [email protected] wrote:
From: Ping-Ke Shih <[email protected]>
Add 8822b routines to run btcoex algorithm
Signed-off-by Ping-Ke Shih <[email protected]>
Quoted 244 lines
--- .../realtek/rtlwifi/btcoexist/halbtcoutsrc.c | 100 +++++++++++++++++++++ 1 file changed, 100 insertions(+)drivers/net/wireless/realtek/rtlwifi/btcoexist/halbtcoutsrc.c +100
-0@@ -1441,6 +1441,11 @@ void exhalbtc_power_on_setting(struct btc_coexist *btcoexist)ex_btc8723b2ant_power_on_setting (btcoexist); else if (btcoexist->board_info.btdm_ant_num == 1) ex_btc8723b1ant_power_on_setting(btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_power_on_setting (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_power_on_setting (btcoexist); } }@@ -1454,6 +1459,11 @@ void exhalbtc_pre_load_firmware(struct btc_coexist *btcoexist)if (IS_HARDWARE_TYPE_8723B (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8723b2ant_pre_load_firmware (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_pre_load_firmware (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_pre_load_firmware (btcoexist); } }@@ -1479,11 +1489,21 @@ void exhalbtc_init_hw_config(struct btc_coexist *btcoexist, bool wifi_only) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_init_hwconfig (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_init_hw_config (btcoexist, wifi_only); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_init_hw_config (btcoexist, wifi_only); + +halbtc_set_default_port_id_cmd (btcoexist); +halbtc_send_wifi_port_id_cmd (btcoexist); } }void exhalbtc_init_hw_config_wifi_only (struct wifi_only_cfg *wifionly_cfg) { +if (IS_HARDWARE_TYPE_8822B (wifionly_cfg->adapter)) +ex_hal8822b_wifi_only_hw_config (wifionly_cfg); }void exhalbtc_init_coex_dm (struct btc_coexist *btcoexist)@@ -1506,6 +1526,11 @@ void exhalbtc_init_coex_dm(struct btc_coexist *btcoexist) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_init_coex_dm (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_init_coex_dm (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_init_coex_dm (btcoexist); } btcoexist->initilized = true;@@ -1541,6 +1566,11 @@ void exhalbtc_ips_notify(struct btc_coexist *btcoexist, u8 type) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_ips_notify (btcoexist, ips_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_ips_notify (btcoexist, ips_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_ips_notify (btcoexist, ips_type); }halbtc_normal_low_power (btcoexist);@@ -1574,6 +1604,11 @@ void exhalbtc_lps_notify(struct btc_coexist *btcoexist, u8 type) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_lps_notify (btcoexist, lps_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_lps_notify (btcoexist, lps_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_lps_notify (btcoexist, lps_type); } }@@ -1607,6 +1642,11 @@ void exhalbtc_scan_notify(struct btc_coexist *btcoexist, u8 type) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_scan_notify (btcoexist, scan_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_scan_notify (btcoexist, scan_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_scan_notify (btcoexist, scan_type); }halbtc_normal_low_power (btcoexist);@@ -1615,6 +1655,8 @@ void exhalbtc_scan_notify(struct btc_coexist *btcoexist, u8 type)void exhalbtc_scan_notify_wifi_only (struct wifi_only_cfg *wifionly_cfg,u8 is_5g) { +if (IS_HARDWARE_TYPE_8822B (wifionly_cfg->adapter)) +ex_hal8822b_wifi_only_scannotify (wifionly_cfg, is_5g); }void exhalbtc_connect_notify (struct btc_coexist *btcoexist,u8 action)@@ -1655,6 +1697,11 @@ void exhalbtc_connect_notify(struct btc_coexist *btcoexist, u8 action) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_connect_notify (btcoexist, asso_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_connect_notify (btcoexist, asso_type_v2); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_connect_notify (btcoexist, asso_type_v2); }halbtc_normal_low_power (btcoexist);@@ -1691,6 +1738,11 @@ void exhalbtc_mediastatus_notify(struct btc_coexist *btcoexist, }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_media_status_notify (btcoexist, status); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_media_status_notify (btcoexist, status); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_media_status_notify (btcoexist, status); }halbtc_normal_low_power (btcoexist);@@ -1737,6 +1789,13 @@ void exhalbtc_special_packet_notify(struct btc_coexist *btcoexist, u8 pkt_type)if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_special_packet_notify (btcoexist, packet_type); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_specific_packet_notify (btcoexist, + packet_type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_specific_packet_notify (btcoexist, + packet_type); }halbtc_normal_low_power (btcoexist);@@ -1769,6 +1828,13 @@ void exhalbtc_bt_info_notify(struct btc_coexist *btcoexist,if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_bt_info_notify (btcoexist, tmp_buf, length); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_bt_info_notify (btcoexist, tmp_buf, + length); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_bt_info_notify (btcoexist, tmp_buf, + length); }halbtc_normal_low_power (btcoexist);@@ -1784,6 +1850,11 @@ void exhalbtc_rf_status_notify(struct btc_coexist *btcoexist, u8 type)if (btcoexist->board_info.btdm_ant_num ==1 )ex_btc8723b1ant_rf_status_notify (btcoexist, type); }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) { + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_rf_status_notify (btcoexist, type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_rf_status_notify (btcoexist, type); } }@@ -1829,6 +1900,11 @@ void exhalbtc_halt_notify(struct btc_coexist *btcoexist) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_halt_notify (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_halt_notify (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_halt_notify (btcoexist); } btcoexist->binded = false;@@ -1855,6 +1931,11 @@ void exhalbtc_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state)else if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8821a2ant_pnp_notify (btcoexist, pnp_state); }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) { + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_pnp_notify (btcoexist, pnp_state); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_pnp_notify (btcoexist, pnp_state); } }@@ -1905,6 +1986,11 @@ void exhalbtc_periodical(struct btc_coexist *btcoexist) }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_periodical (btcoexist); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_periodical (btcoexist); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_periodical (btcoexist); }halbtc_normal_low_power (btcoexist);@@ -2038,6 +2124,11 @@ void exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist, }else if (IS_HARDWARE_TYPE_8192E (btcoexist->adapter)) {if (btcoexist->board_info.btdm_ant_num ==2 )ex_btc8192e2ant_display_coex_info (btcoexist, m); + }else if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_display_coex_info (btcoexist, m); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_display_coex_info (btcoexist, m); }halbtc_normal_low_power (btcoexist);@@ -2053,10 +2144,19 @@ void exhalbtc_switch_band_notify(struct btc_coexist *btcoexist, u8 type)halbtc_leave_low_power (btcoexist); +if (IS_HARDWARE_TYPE_8822B (btcoexist->adapter)) { +if (btcoexist->board_info.btdm_ant_num ==1 ) +ex_btc8822b1ant_switchband_notify (btcoexist, type); +else if (btcoexist->board_info.btdm_ant_num ==2 ) +ex_btc8822b2ant_switchband_notify (btcoexist, type); + } +halbtc_normal_low_power (btcoexist); }void exhalbtc_switch_band_notify_wifi_only (struct wifi_only_cfg *wifionly_cfg,u8 is_5g) { +if (IS_HARDWARE_TYPE_8822B (wifionly_cfg->adapter)) +ex_hal8822b_wifi_only_switchbandnotify (wifionly_cfg, is_5g); }