162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright(c) 2007-2013 Realtek Corporation.*/ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include "halbt_precomp.h" 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci/*************************************************** 762306a36Sopenharmony_ci * Debug related function 862306a36Sopenharmony_ci ***************************************************/ 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic const char *const gl_btc_wifi_bw_string[] = { 1162306a36Sopenharmony_ci "11bg", 1262306a36Sopenharmony_ci "HT20", 1362306a36Sopenharmony_ci "HT40", 1462306a36Sopenharmony_ci "HT80", 1562306a36Sopenharmony_ci "HT160" 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic const char *const gl_btc_wifi_freq_string[] = { 1962306a36Sopenharmony_ci "2.4G", 2062306a36Sopenharmony_ci "5G" 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic bool halbtc_is_bt_coexist_available(struct btc_coexist *btcoexist) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci if (!btcoexist->binded || NULL == btcoexist->adapter) 2662306a36Sopenharmony_ci return false; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci return true; 2962306a36Sopenharmony_ci} 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistatic bool halbtc_is_wifi_busy(struct rtl_priv *rtlpriv) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci if (rtlpriv->link_info.busytraffic) 3462306a36Sopenharmony_ci return true; 3562306a36Sopenharmony_ci else 3662306a36Sopenharmony_ci return false; 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistatic void halbtc_dbg_init(void) 4062306a36Sopenharmony_ci{ 4162306a36Sopenharmony_ci} 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci/*************************************************** 4462306a36Sopenharmony_ci * helper function 4562306a36Sopenharmony_ci ***************************************************/ 4662306a36Sopenharmony_cistatic bool is_any_client_connect_to_ap(struct btc_coexist *btcoexist) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 4962306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtlpriv); 5062306a36Sopenharmony_ci bool ret = false; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci if (mac->opmode == NL80211_IFTYPE_ADHOC || 5362306a36Sopenharmony_ci mac->opmode == NL80211_IFTYPE_MESH_POINT || 5462306a36Sopenharmony_ci mac->opmode == NL80211_IFTYPE_AP) { 5562306a36Sopenharmony_ci spin_lock_bh(&rtlpriv->locks.entry_list_lock); 5662306a36Sopenharmony_ci if (!list_empty(&rtlpriv->entry_list)) 5762306a36Sopenharmony_ci ret = true; 5862306a36Sopenharmony_ci spin_unlock_bh(&rtlpriv->locks.entry_list_lock); 5962306a36Sopenharmony_ci } 6062306a36Sopenharmony_ci return ret; 6162306a36Sopenharmony_ci} 6262306a36Sopenharmony_ci 6362306a36Sopenharmony_cistatic bool halbtc_legacy(struct rtl_priv *adapter) 6462306a36Sopenharmony_ci{ 6562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = adapter; 6662306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtlpriv); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci bool is_legacy = false; 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci if ((mac->mode == WIRELESS_MODE_B) || (mac->mode == WIRELESS_MODE_G)) 7162306a36Sopenharmony_ci is_legacy = true; 7262306a36Sopenharmony_ci 7362306a36Sopenharmony_ci return is_legacy; 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cibool halbtc_is_wifi_uplink(struct rtl_priv *adapter) 7762306a36Sopenharmony_ci{ 7862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = adapter; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_ci if (rtlpriv->link_info.tx_busy_traffic) 8162306a36Sopenharmony_ci return true; 8262306a36Sopenharmony_ci else 8362306a36Sopenharmony_ci return false; 8462306a36Sopenharmony_ci} 8562306a36Sopenharmony_ci 8662306a36Sopenharmony_cistatic u32 halbtc_get_wifi_bw(struct btc_coexist *btcoexist) 8762306a36Sopenharmony_ci{ 8862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 8962306a36Sopenharmony_ci struct rtl_phy *rtlphy = &rtlpriv->phy; 9062306a36Sopenharmony_ci u32 wifi_bw = BTC_WIFI_BW_HT20; 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_ci if (halbtc_legacy(rtlpriv)) { 9362306a36Sopenharmony_ci wifi_bw = BTC_WIFI_BW_LEGACY; 9462306a36Sopenharmony_ci } else { 9562306a36Sopenharmony_ci switch (rtlphy->current_chan_bw) { 9662306a36Sopenharmony_ci case HT_CHANNEL_WIDTH_20: 9762306a36Sopenharmony_ci wifi_bw = BTC_WIFI_BW_HT20; 9862306a36Sopenharmony_ci break; 9962306a36Sopenharmony_ci case HT_CHANNEL_WIDTH_20_40: 10062306a36Sopenharmony_ci wifi_bw = BTC_WIFI_BW_HT40; 10162306a36Sopenharmony_ci break; 10262306a36Sopenharmony_ci case HT_CHANNEL_WIDTH_80: 10362306a36Sopenharmony_ci wifi_bw = BTC_WIFI_BW_HT80; 10462306a36Sopenharmony_ci break; 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci } 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci return wifi_bw; 10962306a36Sopenharmony_ci} 11062306a36Sopenharmony_ci 11162306a36Sopenharmony_cistatic u8 halbtc_get_wifi_central_chnl(struct btc_coexist *btcoexist) 11262306a36Sopenharmony_ci{ 11362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 11462306a36Sopenharmony_ci struct rtl_phy *rtlphy = &(rtlpriv->phy); 11562306a36Sopenharmony_ci u8 chnl = 1; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci if (rtlphy->current_channel != 0) 11862306a36Sopenharmony_ci chnl = rtlphy->current_channel; 11962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 12062306a36Sopenharmony_ci "%s:%d\n", __func__, chnl); 12162306a36Sopenharmony_ci return chnl; 12262306a36Sopenharmony_ci} 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_cistatic u8 rtl_get_hwpg_single_ant_path(struct rtl_priv *rtlpriv) 12562306a36Sopenharmony_ci{ 12662306a36Sopenharmony_ci return rtlpriv->btcoexist.btc_info.single_ant_path; 12762306a36Sopenharmony_ci} 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_cistatic u8 rtl_get_hwpg_bt_type(struct rtl_priv *rtlpriv) 13062306a36Sopenharmony_ci{ 13162306a36Sopenharmony_ci return rtlpriv->btcoexist.btc_info.bt_type; 13262306a36Sopenharmony_ci} 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cistatic u8 rtl_get_hwpg_ant_num(struct rtl_priv *rtlpriv) 13562306a36Sopenharmony_ci{ 13662306a36Sopenharmony_ci u8 num; 13762306a36Sopenharmony_ci 13862306a36Sopenharmony_ci if (rtlpriv->btcoexist.btc_info.ant_num == ANT_X2) 13962306a36Sopenharmony_ci num = 2; 14062306a36Sopenharmony_ci else 14162306a36Sopenharmony_ci num = 1; 14262306a36Sopenharmony_ci 14362306a36Sopenharmony_ci return num; 14462306a36Sopenharmony_ci} 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_cistatic u8 rtl_get_hwpg_package_type(struct rtl_priv *rtlpriv) 14762306a36Sopenharmony_ci{ 14862306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci return rtlhal->package_type; 15162306a36Sopenharmony_ci} 15262306a36Sopenharmony_ci 15362306a36Sopenharmony_cistatic 15462306a36Sopenharmony_ciu8 rtl_get_hwpg_rfe_type(struct rtl_priv *rtlpriv) 15562306a36Sopenharmony_ci{ 15662306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_ci return rtlhal->rfe_type; 15962306a36Sopenharmony_ci} 16062306a36Sopenharmony_ci 16162306a36Sopenharmony_cistatic 16262306a36Sopenharmony_cibool halbtc_is_hw_mailbox_exist(struct btc_coexist *btcoexist) 16362306a36Sopenharmony_ci{ 16462306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8812(btcoexist->adapter)) 16562306a36Sopenharmony_ci return false; 16662306a36Sopenharmony_ci else 16762306a36Sopenharmony_ci return true; 16862306a36Sopenharmony_ci} 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_cistatic 17162306a36Sopenharmony_cibool halbtc_send_bt_mp_operation(struct btc_coexist *btcoexist, u8 op_code, 17262306a36Sopenharmony_ci u8 *cmd, u32 len, unsigned long wait_ms) 17362306a36Sopenharmony_ci{ 17462306a36Sopenharmony_ci struct rtl_priv *rtlpriv; 17562306a36Sopenharmony_ci const u8 oper_ver = 0; 17662306a36Sopenharmony_ci u8 req_num; 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci if (!halbtc_is_hw_mailbox_exist(btcoexist)) 17962306a36Sopenharmony_ci return false; 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci if (wait_ms) /* before h2c to avoid race condition */ 18262306a36Sopenharmony_ci reinit_completion(&btcoexist->bt_mp_comp); 18362306a36Sopenharmony_ci 18462306a36Sopenharmony_ci rtlpriv = btcoexist->adapter; 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci /* fill req_num by op_code, and rtl_btc_btmpinfo_notify() use it 18762306a36Sopenharmony_ci * to know message type 18862306a36Sopenharmony_ci */ 18962306a36Sopenharmony_ci switch (op_code) { 19062306a36Sopenharmony_ci case BT_OP_GET_BT_VERSION: 19162306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_VERSION; 19262306a36Sopenharmony_ci break; 19362306a36Sopenharmony_ci case BT_OP_GET_AFH_MAP_L: 19462306a36Sopenharmony_ci req_num = BT_SEQ_GET_AFH_MAP_L; 19562306a36Sopenharmony_ci break; 19662306a36Sopenharmony_ci case BT_OP_GET_AFH_MAP_M: 19762306a36Sopenharmony_ci req_num = BT_SEQ_GET_AFH_MAP_M; 19862306a36Sopenharmony_ci break; 19962306a36Sopenharmony_ci case BT_OP_GET_AFH_MAP_H: 20062306a36Sopenharmony_ci req_num = BT_SEQ_GET_AFH_MAP_H; 20162306a36Sopenharmony_ci break; 20262306a36Sopenharmony_ci case BT_OP_GET_BT_COEX_SUPPORTED_FEATURE: 20362306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_COEX_SUPPORTED_FEATURE; 20462306a36Sopenharmony_ci break; 20562306a36Sopenharmony_ci case BT_OP_GET_BT_COEX_SUPPORTED_VERSION: 20662306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_COEX_SUPPORTED_VERSION; 20762306a36Sopenharmony_ci break; 20862306a36Sopenharmony_ci case BT_OP_GET_BT_ANT_DET_VAL: 20962306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_ANT_DET_VAL; 21062306a36Sopenharmony_ci break; 21162306a36Sopenharmony_ci case BT_OP_GET_BT_BLE_SCAN_PARA: 21262306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_BLE_SCAN_PARA; 21362306a36Sopenharmony_ci break; 21462306a36Sopenharmony_ci case BT_OP_GET_BT_BLE_SCAN_TYPE: 21562306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_BLE_SCAN_TYPE; 21662306a36Sopenharmony_ci break; 21762306a36Sopenharmony_ci case BT_OP_GET_BT_DEVICE_INFO: 21862306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_DEVICE_INFO; 21962306a36Sopenharmony_ci break; 22062306a36Sopenharmony_ci case BT_OP_GET_BT_FORBIDDEN_SLOT_VAL: 22162306a36Sopenharmony_ci req_num = BT_SEQ_GET_BT_FORB_SLOT_VAL; 22262306a36Sopenharmony_ci break; 22362306a36Sopenharmony_ci case BT_OP_WRITE_REG_ADDR: 22462306a36Sopenharmony_ci case BT_OP_WRITE_REG_VALUE: 22562306a36Sopenharmony_ci case BT_OP_READ_REG: 22662306a36Sopenharmony_ci default: 22762306a36Sopenharmony_ci req_num = BT_SEQ_DONT_CARE; 22862306a36Sopenharmony_ci break; 22962306a36Sopenharmony_ci } 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_ci cmd[0] |= (oper_ver & 0x0f); /* Set OperVer */ 23262306a36Sopenharmony_ci cmd[0] |= ((req_num << 4) & 0xf0); /* Set ReqNum */ 23362306a36Sopenharmony_ci cmd[1] = op_code; 23462306a36Sopenharmony_ci rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->mac80211.hw, 0x67, len, cmd); 23562306a36Sopenharmony_ci 23662306a36Sopenharmony_ci /* wait? */ 23762306a36Sopenharmony_ci if (!wait_ms) 23862306a36Sopenharmony_ci return true; 23962306a36Sopenharmony_ci 24062306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 24162306a36Sopenharmony_ci "btmpinfo wait req_num=%d wait=%ld\n", req_num, wait_ms); 24262306a36Sopenharmony_ci 24362306a36Sopenharmony_ci if (wait_for_completion_timeout(&btcoexist->bt_mp_comp, 24462306a36Sopenharmony_ci msecs_to_jiffies(wait_ms)) == 0) { 24562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 24662306a36Sopenharmony_ci "btmpinfo wait (req_num=%d) timeout\n", req_num); 24762306a36Sopenharmony_ci 24862306a36Sopenharmony_ci return false; /* timeout */ 24962306a36Sopenharmony_ci } 25062306a36Sopenharmony_ci 25162306a36Sopenharmony_ci return true; 25262306a36Sopenharmony_ci} 25362306a36Sopenharmony_ci 25462306a36Sopenharmony_cistatic void halbtc_leave_lps(struct btc_coexist *btcoexist) 25562306a36Sopenharmony_ci{ 25662306a36Sopenharmony_ci struct rtl_priv *rtlpriv; 25762306a36Sopenharmony_ci bool ap_enable = false; 25862306a36Sopenharmony_ci 25962306a36Sopenharmony_ci rtlpriv = btcoexist->adapter; 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, 26262306a36Sopenharmony_ci &ap_enable); 26362306a36Sopenharmony_ci 26462306a36Sopenharmony_ci if (ap_enable) { 26562306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 26662306a36Sopenharmony_ci "%s()<--dont leave lps under AP mode\n", __func__); 26762306a36Sopenharmony_ci return; 26862306a36Sopenharmony_ci } 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_lps = true; 27162306a36Sopenharmony_ci btcoexist->bt_info.bt_lps_on = false; 27262306a36Sopenharmony_ci /* FIXME: Context is unclear. Is it allowed to block? */ 27362306a36Sopenharmony_ci rtl_lps_leave(rtlpriv->mac80211.hw, false); 27462306a36Sopenharmony_ci} 27562306a36Sopenharmony_ci 27662306a36Sopenharmony_cistatic void halbtc_enter_lps(struct btc_coexist *btcoexist) 27762306a36Sopenharmony_ci{ 27862306a36Sopenharmony_ci struct rtl_priv *rtlpriv; 27962306a36Sopenharmony_ci bool ap_enable = false; 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_ci rtlpriv = btcoexist->adapter; 28262306a36Sopenharmony_ci 28362306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_AP_MODE_ENABLE, 28462306a36Sopenharmony_ci &ap_enable); 28562306a36Sopenharmony_ci 28662306a36Sopenharmony_ci if (ap_enable) { 28762306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_DMESG, 28862306a36Sopenharmony_ci "%s()<--dont enter lps under AP mode\n", __func__); 28962306a36Sopenharmony_ci return; 29062306a36Sopenharmony_ci } 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_lps = true; 29362306a36Sopenharmony_ci btcoexist->bt_info.bt_lps_on = true; 29462306a36Sopenharmony_ci /* FIXME: Context is unclear. Is it allowed to block? */ 29562306a36Sopenharmony_ci rtl_lps_enter(rtlpriv->mac80211.hw, false); 29662306a36Sopenharmony_ci} 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_cistatic void halbtc_normal_lps(struct btc_coexist *btcoexist) 29962306a36Sopenharmony_ci{ 30062306a36Sopenharmony_ci struct rtl_priv *rtlpriv; 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci rtlpriv = btcoexist->adapter; 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci if (btcoexist->bt_info.bt_ctrl_lps) { 30562306a36Sopenharmony_ci btcoexist->bt_info.bt_lps_on = false; 30662306a36Sopenharmony_ci /* FIXME: Context is unclear. Is it allowed to block? */ 30762306a36Sopenharmony_ci rtl_lps_leave(rtlpriv->mac80211.hw, false); 30862306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_lps = false; 30962306a36Sopenharmony_ci } 31062306a36Sopenharmony_ci} 31162306a36Sopenharmony_ci 31262306a36Sopenharmony_cistatic void halbtc_pre_normal_lps(struct btc_coexist *btcoexist) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 31562306a36Sopenharmony_ci 31662306a36Sopenharmony_ci if (btcoexist->bt_info.bt_ctrl_lps) { 31762306a36Sopenharmony_ci btcoexist->bt_info.bt_lps_on = false; 31862306a36Sopenharmony_ci /* FIXME: Context is unclear. Is it allowed to block? */ 31962306a36Sopenharmony_ci rtl_lps_leave(rtlpriv->mac80211.hw, false); 32062306a36Sopenharmony_ci } 32162306a36Sopenharmony_ci} 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_cistatic void halbtc_post_normal_lps(struct btc_coexist *btcoexist) 32462306a36Sopenharmony_ci{ 32562306a36Sopenharmony_ci if (btcoexist->bt_info.bt_ctrl_lps) 32662306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_lps = false; 32762306a36Sopenharmony_ci} 32862306a36Sopenharmony_ci 32962306a36Sopenharmony_cistatic void halbtc_leave_low_power(struct btc_coexist *btcoexist) 33062306a36Sopenharmony_ci{ 33162306a36Sopenharmony_ci} 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_cistatic void halbtc_normal_low_power(struct btc_coexist *btcoexist) 33462306a36Sopenharmony_ci{ 33562306a36Sopenharmony_ci} 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_cistatic void halbtc_disable_low_power(struct btc_coexist *btcoexist, 33862306a36Sopenharmony_ci bool low_pwr_disable) 33962306a36Sopenharmony_ci{ 34062306a36Sopenharmony_ci /* TODO: original/leave 32k low power */ 34162306a36Sopenharmony_ci btcoexist->bt_info.bt_disable_low_pwr = low_pwr_disable; 34262306a36Sopenharmony_ci} 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_cistatic void halbtc_aggregation_check(struct btc_coexist *btcoexist) 34562306a36Sopenharmony_ci{ 34662306a36Sopenharmony_ci bool need_to_act = false; 34762306a36Sopenharmony_ci static unsigned long pre_time; 34862306a36Sopenharmony_ci unsigned long cur_time = 0; 34962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 35062306a36Sopenharmony_ci 35162306a36Sopenharmony_ci /* To void continuous deleteBA=>addBA=>deleteBA=>addBA 35262306a36Sopenharmony_ci * This function is not allowed to continuous called 35362306a36Sopenharmony_ci * It can only be called after 8 seconds 35462306a36Sopenharmony_ci */ 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci cur_time = jiffies; 35762306a36Sopenharmony_ci if (jiffies_to_msecs(cur_time - pre_time) <= 8000) { 35862306a36Sopenharmony_ci /* over 8 seconds you can execute this function again. */ 35962306a36Sopenharmony_ci return; 36062306a36Sopenharmony_ci } 36162306a36Sopenharmony_ci pre_time = cur_time; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci if (btcoexist->bt_info.reject_agg_pkt) { 36462306a36Sopenharmony_ci need_to_act = true; 36562306a36Sopenharmony_ci btcoexist->bt_info.pre_reject_agg_pkt = 36662306a36Sopenharmony_ci btcoexist->bt_info.reject_agg_pkt; 36762306a36Sopenharmony_ci } else { 36862306a36Sopenharmony_ci if (btcoexist->bt_info.pre_reject_agg_pkt) { 36962306a36Sopenharmony_ci need_to_act = true; 37062306a36Sopenharmony_ci btcoexist->bt_info.pre_reject_agg_pkt = 37162306a36Sopenharmony_ci btcoexist->bt_info.reject_agg_pkt; 37262306a36Sopenharmony_ci } 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci if (btcoexist->bt_info.pre_bt_ctrl_agg_buf_size != 37562306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_agg_buf_size) { 37662306a36Sopenharmony_ci need_to_act = true; 37762306a36Sopenharmony_ci btcoexist->bt_info.pre_bt_ctrl_agg_buf_size = 37862306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_agg_buf_size; 37962306a36Sopenharmony_ci } 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_ci if (btcoexist->bt_info.bt_ctrl_agg_buf_size) { 38262306a36Sopenharmony_ci if (btcoexist->bt_info.pre_agg_buf_size != 38362306a36Sopenharmony_ci btcoexist->bt_info.agg_buf_size) { 38462306a36Sopenharmony_ci need_to_act = true; 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci btcoexist->bt_info.pre_agg_buf_size = 38762306a36Sopenharmony_ci btcoexist->bt_info.agg_buf_size; 38862306a36Sopenharmony_ci } 38962306a36Sopenharmony_ci 39062306a36Sopenharmony_ci if (need_to_act) 39162306a36Sopenharmony_ci rtl_rx_ampdu_apply(rtlpriv); 39262306a36Sopenharmony_ci } 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic u32 halbtc_get_bt_patch_version(struct btc_coexist *btcoexist) 39662306a36Sopenharmony_ci{ 39762306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 39862306a36Sopenharmony_ci 39962306a36Sopenharmony_ci if (btcoexist->bt_info.bt_real_fw_ver) 40062306a36Sopenharmony_ci goto label_done; 40162306a36Sopenharmony_ci 40262306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 40362306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_VERSION, 40462306a36Sopenharmony_ci cmd_buffer, 4, 200); 40562306a36Sopenharmony_ci 40662306a36Sopenharmony_cilabel_done: 40762306a36Sopenharmony_ci return btcoexist->bt_info.bt_real_fw_ver; 40862306a36Sopenharmony_ci} 40962306a36Sopenharmony_ci 41062306a36Sopenharmony_cistatic u32 halbtc_get_bt_coex_supported_feature(void *btc_context) 41162306a36Sopenharmony_ci{ 41262306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 41362306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 41462306a36Sopenharmony_ci 41562306a36Sopenharmony_ci if (btcoexist->bt_info.bt_supported_feature) 41662306a36Sopenharmony_ci goto label_done; 41762306a36Sopenharmony_ci 41862306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 41962306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, 42062306a36Sopenharmony_ci BT_OP_GET_BT_COEX_SUPPORTED_FEATURE, 42162306a36Sopenharmony_ci cmd_buffer, 4, 200); 42262306a36Sopenharmony_ci 42362306a36Sopenharmony_cilabel_done: 42462306a36Sopenharmony_ci return btcoexist->bt_info.bt_supported_feature; 42562306a36Sopenharmony_ci} 42662306a36Sopenharmony_ci 42762306a36Sopenharmony_cistatic u32 halbtc_get_bt_coex_supported_version(void *btc_context) 42862306a36Sopenharmony_ci{ 42962306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 43062306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 43162306a36Sopenharmony_ci 43262306a36Sopenharmony_ci if (btcoexist->bt_info.bt_supported_version) 43362306a36Sopenharmony_ci goto label_done; 43462306a36Sopenharmony_ci 43562306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 43662306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, 43762306a36Sopenharmony_ci BT_OP_GET_BT_COEX_SUPPORTED_VERSION, 43862306a36Sopenharmony_ci cmd_buffer, 4, 200); 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_cilabel_done: 44162306a36Sopenharmony_ci return btcoexist->bt_info.bt_supported_version; 44262306a36Sopenharmony_ci} 44362306a36Sopenharmony_ci 44462306a36Sopenharmony_cistatic u32 halbtc_get_bt_device_info(void *btc_context) 44562306a36Sopenharmony_ci{ 44662306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 44762306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 45062306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, 45162306a36Sopenharmony_ci BT_OP_GET_BT_DEVICE_INFO, 45262306a36Sopenharmony_ci cmd_buffer, 4, 200); 45362306a36Sopenharmony_ci 45462306a36Sopenharmony_ci return btcoexist->bt_info.bt_device_info; 45562306a36Sopenharmony_ci} 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_cistatic u32 halbtc_get_bt_forbidden_slot_val(void *btc_context) 45862306a36Sopenharmony_ci{ 45962306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 46062306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 46162306a36Sopenharmony_ci 46262306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 46362306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, 46462306a36Sopenharmony_ci BT_OP_GET_BT_FORBIDDEN_SLOT_VAL, 46562306a36Sopenharmony_ci cmd_buffer, 4, 200); 46662306a36Sopenharmony_ci 46762306a36Sopenharmony_ci return btcoexist->bt_info.bt_forb_slot_val; 46862306a36Sopenharmony_ci} 46962306a36Sopenharmony_ci 47062306a36Sopenharmony_cistatic u32 halbtc_get_wifi_link_status(struct btc_coexist *btcoexist) 47162306a36Sopenharmony_ci{ 47262306a36Sopenharmony_ci /* return value: 47362306a36Sopenharmony_ci * [31:16] => connected port number 47462306a36Sopenharmony_ci * [15:0] => port connected bit define 47562306a36Sopenharmony_ci */ 47662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 47762306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtlpriv); 47862306a36Sopenharmony_ci u32 ret_val = 0; 47962306a36Sopenharmony_ci u32 port_connected_status = 0, num_of_connected_port = 0; 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci if (mac->opmode == NL80211_IFTYPE_STATION && 48262306a36Sopenharmony_ci mac->link_state >= MAC80211_LINKED) { 48362306a36Sopenharmony_ci port_connected_status |= WIFI_STA_CONNECTED; 48462306a36Sopenharmony_ci num_of_connected_port++; 48562306a36Sopenharmony_ci } 48662306a36Sopenharmony_ci /* AP & ADHOC & MESH */ 48762306a36Sopenharmony_ci if (is_any_client_connect_to_ap(btcoexist)) { 48862306a36Sopenharmony_ci port_connected_status |= WIFI_AP_CONNECTED; 48962306a36Sopenharmony_ci num_of_connected_port++; 49062306a36Sopenharmony_ci } 49162306a36Sopenharmony_ci /* TODO: P2P Connected Status */ 49262306a36Sopenharmony_ci 49362306a36Sopenharmony_ci ret_val = (num_of_connected_port << 16) | port_connected_status; 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci return ret_val; 49662306a36Sopenharmony_ci} 49762306a36Sopenharmony_ci 49862306a36Sopenharmony_cistatic s32 halbtc_get_wifi_rssi(struct rtl_priv *rtlpriv) 49962306a36Sopenharmony_ci{ 50062306a36Sopenharmony_ci return rtlpriv->dm.undec_sm_pwdb; 50162306a36Sopenharmony_ci} 50262306a36Sopenharmony_ci 50362306a36Sopenharmony_cistatic bool halbtc_get(void *void_btcoexist, u8 get_type, void *out_buf) 50462306a36Sopenharmony_ci{ 50562306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)void_btcoexist; 50662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 50762306a36Sopenharmony_ci struct rtl_phy *rtlphy = &(rtlpriv->phy); 50862306a36Sopenharmony_ci struct rtl_mac *mac = rtl_mac(rtlpriv); 50962306a36Sopenharmony_ci struct rtl_hal *rtlhal = rtl_hal(rtlpriv); 51062306a36Sopenharmony_ci bool *bool_tmp = (bool *)out_buf; 51162306a36Sopenharmony_ci int *s32_tmp = (int *)out_buf; 51262306a36Sopenharmony_ci u32 *u32_tmp = (u32 *)out_buf; 51362306a36Sopenharmony_ci u8 *u8_tmp = (u8 *)out_buf; 51462306a36Sopenharmony_ci bool tmp = false; 51562306a36Sopenharmony_ci bool ret = true; 51662306a36Sopenharmony_ci 51762306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 51862306a36Sopenharmony_ci return false; 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci switch (get_type) { 52162306a36Sopenharmony_ci case BTC_GET_BL_HS_OPERATION: 52262306a36Sopenharmony_ci *bool_tmp = false; 52362306a36Sopenharmony_ci ret = false; 52462306a36Sopenharmony_ci break; 52562306a36Sopenharmony_ci case BTC_GET_BL_HS_CONNECTING: 52662306a36Sopenharmony_ci *bool_tmp = false; 52762306a36Sopenharmony_ci ret = false; 52862306a36Sopenharmony_ci break; 52962306a36Sopenharmony_ci case BTC_GET_BL_WIFI_CONNECTED: 53062306a36Sopenharmony_ci if (rtlpriv->mac80211.opmode == NL80211_IFTYPE_STATION && 53162306a36Sopenharmony_ci rtlpriv->mac80211.link_state >= MAC80211_LINKED) 53262306a36Sopenharmony_ci tmp = true; 53362306a36Sopenharmony_ci if (is_any_client_connect_to_ap(btcoexist)) 53462306a36Sopenharmony_ci tmp = true; 53562306a36Sopenharmony_ci *bool_tmp = tmp; 53662306a36Sopenharmony_ci break; 53762306a36Sopenharmony_ci case BTC_GET_BL_WIFI_DUAL_BAND_CONNECTED: 53862306a36Sopenharmony_ci *u8_tmp = BTC_MULTIPORT_SCC; 53962306a36Sopenharmony_ci break; 54062306a36Sopenharmony_ci case BTC_GET_BL_WIFI_BUSY: 54162306a36Sopenharmony_ci if (halbtc_is_wifi_busy(rtlpriv)) 54262306a36Sopenharmony_ci *bool_tmp = true; 54362306a36Sopenharmony_ci else 54462306a36Sopenharmony_ci *bool_tmp = false; 54562306a36Sopenharmony_ci break; 54662306a36Sopenharmony_ci case BTC_GET_BL_WIFI_SCAN: 54762306a36Sopenharmony_ci if (mac->act_scanning) 54862306a36Sopenharmony_ci *bool_tmp = true; 54962306a36Sopenharmony_ci else 55062306a36Sopenharmony_ci *bool_tmp = false; 55162306a36Sopenharmony_ci break; 55262306a36Sopenharmony_ci case BTC_GET_BL_WIFI_LINK: 55362306a36Sopenharmony_ci if (mac->link_state == MAC80211_LINKING) 55462306a36Sopenharmony_ci *bool_tmp = true; 55562306a36Sopenharmony_ci else 55662306a36Sopenharmony_ci *bool_tmp = false; 55762306a36Sopenharmony_ci break; 55862306a36Sopenharmony_ci case BTC_GET_BL_WIFI_ROAM: 55962306a36Sopenharmony_ci if (mac->link_state == MAC80211_LINKING) 56062306a36Sopenharmony_ci *bool_tmp = true; 56162306a36Sopenharmony_ci else 56262306a36Sopenharmony_ci *bool_tmp = false; 56362306a36Sopenharmony_ci break; 56462306a36Sopenharmony_ci case BTC_GET_BL_WIFI_4_WAY_PROGRESS: 56562306a36Sopenharmony_ci *bool_tmp = rtlpriv->btcoexist.btc_info.in_4way; 56662306a36Sopenharmony_ci break; 56762306a36Sopenharmony_ci case BTC_GET_BL_WIFI_UNDER_5G: 56862306a36Sopenharmony_ci if (rtlhal->current_bandtype == BAND_ON_5G) 56962306a36Sopenharmony_ci *bool_tmp = true; 57062306a36Sopenharmony_ci else 57162306a36Sopenharmony_ci *bool_tmp = false; 57262306a36Sopenharmony_ci break; 57362306a36Sopenharmony_ci case BTC_GET_BL_WIFI_AP_MODE_ENABLE: 57462306a36Sopenharmony_ci if (mac->opmode == NL80211_IFTYPE_AP) 57562306a36Sopenharmony_ci *bool_tmp = true; 57662306a36Sopenharmony_ci else 57762306a36Sopenharmony_ci *bool_tmp = false; 57862306a36Sopenharmony_ci break; 57962306a36Sopenharmony_ci case BTC_GET_BL_WIFI_ENABLE_ENCRYPTION: 58062306a36Sopenharmony_ci if (NO_ENCRYPTION == rtlpriv->sec.pairwise_enc_algorithm) 58162306a36Sopenharmony_ci *bool_tmp = false; 58262306a36Sopenharmony_ci else 58362306a36Sopenharmony_ci *bool_tmp = true; 58462306a36Sopenharmony_ci break; 58562306a36Sopenharmony_ci case BTC_GET_BL_WIFI_UNDER_B_MODE: 58662306a36Sopenharmony_ci if (rtlpriv->mac80211.mode == WIRELESS_MODE_B) 58762306a36Sopenharmony_ci *bool_tmp = true; 58862306a36Sopenharmony_ci else 58962306a36Sopenharmony_ci *bool_tmp = false; 59062306a36Sopenharmony_ci break; 59162306a36Sopenharmony_ci case BTC_GET_BL_EXT_SWITCH: 59262306a36Sopenharmony_ci *bool_tmp = false; 59362306a36Sopenharmony_ci break; 59462306a36Sopenharmony_ci case BTC_GET_BL_WIFI_IS_IN_MP_MODE: 59562306a36Sopenharmony_ci *bool_tmp = false; 59662306a36Sopenharmony_ci break; 59762306a36Sopenharmony_ci case BTC_GET_BL_IS_ASUS_8723B: 59862306a36Sopenharmony_ci *bool_tmp = false; 59962306a36Sopenharmony_ci break; 60062306a36Sopenharmony_ci case BTC_GET_BL_RF4CE_CONNECTED: 60162306a36Sopenharmony_ci *bool_tmp = false; 60262306a36Sopenharmony_ci break; 60362306a36Sopenharmony_ci case BTC_GET_S4_WIFI_RSSI: 60462306a36Sopenharmony_ci *s32_tmp = halbtc_get_wifi_rssi(rtlpriv); 60562306a36Sopenharmony_ci break; 60662306a36Sopenharmony_ci case BTC_GET_S4_HS_RSSI: 60762306a36Sopenharmony_ci *s32_tmp = 0; 60862306a36Sopenharmony_ci ret = false; 60962306a36Sopenharmony_ci break; 61062306a36Sopenharmony_ci case BTC_GET_U4_WIFI_BW: 61162306a36Sopenharmony_ci *u32_tmp = halbtc_get_wifi_bw(btcoexist); 61262306a36Sopenharmony_ci break; 61362306a36Sopenharmony_ci case BTC_GET_U4_WIFI_TRAFFIC_DIRECTION: 61462306a36Sopenharmony_ci if (halbtc_is_wifi_uplink(rtlpriv)) 61562306a36Sopenharmony_ci *u32_tmp = BTC_WIFI_TRAFFIC_TX; 61662306a36Sopenharmony_ci else 61762306a36Sopenharmony_ci *u32_tmp = BTC_WIFI_TRAFFIC_RX; 61862306a36Sopenharmony_ci break; 61962306a36Sopenharmony_ci case BTC_GET_U4_WIFI_FW_VER: 62062306a36Sopenharmony_ci *u32_tmp = (rtlhal->fw_version << 16) | rtlhal->fw_subversion; 62162306a36Sopenharmony_ci break; 62262306a36Sopenharmony_ci case BTC_GET_U4_WIFI_LINK_STATUS: 62362306a36Sopenharmony_ci *u32_tmp = halbtc_get_wifi_link_status(btcoexist); 62462306a36Sopenharmony_ci break; 62562306a36Sopenharmony_ci case BTC_GET_U4_BT_PATCH_VER: 62662306a36Sopenharmony_ci *u32_tmp = halbtc_get_bt_patch_version(btcoexist); 62762306a36Sopenharmony_ci break; 62862306a36Sopenharmony_ci case BTC_GET_U4_VENDOR: 62962306a36Sopenharmony_ci *u32_tmp = BTC_VENDOR_OTHER; 63062306a36Sopenharmony_ci break; 63162306a36Sopenharmony_ci case BTC_GET_U4_SUPPORTED_VERSION: 63262306a36Sopenharmony_ci *u32_tmp = halbtc_get_bt_coex_supported_version(btcoexist); 63362306a36Sopenharmony_ci break; 63462306a36Sopenharmony_ci case BTC_GET_U4_SUPPORTED_FEATURE: 63562306a36Sopenharmony_ci *u32_tmp = halbtc_get_bt_coex_supported_feature(btcoexist); 63662306a36Sopenharmony_ci break; 63762306a36Sopenharmony_ci case BTC_GET_U4_BT_DEVICE_INFO: 63862306a36Sopenharmony_ci *u32_tmp = halbtc_get_bt_device_info(btcoexist); 63962306a36Sopenharmony_ci break; 64062306a36Sopenharmony_ci case BTC_GET_U4_BT_FORBIDDEN_SLOT_VAL: 64162306a36Sopenharmony_ci *u32_tmp = halbtc_get_bt_forbidden_slot_val(btcoexist); 64262306a36Sopenharmony_ci break; 64362306a36Sopenharmony_ci case BTC_GET_U4_WIFI_IQK_TOTAL: 64462306a36Sopenharmony_ci *u32_tmp = 64562306a36Sopenharmony_ci btcoexist->btc_phydm_query_phy_counter(btcoexist, 64662306a36Sopenharmony_ci DM_INFO_IQK_ALL); 64762306a36Sopenharmony_ci break; 64862306a36Sopenharmony_ci case BTC_GET_U4_WIFI_IQK_OK: 64962306a36Sopenharmony_ci *u32_tmp = 65062306a36Sopenharmony_ci btcoexist->btc_phydm_query_phy_counter(btcoexist, 65162306a36Sopenharmony_ci DM_INFO_IQK_OK); 65262306a36Sopenharmony_ci break; 65362306a36Sopenharmony_ci case BTC_GET_U4_WIFI_IQK_FAIL: 65462306a36Sopenharmony_ci *u32_tmp = 65562306a36Sopenharmony_ci btcoexist->btc_phydm_query_phy_counter(btcoexist, 65662306a36Sopenharmony_ci DM_INFO_IQK_NG); 65762306a36Sopenharmony_ci break; 65862306a36Sopenharmony_ci case BTC_GET_U1_WIFI_DOT11_CHNL: 65962306a36Sopenharmony_ci *u8_tmp = rtlphy->current_channel; 66062306a36Sopenharmony_ci break; 66162306a36Sopenharmony_ci case BTC_GET_U1_WIFI_CENTRAL_CHNL: 66262306a36Sopenharmony_ci *u8_tmp = halbtc_get_wifi_central_chnl(btcoexist); 66362306a36Sopenharmony_ci break; 66462306a36Sopenharmony_ci case BTC_GET_U1_WIFI_HS_CHNL: 66562306a36Sopenharmony_ci *u8_tmp = 0; 66662306a36Sopenharmony_ci ret = false; 66762306a36Sopenharmony_ci break; 66862306a36Sopenharmony_ci case BTC_GET_U1_AP_NUM: 66962306a36Sopenharmony_ci *u8_tmp = rtlpriv->btcoexist.btc_info.ap_num; 67062306a36Sopenharmony_ci break; 67162306a36Sopenharmony_ci case BTC_GET_U1_ANT_TYPE: 67262306a36Sopenharmony_ci *u8_tmp = (u8)BTC_ANT_TYPE_0; 67362306a36Sopenharmony_ci break; 67462306a36Sopenharmony_ci case BTC_GET_U1_IOT_PEER: 67562306a36Sopenharmony_ci *u8_tmp = 0; 67662306a36Sopenharmony_ci break; 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ci /************* 1Ant **************/ 67962306a36Sopenharmony_ci case BTC_GET_U1_LPS_MODE: 68062306a36Sopenharmony_ci *u8_tmp = btcoexist->pwr_mode_val[0]; 68162306a36Sopenharmony_ci break; 68262306a36Sopenharmony_ci 68362306a36Sopenharmony_ci default: 68462306a36Sopenharmony_ci ret = false; 68562306a36Sopenharmony_ci break; 68662306a36Sopenharmony_ci } 68762306a36Sopenharmony_ci 68862306a36Sopenharmony_ci return ret; 68962306a36Sopenharmony_ci} 69062306a36Sopenharmony_ci 69162306a36Sopenharmony_cistatic bool halbtc_set(void *void_btcoexist, u8 set_type, void *in_buf) 69262306a36Sopenharmony_ci{ 69362306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)void_btcoexist; 69462306a36Sopenharmony_ci bool *bool_tmp = (bool *)in_buf; 69562306a36Sopenharmony_ci u8 *u8_tmp = (u8 *)in_buf; 69662306a36Sopenharmony_ci u32 *u32_tmp = (u32 *)in_buf; 69762306a36Sopenharmony_ci bool ret = true; 69862306a36Sopenharmony_ci 69962306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 70062306a36Sopenharmony_ci return false; 70162306a36Sopenharmony_ci 70262306a36Sopenharmony_ci switch (set_type) { 70362306a36Sopenharmony_ci /* set some bool type variables. */ 70462306a36Sopenharmony_ci case BTC_SET_BL_BT_DISABLE: 70562306a36Sopenharmony_ci btcoexist->bt_info.bt_disabled = *bool_tmp; 70662306a36Sopenharmony_ci break; 70762306a36Sopenharmony_ci case BTC_SET_BL_BT_TRAFFIC_BUSY: 70862306a36Sopenharmony_ci btcoexist->bt_info.bt_busy = *bool_tmp; 70962306a36Sopenharmony_ci break; 71062306a36Sopenharmony_ci case BTC_SET_BL_BT_LIMITED_DIG: 71162306a36Sopenharmony_ci btcoexist->bt_info.limited_dig = *bool_tmp; 71262306a36Sopenharmony_ci break; 71362306a36Sopenharmony_ci case BTC_SET_BL_FORCE_TO_ROAM: 71462306a36Sopenharmony_ci btcoexist->bt_info.force_to_roam = *bool_tmp; 71562306a36Sopenharmony_ci break; 71662306a36Sopenharmony_ci case BTC_SET_BL_TO_REJ_AP_AGG_PKT: 71762306a36Sopenharmony_ci btcoexist->bt_info.reject_agg_pkt = *bool_tmp; 71862306a36Sopenharmony_ci break; 71962306a36Sopenharmony_ci case BTC_SET_BL_BT_CTRL_AGG_SIZE: 72062306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_agg_buf_size = *bool_tmp; 72162306a36Sopenharmony_ci break; 72262306a36Sopenharmony_ci case BTC_SET_BL_INC_SCAN_DEV_NUM: 72362306a36Sopenharmony_ci btcoexist->bt_info.increase_scan_dev_num = *bool_tmp; 72462306a36Sopenharmony_ci break; 72562306a36Sopenharmony_ci case BTC_SET_BL_BT_TX_RX_MASK: 72662306a36Sopenharmony_ci btcoexist->bt_info.bt_tx_rx_mask = *bool_tmp; 72762306a36Sopenharmony_ci break; 72862306a36Sopenharmony_ci case BTC_SET_BL_MIRACAST_PLUS_BT: 72962306a36Sopenharmony_ci btcoexist->bt_info.miracast_plus_bt = *bool_tmp; 73062306a36Sopenharmony_ci break; 73162306a36Sopenharmony_ci /* set some u1Byte type variables. */ 73262306a36Sopenharmony_ci case BTC_SET_U1_RSSI_ADJ_VAL_FOR_AGC_TABLE_ON: 73362306a36Sopenharmony_ci btcoexist->bt_info.rssi_adjust_for_agc_table_on = *u8_tmp; 73462306a36Sopenharmony_ci break; 73562306a36Sopenharmony_ci case BTC_SET_U1_AGG_BUF_SIZE: 73662306a36Sopenharmony_ci btcoexist->bt_info.agg_buf_size = *u8_tmp; 73762306a36Sopenharmony_ci break; 73862306a36Sopenharmony_ci 73962306a36Sopenharmony_ci /* the following are some action which will be triggered */ 74062306a36Sopenharmony_ci case BTC_SET_ACT_GET_BT_RSSI: 74162306a36Sopenharmony_ci ret = false; 74262306a36Sopenharmony_ci break; 74362306a36Sopenharmony_ci case BTC_SET_ACT_AGGREGATE_CTRL: 74462306a36Sopenharmony_ci halbtc_aggregation_check(btcoexist); 74562306a36Sopenharmony_ci break; 74662306a36Sopenharmony_ci 74762306a36Sopenharmony_ci /* 1Ant */ 74862306a36Sopenharmony_ci case BTC_SET_U1_RSSI_ADJ_VAL_FOR_1ANT_COEX_TYPE: 74962306a36Sopenharmony_ci btcoexist->bt_info.rssi_adjust_for_1ant_coex_type = *u8_tmp; 75062306a36Sopenharmony_ci break; 75162306a36Sopenharmony_ci case BTC_SET_UI_SCAN_SIG_COMPENSATION: 75262306a36Sopenharmony_ci break; 75362306a36Sopenharmony_ci case BTC_SET_U1_LPS_VAL: 75462306a36Sopenharmony_ci btcoexist->bt_info.lps_val = *u8_tmp; 75562306a36Sopenharmony_ci break; 75662306a36Sopenharmony_ci case BTC_SET_U1_RPWM_VAL: 75762306a36Sopenharmony_ci btcoexist->bt_info.rpwm_val = *u8_tmp; 75862306a36Sopenharmony_ci break; 75962306a36Sopenharmony_ci /* the following are some action which will be triggered */ 76062306a36Sopenharmony_ci case BTC_SET_ACT_LEAVE_LPS: 76162306a36Sopenharmony_ci halbtc_leave_lps(btcoexist); 76262306a36Sopenharmony_ci break; 76362306a36Sopenharmony_ci case BTC_SET_ACT_ENTER_LPS: 76462306a36Sopenharmony_ci halbtc_enter_lps(btcoexist); 76562306a36Sopenharmony_ci break; 76662306a36Sopenharmony_ci case BTC_SET_ACT_NORMAL_LPS: 76762306a36Sopenharmony_ci halbtc_normal_lps(btcoexist); 76862306a36Sopenharmony_ci break; 76962306a36Sopenharmony_ci case BTC_SET_ACT_PRE_NORMAL_LPS: 77062306a36Sopenharmony_ci halbtc_pre_normal_lps(btcoexist); 77162306a36Sopenharmony_ci break; 77262306a36Sopenharmony_ci case BTC_SET_ACT_POST_NORMAL_LPS: 77362306a36Sopenharmony_ci halbtc_post_normal_lps(btcoexist); 77462306a36Sopenharmony_ci break; 77562306a36Sopenharmony_ci case BTC_SET_ACT_DISABLE_LOW_POWER: 77662306a36Sopenharmony_ci halbtc_disable_low_power(btcoexist, *bool_tmp); 77762306a36Sopenharmony_ci break; 77862306a36Sopenharmony_ci case BTC_SET_ACT_UPDATE_RAMASK: 77962306a36Sopenharmony_ci btcoexist->bt_info.ra_mask = *u32_tmp; 78062306a36Sopenharmony_ci break; 78162306a36Sopenharmony_ci case BTC_SET_ACT_SEND_MIMO_PS: 78262306a36Sopenharmony_ci break; 78362306a36Sopenharmony_ci case BTC_SET_ACT_CTRL_BT_INFO: /*wait for 8812/8821*/ 78462306a36Sopenharmony_ci break; 78562306a36Sopenharmony_ci case BTC_SET_ACT_CTRL_BT_COEX: 78662306a36Sopenharmony_ci break; 78762306a36Sopenharmony_ci case BTC_SET_ACT_CTRL_8723B_ANT: 78862306a36Sopenharmony_ci break; 78962306a36Sopenharmony_ci default: 79062306a36Sopenharmony_ci break; 79162306a36Sopenharmony_ci } 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_ci return ret; 79462306a36Sopenharmony_ci} 79562306a36Sopenharmony_ci 79662306a36Sopenharmony_cistatic void halbtc_display_coex_statistics(struct btc_coexist *btcoexist, 79762306a36Sopenharmony_ci struct seq_file *m) 79862306a36Sopenharmony_ci{ 79962306a36Sopenharmony_ci} 80062306a36Sopenharmony_ci 80162306a36Sopenharmony_cistatic void halbtc_display_bt_link_info(struct btc_coexist *btcoexist, 80262306a36Sopenharmony_ci struct seq_file *m) 80362306a36Sopenharmony_ci{ 80462306a36Sopenharmony_ci} 80562306a36Sopenharmony_ci 80662306a36Sopenharmony_cistatic void halbtc_display_wifi_status(struct btc_coexist *btcoexist, 80762306a36Sopenharmony_ci struct seq_file *m) 80862306a36Sopenharmony_ci{ 80962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 81062306a36Sopenharmony_ci s32 wifi_rssi = 0, bt_hs_rssi = 0; 81162306a36Sopenharmony_ci bool scan = false, link = false, roam = false, wifi_busy = false; 81262306a36Sopenharmony_ci bool wifi_under_b_mode = false; 81362306a36Sopenharmony_ci bool wifi_under_5g = false; 81462306a36Sopenharmony_ci u32 wifi_bw = BTC_WIFI_BW_HT20; 81562306a36Sopenharmony_ci u32 wifi_traffic_dir = BTC_WIFI_TRAFFIC_TX; 81662306a36Sopenharmony_ci u32 wifi_freq = BTC_FREQ_2_4G; 81762306a36Sopenharmony_ci u32 wifi_link_status = 0x0; 81862306a36Sopenharmony_ci bool bt_hs_on = false, under_ips = false, under_lps = false; 81962306a36Sopenharmony_ci bool low_power = false, dc_mode = false; 82062306a36Sopenharmony_ci u8 wifi_chnl = 0, wifi_hs_chnl = 0; 82162306a36Sopenharmony_ci u8 ap_num = 0; 82262306a36Sopenharmony_ci 82362306a36Sopenharmony_ci wifi_link_status = halbtc_get_wifi_link_status(btcoexist); 82462306a36Sopenharmony_ci seq_printf(m, "\n %-35s = %d/ %d/ %d/ %d/ %d", 82562306a36Sopenharmony_ci "STA/vWifi/HS/p2pGo/p2pGc", 82662306a36Sopenharmony_ci ((wifi_link_status & WIFI_STA_CONNECTED) ? 1 : 0), 82762306a36Sopenharmony_ci ((wifi_link_status & WIFI_AP_CONNECTED) ? 1 : 0), 82862306a36Sopenharmony_ci ((wifi_link_status & WIFI_HS_CONNECTED) ? 1 : 0), 82962306a36Sopenharmony_ci ((wifi_link_status & WIFI_P2P_GO_CONNECTED) ? 1 : 0), 83062306a36Sopenharmony_ci ((wifi_link_status & WIFI_P2P_GC_CONNECTED) ? 1 : 0)); 83162306a36Sopenharmony_ci 83262306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_HS_OPERATION, &bt_hs_on); 83362306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_DOT11_CHNL, &wifi_chnl); 83462306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_U1_WIFI_HS_CHNL, &wifi_hs_chnl); 83562306a36Sopenharmony_ci seq_printf(m, "\n %-35s = %d / %d(%d)", 83662306a36Sopenharmony_ci "Dot11 channel / HsChnl(High Speed)", 83762306a36Sopenharmony_ci wifi_chnl, wifi_hs_chnl, bt_hs_on); 83862306a36Sopenharmony_ci 83962306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_S4_WIFI_RSSI, &wifi_rssi); 84062306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_S4_HS_RSSI, &bt_hs_rssi); 84162306a36Sopenharmony_ci seq_printf(m, "\n %-35s = %d/ %d", 84262306a36Sopenharmony_ci "Wifi rssi/ HS rssi", 84362306a36Sopenharmony_ci wifi_rssi - 100, bt_hs_rssi - 100); 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_SCAN, &scan); 84662306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_LINK, &link); 84762306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_ROAM, &roam); 84862306a36Sopenharmony_ci seq_printf(m, "\n %-35s = %d/ %d/ %d ", 84962306a36Sopenharmony_ci "Wifi link/ roam/ scan", 85062306a36Sopenharmony_ci link, roam, scan); 85162306a36Sopenharmony_ci 85262306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g); 85362306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_BW, &wifi_bw); 85462306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_BUSY, &wifi_busy); 85562306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_U4_WIFI_TRAFFIC_DIRECTION, 85662306a36Sopenharmony_ci &wifi_traffic_dir); 85762306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_U1_AP_NUM, &ap_num); 85862306a36Sopenharmony_ci wifi_freq = (wifi_under_5g ? BTC_FREQ_5G : BTC_FREQ_2_4G); 85962306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_B_MODE, 86062306a36Sopenharmony_ci &wifi_under_b_mode); 86162306a36Sopenharmony_ci 86262306a36Sopenharmony_ci seq_printf(m, "\n %-35s = %s / %s/ %s/ AP=%d ", 86362306a36Sopenharmony_ci "Wifi freq/ bw/ traffic", 86462306a36Sopenharmony_ci gl_btc_wifi_freq_string[wifi_freq], 86562306a36Sopenharmony_ci ((wifi_under_b_mode) ? "11b" : 86662306a36Sopenharmony_ci gl_btc_wifi_bw_string[wifi_bw]), 86762306a36Sopenharmony_ci ((!wifi_busy) ? "idle" : ((BTC_WIFI_TRAFFIC_TX == 86862306a36Sopenharmony_ci wifi_traffic_dir) ? "uplink" : 86962306a36Sopenharmony_ci "downlink")), 87062306a36Sopenharmony_ci ap_num); 87162306a36Sopenharmony_ci 87262306a36Sopenharmony_ci /* power status */ 87362306a36Sopenharmony_ci dc_mode = true; /*TODO*/ 87462306a36Sopenharmony_ci under_ips = rtlpriv->psc.inactive_pwrstate == ERFOFF ? 1 : 0; 87562306a36Sopenharmony_ci under_lps = rtlpriv->psc.dot11_psmode == EACTIVE ? 0 : 1; 87662306a36Sopenharmony_ci low_power = 0; /*TODO*/ 87762306a36Sopenharmony_ci seq_printf(m, "\n %-35s = %s%s%s%s", 87862306a36Sopenharmony_ci "Power Status", 87962306a36Sopenharmony_ci (dc_mode ? "DC mode" : "AC mode"), 88062306a36Sopenharmony_ci (under_ips ? ", IPS ON" : ""), 88162306a36Sopenharmony_ci (under_lps ? ", LPS ON" : ""), 88262306a36Sopenharmony_ci (low_power ? ", 32k" : "")); 88362306a36Sopenharmony_ci 88462306a36Sopenharmony_ci seq_printf(m, 88562306a36Sopenharmony_ci "\n %-35s = %6ph (0x%x/0x%x)", 88662306a36Sopenharmony_ci "Power mode cmd(lps/rpwm)", 88762306a36Sopenharmony_ci btcoexist->pwr_mode_val, 88862306a36Sopenharmony_ci btcoexist->bt_info.lps_val, 88962306a36Sopenharmony_ci btcoexist->bt_info.rpwm_val); 89062306a36Sopenharmony_ci} 89162306a36Sopenharmony_ci 89262306a36Sopenharmony_ci/************************************************************ 89362306a36Sopenharmony_ci * IO related function 89462306a36Sopenharmony_ci ************************************************************/ 89562306a36Sopenharmony_cistatic u8 halbtc_read_1byte(void *bt_context, u32 reg_addr) 89662306a36Sopenharmony_ci{ 89762306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 89862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 89962306a36Sopenharmony_ci 90062306a36Sopenharmony_ci return rtl_read_byte(rtlpriv, reg_addr); 90162306a36Sopenharmony_ci} 90262306a36Sopenharmony_ci 90362306a36Sopenharmony_cistatic u16 halbtc_read_2byte(void *bt_context, u32 reg_addr) 90462306a36Sopenharmony_ci{ 90562306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 90662306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 90762306a36Sopenharmony_ci 90862306a36Sopenharmony_ci return rtl_read_word(rtlpriv, reg_addr); 90962306a36Sopenharmony_ci} 91062306a36Sopenharmony_ci 91162306a36Sopenharmony_cistatic u32 halbtc_read_4byte(void *bt_context, u32 reg_addr) 91262306a36Sopenharmony_ci{ 91362306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 91462306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 91562306a36Sopenharmony_ci 91662306a36Sopenharmony_ci return rtl_read_dword(rtlpriv, reg_addr); 91762306a36Sopenharmony_ci} 91862306a36Sopenharmony_ci 91962306a36Sopenharmony_cistatic void halbtc_write_1byte(void *bt_context, u32 reg_addr, u32 data) 92062306a36Sopenharmony_ci{ 92162306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 92262306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 92362306a36Sopenharmony_ci 92462306a36Sopenharmony_ci rtl_write_byte(rtlpriv, reg_addr, data); 92562306a36Sopenharmony_ci} 92662306a36Sopenharmony_ci 92762306a36Sopenharmony_cistatic void halbtc_bitmask_write_1byte(void *bt_context, u32 reg_addr, 92862306a36Sopenharmony_ci u32 bit_mask, u8 data) 92962306a36Sopenharmony_ci{ 93062306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 93162306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 93262306a36Sopenharmony_ci u8 original_value, bit_shift = 0; 93362306a36Sopenharmony_ci u8 i; 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_ci if (bit_mask != MASKDWORD) {/*if not "double word" write*/ 93662306a36Sopenharmony_ci original_value = rtl_read_byte(rtlpriv, reg_addr); 93762306a36Sopenharmony_ci for (i = 0; i <= 7; i++) { 93862306a36Sopenharmony_ci if ((bit_mask>>i) & 0x1) 93962306a36Sopenharmony_ci break; 94062306a36Sopenharmony_ci } 94162306a36Sopenharmony_ci bit_shift = i; 94262306a36Sopenharmony_ci data = (original_value & (~bit_mask)) | 94362306a36Sopenharmony_ci ((data << bit_shift) & bit_mask); 94462306a36Sopenharmony_ci } 94562306a36Sopenharmony_ci rtl_write_byte(rtlpriv, reg_addr, data); 94662306a36Sopenharmony_ci} 94762306a36Sopenharmony_ci 94862306a36Sopenharmony_cistatic void halbtc_write_2byte(void *bt_context, u32 reg_addr, u16 data) 94962306a36Sopenharmony_ci{ 95062306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 95162306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 95262306a36Sopenharmony_ci 95362306a36Sopenharmony_ci rtl_write_word(rtlpriv, reg_addr, data); 95462306a36Sopenharmony_ci} 95562306a36Sopenharmony_ci 95662306a36Sopenharmony_cistatic void halbtc_write_4byte(void *bt_context, u32 reg_addr, u32 data) 95762306a36Sopenharmony_ci{ 95862306a36Sopenharmony_ci struct btc_coexist *btcoexist = 95962306a36Sopenharmony_ci (struct btc_coexist *)bt_context; 96062306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 96162306a36Sopenharmony_ci 96262306a36Sopenharmony_ci rtl_write_dword(rtlpriv, reg_addr, data); 96362306a36Sopenharmony_ci} 96462306a36Sopenharmony_ci 96562306a36Sopenharmony_cistatic void halbtc_write_local_reg_1byte(void *btc_context, u32 reg_addr, 96662306a36Sopenharmony_ci u8 data) 96762306a36Sopenharmony_ci{ 96862306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 96962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 97062306a36Sopenharmony_ci 97162306a36Sopenharmony_ci if (btcoexist->chip_interface == BTC_INTF_SDIO) 97262306a36Sopenharmony_ci ; 97362306a36Sopenharmony_ci else if (btcoexist->chip_interface == BTC_INTF_PCI) 97462306a36Sopenharmony_ci rtl_write_byte(rtlpriv, reg_addr, data); 97562306a36Sopenharmony_ci else if (btcoexist->chip_interface == BTC_INTF_USB) 97662306a36Sopenharmony_ci rtl_write_byte(rtlpriv, reg_addr, data); 97762306a36Sopenharmony_ci} 97862306a36Sopenharmony_ci 97962306a36Sopenharmony_cistatic void halbtc_set_bbreg(void *bt_context, u32 reg_addr, u32 bit_mask, 98062306a36Sopenharmony_ci u32 data) 98162306a36Sopenharmony_ci{ 98262306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 98362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 98462306a36Sopenharmony_ci 98562306a36Sopenharmony_ci rtl_set_bbreg(rtlpriv->mac80211.hw, reg_addr, bit_mask, data); 98662306a36Sopenharmony_ci} 98762306a36Sopenharmony_ci 98862306a36Sopenharmony_cistatic u32 halbtc_get_bbreg(void *bt_context, u32 reg_addr, u32 bit_mask) 98962306a36Sopenharmony_ci{ 99062306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 99162306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 99262306a36Sopenharmony_ci 99362306a36Sopenharmony_ci return rtl_get_bbreg(rtlpriv->mac80211.hw, reg_addr, bit_mask); 99462306a36Sopenharmony_ci} 99562306a36Sopenharmony_ci 99662306a36Sopenharmony_cistatic void halbtc_set_rfreg(void *bt_context, u8 rf_path, u32 reg_addr, 99762306a36Sopenharmony_ci u32 bit_mask, u32 data) 99862306a36Sopenharmony_ci{ 99962306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 100062306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 100162306a36Sopenharmony_ci 100262306a36Sopenharmony_ci rtl_set_rfreg(rtlpriv->mac80211.hw, rf_path, reg_addr, bit_mask, data); 100362306a36Sopenharmony_ci} 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_cistatic u32 halbtc_get_rfreg(void *bt_context, u8 rf_path, u32 reg_addr, 100662306a36Sopenharmony_ci u32 bit_mask) 100762306a36Sopenharmony_ci{ 100862306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 100962306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci return rtl_get_rfreg(rtlpriv->mac80211.hw, rf_path, reg_addr, bit_mask); 101262306a36Sopenharmony_ci} 101362306a36Sopenharmony_ci 101462306a36Sopenharmony_cistatic void halbtc_fill_h2c_cmd(void *bt_context, u8 element_id, 101562306a36Sopenharmony_ci u32 cmd_len, u8 *cmd_buf) 101662306a36Sopenharmony_ci{ 101762306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 101862306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 101962306a36Sopenharmony_ci 102062306a36Sopenharmony_ci rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->mac80211.hw, element_id, 102162306a36Sopenharmony_ci cmd_len, cmd_buf); 102262306a36Sopenharmony_ci} 102362306a36Sopenharmony_ci 102462306a36Sopenharmony_civoid halbtc_send_wifi_port_id_cmd(void *bt_context) 102562306a36Sopenharmony_ci{ 102662306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 102762306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 102862306a36Sopenharmony_ci u8 cmd_buf[1] = {0}; /* port id [2:0] = 0 */ 102962306a36Sopenharmony_ci 103062306a36Sopenharmony_ci rtlpriv->cfg->ops->fill_h2c_cmd(rtlpriv->mac80211.hw, H2C_BT_PORT_ID, 103162306a36Sopenharmony_ci 1, cmd_buf); 103262306a36Sopenharmony_ci} 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_civoid halbtc_set_default_port_id_cmd(void *bt_context) 103562306a36Sopenharmony_ci{ 103662306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 103762306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 103862306a36Sopenharmony_ci struct ieee80211_hw *hw = rtlpriv->mac80211.hw; 103962306a36Sopenharmony_ci 104062306a36Sopenharmony_ci if (!rtlpriv->cfg->ops->set_default_port_id_cmd) 104162306a36Sopenharmony_ci return; 104262306a36Sopenharmony_ci 104362306a36Sopenharmony_ci rtlpriv->cfg->ops->set_default_port_id_cmd(hw); 104462306a36Sopenharmony_ci} 104562306a36Sopenharmony_ci 104662306a36Sopenharmony_cistatic 104762306a36Sopenharmony_civoid halbtc_set_bt_reg(void *btc_context, u8 reg_type, u32 offset, u32 set_val) 104862306a36Sopenharmony_ci{ 104962306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 105062306a36Sopenharmony_ci u8 cmd_buffer1[4] = {0}; 105162306a36Sopenharmony_ci u8 cmd_buffer2[4] = {0}; 105262306a36Sopenharmony_ci 105362306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 105462306a36Sopenharmony_ci *((__le16 *)&cmd_buffer1[2]) = cpu_to_le16((u16)set_val); 105562306a36Sopenharmony_ci if (!halbtc_send_bt_mp_operation(btcoexist, BT_OP_WRITE_REG_VALUE, 105662306a36Sopenharmony_ci cmd_buffer1, 4, 200)) 105762306a36Sopenharmony_ci return; 105862306a36Sopenharmony_ci 105962306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 106062306a36Sopenharmony_ci cmd_buffer2[2] = reg_type; 106162306a36Sopenharmony_ci *((u8 *)&cmd_buffer2[3]) = (u8)offset; 106262306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, BT_OP_WRITE_REG_ADDR, 106362306a36Sopenharmony_ci cmd_buffer2, 4, 200); 106462306a36Sopenharmony_ci} 106562306a36Sopenharmony_ci 106662306a36Sopenharmony_cistatic void halbtc_display_dbg_msg(void *bt_context, u8 disp_type, 106762306a36Sopenharmony_ci struct seq_file *m) 106862306a36Sopenharmony_ci{ 106962306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)bt_context; 107062306a36Sopenharmony_ci 107162306a36Sopenharmony_ci switch (disp_type) { 107262306a36Sopenharmony_ci case BTC_DBG_DISP_COEX_STATISTICS: 107362306a36Sopenharmony_ci halbtc_display_coex_statistics(btcoexist, m); 107462306a36Sopenharmony_ci break; 107562306a36Sopenharmony_ci case BTC_DBG_DISP_BT_LINK_INFO: 107662306a36Sopenharmony_ci halbtc_display_bt_link_info(btcoexist, m); 107762306a36Sopenharmony_ci break; 107862306a36Sopenharmony_ci case BTC_DBG_DISP_WIFI_STATUS: 107962306a36Sopenharmony_ci halbtc_display_wifi_status(btcoexist, m); 108062306a36Sopenharmony_ci break; 108162306a36Sopenharmony_ci default: 108262306a36Sopenharmony_ci break; 108362306a36Sopenharmony_ci } 108462306a36Sopenharmony_ci} 108562306a36Sopenharmony_ci 108662306a36Sopenharmony_cistatic u32 halbtc_get_bt_reg(void *btc_context, u8 reg_type, u32 offset) 108762306a36Sopenharmony_ci{ 108862306a36Sopenharmony_ci return 0; 108962306a36Sopenharmony_ci} 109062306a36Sopenharmony_ci 109162306a36Sopenharmony_cistatic bool halbtc_under_ips(struct btc_coexist *btcoexist) 109262306a36Sopenharmony_ci{ 109362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 109462306a36Sopenharmony_ci struct rtl_ps_ctl *ppsc = rtl_psc(rtlpriv); 109562306a36Sopenharmony_ci enum rf_pwrstate rtstate; 109662306a36Sopenharmony_ci 109762306a36Sopenharmony_ci if (ppsc->inactiveps) { 109862306a36Sopenharmony_ci rtstate = ppsc->rfpwr_state; 109962306a36Sopenharmony_ci 110062306a36Sopenharmony_ci if (rtstate != ERFON && 110162306a36Sopenharmony_ci ppsc->rfoff_reason == RF_CHANGE_BY_IPS) { 110262306a36Sopenharmony_ci return true; 110362306a36Sopenharmony_ci } 110462306a36Sopenharmony_ci } 110562306a36Sopenharmony_ci 110662306a36Sopenharmony_ci return false; 110762306a36Sopenharmony_ci} 110862306a36Sopenharmony_ci 110962306a36Sopenharmony_cistatic 111062306a36Sopenharmony_ciu32 halbtc_get_phydm_version(void *btc_context) 111162306a36Sopenharmony_ci{ 111262306a36Sopenharmony_ci return 0; 111362306a36Sopenharmony_ci} 111462306a36Sopenharmony_ci 111562306a36Sopenharmony_cistatic 111662306a36Sopenharmony_civoid halbtc_phydm_modify_ra_pcr_threshold(void *btc_context, 111762306a36Sopenharmony_ci u8 ra_offset_direction, 111862306a36Sopenharmony_ci u8 ra_threshold_offset) 111962306a36Sopenharmony_ci{ 112062306a36Sopenharmony_ci} 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_cistatic 112362306a36Sopenharmony_ciu32 halbtc_phydm_query_phy_counter(void *btc_context, enum dm_info_query dm_id) 112462306a36Sopenharmony_ci{ 112562306a36Sopenharmony_ci return 0; 112662306a36Sopenharmony_ci} 112762306a36Sopenharmony_ci 112862306a36Sopenharmony_cistatic u8 halbtc_get_ant_det_val_from_bt(void *btc_context) 112962306a36Sopenharmony_ci{ 113062306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 113162306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 113262306a36Sopenharmony_ci 113362306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 113462306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_ANT_DET_VAL, 113562306a36Sopenharmony_ci cmd_buffer, 4, 200); 113662306a36Sopenharmony_ci 113762306a36Sopenharmony_ci /* need wait completion to return correct value */ 113862306a36Sopenharmony_ci 113962306a36Sopenharmony_ci return btcoexist->bt_info.bt_ant_det_val; 114062306a36Sopenharmony_ci} 114162306a36Sopenharmony_ci 114262306a36Sopenharmony_cistatic u8 halbtc_get_ble_scan_type_from_bt(void *btc_context) 114362306a36Sopenharmony_ci{ 114462306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 114562306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 114662306a36Sopenharmony_ci 114762306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 114862306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_BLE_SCAN_TYPE, 114962306a36Sopenharmony_ci cmd_buffer, 4, 200); 115062306a36Sopenharmony_ci 115162306a36Sopenharmony_ci /* need wait completion to return correct value */ 115262306a36Sopenharmony_ci 115362306a36Sopenharmony_ci return btcoexist->bt_info.bt_ble_scan_type; 115462306a36Sopenharmony_ci} 115562306a36Sopenharmony_ci 115662306a36Sopenharmony_cistatic u32 halbtc_get_ble_scan_para_from_bt(void *btc_context, u8 scan_type) 115762306a36Sopenharmony_ci{ 115862306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 115962306a36Sopenharmony_ci u8 cmd_buffer[4] = {0}; 116062306a36Sopenharmony_ci 116162306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 116262306a36Sopenharmony_ci halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_BT_BLE_SCAN_PARA, 116362306a36Sopenharmony_ci cmd_buffer, 4, 200); 116462306a36Sopenharmony_ci 116562306a36Sopenharmony_ci /* need wait completion to return correct value */ 116662306a36Sopenharmony_ci 116762306a36Sopenharmony_ci return btcoexist->bt_info.bt_ble_scan_para; 116862306a36Sopenharmony_ci} 116962306a36Sopenharmony_ci 117062306a36Sopenharmony_cistatic bool halbtc_get_bt_afh_map_from_bt(void *btc_context, u8 map_type, 117162306a36Sopenharmony_ci u8 *afh_map) 117262306a36Sopenharmony_ci{ 117362306a36Sopenharmony_ci struct btc_coexist *btcoexist = (struct btc_coexist *)btc_context; 117462306a36Sopenharmony_ci u8 cmd_buffer[2] = {0}; 117562306a36Sopenharmony_ci bool ret; 117662306a36Sopenharmony_ci u32 *afh_map_l = (u32 *)afh_map; 117762306a36Sopenharmony_ci u32 *afh_map_m = (u32 *)(afh_map + 4); 117862306a36Sopenharmony_ci u16 *afh_map_h = (u16 *)(afh_map + 8); 117962306a36Sopenharmony_ci 118062306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 118162306a36Sopenharmony_ci ret = halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_AFH_MAP_L, 118262306a36Sopenharmony_ci cmd_buffer, 2, 200); 118362306a36Sopenharmony_ci if (!ret) 118462306a36Sopenharmony_ci goto exit; 118562306a36Sopenharmony_ci 118662306a36Sopenharmony_ci *afh_map_l = btcoexist->bt_info.afh_map_l; 118762306a36Sopenharmony_ci 118862306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 118962306a36Sopenharmony_ci ret = halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_AFH_MAP_M, 119062306a36Sopenharmony_ci cmd_buffer, 2, 200); 119162306a36Sopenharmony_ci if (!ret) 119262306a36Sopenharmony_ci goto exit; 119362306a36Sopenharmony_ci 119462306a36Sopenharmony_ci *afh_map_m = btcoexist->bt_info.afh_map_m; 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci /* cmd_buffer[0] and [1] is filled by halbtc_send_bt_mp_operation() */ 119762306a36Sopenharmony_ci ret = halbtc_send_bt_mp_operation(btcoexist, BT_OP_GET_AFH_MAP_H, 119862306a36Sopenharmony_ci cmd_buffer, 2, 200); 119962306a36Sopenharmony_ci if (!ret) 120062306a36Sopenharmony_ci goto exit; 120162306a36Sopenharmony_ci 120262306a36Sopenharmony_ci *afh_map_h = btcoexist->bt_info.afh_map_h; 120362306a36Sopenharmony_ci 120462306a36Sopenharmony_ciexit: 120562306a36Sopenharmony_ci return ret; 120662306a36Sopenharmony_ci} 120762306a36Sopenharmony_ci 120862306a36Sopenharmony_ci/***************************************************************** 120962306a36Sopenharmony_ci * Extern functions called by other module 121062306a36Sopenharmony_ci *****************************************************************/ 121162306a36Sopenharmony_cibool exhalbtc_initlize_variables(struct rtl_priv *rtlpriv) 121262306a36Sopenharmony_ci{ 121362306a36Sopenharmony_ci struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv); 121462306a36Sopenharmony_ci 121562306a36Sopenharmony_ci if (!btcoexist) 121662306a36Sopenharmony_ci return false; 121762306a36Sopenharmony_ci 121862306a36Sopenharmony_ci halbtc_dbg_init(); 121962306a36Sopenharmony_ci 122062306a36Sopenharmony_ci btcoexist->btc_read_1byte = halbtc_read_1byte; 122162306a36Sopenharmony_ci btcoexist->btc_write_1byte = halbtc_write_1byte; 122262306a36Sopenharmony_ci btcoexist->btc_write_1byte_bitmask = halbtc_bitmask_write_1byte; 122362306a36Sopenharmony_ci btcoexist->btc_read_2byte = halbtc_read_2byte; 122462306a36Sopenharmony_ci btcoexist->btc_write_2byte = halbtc_write_2byte; 122562306a36Sopenharmony_ci btcoexist->btc_read_4byte = halbtc_read_4byte; 122662306a36Sopenharmony_ci btcoexist->btc_write_4byte = halbtc_write_4byte; 122762306a36Sopenharmony_ci btcoexist->btc_write_local_reg_1byte = halbtc_write_local_reg_1byte; 122862306a36Sopenharmony_ci 122962306a36Sopenharmony_ci btcoexist->btc_set_bb_reg = halbtc_set_bbreg; 123062306a36Sopenharmony_ci btcoexist->btc_get_bb_reg = halbtc_get_bbreg; 123162306a36Sopenharmony_ci 123262306a36Sopenharmony_ci btcoexist->btc_set_rf_reg = halbtc_set_rfreg; 123362306a36Sopenharmony_ci btcoexist->btc_get_rf_reg = halbtc_get_rfreg; 123462306a36Sopenharmony_ci 123562306a36Sopenharmony_ci btcoexist->btc_fill_h2c = halbtc_fill_h2c_cmd; 123662306a36Sopenharmony_ci btcoexist->btc_disp_dbg_msg = halbtc_display_dbg_msg; 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_ci btcoexist->btc_get = halbtc_get; 123962306a36Sopenharmony_ci btcoexist->btc_set = halbtc_set; 124062306a36Sopenharmony_ci btcoexist->btc_set_bt_reg = halbtc_set_bt_reg; 124162306a36Sopenharmony_ci btcoexist->btc_get_bt_reg = halbtc_get_bt_reg; 124262306a36Sopenharmony_ci 124362306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_buf_size = false; 124462306a36Sopenharmony_ci btcoexist->bt_info.agg_buf_size = 5; 124562306a36Sopenharmony_ci 124662306a36Sopenharmony_ci btcoexist->bt_info.increase_scan_dev_num = false; 124762306a36Sopenharmony_ci 124862306a36Sopenharmony_ci btcoexist->btc_get_bt_coex_supported_feature = 124962306a36Sopenharmony_ci halbtc_get_bt_coex_supported_feature; 125062306a36Sopenharmony_ci btcoexist->btc_get_bt_coex_supported_version = 125162306a36Sopenharmony_ci halbtc_get_bt_coex_supported_version; 125262306a36Sopenharmony_ci btcoexist->btc_get_bt_phydm_version = halbtc_get_phydm_version; 125362306a36Sopenharmony_ci btcoexist->btc_phydm_modify_ra_pcr_threshold = 125462306a36Sopenharmony_ci halbtc_phydm_modify_ra_pcr_threshold; 125562306a36Sopenharmony_ci btcoexist->btc_phydm_query_phy_counter = halbtc_phydm_query_phy_counter; 125662306a36Sopenharmony_ci btcoexist->btc_get_ant_det_val_from_bt = halbtc_get_ant_det_val_from_bt; 125762306a36Sopenharmony_ci btcoexist->btc_get_ble_scan_type_from_bt = 125862306a36Sopenharmony_ci halbtc_get_ble_scan_type_from_bt; 125962306a36Sopenharmony_ci btcoexist->btc_get_ble_scan_para_from_bt = 126062306a36Sopenharmony_ci halbtc_get_ble_scan_para_from_bt; 126162306a36Sopenharmony_ci btcoexist->btc_get_bt_afh_map_from_bt = 126262306a36Sopenharmony_ci halbtc_get_bt_afh_map_from_bt; 126362306a36Sopenharmony_ci 126462306a36Sopenharmony_ci init_completion(&btcoexist->bt_mp_comp); 126562306a36Sopenharmony_ci 126662306a36Sopenharmony_ci return true; 126762306a36Sopenharmony_ci} 126862306a36Sopenharmony_ci 126962306a36Sopenharmony_cibool exhalbtc_initlize_variables_wifi_only(struct rtl_priv *rtlpriv) 127062306a36Sopenharmony_ci{ 127162306a36Sopenharmony_ci struct wifi_only_cfg *wifionly_cfg = rtl_btc_wifi_only(rtlpriv); 127262306a36Sopenharmony_ci struct wifi_only_haldata *wifionly_haldata; 127362306a36Sopenharmony_ci 127462306a36Sopenharmony_ci if (!wifionly_cfg) 127562306a36Sopenharmony_ci return false; 127662306a36Sopenharmony_ci 127762306a36Sopenharmony_ci wifionly_cfg->adapter = rtlpriv; 127862306a36Sopenharmony_ci 127962306a36Sopenharmony_ci switch (rtlpriv->rtlhal.interface) { 128062306a36Sopenharmony_ci case INTF_PCI: 128162306a36Sopenharmony_ci wifionly_cfg->chip_interface = WIFIONLY_INTF_PCI; 128262306a36Sopenharmony_ci break; 128362306a36Sopenharmony_ci case INTF_USB: 128462306a36Sopenharmony_ci wifionly_cfg->chip_interface = WIFIONLY_INTF_USB; 128562306a36Sopenharmony_ci break; 128662306a36Sopenharmony_ci default: 128762306a36Sopenharmony_ci wifionly_cfg->chip_interface = WIFIONLY_INTF_UNKNOWN; 128862306a36Sopenharmony_ci break; 128962306a36Sopenharmony_ci } 129062306a36Sopenharmony_ci 129162306a36Sopenharmony_ci wifionly_haldata = &wifionly_cfg->haldata_info; 129262306a36Sopenharmony_ci 129362306a36Sopenharmony_ci wifionly_haldata->customer_id = CUSTOMER_NORMAL; 129462306a36Sopenharmony_ci wifionly_haldata->efuse_pg_antnum = rtl_get_hwpg_ant_num(rtlpriv); 129562306a36Sopenharmony_ci wifionly_haldata->efuse_pg_antpath = 129662306a36Sopenharmony_ci rtl_get_hwpg_single_ant_path(rtlpriv); 129762306a36Sopenharmony_ci wifionly_haldata->rfe_type = rtl_get_hwpg_rfe_type(rtlpriv); 129862306a36Sopenharmony_ci wifionly_haldata->ant_div_cfg = 0; 129962306a36Sopenharmony_ci 130062306a36Sopenharmony_ci return true; 130162306a36Sopenharmony_ci} 130262306a36Sopenharmony_ci 130362306a36Sopenharmony_cibool exhalbtc_bind_bt_coex_withadapter(void *adapter) 130462306a36Sopenharmony_ci{ 130562306a36Sopenharmony_ci struct rtl_priv *rtlpriv = adapter; 130662306a36Sopenharmony_ci struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv); 130762306a36Sopenharmony_ci u8 ant_num, chip_type, single_ant_path; 130862306a36Sopenharmony_ci 130962306a36Sopenharmony_ci if (!btcoexist) 131062306a36Sopenharmony_ci return false; 131162306a36Sopenharmony_ci 131262306a36Sopenharmony_ci if (btcoexist->binded) 131362306a36Sopenharmony_ci return false; 131462306a36Sopenharmony_ci 131562306a36Sopenharmony_ci switch (rtlpriv->rtlhal.interface) { 131662306a36Sopenharmony_ci case INTF_PCI: 131762306a36Sopenharmony_ci btcoexist->chip_interface = BTC_INTF_PCI; 131862306a36Sopenharmony_ci break; 131962306a36Sopenharmony_ci case INTF_USB: 132062306a36Sopenharmony_ci btcoexist->chip_interface = BTC_INTF_USB; 132162306a36Sopenharmony_ci break; 132262306a36Sopenharmony_ci default: 132362306a36Sopenharmony_ci btcoexist->chip_interface = BTC_INTF_UNKNOWN; 132462306a36Sopenharmony_ci break; 132562306a36Sopenharmony_ci } 132662306a36Sopenharmony_ci 132762306a36Sopenharmony_ci btcoexist->binded = true; 132862306a36Sopenharmony_ci btcoexist->statistics.cnt_bind++; 132962306a36Sopenharmony_ci 133062306a36Sopenharmony_ci btcoexist->adapter = adapter; 133162306a36Sopenharmony_ci 133262306a36Sopenharmony_ci btcoexist->stack_info.profile_notified = false; 133362306a36Sopenharmony_ci 133462306a36Sopenharmony_ci btcoexist->bt_info.bt_ctrl_agg_buf_size = false; 133562306a36Sopenharmony_ci btcoexist->bt_info.agg_buf_size = 5; 133662306a36Sopenharmony_ci 133762306a36Sopenharmony_ci btcoexist->bt_info.increase_scan_dev_num = false; 133862306a36Sopenharmony_ci btcoexist->bt_info.miracast_plus_bt = false; 133962306a36Sopenharmony_ci 134062306a36Sopenharmony_ci chip_type = rtl_get_hwpg_bt_type(rtlpriv); 134162306a36Sopenharmony_ci exhalbtc_set_chip_type(btcoexist, chip_type); 134262306a36Sopenharmony_ci ant_num = rtl_get_hwpg_ant_num(rtlpriv); 134362306a36Sopenharmony_ci exhalbtc_set_ant_num(rtlpriv, BT_COEX_ANT_TYPE_PG, ant_num); 134462306a36Sopenharmony_ci 134562306a36Sopenharmony_ci /* set default antenna position to main port */ 134662306a36Sopenharmony_ci btcoexist->board_info.btdm_ant_pos = BTC_ANTENNA_AT_MAIN_PORT; 134762306a36Sopenharmony_ci 134862306a36Sopenharmony_ci single_ant_path = rtl_get_hwpg_single_ant_path(rtlpriv); 134962306a36Sopenharmony_ci exhalbtc_set_single_ant_path(btcoexist, single_ant_path); 135062306a36Sopenharmony_ci 135162306a36Sopenharmony_ci if (rtl_get_hwpg_package_type(rtlpriv) == 0) 135262306a36Sopenharmony_ci btcoexist->board_info.tfbga_package = false; 135362306a36Sopenharmony_ci else if (rtl_get_hwpg_package_type(rtlpriv) == 1) 135462306a36Sopenharmony_ci btcoexist->board_info.tfbga_package = false; 135562306a36Sopenharmony_ci else 135662306a36Sopenharmony_ci btcoexist->board_info.tfbga_package = true; 135762306a36Sopenharmony_ci 135862306a36Sopenharmony_ci if (btcoexist->board_info.tfbga_package) 135962306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 136062306a36Sopenharmony_ci "[BTCoex], Package Type = TFBGA\n"); 136162306a36Sopenharmony_ci else 136262306a36Sopenharmony_ci rtl_dbg(rtlpriv, COMP_BT_COEXIST, DBG_LOUD, 136362306a36Sopenharmony_ci "[BTCoex], Package Type = Non-TFBGA\n"); 136462306a36Sopenharmony_ci 136562306a36Sopenharmony_ci btcoexist->board_info.rfe_type = rtl_get_hwpg_rfe_type(rtlpriv); 136662306a36Sopenharmony_ci btcoexist->board_info.ant_div_cfg = 0; 136762306a36Sopenharmony_ci 136862306a36Sopenharmony_ci return true; 136962306a36Sopenharmony_ci} 137062306a36Sopenharmony_ci 137162306a36Sopenharmony_civoid exhalbtc_power_on_setting(struct btc_coexist *btcoexist) 137262306a36Sopenharmony_ci{ 137362306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 137462306a36Sopenharmony_ci return; 137562306a36Sopenharmony_ci 137662306a36Sopenharmony_ci btcoexist->statistics.cnt_power_on++; 137762306a36Sopenharmony_ci 137862306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 137962306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 138062306a36Sopenharmony_ci ex_btc8723b2ant_power_on_setting(btcoexist); 138162306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 138262306a36Sopenharmony_ci ex_btc8723b1ant_power_on_setting(btcoexist); 138362306a36Sopenharmony_ci } 138462306a36Sopenharmony_ci} 138562306a36Sopenharmony_ci 138662306a36Sopenharmony_civoid exhalbtc_pre_load_firmware(struct btc_coexist *btcoexist) 138762306a36Sopenharmony_ci{ 138862306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 138962306a36Sopenharmony_ci return; 139062306a36Sopenharmony_ci 139162306a36Sopenharmony_ci btcoexist->statistics.cnt_pre_load_firmware++; 139262306a36Sopenharmony_ci 139362306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 139462306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 139562306a36Sopenharmony_ci ex_btc8723b2ant_pre_load_firmware(btcoexist); 139662306a36Sopenharmony_ci } 139762306a36Sopenharmony_ci} 139862306a36Sopenharmony_ci 139962306a36Sopenharmony_civoid exhalbtc_init_hw_config(struct btc_coexist *btcoexist, bool wifi_only) 140062306a36Sopenharmony_ci{ 140162306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 140262306a36Sopenharmony_ci return; 140362306a36Sopenharmony_ci 140462306a36Sopenharmony_ci btcoexist->statistics.cnt_init_hw_config++; 140562306a36Sopenharmony_ci 140662306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 140762306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 140862306a36Sopenharmony_ci ex_btc8821a2ant_init_hwconfig(btcoexist); 140962306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 141062306a36Sopenharmony_ci ex_btc8821a1ant_init_hwconfig(btcoexist, wifi_only); 141162306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 141262306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 141362306a36Sopenharmony_ci ex_btc8723b2ant_init_hwconfig(btcoexist); 141462306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 141562306a36Sopenharmony_ci ex_btc8723b1ant_init_hwconfig(btcoexist, wifi_only); 141662306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723A(btcoexist->adapter)) { 141762306a36Sopenharmony_ci /* 8723A has no this function */ 141862306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 141962306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 142062306a36Sopenharmony_ci ex_btc8192e2ant_init_hwconfig(btcoexist); 142162306a36Sopenharmony_ci } 142262306a36Sopenharmony_ci} 142362306a36Sopenharmony_ci 142462306a36Sopenharmony_civoid exhalbtc_init_hw_config_wifi_only(struct wifi_only_cfg *wifionly_cfg) 142562306a36Sopenharmony_ci{ 142662306a36Sopenharmony_ci} 142762306a36Sopenharmony_ci 142862306a36Sopenharmony_civoid exhalbtc_init_coex_dm(struct btc_coexist *btcoexist) 142962306a36Sopenharmony_ci{ 143062306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 143162306a36Sopenharmony_ci return; 143262306a36Sopenharmony_ci 143362306a36Sopenharmony_ci btcoexist->statistics.cnt_init_coex_dm++; 143462306a36Sopenharmony_ci 143562306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 143662306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 143762306a36Sopenharmony_ci ex_btc8821a2ant_init_coex_dm(btcoexist); 143862306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 143962306a36Sopenharmony_ci ex_btc8821a1ant_init_coex_dm(btcoexist); 144062306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 144162306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 144262306a36Sopenharmony_ci ex_btc8723b2ant_init_coex_dm(btcoexist); 144362306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 144462306a36Sopenharmony_ci ex_btc8723b1ant_init_coex_dm(btcoexist); 144562306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 144662306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 144762306a36Sopenharmony_ci ex_btc8192e2ant_init_coex_dm(btcoexist); 144862306a36Sopenharmony_ci } 144962306a36Sopenharmony_ci 145062306a36Sopenharmony_ci btcoexist->initialized = true; 145162306a36Sopenharmony_ci} 145262306a36Sopenharmony_ci 145362306a36Sopenharmony_civoid exhalbtc_ips_notify(struct btc_coexist *btcoexist, u8 type) 145462306a36Sopenharmony_ci{ 145562306a36Sopenharmony_ci u8 ips_type; 145662306a36Sopenharmony_ci 145762306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 145862306a36Sopenharmony_ci return; 145962306a36Sopenharmony_ci btcoexist->statistics.cnt_ips_notify++; 146062306a36Sopenharmony_ci if (btcoexist->manual_control) 146162306a36Sopenharmony_ci return; 146262306a36Sopenharmony_ci 146362306a36Sopenharmony_ci if (ERFOFF == type) 146462306a36Sopenharmony_ci ips_type = BTC_IPS_ENTER; 146562306a36Sopenharmony_ci else 146662306a36Sopenharmony_ci ips_type = BTC_IPS_LEAVE; 146762306a36Sopenharmony_ci 146862306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 146962306a36Sopenharmony_ci 147062306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 147162306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 147262306a36Sopenharmony_ci ex_btc8821a2ant_ips_notify(btcoexist, ips_type); 147362306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 147462306a36Sopenharmony_ci ex_btc8821a1ant_ips_notify(btcoexist, ips_type); 147562306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 147662306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 147762306a36Sopenharmony_ci ex_btc8723b2ant_ips_notify(btcoexist, ips_type); 147862306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 147962306a36Sopenharmony_ci ex_btc8723b1ant_ips_notify(btcoexist, ips_type); 148062306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 148162306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 148262306a36Sopenharmony_ci ex_btc8192e2ant_ips_notify(btcoexist, ips_type); 148362306a36Sopenharmony_ci } 148462306a36Sopenharmony_ci 148562306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 148662306a36Sopenharmony_ci} 148762306a36Sopenharmony_ci 148862306a36Sopenharmony_civoid exhalbtc_lps_notify(struct btc_coexist *btcoexist, u8 type) 148962306a36Sopenharmony_ci{ 149062306a36Sopenharmony_ci u8 lps_type; 149162306a36Sopenharmony_ci 149262306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 149362306a36Sopenharmony_ci return; 149462306a36Sopenharmony_ci btcoexist->statistics.cnt_lps_notify++; 149562306a36Sopenharmony_ci if (btcoexist->manual_control) 149662306a36Sopenharmony_ci return; 149762306a36Sopenharmony_ci 149862306a36Sopenharmony_ci if (EACTIVE == type) 149962306a36Sopenharmony_ci lps_type = BTC_LPS_DISABLE; 150062306a36Sopenharmony_ci else 150162306a36Sopenharmony_ci lps_type = BTC_LPS_ENABLE; 150262306a36Sopenharmony_ci 150362306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 150462306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 150562306a36Sopenharmony_ci ex_btc8821a2ant_lps_notify(btcoexist, lps_type); 150662306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 150762306a36Sopenharmony_ci ex_btc8821a1ant_lps_notify(btcoexist, lps_type); 150862306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 150962306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 151062306a36Sopenharmony_ci ex_btc8723b2ant_lps_notify(btcoexist, lps_type); 151162306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 151262306a36Sopenharmony_ci ex_btc8723b1ant_lps_notify(btcoexist, lps_type); 151362306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 151462306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 151562306a36Sopenharmony_ci ex_btc8192e2ant_lps_notify(btcoexist, lps_type); 151662306a36Sopenharmony_ci } 151762306a36Sopenharmony_ci} 151862306a36Sopenharmony_ci 151962306a36Sopenharmony_civoid exhalbtc_scan_notify(struct btc_coexist *btcoexist, u8 type) 152062306a36Sopenharmony_ci{ 152162306a36Sopenharmony_ci u8 scan_type; 152262306a36Sopenharmony_ci 152362306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 152462306a36Sopenharmony_ci return; 152562306a36Sopenharmony_ci btcoexist->statistics.cnt_scan_notify++; 152662306a36Sopenharmony_ci if (btcoexist->manual_control) 152762306a36Sopenharmony_ci return; 152862306a36Sopenharmony_ci 152962306a36Sopenharmony_ci if (type) 153062306a36Sopenharmony_ci scan_type = BTC_SCAN_START; 153162306a36Sopenharmony_ci else 153262306a36Sopenharmony_ci scan_type = BTC_SCAN_FINISH; 153362306a36Sopenharmony_ci 153462306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 153562306a36Sopenharmony_ci 153662306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 153762306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 153862306a36Sopenharmony_ci ex_btc8821a2ant_scan_notify(btcoexist, scan_type); 153962306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 154062306a36Sopenharmony_ci ex_btc8821a1ant_scan_notify(btcoexist, scan_type); 154162306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 154262306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 154362306a36Sopenharmony_ci ex_btc8723b2ant_scan_notify(btcoexist, scan_type); 154462306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 154562306a36Sopenharmony_ci ex_btc8723b1ant_scan_notify(btcoexist, scan_type); 154662306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 154762306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 154862306a36Sopenharmony_ci ex_btc8192e2ant_scan_notify(btcoexist, scan_type); 154962306a36Sopenharmony_ci } 155062306a36Sopenharmony_ci 155162306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 155262306a36Sopenharmony_ci} 155362306a36Sopenharmony_ci 155462306a36Sopenharmony_civoid exhalbtc_scan_notify_wifi_only(struct wifi_only_cfg *wifionly_cfg, 155562306a36Sopenharmony_ci u8 is_5g) 155662306a36Sopenharmony_ci{ 155762306a36Sopenharmony_ci} 155862306a36Sopenharmony_ci 155962306a36Sopenharmony_civoid exhalbtc_connect_notify(struct btc_coexist *btcoexist, u8 action) 156062306a36Sopenharmony_ci{ 156162306a36Sopenharmony_ci u8 asso_type; 156262306a36Sopenharmony_ci bool wifi_under_5g; 156362306a36Sopenharmony_ci 156462306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 156562306a36Sopenharmony_ci return; 156662306a36Sopenharmony_ci btcoexist->statistics.cnt_connect_notify++; 156762306a36Sopenharmony_ci if (btcoexist->manual_control) 156862306a36Sopenharmony_ci return; 156962306a36Sopenharmony_ci 157062306a36Sopenharmony_ci btcoexist->btc_get(btcoexist, BTC_GET_BL_WIFI_UNDER_5G, &wifi_under_5g); 157162306a36Sopenharmony_ci 157262306a36Sopenharmony_ci if (action) 157362306a36Sopenharmony_ci asso_type = BTC_ASSOCIATE_START; 157462306a36Sopenharmony_ci else 157562306a36Sopenharmony_ci asso_type = BTC_ASSOCIATE_FINISH; 157662306a36Sopenharmony_ci 157762306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 157862306a36Sopenharmony_ci 157962306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 158062306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 158162306a36Sopenharmony_ci ex_btc8821a2ant_connect_notify(btcoexist, asso_type); 158262306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 158362306a36Sopenharmony_ci ex_btc8821a1ant_connect_notify(btcoexist, asso_type); 158462306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 158562306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 158662306a36Sopenharmony_ci ex_btc8723b2ant_connect_notify(btcoexist, asso_type); 158762306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 158862306a36Sopenharmony_ci ex_btc8723b1ant_connect_notify(btcoexist, asso_type); 158962306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 159062306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 159162306a36Sopenharmony_ci ex_btc8192e2ant_connect_notify(btcoexist, asso_type); 159262306a36Sopenharmony_ci } 159362306a36Sopenharmony_ci 159462306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 159562306a36Sopenharmony_ci} 159662306a36Sopenharmony_ci 159762306a36Sopenharmony_civoid exhalbtc_mediastatus_notify(struct btc_coexist *btcoexist, 159862306a36Sopenharmony_ci enum rt_media_status media_status) 159962306a36Sopenharmony_ci{ 160062306a36Sopenharmony_ci u8 status; 160162306a36Sopenharmony_ci 160262306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 160362306a36Sopenharmony_ci return; 160462306a36Sopenharmony_ci btcoexist->statistics.cnt_media_status_notify++; 160562306a36Sopenharmony_ci if (btcoexist->manual_control) 160662306a36Sopenharmony_ci return; 160762306a36Sopenharmony_ci 160862306a36Sopenharmony_ci if (RT_MEDIA_CONNECT == media_status) 160962306a36Sopenharmony_ci status = BTC_MEDIA_CONNECT; 161062306a36Sopenharmony_ci else 161162306a36Sopenharmony_ci status = BTC_MEDIA_DISCONNECT; 161262306a36Sopenharmony_ci 161362306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 161462306a36Sopenharmony_ci 161562306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 161662306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 161762306a36Sopenharmony_ci ex_btc8821a2ant_media_status_notify(btcoexist, status); 161862306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 161962306a36Sopenharmony_ci ex_btc8821a1ant_media_status_notify(btcoexist, status); 162062306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 162162306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 162262306a36Sopenharmony_ci ex_btc8723b2ant_media_status_notify(btcoexist, status); 162362306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 162462306a36Sopenharmony_ci ex_btc8723b1ant_media_status_notify(btcoexist, status); 162562306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 162662306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 162762306a36Sopenharmony_ci ex_btc8192e2ant_media_status_notify(btcoexist, status); 162862306a36Sopenharmony_ci } 162962306a36Sopenharmony_ci 163062306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 163162306a36Sopenharmony_ci} 163262306a36Sopenharmony_ci 163362306a36Sopenharmony_civoid exhalbtc_special_packet_notify(struct btc_coexist *btcoexist, u8 pkt_type) 163462306a36Sopenharmony_ci{ 163562306a36Sopenharmony_ci u8 packet_type; 163662306a36Sopenharmony_ci 163762306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 163862306a36Sopenharmony_ci return; 163962306a36Sopenharmony_ci btcoexist->statistics.cnt_special_packet_notify++; 164062306a36Sopenharmony_ci if (btcoexist->manual_control) 164162306a36Sopenharmony_ci return; 164262306a36Sopenharmony_ci 164362306a36Sopenharmony_ci if (pkt_type == PACKET_DHCP) { 164462306a36Sopenharmony_ci packet_type = BTC_PACKET_DHCP; 164562306a36Sopenharmony_ci } else if (pkt_type == PACKET_EAPOL) { 164662306a36Sopenharmony_ci packet_type = BTC_PACKET_EAPOL; 164762306a36Sopenharmony_ci } else if (pkt_type == PACKET_ARP) { 164862306a36Sopenharmony_ci packet_type = BTC_PACKET_ARP; 164962306a36Sopenharmony_ci } else { 165062306a36Sopenharmony_ci packet_type = BTC_PACKET_UNKNOWN; 165162306a36Sopenharmony_ci return; 165262306a36Sopenharmony_ci } 165362306a36Sopenharmony_ci 165462306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 165562306a36Sopenharmony_ci 165662306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 165762306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 165862306a36Sopenharmony_ci ex_btc8821a2ant_special_packet_notify(btcoexist, 165962306a36Sopenharmony_ci packet_type); 166062306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 166162306a36Sopenharmony_ci ex_btc8821a1ant_special_packet_notify(btcoexist, 166262306a36Sopenharmony_ci packet_type); 166362306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 166462306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 166562306a36Sopenharmony_ci ex_btc8723b2ant_special_packet_notify(btcoexist, 166662306a36Sopenharmony_ci packet_type); 166762306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 166862306a36Sopenharmony_ci ex_btc8723b1ant_special_packet_notify(btcoexist, 166962306a36Sopenharmony_ci packet_type); 167062306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 167162306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 167262306a36Sopenharmony_ci ex_btc8192e2ant_special_packet_notify(btcoexist, 167362306a36Sopenharmony_ci packet_type); 167462306a36Sopenharmony_ci } 167562306a36Sopenharmony_ci 167662306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 167762306a36Sopenharmony_ci} 167862306a36Sopenharmony_ci 167962306a36Sopenharmony_civoid exhalbtc_bt_info_notify(struct btc_coexist *btcoexist, 168062306a36Sopenharmony_ci u8 *tmp_buf, u8 length) 168162306a36Sopenharmony_ci{ 168262306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 168362306a36Sopenharmony_ci return; 168462306a36Sopenharmony_ci btcoexist->statistics.cnt_bt_info_notify++; 168562306a36Sopenharmony_ci 168662306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 168762306a36Sopenharmony_ci 168862306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 168962306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 169062306a36Sopenharmony_ci ex_btc8821a2ant_bt_info_notify(btcoexist, tmp_buf, 169162306a36Sopenharmony_ci length); 169262306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 169362306a36Sopenharmony_ci ex_btc8821a1ant_bt_info_notify(btcoexist, tmp_buf, 169462306a36Sopenharmony_ci length); 169562306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 169662306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 169762306a36Sopenharmony_ci ex_btc8723b2ant_bt_info_notify(btcoexist, tmp_buf, 169862306a36Sopenharmony_ci length); 169962306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 170062306a36Sopenharmony_ci ex_btc8723b1ant_bt_info_notify(btcoexist, tmp_buf, 170162306a36Sopenharmony_ci length); 170262306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 170362306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 170462306a36Sopenharmony_ci ex_btc8192e2ant_bt_info_notify(btcoexist, tmp_buf, 170562306a36Sopenharmony_ci length); 170662306a36Sopenharmony_ci } 170762306a36Sopenharmony_ci 170862306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 170962306a36Sopenharmony_ci} 171062306a36Sopenharmony_ci 171162306a36Sopenharmony_civoid exhalbtc_rf_status_notify(struct btc_coexist *btcoexist, u8 type) 171262306a36Sopenharmony_ci{ 171362306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 171462306a36Sopenharmony_ci return; 171562306a36Sopenharmony_ci 171662306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 171762306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 171862306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 1) 171962306a36Sopenharmony_ci ex_btc8723b1ant_rf_status_notify(btcoexist, type); 172062306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 172162306a36Sopenharmony_ci } 172262306a36Sopenharmony_ci} 172362306a36Sopenharmony_ci 172462306a36Sopenharmony_civoid exhalbtc_halt_notify(struct btc_coexist *btcoexist) 172562306a36Sopenharmony_ci{ 172662306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 172762306a36Sopenharmony_ci return; 172862306a36Sopenharmony_ci 172962306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 173062306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 173162306a36Sopenharmony_ci ex_btc8821a2ant_halt_notify(btcoexist); 173262306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 173362306a36Sopenharmony_ci ex_btc8821a1ant_halt_notify(btcoexist); 173462306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 173562306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 173662306a36Sopenharmony_ci ex_btc8723b2ant_halt_notify(btcoexist); 173762306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 173862306a36Sopenharmony_ci ex_btc8723b1ant_halt_notify(btcoexist); 173962306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 174062306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 174162306a36Sopenharmony_ci ex_btc8192e2ant_halt_notify(btcoexist); 174262306a36Sopenharmony_ci } 174362306a36Sopenharmony_ci 174462306a36Sopenharmony_ci btcoexist->binded = false; 174562306a36Sopenharmony_ci} 174662306a36Sopenharmony_ci 174762306a36Sopenharmony_civoid exhalbtc_pnp_notify(struct btc_coexist *btcoexist, u8 pnp_state) 174862306a36Sopenharmony_ci{ 174962306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 175062306a36Sopenharmony_ci return; 175162306a36Sopenharmony_ci 175262306a36Sopenharmony_ci /* currently only 1ant we have to do the notification, 175362306a36Sopenharmony_ci * once pnp is notified to sleep state, we have to leave LPS that 175462306a36Sopenharmony_ci * we can sleep normally. 175562306a36Sopenharmony_ci */ 175662306a36Sopenharmony_ci 175762306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 175862306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 1) 175962306a36Sopenharmony_ci ex_btc8723b1ant_pnp_notify(btcoexist, pnp_state); 176062306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 2) 176162306a36Sopenharmony_ci ex_btc8723b2ant_pnp_notify(btcoexist, pnp_state); 176262306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 176362306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 1) 176462306a36Sopenharmony_ci ex_btc8821a1ant_pnp_notify(btcoexist, pnp_state); 176562306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 2) 176662306a36Sopenharmony_ci ex_btc8821a2ant_pnp_notify(btcoexist, pnp_state); 176762306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 176862306a36Sopenharmony_ci } 176962306a36Sopenharmony_ci} 177062306a36Sopenharmony_ci 177162306a36Sopenharmony_civoid exhalbtc_coex_dm_switch(struct btc_coexist *btcoexist) 177262306a36Sopenharmony_ci{ 177362306a36Sopenharmony_ci struct rtl_priv *rtlpriv = btcoexist->adapter; 177462306a36Sopenharmony_ci 177562306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 177662306a36Sopenharmony_ci return; 177762306a36Sopenharmony_ci btcoexist->statistics.cnt_coex_dm_switch++; 177862306a36Sopenharmony_ci 177962306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 178062306a36Sopenharmony_ci 178162306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 178262306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 1) { 178362306a36Sopenharmony_ci btcoexist->stop_coex_dm = true; 178462306a36Sopenharmony_ci ex_btc8723b1ant_coex_dm_reset(btcoexist); 178562306a36Sopenharmony_ci exhalbtc_set_ant_num(rtlpriv, 178662306a36Sopenharmony_ci BT_COEX_ANT_TYPE_DETECTED, 2); 178762306a36Sopenharmony_ci ex_btc8723b2ant_init_hwconfig(btcoexist); 178862306a36Sopenharmony_ci ex_btc8723b2ant_init_coex_dm(btcoexist); 178962306a36Sopenharmony_ci btcoexist->stop_coex_dm = false; 179062306a36Sopenharmony_ci } 179162306a36Sopenharmony_ci } 179262306a36Sopenharmony_ci 179362306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 179462306a36Sopenharmony_ci} 179562306a36Sopenharmony_ci 179662306a36Sopenharmony_civoid exhalbtc_periodical(struct btc_coexist *btcoexist) 179762306a36Sopenharmony_ci{ 179862306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 179962306a36Sopenharmony_ci return; 180062306a36Sopenharmony_ci btcoexist->statistics.cnt_periodical++; 180162306a36Sopenharmony_ci 180262306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 180362306a36Sopenharmony_ci 180462306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 180562306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 180662306a36Sopenharmony_ci ex_btc8821a2ant_periodical(btcoexist); 180762306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 180862306a36Sopenharmony_ci if (!halbtc_under_ips(btcoexist)) 180962306a36Sopenharmony_ci ex_btc8821a1ant_periodical(btcoexist); 181062306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 181162306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 181262306a36Sopenharmony_ci ex_btc8723b2ant_periodical(btcoexist); 181362306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 181462306a36Sopenharmony_ci ex_btc8723b1ant_periodical(btcoexist); 181562306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 181662306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 181762306a36Sopenharmony_ci ex_btc8192e2ant_periodical(btcoexist); 181862306a36Sopenharmony_ci } 181962306a36Sopenharmony_ci 182062306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 182162306a36Sopenharmony_ci} 182262306a36Sopenharmony_ci 182362306a36Sopenharmony_civoid exhalbtc_dbg_control(struct btc_coexist *btcoexist, 182462306a36Sopenharmony_ci u8 code, u8 len, u8 *data) 182562306a36Sopenharmony_ci{ 182662306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 182762306a36Sopenharmony_ci return; 182862306a36Sopenharmony_ci btcoexist->statistics.cnt_dbg_ctrl++; 182962306a36Sopenharmony_ci 183062306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 183162306a36Sopenharmony_ci 183262306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 183362306a36Sopenharmony_ci} 183462306a36Sopenharmony_ci 183562306a36Sopenharmony_civoid exhalbtc_antenna_detection(struct btc_coexist *btcoexist, u32 cent_freq, 183662306a36Sopenharmony_ci u32 offset, u32 span, u32 seconds) 183762306a36Sopenharmony_ci{ 183862306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 183962306a36Sopenharmony_ci return; 184062306a36Sopenharmony_ci} 184162306a36Sopenharmony_ci 184262306a36Sopenharmony_civoid exhalbtc_stack_update_profile_info(void) 184362306a36Sopenharmony_ci{ 184462306a36Sopenharmony_ci} 184562306a36Sopenharmony_ci 184662306a36Sopenharmony_civoid exhalbtc_update_min_bt_rssi(struct btc_coexist *btcoexist, s8 bt_rssi) 184762306a36Sopenharmony_ci{ 184862306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 184962306a36Sopenharmony_ci return; 185062306a36Sopenharmony_ci 185162306a36Sopenharmony_ci btcoexist->stack_info.min_bt_rssi = bt_rssi; 185262306a36Sopenharmony_ci} 185362306a36Sopenharmony_ci 185462306a36Sopenharmony_civoid exhalbtc_set_hci_version(struct btc_coexist *btcoexist, u16 hci_version) 185562306a36Sopenharmony_ci{ 185662306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 185762306a36Sopenharmony_ci return; 185862306a36Sopenharmony_ci 185962306a36Sopenharmony_ci btcoexist->stack_info.hci_version = hci_version; 186062306a36Sopenharmony_ci} 186162306a36Sopenharmony_ci 186262306a36Sopenharmony_civoid exhalbtc_set_bt_patch_version(struct btc_coexist *btcoexist, 186362306a36Sopenharmony_ci u16 bt_hci_version, u16 bt_patch_version) 186462306a36Sopenharmony_ci{ 186562306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 186662306a36Sopenharmony_ci return; 186762306a36Sopenharmony_ci 186862306a36Sopenharmony_ci btcoexist->bt_info.bt_real_fw_ver = bt_patch_version; 186962306a36Sopenharmony_ci btcoexist->bt_info.bt_hci_ver = bt_hci_version; 187062306a36Sopenharmony_ci} 187162306a36Sopenharmony_ci 187262306a36Sopenharmony_civoid exhalbtc_set_chip_type(struct btc_coexist *btcoexist, u8 chip_type) 187362306a36Sopenharmony_ci{ 187462306a36Sopenharmony_ci switch (chip_type) { 187562306a36Sopenharmony_ci default: 187662306a36Sopenharmony_ci case BT_2WIRE: 187762306a36Sopenharmony_ci case BT_ISSC_3WIRE: 187862306a36Sopenharmony_ci case BT_ACCEL: 187962306a36Sopenharmony_ci case BT_RTL8756: 188062306a36Sopenharmony_ci btcoexist->board_info.bt_chip_type = BTC_CHIP_UNDEF; 188162306a36Sopenharmony_ci break; 188262306a36Sopenharmony_ci case BT_CSR_BC4: 188362306a36Sopenharmony_ci btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC4; 188462306a36Sopenharmony_ci break; 188562306a36Sopenharmony_ci case BT_CSR_BC8: 188662306a36Sopenharmony_ci btcoexist->board_info.bt_chip_type = BTC_CHIP_CSR_BC8; 188762306a36Sopenharmony_ci break; 188862306a36Sopenharmony_ci case BT_RTL8723A: 188962306a36Sopenharmony_ci btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723A; 189062306a36Sopenharmony_ci break; 189162306a36Sopenharmony_ci case BT_RTL8821A: 189262306a36Sopenharmony_ci btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8821; 189362306a36Sopenharmony_ci break; 189462306a36Sopenharmony_ci case BT_RTL8723B: 189562306a36Sopenharmony_ci btcoexist->board_info.bt_chip_type = BTC_CHIP_RTL8723B; 189662306a36Sopenharmony_ci break; 189762306a36Sopenharmony_ci } 189862306a36Sopenharmony_ci} 189962306a36Sopenharmony_ci 190062306a36Sopenharmony_civoid exhalbtc_set_ant_num(struct rtl_priv *rtlpriv, u8 type, u8 ant_num) 190162306a36Sopenharmony_ci{ 190262306a36Sopenharmony_ci struct btc_coexist *btcoexist = rtl_btc_coexist(rtlpriv); 190362306a36Sopenharmony_ci 190462306a36Sopenharmony_ci if (!btcoexist) 190562306a36Sopenharmony_ci return; 190662306a36Sopenharmony_ci 190762306a36Sopenharmony_ci if (BT_COEX_ANT_TYPE_PG == type) { 190862306a36Sopenharmony_ci btcoexist->board_info.pg_ant_num = ant_num; 190962306a36Sopenharmony_ci btcoexist->board_info.btdm_ant_num = ant_num; 191062306a36Sopenharmony_ci } else if (BT_COEX_ANT_TYPE_ANTDIV == type) { 191162306a36Sopenharmony_ci btcoexist->board_info.btdm_ant_num = ant_num; 191262306a36Sopenharmony_ci } else if (type == BT_COEX_ANT_TYPE_DETECTED) { 191362306a36Sopenharmony_ci btcoexist->board_info.btdm_ant_num = ant_num; 191462306a36Sopenharmony_ci if (rtlpriv->cfg->mod_params->ant_sel == 1) 191562306a36Sopenharmony_ci btcoexist->board_info.btdm_ant_pos = 191662306a36Sopenharmony_ci BTC_ANTENNA_AT_AUX_PORT; 191762306a36Sopenharmony_ci else 191862306a36Sopenharmony_ci btcoexist->board_info.btdm_ant_pos = 191962306a36Sopenharmony_ci BTC_ANTENNA_AT_MAIN_PORT; 192062306a36Sopenharmony_ci } 192162306a36Sopenharmony_ci} 192262306a36Sopenharmony_ci 192362306a36Sopenharmony_ci/* Currently used by 8723b only, S0 or S1 */ 192462306a36Sopenharmony_civoid exhalbtc_set_single_ant_path(struct btc_coexist *btcoexist, 192562306a36Sopenharmony_ci u8 single_ant_path) 192662306a36Sopenharmony_ci{ 192762306a36Sopenharmony_ci btcoexist->board_info.single_ant_path = single_ant_path; 192862306a36Sopenharmony_ci} 192962306a36Sopenharmony_ci 193062306a36Sopenharmony_civoid exhalbtc_display_bt_coex_info(struct btc_coexist *btcoexist, 193162306a36Sopenharmony_ci struct seq_file *m) 193262306a36Sopenharmony_ci{ 193362306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 193462306a36Sopenharmony_ci return; 193562306a36Sopenharmony_ci 193662306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 193762306a36Sopenharmony_ci 193862306a36Sopenharmony_ci if (IS_HARDWARE_TYPE_8821(btcoexist->adapter)) { 193962306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 194062306a36Sopenharmony_ci ex_btc8821a2ant_display_coex_info(btcoexist, m); 194162306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 194262306a36Sopenharmony_ci ex_btc8821a1ant_display_coex_info(btcoexist, m); 194362306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8723B(btcoexist->adapter)) { 194462306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 194562306a36Sopenharmony_ci ex_btc8723b2ant_display_coex_info(btcoexist, m); 194662306a36Sopenharmony_ci else if (btcoexist->board_info.btdm_ant_num == 1) 194762306a36Sopenharmony_ci ex_btc8723b1ant_display_coex_info(btcoexist, m); 194862306a36Sopenharmony_ci } else if (IS_HARDWARE_TYPE_8192E(btcoexist->adapter)) { 194962306a36Sopenharmony_ci if (btcoexist->board_info.btdm_ant_num == 2) 195062306a36Sopenharmony_ci ex_btc8192e2ant_display_coex_info(btcoexist, m); 195162306a36Sopenharmony_ci } 195262306a36Sopenharmony_ci 195362306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 195462306a36Sopenharmony_ci} 195562306a36Sopenharmony_ci 195662306a36Sopenharmony_civoid exhalbtc_switch_band_notify(struct btc_coexist *btcoexist, u8 type) 195762306a36Sopenharmony_ci{ 195862306a36Sopenharmony_ci if (!halbtc_is_bt_coexist_available(btcoexist)) 195962306a36Sopenharmony_ci return; 196062306a36Sopenharmony_ci 196162306a36Sopenharmony_ci if (btcoexist->manual_control) 196262306a36Sopenharmony_ci return; 196362306a36Sopenharmony_ci 196462306a36Sopenharmony_ci halbtc_leave_low_power(btcoexist); 196562306a36Sopenharmony_ci 196662306a36Sopenharmony_ci halbtc_normal_low_power(btcoexist); 196762306a36Sopenharmony_ci} 196862306a36Sopenharmony_ci 196962306a36Sopenharmony_civoid exhalbtc_switch_band_notify_wifi_only(struct wifi_only_cfg *wifionly_cfg, 197062306a36Sopenharmony_ci u8 is_5g) 197162306a36Sopenharmony_ci{ 197262306a36Sopenharmony_ci} 1973