#include "coex.h"
#include "debug.h"
#include "fw.h"
#include "mac.h"
#include "phy.h"
#include "ps.h"
#include "reg.h"
#define RTW89_COEX_VERSION …
#define FCXDEF_STEP …
#define BTC_E2G_LIMIT_DEF …
enum btc_fbtc_tdma_template { … };
enum btc_fbtc_tdma_type { … };
enum btc_fbtc_tdma_rx_flow_ctrl { … };
enum btc_fbtc_tdma_wlan_tx_pause { … };
enum btc_mlme_state { … };
struct btc_fbtc_1slot { … } __packed;
static const struct rtw89_btc_fbtc_tdma t_def[] = …;
#define __DEF_FBTC_SLOT(__dur, __cxtbl, __cxtype) …
static const struct rtw89_btc_fbtc_slot s_def[] = …;
static const u32 cxtbl[] = …;
static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = …;
#define RTW89_DEFAULT_BTC_VER_IDX …
static const union rtw89_btc_wl_state_map btc_scanning_map = …;
static u32 chip_id_to_bt_rom_code_id(u32 id)
{ … }
struct rtw89_btc_btf_tlv { … } __packed;
struct rtw89_btc_btf_tlv_v7 { … } __packed;
enum btc_btf_set_report_en { … };
struct rtw89_btc_btf_set_report_v1 { … } __packed;
struct rtw89_btc_btf_set_report_v8 { … } __packed;
rtw89_fbtc_rtp_ctrl;
#define BTF_SET_SLOT_TABLE_VER …
struct rtw89_btc_btf_set_slot_table { … } __packed;
struct rtw89_btc_btf_set_slot_table_v7 { … } __packed;
struct rtw89_btc_btf_set_mon_reg_v1 { … } __packed;
struct rtw89_btc_btf_set_mon_reg_v7 { … } __packed;
rtw89_fbtc_set_mon_reg __packed;
struct _wl_rinfo_now { … };
enum btc_btf_set_cx_policy { … };
enum btc_b2w_scoreboard { … };
enum btc_phymap { … };
enum btc_cx_state_map { … };
enum btc_ant_phase { … };
enum btc_plt { … };
enum btc_cx_poicy_main_type { … };
enum btc_cx_poicy_type { … };
enum btc_wl_rfk_result { … };
enum btc_coex_info_map_en { … };
#define BTC_CXP_MASK …
enum btc_w2b_scoreboard { … };
enum btc_wl_link_mode { … };
enum btc_wl_mrole_type { … };
enum btc_bt_hid_type { … };
enum btc_reset_module { … };
enum btc_gnt_state { … };
enum btc_ctr_path { … };
enum btc_wlact_state { … };
enum btc_wl_max_tx_time { … };
enum btc_wl_max_tx_retry { … };
enum btc_reason_and_action { … };
#define BTC_FREERUN_ANTISO_MIN …
#define BTC_TDMA_BTHID_MAX …
#define BTC_BLINK_NOCONNECT …
#define BTC_B1_MAX …
static void _run_coex(struct rtw89_dev *rtwdev,
enum btc_reason_and_action reason);
static void _write_scbd(struct rtw89_dev *rtwdev, u32 val, bool state);
static void _update_bt_scbd(struct rtw89_dev *rtwdev, bool only_update);
static int _send_fw_cmd(struct rtw89_dev *rtwdev, u8 h2c_class, u8 h2c_func,
void *param, u16 len)
{ … }
static void _reset_btc_var(struct rtw89_dev *rtwdev, u8 type)
{ … }
static u8 _search_reg_index(struct rtw89_dev *rtwdev, u8 mreg_num, u16 reg_type, u32 target)
{ … }
static void _get_reg_status(struct rtw89_dev *rtwdev, u8 type, u8 *val)
{ … }
#define BTC_RPT_HDR_SIZE …
#define BTC_CHK_WLSLOT_DRIFT_MAX …
#define BTC_CHK_BTSLOT_DRIFT_MAX …
#define BTC_CHK_HANG_MAX …
static void _chk_btc_err(struct rtw89_dev *rtwdev, u8 type, u32 cnt)
{ … }
static void _update_bt_report(struct rtw89_dev *rtwdev, u8 rpt_type, u8 *pfinfo)
{ … }
static void rtw89_btc_fw_rpt_evnt_ver(struct rtw89_dev *rtwdev, u8 *index)
{ … }
#define BTC_LEAK_AP_TH …
#define BTC_CYSTA_CHK_PERIOD …
struct rtw89_btc_prpt { … } __packed;
static u32 _chk_btc_report(struct rtw89_dev *rtwdev,
struct rtw89_btc_btf_fwinfo *pfwinfo,
u8 *prptbuf, u32 index)
{ … }
static void _parse_btc_report(struct rtw89_dev *rtwdev,
struct rtw89_btc_btf_fwinfo *pfwinfo,
u8 *pbuf, u32 buf_len)
{ … }
#define BTC_TLV_HDR_LEN …
#define BTC_TLV_HDR_LEN_V7 …
static void _append_tdma(struct rtw89_dev *rtwdev)
{ … }
static void _append_slot_v1(struct rtw89_dev *rtwdev)
{ … }
static void _append_slot_v7(struct rtw89_dev *rtwdev)
{ … }
static void _append_slot(struct rtw89_dev *rtwdev)
{ … }
static u32 rtw89_btc_fw_rpt_ver(struct rtw89_dev *rtwdev, u32 rpt_map)
{ … }
static void rtw89_btc_fw_set_slots(struct rtw89_dev *rtwdev)
{ … }
static void rtw89_btc_fw_en_rpt(struct rtw89_dev *rtwdev,
u32 rpt_map, bool rpt_state)
{ … }
static void btc_fw_set_monreg(struct rtw89_dev *rtwdev)
{ … }
static void _update_dm_step(struct rtw89_dev *rtwdev,
enum btc_reason_and_action reason_or_action)
{ … }
static void _fw_set_policy(struct rtw89_dev *rtwdev, u16 policy_type,
enum btc_reason_and_action action)
{ … }
static void _fw_set_drv_info(struct rtw89_dev *rtwdev, u8 type)
{ … }
static
void btc_fw_event(struct rtw89_dev *rtwdev, u8 evt_id, void *data, u32 len)
{ … }
static void _set_gnt(struct rtw89_dev *rtwdev, u8 phy_map, u8 wl_state, u8 bt_state)
{ … }
static void _set_gnt_v1(struct rtw89_dev *rtwdev, u8 phy_map,
u8 wl_state, u8 bt_state, u8 wlact_state)
{ … }
#define BTC_TDMA_WLROLE_MAX …
static void _set_bt_ignore_wlan_act(struct rtw89_dev *rtwdev, u8 enable)
{ … }
#define WL_TX_POWER_NO_BTC_CTRL …
#define WL_TX_POWER_ALL_TIME …
#define WL_TX_POWER_WITH_BT …
#define WL_TX_POWER_INT_PART …
#define WL_TX_POWER_FRA_PART …
#define B_BTC_WL_TX_POWER_SIGN …
#define B_TSSI_WL_TX_POWER_SIGN …
static void _set_wl_tx_power(struct rtw89_dev *rtwdev, u32 level)
{ … }
static void _set_wl_rx_gain(struct rtw89_dev *rtwdev, u32 level)
{ … }
static void _set_bt_tx_power(struct rtw89_dev *rtwdev, u8 level)
{ … }
#define BTC_BT_RX_NORMAL_LVL …
static void _set_bt_rx_gain(struct rtw89_dev *rtwdev, u8 level)
{ … }
static void _set_rf_trx_para(struct rtw89_dev *rtwdev)
{ … }
static void _update_btc_state_map(struct rtw89_dev *rtwdev)
{ … }
static void _set_bt_afh_info(struct rtw89_dev *rtwdev)
{ … }
static bool _check_freerun(struct rtw89_dev *rtwdev)
{ … }
#define _tdma_set_flctrl(btc, flc) …
#define _tdma_set_flctrl_role(btc, role) …
#define _tdma_set_tog(btc, wtg) …
#define _tdma_set_lek(btc, lek) …
struct btc_btinfo_lb2 { … };
struct btc_btinfo_lb3 { … };
struct btc_btinfo_hb0 { … };
struct btc_btinfo_hb1 { … };
struct btc_btinfo_hb2 { … };
struct btc_btinfo_hb3 { … };
btc_btinfo;
static void _set_policy(struct rtw89_dev *rtwdev, u16 policy_type,
enum btc_reason_and_action action)
{ … }
#define BTC_B1_MAX …
void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type)
{ … }
EXPORT_SYMBOL(…);
void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type)
{ … }
EXPORT_SYMBOL(…);
static void _set_bt_plut(struct rtw89_dev *rtwdev, u8 phy_map,
u8 tx_val, u8 rx_val)
{ … }
static void _set_ant_v0(struct rtw89_dev *rtwdev, bool force_exec,
u8 phy_map, u8 type)
{ … }
static void _set_ant_v1(struct rtw89_dev *rtwdev, bool force_exec,
u8 phy_map, u8 type)
{ … }
static void _set_ant(struct rtw89_dev *rtwdev, bool force_exec,
u8 phy_map, u8 type)
{ … }
static void _action_wl_only(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_init(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_off(struct rtw89_dev *rtwdev, u8 mode)
{ … }
static void _action_freerun(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_whql(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_off(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_idle(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_hfp(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_hid(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_a2dp(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_a2dpsink(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_pan(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_a2dp_hid(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_a2dp_pan(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_pan_hid(struct rtw89_dev *rtwdev)
{ … }
static void _action_bt_a2dp_pan_hid(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_5g(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_other(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_nc(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_rfk(struct rtw89_dev *rtwdev)
{ … }
static void _set_btg_ctrl(struct rtw89_dev *rtwdev)
{ … }
static void _set_wl_preagc_ctrl(struct rtw89_dev *rtwdev)
{ … }
struct rtw89_txtime_data { … };
static void rtw89_tx_time_iter(void *data, struct ieee80211_sta *sta)
{ … }
static void _set_wl_tx_limit(struct rtw89_dev *rtwdev)
{ … }
static void _set_bt_rx_agc(struct rtw89_dev *rtwdev)
{ … }
static void _set_bt_rx_scan_pri(struct rtw89_dev *rtwdev)
{ … }
static void _action_common(struct rtw89_dev *rtwdev)
{ … }
static void _action_by_bt(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_sta(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_25g_mcc(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_scan(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_mcc(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_scc(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_scc_v1(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_scc_v2(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_scc_v8(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_ap(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_go(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_gc(struct rtw89_dev *rtwdev)
{ … }
static void _action_wl_2g_nan(struct rtw89_dev *rtwdev)
{ … }
static u32 _read_scbd(struct rtw89_dev *rtwdev)
{ … }
static void _write_scbd(struct rtw89_dev *rtwdev, u32 val, bool state)
{ … }
static u8
_update_rssi_state(struct rtw89_dev *rtwdev, u8 pre_state, u8 rssi, u8 thresh)
{ … }
static void _wl_req_mac(struct rtw89_dev *rtwdev, u8 mac)
{ … }
static
void _update_dbcc_band(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx)
{ … }
static void _update_wl_info(struct rtw89_dev *rtwdev)
{ … }
static void _update_wl_info_v1(struct rtw89_dev *rtwdev)
{ … }
static void _update_wl_info_v2(struct rtw89_dev *rtwdev)
{ … }
#define BTC_CHK_HANG_MAX …
#define BTC_SCB_INV_VALUE …
static u8 _get_role_link_mode(u8 role)
{ … }
static bool _chk_role_ch_group(const struct rtw89_btc_chdef *r1,
const struct rtw89_btc_chdef *r2)
{ … }
static u8 _chk_dbcc(struct rtw89_dev *rtwdev, struct rtw89_btc_chdef *ch,
u8 *phy, u8 *role, u8 *dbcc_2g_phy)
{ … }
static void _update_role_link_mode(struct rtw89_dev *rtwdev,
bool client_joined, u32 noa)
{ … }
static void _update_wl_info_v7(struct rtw89_dev *rtwdev, u8 rid)
{ … }
static void _update_wl_info_v8(struct rtw89_dev *rtwdev, u8 role_id, u8 rlink_id,
enum btc_role_state state)
{ … }
void rtw89_coex_act1_work(struct work_struct *work)
{ … }
void rtw89_coex_bt_devinfo_work(struct work_struct *work)
{ … }
void rtw89_coex_rfk_chk_work(struct work_struct *work)
{ … }
static void _update_bt_scbd(struct rtw89_dev *rtwdev, bool only_update)
{ … }
static bool _chk_wl_rfk_request(struct rtw89_dev *rtwdev)
{ … }
static
void _run_coex(struct rtw89_dev *rtwdev, enum btc_reason_and_action reason)
{ … }
void rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev)
{ … }
void rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev)
{ … }
static void _set_init_info(struct rtw89_dev *rtwdev)
{ … }
void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode)
{ … }
void rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band)
{ … }
void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx)
{ … }
void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band)
{ … }
void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev,
enum btc_pkt_type pkt_type)
{ … }
void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work)
{ … }
void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work)
{ … }
void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work)
{ … }
void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work)
{ … }
static u8 _update_bt_rssi_level(struct rtw89_dev *rtwdev, u8 rssi)
{ … }
static void _update_zb_coex_tbl(struct rtw89_dev *rtwdev)
{ … }
#define BT_PROFILE_PROTOCOL_MASK …
static void _update_bt_info(struct rtw89_dev *rtwdev, u8 *buf, u32 len)
{ … }
void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif,
struct rtw89_sta *rtwsta, enum btc_role_state state)
{ … }
void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state)
{ … }
static bool _ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_path,
enum btc_wl_rfk_type type,
enum btc_wl_rfk_state state)
{ … }
void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map,
enum btc_wl_rfk_type type,
enum btc_wl_rfk_state state)
{ … }
EXPORT_SYMBOL(…);
struct rtw89_btc_wl_sta_iter_data { … };
static void rtw89_btc_ntfy_wl_sta_iter(void *data, struct ieee80211_sta *sta)
{ … }
#define BTC_NHM_CHK_INTVL …
void rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev)
{ … }
void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb,
u32 len, u8 class, u8 func)
{ … }
#define BTC_CX_FW_OFFLOAD …
static void _show_cx_info(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_wl_role_info(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_wl_info(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
enum btc_bt_a2dp_type { … };
static void _show_bt_profile_info(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_bt_info(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
#define CASE_BTC_RSN_STR(e) …
#define CASE_BTC_ACT_STR(e) …
#define CASE_BTC_POLICY_STR(e) …
#define CASE_BTC_SLOT_STR(e) …
#define CASE_BTC_EVT_STR(e) …
#define CASE_BTC_INIT(e) …
#define CASE_BTC_ANTPATH_STR(e) …
#define CASE_BTC_POLUT_STR(e) …
#define CASE_BTC_REGTYPE_STR(e) …
#define CASE_BTC_GDBG_STR(e) …
static const char *id_to_polut(u32 id)
{ … }
static const char *id_to_regtype(u32 id)
{ … }
static const char *id_to_gdbg(u32 id)
{ … }
static const char *steps_to_str(u16 step)
{ … }
static const char *id_to_slot(u32 id)
{ … }
static const char *id_to_evt(u32 id)
{ … }
static const char *id_to_mode(u8 id)
{ … }
static const char *id_to_ant(u32 id)
{ … }
static
void seq_print_segment(struct seq_file *m, const char *prefix, u16 *data,
u8 len, u8 seg_len, u8 start_idx, u8 ring_len)
{ … }
static void _show_dm_step(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_dm_info(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_error(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_tdma(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_slots(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_cysta_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_cysta_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_cysta_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_cysta_v5(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_cysta_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_nullsta(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_step_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fbtc_step_v3(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_fw_dm_msg(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _get_gnt(struct rtw89_dev *rtwdev, struct rtw89_mac_ax_coex_gnt *gnt_cfg)
{ … }
static void _show_gpio_dbg(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_mreg_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_mreg_v2(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_mreg_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_summary_v1(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_summary_v4(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_summary_v5(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_summary_v105(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_summary_v7(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
static void _show_summary_v8(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m)
{ … }
void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev)
{ … }