FILE
coex.h
File preview with syntax highlighting.
linux-6.19.14/drivers/net/wireless/realtek/rtw89/coex.h
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#define BTC_H2C_MAXLEN 2020 11#define BTC_TLV_SLOT_ID_LEN_V7 1 12#define BTC_SLOT_REQ_TH 2 13 14enum btc_mode { 15 BTC_MODE_NORMAL, 16 BTC_MODE_WL, 17 BTC_MODE_BT, 18 BTC_MODE_WLOFF, 19 BTC_MODE_MAX 20}; 21 22enum btc_wl_rfk_type { 23 BTC_WRFKT_IQK = 0, 24 BTC_WRFKT_LCK = 1, 25 BTC_WRFKT_DPK = 2, 26 BTC_WRFKT_TXGAPK = 3, 27 BTC_WRFKT_DACK = 4, 28 BTC_WRFKT_RXDCK = 5, 29 BTC_WRFKT_TSSI = 6, 30 BTC_WRFKT_CHLK = 7, 31}; 32 33#define NM_EXEC false 34#define FC_EXEC true 35 36#define RTW89_COEX_ACT1_WORK_PERIOD round_jiffies_relative(HZ * 4) 37#define RTW89_COEX_BT_DEVINFO_WORK_PERIOD round_jiffies_relative(HZ * 16) 38#define RTW89_COEX_RFK_CHK_WORK_PERIOD msecs_to_jiffies(300) 39#define BTC_RFK_PATH_MAP GENMASK(3, 0) 40#define BTC_RFK_PHY_MAP GENMASK(5, 4) 41#define BTC_RFK_BAND_MAP GENMASK(7, 6) 42 43enum btc_wl_rfk_state { 44 BTC_WRFK_STOP = 0, 45 BTC_WRFK_START = 1, 46 BTC_WRFK_ONESHOT_START = 2, 47 BTC_WRFK_ONESHOT_STOP = 3, 48}; 49 50enum btc_pri { 51 BTC_PRI_MASK_RX_RESP = 0, 52 BTC_PRI_MASK_TX_RESP, 53 BTC_PRI_MASK_BEACON, 54 BTC_PRI_MASK_RX_CCK, 55 BTC_PRI_MASK_TX_MNGQ, 56 BTC_PRI_MASK_MAX, 57}; 58 59enum btc_bt_trs { 60 BTC_BT_SS_GROUP = 0x0, 61 BTC_BT_TX_GROUP = 0x2, 62 BTC_BT_RX_GROUP = 0x3, 63 BTC_BT_MAX_GROUP, 64}; 65 66enum btc_rssi_st { 67 BTC_RSSI_ST_LOW = 0x0, 68 BTC_RSSI_ST_HIGH, 69 BTC_RSSI_ST_STAY_LOW, 70 BTC_RSSI_ST_STAY_HIGH, 71 BTC_RSSI_ST_MAX 72}; 73 74enum btc_fddt_en { 75 BTC_FDDT_DISABLE, 76 BTC_FDDT_ENABLE, 77}; 78 79#define BTC_RSSI_HIGH(_rssi_) \ 80 ({typeof(_rssi_) __rssi = (_rssi_); \ 81 ((__rssi == BTC_RSSI_ST_HIGH || \ 82 __rssi == BTC_RSSI_ST_STAY_HIGH) ? 1 : 0); }) 83 84#define BTC_RSSI_LOW(_rssi_) \ 85 ({typeof(_rssi_) __rssi = (_rssi_); \ 86 ((__rssi == BTC_RSSI_ST_LOW || \ 87 __rssi == BTC_RSSI_ST_STAY_LOW) ? 1 : 0); }) 88 89#define BTC_RSSI_CHANGE(_rssi_) \ 90 ({typeof(_rssi_) __rssi = (_rssi_); \ 91 ((__rssi == BTC_RSSI_ST_LOW || \ 92 __rssi == BTC_RSSI_ST_HIGH) ? 1 : 0); }) 93 94enum btc_ant { 95 BTC_ANT_SHARED = 0, 96 BTC_ANT_DEDICATED, 97 BTC_ANTTYPE_MAX 98}; 99 100enum btc_bt_btg { 101 BTC_BT_ALONE = 0, 102 BTC_BT_BTG 103}; 104 105enum btc_switch { 106 BTC_SWITCH_INTERNAL = 0, 107 BTC_SWITCH_EXTERNAL 108}; 109 110enum btc_pkt_type { 111 PACKET_DHCP, 112 PACKET_ARP, 113 PACKET_EAPOL, 114 PACKET_EAPOL_END, 115 PACKET_ICMP, 116 PACKET_MAX 117}; 118 119enum btc_bt_mailbox_id { 120 BTC_BTINFO_REPLY = 0x23, 121 BTC_BTINFO_AUTO = 0x27 122}; 123 124enum btc_role_state { 125 BTC_ROLE_START, 126 BTC_ROLE_STOP, 127 BTC_ROLE_CHG_TYPE, 128 BTC_ROLE_MSTS_STA_CONN_START, 129 BTC_ROLE_MSTS_STA_CONN_END, 130 BTC_ROLE_MSTS_STA_DIS_CONN, 131 BTC_ROLE_MSTS_AP_START, 132 BTC_ROLE_MSTS_AP_STOP, 133 BTC_ROLE_STATE_UNKNOWN 134}; 135 136enum btc_rfctrl { 137 BTC_RFCTRL_WL_OFF, 138 BTC_RFCTRL_WL_ON, 139 BTC_RFCTRL_LPS_WL_ON, 140 BTC_RFCTRL_FW_CTRL, 141 BTC_RFCTRL_MAX 142}; 143 144enum btc_lps_state { 145 BTC_LPS_OFF = 0, 146 BTC_LPS_RF_OFF = 1, 147 BTC_LPS_RF_ON = 2 148}; 149 150#define R_BTC_BB_BTG_RX 0x980 151#define R_BTC_BB_PRE_AGC_S1 0x476C 152#define R_BTC_BB_PRE_AGC_S0 0x4688 153 154#define B_BTC_BB_GNT_MUX GENMASK(20, 17) 155#define B_BTC_BB_PRE_AGC_MASK GENMASK(31, 24) 156#define B_BTC_BB_PRE_AGC_VAL BIT(31) 157 158#define BTC_REG_NOTFOUND 0xff 159 160#define R_BTC_ZB_COEX_TBL_0 0xE328 161#define R_BTC_ZB_COEX_TBL_1 0xE32c 162#define R_BTC_ZB_BREAK_TBL 0xE350 163 164enum btc_ant_div_pos { 165 BTC_ANT_DIV_MAIN = 0, 166 BTC_ANT_DIV_AUX = 1, 167}; 168 169enum btc_get_reg_status { 170 BTC_CSTATUS_TXDIV_POS = 0, 171 BTC_CSTATUS_RXDIV_POS = 1, 172 BTC_CSTATUS_BB_GNT_MUX = 2, 173 BTC_CSTATUS_BB_GNT_MUX_MON = 3, 174 BTC_CSTATUS_BB_PRE_AGC = 4, 175 BTC_CSTATUS_BB_PRE_AGC_MON = 5, 176}; 177 178enum btc_preagc_type { 179 BTC_PREAGC_DISABLE, 180 BTC_PREAGC_ENABLE, 181 BTC_PREAGC_BB_FWCTRL, 182 BTC_PREAGC_NOTFOUND, 183}; 184 185enum btc_btgctrl_type { 186 BTC_BTGCTRL_DISABLE, 187 BTC_BTGCTRL_ENABLE, 188 BTC_BTGCTRL_BB_GNT_FWCTRL, 189 BTC_BTGCTRL_BB_GNT_NOTFOUND, 190}; 191 192enum btc_wa_type { 193 BTC_WA_5G_HI_CH_RX = BIT(0), 194 BTC_WA_NULL_AP = BIT(1), 195 BTC_WA_HFP_ZB = BIT(2), /* HFP PTA req bit4 define issue */ 196 BTC_WA_HFP_LAG = BIT(3), /* 52BT WL break BT Rx lag issue */ 197 BTC_WA_INIT_SCAN = BIT(4) /* 52A/C/D init scan move to wl slot WA */ 198}; 199 200enum btc_3cx_type { 201 BTC_3CX_NONE = 0, 202 BTC_3CX_BT2 = BIT(0), 203 BTC_3CX_ZB = BIT(1), 204 BTC_3CX_LTE = BIT(2), 205 BTC_3CX_MAX, 206}; 207 208enum btc_chip_feature { 209 BTC_FEAT_PTA_ONOFF_CTRL = BIT(0), /* on/off ctrl by HW (not 0x73[2]) */ 210 BTC_FEAT_NONBTG_GWL_THRU = BIT(1), /* non-BTG GNT_WL!=0 if GNT_BT = 1 */ 211 BTC_FEAT_WLAN_ACT_MUX = BIT(2), /* separate wlan_act/gnt mux */ 212 BTC_FEAT_NEW_BBAPI_FLOW = BIT(3), /* new btg_ctrl/pre_agc_ctrl */ 213 BTC_FEAT_MLO_SUPPORT = BIT(4), 214 BTC_FEAT_H2C_MACRO = BIT(5), 215}; 216 217enum btc_wl_mode { 218 BTC_WL_MODE_11B = 0, 219 BTC_WL_MODE_11A = 1, 220 BTC_WL_MODE_11G = 2, 221 BTC_WL_MODE_HT = 3, 222 BTC_WL_MODE_VHT = 4, 223 BTC_WL_MODE_HE = 5, 224 BTC_WL_MODE_NUM, 225}; 226 227enum btc_mlo_rf_combin { 228 BTC_MLO_RF_2_PLUS_0 = 0, 229 BTC_MLO_RF_0_PLUS_2 = 1, 230 BTC_MLO_RF_1_PLUS_1 = 2, 231 BTC_MLO_RF_2_PLUS_2 = 3, 232}; 233 234enum btc_wl_gpio_debug { 235 BTC_DBG_GNT_BT = 0, 236 BTC_DBG_GNT_WL = 1, 237 BTC_DBG_BCN_EARLY = 2, 238 BTC_DBG_WL_NULL0 = 3, 239 BTC_DBG_WL_NULL1 = 4, 240 BTC_DBG_WL_RXISR = 5, 241 BTC_DBG_TDMA_ENTRY = 6, 242 BTC_DBG_A2DP_EMPTY = 7, 243 BTC_DBG_BT_RETRY = 8, 244 BTC_DBG_BT_RELINK = 9, 245 BTC_DBG_SLOT_WL = 10, 246 BTC_DBG_SLOT_BT = 11, 247 BTC_DBG_WL_ERR = 12, 248 BTC_DBG_WL_OK = 13, 249 BTC_DBG_SLOT_B2W = 14, 250 BTC_DBG_SLOT_W1 = 15, 251 BTC_DBG_SLOT_W2 = 16, 252 BTC_DBG_SLOT_W2B = 17, 253 BTC_DBG_SLOT_B1 = 18, 254 BTC_DBG_SLOT_B2 = 19, 255 BTC_DBG_SLOT_B3 = 20, 256 BTC_DBG_SLOT_B4 = 21, 257 BTC_DBG_SLOT_LK = 22, 258 BTC_DBG_SLOT_E2G = 23, 259 BTC_DBG_SLOT_E5G = 24, 260 BTC_DBG_SLOT_EBT = 25, 261 BTC_DBG_SLOT_WLK = 26, 262 BTC_DBG_SLOT_B1FDD = 27, 263 BTC_DBG_BT_CHANGE = 28, 264 BTC_DBG_WL_CCA = 29, 265 BTC_DBG_BT_LEAUDIO = 30, 266 BTC_DBG_USER_DEF = 31, 267}; 268 269void rtw89_btc_ntfy_poweron(struct rtw89_dev *rtwdev); 270void rtw89_btc_ntfy_poweroff(struct rtw89_dev *rtwdev); 271void rtw89_btc_ntfy_init(struct rtw89_dev *rtwdev, u8 mode); 272void rtw89_btc_ntfy_scan_start(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 273void rtw89_btc_ntfy_scan_finish(struct rtw89_dev *rtwdev, u8 phy_idx); 274void rtw89_btc_ntfy_switch_band(struct rtw89_dev *rtwdev, u8 phy_idx, u8 band); 275void rtw89_btc_ntfy_specific_packet(struct rtw89_dev *rtwdev, 276 enum btc_pkt_type pkt_type); 277void rtw89_btc_ntfy_eapol_packet_work(struct wiphy *wiphy, struct wiphy_work *work); 278void rtw89_btc_ntfy_arp_packet_work(struct wiphy *wiphy, struct wiphy_work *work); 279void rtw89_btc_ntfy_dhcp_packet_work(struct wiphy *wiphy, struct wiphy_work *work); 280void rtw89_btc_ntfy_icmp_packet_work(struct wiphy *wiphy, struct wiphy_work *work); 281void rtw89_btc_ntfy_role_info(struct rtw89_dev *rtwdev, 282 struct rtw89_vif_link *rtwvif_link, 283 struct rtw89_sta_link *rtwsta_link, 284 enum btc_role_state state); 285void rtw89_btc_ntfy_radio_state(struct rtw89_dev *rtwdev, enum btc_rfctrl rf_state); 286void rtw89_btc_ntfy_wl_rfk(struct rtw89_dev *rtwdev, u8 phy_map, 287 enum btc_wl_rfk_type type, 288 enum btc_wl_rfk_state state); 289void rtw89_btc_ntfy_wl_sta(struct rtw89_dev *rtwdev); 290void rtw89_btc_c2h_handle(struct rtw89_dev *rtwdev, struct sk_buff *skb, 291 u32 len, u8 class, u8 func); 292ssize_t rtw89_btc_dump_info(struct rtw89_dev *rtwdev, char *buf, size_t bufsz); 293void rtw89_coex_act1_work(struct wiphy *wiphy, struct wiphy_work *work); 294void rtw89_coex_bt_devinfo_work(struct wiphy *wiphy, struct wiphy_work *work); 295void rtw89_coex_rfk_chk_work(struct wiphy *wiphy, struct wiphy_work *work); 296void rtw89_coex_power_on(struct rtw89_dev *rtwdev); 297void rtw89_btc_set_policy(struct rtw89_dev *rtwdev, u16 policy_type); 298void rtw89_btc_set_policy_v1(struct rtw89_dev *rtwdev, u16 policy_type); 299void rtw89_coex_recognize_ver(struct rtw89_dev *rtwdev); 300void rtw89_btc_ntfy_preserve_bt_time(struct rtw89_dev *rtwdev, u32 ms); 301void rtw89_btc_ntfy_conn_rfk(struct rtw89_dev *rtwdev, bool state); 302 303static inline u8 rtw89_btc_phymap(struct rtw89_dev *rtwdev, 304 enum rtw89_phy_idx phy_idx, 305 enum rtw89_rf_path_bit paths, 306 enum rtw89_chanctx_idx chanctx_idx) 307{ 308 const struct rtw89_chan *chan = rtw89_chan_get(rtwdev, chanctx_idx); 309 u8 phy_map; 310 311 phy_map = FIELD_PREP(BTC_RFK_PATH_MAP, paths) | 312 FIELD_PREP(BTC_RFK_PHY_MAP, BIT(phy_idx)) | 313 FIELD_PREP(BTC_RFK_BAND_MAP, chan->band_type); 314 315 return phy_map; 316} 317 318static inline u8 rtw89_btc_path_phymap(struct rtw89_dev *rtwdev, 319 enum rtw89_phy_idx phy_idx, 320 enum rtw89_rf_path path, 321 enum rtw89_chanctx_idx chanctx_idx) 322{ 323 return rtw89_btc_phymap(rtwdev, phy_idx, BIT(path), chanctx_idx); 324} 325 326/* return bt req len in TU */ 327static inline u16 rtw89_coex_query_bt_req_len(struct rtw89_dev *rtwdev, 328 enum rtw89_phy_idx phy_idx) 329{ 330 struct rtw89_btc *btc = &rtwdev->btc; 331 332 return btc->bt_req_len; 333} 334 335static inline u32 rtw89_get_antpath_type(u8 phy_map, u8 type) 336{ 337 return ((phy_map << 8) + type); 338} 339 340static inline 341void _slot_set_le(struct rtw89_btc *btc, u8 sid, __le16 dura, __le32 tbl, __le16 type) 342{ 343 if (btc->ver->fcxslots == 1) { 344 btc->dm.slot.v1[sid].dur = dura; 345 btc->dm.slot.v1[sid].cxtbl = tbl; 346 btc->dm.slot.v1[sid].cxtype = type; 347 } else if (btc->ver->fcxslots == 7) { 348 btc->dm.slot.v7[sid].dur = dura; 349 btc->dm.slot.v7[sid].cxtype = type; 350 btc->dm.slot.v7[sid].cxtbl = tbl; 351 } 352} 353 354static inline 355void _slot_set(struct rtw89_btc *btc, u8 sid, u16 dura, u32 tbl, u16 type) 356{ 357 _slot_set_le(btc, sid, cpu_to_le16(dura), cpu_to_le32(tbl), cpu_to_le16(type)); 358} 359 360static inline 361void _slot_set_dur(struct rtw89_btc *btc, u8 sid, u16 dura) 362{ 363 if (btc->ver->fcxslots == 1) 364 btc->dm.slot.v1[sid].dur = cpu_to_le16(dura); 365 else if (btc->ver->fcxslots == 7) 366 btc->dm.slot.v7[sid].dur = cpu_to_le16(dura); 367} 368 369static inline 370void _slot_set_type(struct rtw89_btc *btc, u8 sid, u16 type) 371{ 372 if (btc->ver->fcxslots == 1) 373 btc->dm.slot.v1[sid].cxtype = cpu_to_le16(type); 374 else if (btc->ver->fcxslots == 7) 375 btc->dm.slot.v7[sid].cxtype = cpu_to_le16(type); 376} 377 378static inline 379void _slot_set_tbl(struct rtw89_btc *btc, u8 sid, u32 tbl) 380{ 381 if (btc->ver->fcxslots == 1) 382 btc->dm.slot.v1[sid].cxtbl = cpu_to_le32(tbl); 383 else if (btc->ver->fcxslots == 7) 384 btc->dm.slot.v7[sid].cxtbl = cpu_to_le32(tbl); 385} 386 387#endif
~/
Read-only file preview.