162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 262306a36Sopenharmony_ci/* Copyright(c) 2019-2020 Realtek Corporation 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#ifndef __RTW89_COEX_H__ 662306a36Sopenharmony_ci#define __RTW89_COEX_H__ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "core.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cienum btc_mode { 1162306a36Sopenharmony_ci BTC_MODE_NORMAL, 1262306a36Sopenharmony_ci BTC_MODE_WL, 1362306a36Sopenharmony_ci BTC_MODE_BT, 1462306a36Sopenharmony_ci BTC_MODE_WLOFF, 1562306a36Sopenharmony_ci BTC_MODE_MAX 1662306a36Sopenharmony_ci}; 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cienum btc_wl_rfk_type { 1962306a36Sopenharmony_ci BTC_WRFKT_IQK = 0, 2062306a36Sopenharmony_ci BTC_WRFKT_LCK = 1, 2162306a36Sopenharmony_ci BTC_WRFKT_DPK = 2, 2262306a36Sopenharmony_ci BTC_WRFKT_TXGAPK = 3, 2362306a36Sopenharmony_ci BTC_WRFKT_DACK = 4, 2462306a36Sopenharmony_ci BTC_WRFKT_RXDCK = 5, 2562306a36Sopenharmony_ci BTC_WRFKT_TSSI = 6, 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci#define NM_EXEC false 2962306a36Sopenharmony_ci#define FC_EXEC true 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci#define RTW89_COEX_ACT1_WORK_PERIOD round_jiffies_relative(HZ * 4) 3262306a36Sopenharmony_ci#define RTW89_COEX_BT_DEVINFO_WORK_PERIOD round_jiffies_relative(HZ * 16) 3362306a36Sopenharmony_ci#define RTW89_COEX_RFK_CHK_WORK_PERIOD msecs_to_jiffies(300) 3462306a36Sopenharmony_ci#define BTC_RFK_PATH_MAP GENMASK(3, 0) 3562306a36Sopenharmony_ci#define BTC_RFK_PHY_MAP GENMASK(5, 4) 3662306a36Sopenharmony_ci#define BTC_RFK_BAND_MAP GENMASK(7, 6) 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_cienum btc_wl_rfk_state { 3962306a36Sopenharmony_ci BTC_WRFK_STOP = 0, 4062306a36Sopenharmony_ci BTC_WRFK_START = 1, 4162306a36Sopenharmony_ci BTC_WRFK_ONESHOT_START = 2, 4262306a36Sopenharmony_ci BTC_WRFK_ONESHOT_STOP = 3, 4362306a36Sopenharmony_ci}; 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_cienum btc_pri { 4662306a36Sopenharmony_ci BTC_PRI_MASK_RX_RESP = 0, 4762306a36Sopenharmony_ci BTC_PRI_MASK_TX_RESP, 4862306a36Sopenharmony_ci BTC_PRI_MASK_BEACON, 4962306a36Sopenharmony_ci BTC_PRI_MASK_RX_CCK, 5062306a36Sopenharmony_ci BTC_PRI_MASK_TX_MNGQ, 5162306a36Sopenharmony_ci BTC_PRI_MASK_MAX, 5262306a36Sopenharmony_ci}; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_cienum btc_bt_trs { 5562306a36Sopenharmony_ci BTC_BT_SS_GROUP = 0x0, 5662306a36Sopenharmony_ci BTC_BT_TX_GROUP = 0x2, 5762306a36Sopenharmony_ci BTC_BT_RX_GROUP = 0x3, 5862306a36Sopenharmony_ci BTC_BT_MAX_GROUP, 5962306a36Sopenharmony_ci}; 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_cienum btc_rssi_st { 6262306a36Sopenharmony_ci BTC_RSSI_ST_LOW = 0x0, 6362306a36Sopenharmony_ci BTC_RSSI_ST_HIGH, 6462306a36Sopenharmony_ci BTC_RSSI_ST_STAY_LOW, 6562306a36Sopenharmony_ci BTC_RSSI_ST_STAY_HIGH, 6662306a36Sopenharmony_ci BTC_RSSI_ST_MAX 6762306a36Sopenharmony_ci}; 6862306a36Sopenharmony_ci 6962306a36Sopenharmony_cienum btc_fddt_en { 7062306a36Sopenharmony_ci BTC_FDDT_DISABLE, 7162306a36Sopenharmony_ci BTC_FDDT_ENABLE, 7262306a36Sopenharmony_ci}; 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci#define BTC_RSSI_HIGH(_rssi_) \ 7562306a36Sopenharmony_ci ({typeof(_rssi_) __rssi = (_rssi_); \ 7662306a36Sopenharmony_ci ((__rssi == BTC_RSSI_ST_HIGH || \ 7762306a36Sopenharmony_ci __rssi == BTC_RSSI_ST_STAY_HIGH) ? 1 : 0); }) 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci#define BTC_RSSI_LOW(_rssi_) \ 8062306a36Sopenharmony_ci ({typeof(_rssi_) __rssi = (_rssi_); \ 8162306a36Sopenharmony_ci ((__rssi == BTC_RSSI_ST_LOW || \ 8262306a36Sopenharmony_ci __rssi == BTC_RSSI_ST_STAY_LOW) ? 1 : 0); }) 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci#define BTC_RSSI_CHANGE(_rssi_) \ 8562306a36Sopenharmony_ci ({typeof(_rssi_) __rssi = (_rssi_); \ 8662306a36Sopenharmony_ci ((__rssi == BTC_RSSI_ST_LOW || \ 8762306a36Sopenharmony_ci __rssi == BTC_RSSI_ST_HIGH) ? 1 : 0); }) 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cienum btc_ant { 9062306a36Sopenharmony_ci BTC_ANT_SHARED = 0, 9162306a36Sopenharmony_ci BTC_ANT_DEDICATED, 9262306a36Sopenharmony_ci BTC_ANTTYPE_MAX 9362306a36Sopenharmony_ci}; 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_cienum btc_bt_btg { 9662306a36Sopenharmony_ci BTC_BT_ALONE = 0, 9762306a36Sopenharmony_ci BTC_BT_BTG 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_cienum btc_switch { 10162306a36Sopenharmony_ci BTC_SWITCH_INTERNAL = 0, 10262306a36Sopenharmony_ci BTC_SWITCH_EXTERNAL 10362306a36Sopenharmony_ci}; 10462306a36Sopenharmony_ci 10562306a36Sopenharmony_cienum btc_pkt_type { 10662306a36Sopenharmony_ci PACKET_DHCP, 10762306a36Sopenharmony_ci PACKET_ARP, 10862306a36Sopenharmony_ci PACKET_EAPOL, 10962306a36Sopenharmony_ci PACKET_EAPOL_END, 11062306a36Sopenharmony_ci PACKET_ICMP, 11162306a36Sopenharmony_ci PACKET_MAX 11262306a36Sopenharmony_ci}; 11362306a36Sopenharmony_ci 11462306a36Sopenharmony_cienum btc_bt_mailbox_id { 11562306a36Sopenharmony_ci BTC_BTINFO_REPLY = 0x23, 11662306a36Sopenharmony_ci BTC_BTINFO_AUTO = 0x27 11762306a36Sopenharmony_ci}; 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cienum btc_role_state { 12062306a36Sopenharmony_ci BTC_ROLE_START, 12162306a36Sopenharmony_ci BTC_ROLE_STOP, 12262306a36Sopenharmony_ci BTC_ROLE_CHG_TYPE, 12362306a36Sopenharmony_ci BTC_ROLE_MSTS_STA_CONN_START, 12462306a36Sopenharmony_ci BTC_ROLE_MSTS_STA_CONN_END, 12562306a36Sopenharmony_ci BTC_ROLE_MSTS_STA_DIS_CONN, 12662306a36Sopenharmony_ci BTC_ROLE_MSTS_AP_START, 12762306a36Sopenharmony_ci BTC_ROLE_MSTS_AP_STOP, 12862306a36Sopenharmony_ci BTC_ROLE_STATE_UNKNOWN 12962306a36Sopenharmony_ci}; 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_cienum btc_rfctrl { 13262306a36Sopenharmony_ci BTC_RFCTRL_WL_OFF, 13362306a36Sopenharmony_ci BTC_RFCTRL_WL_ON, 13462306a36Sopenharmony_ci BTC_RFCTRL_LPS_WL_ON, 13562306a36Sopenharmony_ci BTC_RFCTRL_FW_CTRL, 13662306a36Sopenharmony_ci BTC_RFCTRL_MAX 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cienum btc_lps_state { 14062306a36Sopenharmony_ci BTC_LPS_OFF = 0, 14162306a36Sopenharmony_ci BTC_LPS_RF_OFF = 1, 14262306a36Sopenharmony_ci BTC_LPS_RF_ON = 2 14362306a36Sopenharmony_ci}; 14462306a36Sopenharmony_ci 14562306a36Sopenharmony_civoid rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev); 14662306a36Sopenharmony_civoid rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev); 14762306a36Sopenharmony_civoid rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode); 14862306a36Sopenharmony_civoid rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 14962306a36Sopenharmony_civoid rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx); 15062306a36Sopenharmony_civoid rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 15162306a36Sopenharmony_civoid rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev, 15262306a36Sopenharmony_ci enum btc_pkt_type pkt_type); 15362306a36Sopenharmony_civoid rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work); 15462306a36Sopenharmony_civoid rtw89_btc_ntfy_arp_packet_work(struct work_struct *work); 15562306a36Sopenharmony_civoid rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work); 15662306a36Sopenharmony_civoid rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work); 15762306a36Sopenharmony_civoid rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, 15862306a36Sopenharmony_ci struct rtw89_sta *rtwsta, enum btc_role_state state); 15962306a36Sopenharmony_civoid rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state); 16062306a36Sopenharmony_civoid rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map, 16162306a36Sopenharmony_ci enum btc_wl_rfk_type type, 16262306a36Sopenharmony_ci enum btc_wl_rfk_state state); 16362306a36Sopenharmony_civoid rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev); 16462306a36Sopenharmony_civoid rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, 16562306a36Sopenharmony_ci u32 len, u8 class, u8 func); 16662306a36Sopenharmony_civoid rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m); 16762306a36Sopenharmony_civoid rtw89_coex_act1_work(struct work_struct *work); 16862306a36Sopenharmony_civoid rtw89_coex_bt_devinfo_work(struct work_struct *work); 16962306a36Sopenharmony_civoid rtw89_coex_rfk_chk_work(struct work_struct *work); 17062306a36Sopenharmony_civoid rtw89_coex_power_on(struct rtw89_dev *rtwdev); 17162306a36Sopenharmony_civoid rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type); 17262306a36Sopenharmony_civoid rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type); 17362306a36Sopenharmony_civoid rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev); 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_cistatic inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev, 17662306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, 17762306a36Sopenharmony_ci enum rtw89_rf_path_bit paths) 17862306a36Sopenharmony_ci{ 17962306a36Sopenharmony_ci const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 18062306a36Sopenharmony_ci u8 phy_map; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) | 18362306a36Sopenharmony_ci FIELD_PREP(BTC_RFK_PHY_MAP, BIT(phy_idx)) | 18462306a36Sopenharmony_ci FIELD_PREP(BTC_RFK_BAND_MAP, chan->band_type); 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci return phy_map; 18762306a36Sopenharmony_ci} 18862306a36Sopenharmony_ci 18962306a36Sopenharmony_cistatic inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev, 19062306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx, 19162306a36Sopenharmony_ci enum rtw89_rf_path path) 19262306a36Sopenharmony_ci{ 19362306a36Sopenharmony_ci return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path)); 19462306a36Sopenharmony_ci} 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci/* return bt req len in TU */ 19762306a36Sopenharmony_cistatic inline u16 rtw89_coex_query_bt_req_len(struct rtw89_dev *rtwdev, 19862306a36Sopenharmony_ci enum rtw89_phy_idx phy_idx) 19962306a36Sopenharmony_ci{ 20062306a36Sopenharmony_ci struct rtw89_btc *btc = &rtwdev->btc; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci return btc->bt_req_len; 20362306a36Sopenharmony_ci} 20462306a36Sopenharmony_ci 20562306a36Sopenharmony_ci#endif 206