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 10 enum btc_mode { 11 BTC_MODE_NORMAL, 12 BTC_MODE_WL, 13 BTC_MODE_BT, 14 BTC_MODE_WLOFF, 15 BTC_MODE_MAX 16 }; 17 18 enum 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 BTC_WRFKT_CHLK = 7, 27 }; 28 29 #define NM_EXEC false 30 #define FC_EXEC true 31 32 #define RTW89_COEX_ACT1_WORK_PERIOD round_jiffies_relative(HZ * 4) 33 #define RTW89_COEX_BT_DEVINFO_WORK_PERIOD round_jiffies_relative(HZ * 16) 34 #define RTW89_COEX_RFK_CHK_WORK_PERIOD msecs_to_jiffies(300) 35 #define BTC_RFK_PATH_MAP GENMASK(3, 0) 36 #define BTC_RFK_PHY_MAP GENMASK(5, 4) 37 #define BTC_RFK_BAND_MAP GENMASK(7, 6) 38 39 enum btc_wl_rfk_state { 40 BTC_WRFK_STOP = 0, 41 BTC_WRFK_START = 1, 42 BTC_WRFK_ONESHOT_START = 2, 43 BTC_WRFK_ONESHOT_STOP = 3, 44 }; 45 46 enum btc_pri { 47 BTC_PRI_MASK_RX_RESP = 0, 48 BTC_PRI_MASK_TX_RESP, 49 BTC_PRI_MASK_BEACON, 50 BTC_PRI_MASK_RX_CCK, 51 BTC_PRI_MASK_TX_MNGQ, 52 BTC_PRI_MASK_MAX, 53 }; 54 55 enum btc_bt_trs { 56 BTC_BT_SS_GROUP = 0x0, 57 BTC_BT_TX_GROUP = 0x2, 58 BTC_BT_RX_GROUP = 0x3, 59 BTC_BT_MAX_GROUP, 60 }; 61 62 enum btc_rssi_st { 63 BTC_RSSI_ST_LOW = 0x0, 64 BTC_RSSI_ST_HIGH, 65 BTC_RSSI_ST_STAY_LOW, 66 BTC_RSSI_ST_STAY_HIGH, 67 BTC_RSSI_ST_MAX 68 }; 69 70 enum btc_fddt_en { 71 BTC_FDDT_DISABLE, 72 BTC_FDDT_ENABLE, 73 }; 74 75 #define BTC_RSSI_HIGH(_rssi_) \ 76 ({typeof(_rssi_) __rssi = (_rssi_); \ 77 ((__rssi == BTC_RSSI_ST_HIGH || \ 78 __rssi == BTC_RSSI_ST_STAY_HIGH) ? 1 : 0); }) 79 80 #define BTC_RSSI_LOW(_rssi_) \ 81 ({typeof(_rssi_) __rssi = (_rssi_); \ 82 ((__rssi == BTC_RSSI_ST_LOW || \ 83 __rssi == BTC_RSSI_ST_STAY_LOW) ? 1 : 0); }) 84 85 #define BTC_RSSI_CHANGE(_rssi_) \ 86 ({typeof(_rssi_) __rssi = (_rssi_); \ 87 ((__rssi == BTC_RSSI_ST_LOW || \ 88 __rssi == BTC_RSSI_ST_HIGH) ? 1 : 0); }) 89 90 enum btc_ant { 91 BTC_ANT_SHARED = 0, 92 BTC_ANT_DEDICATED, 93 BTC_ANTTYPE_MAX 94 }; 95 96 enum btc_bt_btg { 97 BTC_BT_ALONE = 0, 98 BTC_BT_BTG 99 }; 100 101 enum btc_switch { 102 BTC_SWITCH_INTERNAL = 0, 103 BTC_SWITCH_EXTERNAL 104 }; 105 106 enum btc_pkt_type { 107 PACKET_DHCP, 108 PACKET_ARP, 109 PACKET_EAPOL, 110 PACKET_EAPOL_END, 111 PACKET_ICMP, 112 PACKET_MAX 113 }; 114 115 enum btc_bt_mailbox_id { 116 BTC_BTINFO_REPLY = 0x23, 117 BTC_BTINFO_AUTO = 0x27 118 }; 119 120 enum btc_role_state { 121 BTC_ROLE_START, 122 BTC_ROLE_STOP, 123 BTC_ROLE_CHG_TYPE, 124 BTC_ROLE_MSTS_STA_CONN_START, 125 BTC_ROLE_MSTS_STA_CONN_END, 126 BTC_ROLE_MSTS_STA_DIS_CONN, 127 BTC_ROLE_MSTS_AP_START, 128 BTC_ROLE_MSTS_AP_STOP, 129 BTC_ROLE_STATE_UNKNOWN 130 }; 131 132 enum btc_rfctrl { 133 BTC_RFCTRL_WL_OFF, 134 BTC_RFCTRL_WL_ON, 135 BTC_RFCTRL_LPS_WL_ON, 136 BTC_RFCTRL_FW_CTRL, 137 BTC_RFCTRL_MAX 138 }; 139 140 enum btc_lps_state { 141 BTC_LPS_OFF = 0, 142 BTC_LPS_RF_OFF = 1, 143 BTC_LPS_RF_ON = 2 144 }; 145 146 #define R_BTC_BB_BTG_RX 0x980 147 #define R_BTC_BB_PRE_AGC_S1 0x476C 148 #define R_BTC_BB_PRE_AGC_S0 0x4688 149 150 #define B_BTC_BB_GNT_MUX GENMASK(20, 17) 151 #define B_BTC_BB_PRE_AGC_MASK GENMASK(31, 24) 152 #define B_BTC_BB_PRE_AGC_VAL BIT(31) 153 154 #define BTC_REG_NOTFOUND 0xff 155 156 enum btc_ant_div_pos { 157 BTC_ANT_DIV_MAIN = 0, 158 BTC_ANT_DIV_AUX = 1, 159 }; 160 161 enum btc_get_reg_status { 162 BTC_CSTATUS_TXDIV_POS = 0, 163 BTC_CSTATUS_RXDIV_POS = 1, 164 BTC_CSTATUS_BB_GNT_MUX = 2, 165 BTC_CSTATUS_BB_GNT_MUX_MON = 3, 166 BTC_CSTATUS_BB_PRE_AGC = 4, 167 BTC_CSTATUS_BB_PRE_AGC_MON = 5, 168 }; 169 170 enum btc_preagc_type { 171 BTC_PREAGC_DISABLE, 172 BTC_PREAGC_ENABLE, 173 BTC_PREAGC_BB_FWCTRL, 174 BTC_PREAGC_NOTFOUND, 175 }; 176 177 enum btc_btgctrl_type { 178 BTC_BTGCTRL_DISABLE, 179 BTC_BTGCTRL_ENABLE, 180 BTC_BTGCTRL_BB_GNT_FWCTRL, 181 BTC_BTGCTRL_BB_GNT_NOTFOUND, 182 }; 183 184 void rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev); 185 void rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev); 186 void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode); 187 void rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 188 void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx); 189 void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 190 void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev, 191 enum btc_pkt_type pkt_type); 192 void rtw89_btc_ntfy_eapol_packet_work(struct work_struct *work); 193 void rtw89_btc_ntfy_arp_packet_work(struct work_struct *work); 194 void rtw89_btc_ntfy_dhcp_packet_work(struct work_struct *work); 195 void rtw89_btc_ntfy_icmp_packet_work(struct work_struct *work); 196 void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif, 197 struct rtw89_sta *rtwsta, enum btc_role_state state); 198 void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state); 199 void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map, 200 enum btc_wl_rfk_type type, 201 enum btc_wl_rfk_state state); 202 void rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev); 203 void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, 204 u32 len, u8 class, u8 func); 205 void rtw89_btc_dump_info(struct rtw89_dev *rtwdev, struct seq_file *m); 206 void rtw89_coex_act1_work(struct work_struct *work); 207 void rtw89_coex_bt_devinfo_work(struct work_struct *work); 208 void rtw89_coex_rfk_chk_work(struct work_struct *work); 209 void rtw89_coex_power_on(struct rtw89_dev *rtwdev); 210 void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type); 211 void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type); 212 void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev); 213 214 static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev, 215 enum rtw89_phy_idx phy_idx, 216 enum rtw89_rf_path_bit paths) 217 { 218 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, RTW89_SUB_ENTITY_0); 219 u8 phy_map; 220 221 phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) | 222 FIELD_PREP(BTC_RFK_PHY_MAP, BIT(phy_idx)) | 223 FIELD_PREP(BTC_RFK_BAND_MAP, chan->band_type); 224 225 return phy_map; 226 } 227 228 static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev, 229 enum rtw89_phy_idx phy_idx, 230 enum rtw89_rf_path path) 231 { 232 return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path)); 233 } 234 235 /* return bt req len in TU */ 236 static inline u16 rtw89_coex_query_bt_req_len(struct rtw89_dev *rtwdev, 237 enum rtw89_phy_idx phy_idx) 238 { 239 struct rtw89_btc *btc = &rtwdev->btc; 240 241 return btc->bt_req_len; 242 } 243 244 #endif 245