coex.h (4761B)
1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2/* Copyright(c) 2019-2020 Realtek Corporation 3 */ 4 5#ifndef __RTW89_COEX_H__ 6#define __RTW89_COEX_H__ 7 8#include "core.h" 9 10enum btc_mode { 11 BTC_MODE_NORMAL, 12 BTC_MODE_WL, 13 BTC_MODE_BT, 14 BTC_MODE_WLOFF, 15 BTC_MODE_MAX 16}; 17 18enum btc_wl_rfk_type { 19 BTC_WRFKT_IQK = 0, 20 BTC_WRFKT_LCK = 1, 21 BTC_WRFKT_DPK = 2, 22 BTC_WRFKT_TXGAPK = 3, 23 BTC_WRFKT_DACK = 4, 24 BTC_WRFKT_RXDCK = 5, 25 BTC_WRFKT_TSSI = 6, 26}; 27 28#define NM_EXEC false 29#define FC_EXEC true 30 31#define RTW89_COEX_ACT1_WORK_PERIOD round_jiffies_relative(HZ * 4) 32#define RTW89_COEX_BT_DEVINFO_WORK_PERIOD round_jiffies_relative(HZ * 16) 33#define RTW89_COEX_RFK_CHK_WORK_PERIOD msecs_to_jiffies(300) 34#define BTC_RFK_PATH_MAP GENMASK(3, 0) 35#define BTC_RFK_PHY_MAP GENMASK(5, 4) 36#define BTC_RFK_BAND_MAP GENMASK(7, 6) 37 38enum btc_wl_rfk_state { 39 BTC_WRFK_STOP = 0, 40 BTC_WRFK_START = 1, 41 BTC_WRFK_ONESHOT_START = 2, 42 BTC_WRFK_ONESHOT_STOP = 3, 43}; 44 45enum btc_pri { 46 BTC_PRI_MASK_RX_RESP = 0, 47 BTC_PRI_MASK_TX_RESP, 48 BTC_PRI_MASK_BEACON, 49 BTC_PRI_MASK_RX_CCK, 50 BTC_PRI_MASK_TX_MNGQ, 51 BTC_PRI_MASK_MAX, 52}; 53 54enum btc_bt_trs { 55 BTC_BT_SS_GROUP = 0x0, 56 BTC_BT_TX_GROUP = 0x2, 57 BTC_BT_RX_GROUP = 0x3, 58 BTC_BT_MAX_GROUP, 59}; 60 61enum btc_rssi_st { 62 BTC_RSSI_ST_LOW = 0x0, 63 BTC_RSSI_ST_HIGH, 64 BTC_RSSI_ST_STAY_LOW, 65 BTC_RSSI_ST_STAY_HIGH, 66 BTC_RSSI_ST_MAX 67}; 68 69#define BTC_RSSI_HIGH(_rssi_) \ 70 ({typeof(_rssi_) __rssi = (_rssi_); \ 71 ((__rssi == BTC_RSSI_ST_HIGH || \ 72 __rssi == BTC_RSSI_ST_STAY_HIGH) ? 1 : 0); }) 73 74#define BTC_RSSI_LOW(_rssi_) \ 75 ({typeof(_rssi_) __rssi = (_rssi_); \ 76 ((__rssi == BTC_RSSI_ST_LOW || \ 77 __rssi == BTC_RSSI_ST_STAY_LOW) ? 1 : 0); }) 78 79#define BTC_RSSI_CHANGE(_rssi_) \ 80 ({typeof(_rssi_) __rssi = (_rssi_); \ 81 ((__rssi == BTC_RSSI_ST_LOW || \ 82 __rssi == BTC_RSSI_ST_HIGH) ? 1 : 0); }) 83 84enum btc_ant { 85 BTC_ANT_SHARED = 0, 86 BTC_ANT_DEDICATED, 87 BTC_ANTTYPE_MAX 88}; 89 90enum btc_bt_btg { 91 BTC_BT_ALONE = 0, 92 BTC_BT_BTG 93}; 94 95enum btc_switch { 96 BTC_SWITCH_INTERNAL = 0, 97 BTC_SWITCH_EXTERNAL 98}; 99 100enum btc_pkt_type { 101 PACKET_DHCP, 102 PACKET_ARP, 103 PACKET_EAPOL, 104 PACKET_EAPOL_END, 105 PACKET_ICMP, 106 PACKET_MAX 107}; 108 109enum btc_bt_mailbox_id { 110 BTC_BTINFO_REPLY = 0x23, 111 BTC_BTINFO_AUTO = 0x27 112}; 113 114enum btc_role_state { 115 BTC_ROLE_START, 116 BTC_ROLE_STOP, 117 BTC_ROLE_CHG_TYPE, 118 BTC_ROLE_MSTS_STA_CONN_START, 119 BTC_ROLE_MSTS_STA_CONN_END, 120 BTC_ROLE_MSTS_STA_DIS_CONN, 121 BTC_ROLE_MSTS_AP_START, 122 BTC_ROLE_MSTS_AP_STOP, 123 BTC_ROLE_STATE_UNKNOWN 124}; 125 126enum btc_rfctrl { 127 BTC_RFCTRL_WL_OFF, 128 BTC_RFCTRL_WL_ON, 129 BTC_RFCTRL_FW_CTRL, 130 BTC_RFCTRL_MAX 131}; 132 133enum btc_lps_state { 134 BTC_LPS_OFF = 0, 135 BTC_LPS_RF_OFF = 1, 136 BTC_LPS_RF_ON = 2 137}; 138 139void rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev); 140void rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev); 141void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode); 142void rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 143void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx); 144void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 145void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev, 146 enum btc_pkt_type pkt_type); 147void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work); 148void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work); 149void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work); 150void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work); 151void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, 152 struct rtw89_sta *rtwsta, enum btc_role_state state); 153void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state); 154void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map, 155 enum btc_wl_rfk_type type, 156 enum btc_wl_rfk_state state); 157void rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev); 158void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, 159 u32 len, u8 class, u8 func); 160void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m); 161void rtw89_coex_act1_work(struct work_struct *work); 162void rtw89_coex_bt_devinfo_work(struct work_struct *work); 163void rtw89_coex_rfk_chk_work(struct work_struct *work); 164void rtw89_coex_power_on(struct rtw89_dev *rtwdev); 165 166static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev, 167 enum rtw89_phy_idx phy_idx, 168 enum rtw89_rf_path_bit paths) 169{ 170 struct rtw89_hal *hal = &rtwdev->hal; 171 u8 phy_map; 172 173 phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) | 174 FIELD_PREP(BTC_RFK_PHY_MAP, BIT(phy_idx)) | 175 FIELD_PREP(BTC_RFK_BAND_MAP, hal->current_band_type); 176 177 return phy_map; 178} 179 180static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev, 181 enum rtw89_phy_idx phy_idx, 182 enum rtw89_rf_path path) 183{ 184 return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path)); 185} 186 187#endif