1 /* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */ 2 /* Copyright(c) 2019-2020 Realtek Corporation 3 */ 4 5 #ifndef __RTW89_FW_H__ 6 #define __RTW89_FW_H__ 7 8 #include "core.h" 9 10 enum rtw89_fw_dl_status { 11 RTW89_FWDL_INITIAL_STATE = 0, 12 RTW89_FWDL_FWDL_ONGOING = 1, 13 RTW89_FWDL_CHECKSUM_FAIL = 2, 14 RTW89_FWDL_SECURITY_FAIL = 3, 15 RTW89_FWDL_CV_NOT_MATCH = 4, 16 RTW89_FWDL_RSVD0 = 5, 17 RTW89_FWDL_WCPU_FWDL_RDY = 6, 18 RTW89_FWDL_WCPU_FW_INIT_RDY = 7 19 }; 20 21 struct rtw89_c2hreg_hdr { 22 u32 w0; 23 }; 24 25 #define RTW89_C2HREG_HDR_FUNC_MASK GENMASK(6, 0) 26 #define RTW89_C2HREG_HDR_ACK BIT(7) 27 #define RTW89_C2HREG_HDR_LEN_MASK GENMASK(11, 8) 28 #define RTW89_C2HREG_HDR_SEQ_MASK GENMASK(15, 12) 29 30 struct rtw89_c2hreg_phycap { 31 u32 w0; 32 u32 w1; 33 u32 w2; 34 u32 w3; 35 } __packed; 36 37 #define RTW89_C2HREG_PHYCAP_W0_FUNC GENMASK(6, 0) 38 #define RTW89_C2HREG_PHYCAP_W0_ACK BIT(7) 39 #define RTW89_C2HREG_PHYCAP_W0_LEN GENMASK(11, 8) 40 #define RTW89_C2HREG_PHYCAP_W0_SEQ GENMASK(15, 12) 41 #define RTW89_C2HREG_PHYCAP_W0_RX_NSS GENMASK(23, 16) 42 #define RTW89_C2HREG_PHYCAP_W0_BW GENMASK(31, 24) 43 #define RTW89_C2HREG_PHYCAP_W1_TX_NSS GENMASK(7, 0) 44 #define RTW89_C2HREG_PHYCAP_W1_PROT GENMASK(15, 8) 45 #define RTW89_C2HREG_PHYCAP_W1_NIC GENMASK(23, 16) 46 #define RTW89_C2HREG_PHYCAP_W1_WL_FUNC GENMASK(31, 24) 47 #define RTW89_C2HREG_PHYCAP_W2_HW_TYPE GENMASK(7, 0) 48 #define RTW89_C2HREG_PHYCAP_W3_ANT_TX_NUM GENMASK(15, 8) 49 #define RTW89_C2HREG_PHYCAP_W3_ANT_RX_NUM GENMASK(23, 16) 50 #define RTW89_C2HREG_PHYCAP_W3_BAND_SEL GENMASK(31, 24) 51 52 #define RTW89_C2HREG_PHYCAP_P1_W0_B1_RX_NSS GENMASK(23, 16) 53 #define RTW89_C2HREG_PHYCAP_P1_W0_B1_BW GENMASK(31, 24) 54 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_TX_NSS GENMASK(7, 0) 55 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_TX_NUM GENMASK(15, 8) 56 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_ANT_RX_NUM GENMASK(23, 16) 57 #define RTW89_C2HREG_PHYCAP_P1_W1_B1_BAND_SEL GENMASK(31, 24) 58 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM GENMASK(7, 0) 59 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_256 0x1 60 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_1024 0x2 61 #define RTW89_C2HREG_PHYCAP_P1_W2_QAM_4096 0x3 62 #define RTW89_C2HREG_PHYCAP_P1_W2_B1_QAM GENMASK(15, 8) 63 64 #define RTW89_C2HREG_AOAC_RPT_1_W0_KEY_IDX GENMASK(23, 16) 65 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_0 GENMASK(7, 0) 66 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_1 GENMASK(15, 8) 67 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_2 GENMASK(23, 16) 68 #define RTW89_C2HREG_AOAC_RPT_1_W1_IV_3 GENMASK(31, 24) 69 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_4 GENMASK(7, 0) 70 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_5 GENMASK(15, 8) 71 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_6 GENMASK(23, 16) 72 #define RTW89_C2HREG_AOAC_RPT_1_W2_IV_7 GENMASK(31, 24) 73 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_0 GENMASK(7, 0) 74 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_1 GENMASK(15, 8) 75 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_2 GENMASK(23, 16) 76 #define RTW89_C2HREG_AOAC_RPT_1_W3_PTK_IV_3 GENMASK(31, 24) 77 #define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_4 GENMASK(23, 16) 78 #define RTW89_C2HREG_AOAC_RPT_2_W0_PTK_IV_5 GENMASK(31, 24) 79 #define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_6 GENMASK(7, 0) 80 #define RTW89_C2HREG_AOAC_RPT_2_W1_PTK_IV_7 GENMASK(15, 8) 81 #define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_0 GENMASK(23, 16) 82 #define RTW89_C2HREG_AOAC_RPT_2_W1_IGTK_IPN_IV_1 GENMASK(31, 24) 83 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_2 GENMASK(7, 0) 84 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_3 GENMASK(15, 8) 85 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_4 GENMASK(23, 16) 86 #define RTW89_C2HREG_AOAC_RPT_2_W2_IGTK_IPN_IV_5 GENMASK(31, 24) 87 #define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_6 GENMASK(7, 0) 88 #define RTW89_C2HREG_AOAC_RPT_2_W3_IGTK_IPN_IV_7 GENMASK(15, 8) 89 90 struct rtw89_h2creg_hdr { 91 u32 w0; 92 }; 93 94 #define RTW89_H2CREG_HDR_FUNC_MASK GENMASK(6, 0) 95 #define RTW89_H2CREG_HDR_LEN_MASK GENMASK(11, 8) 96 97 struct rtw89_h2creg_sch_tx_en { 98 u32 w0; 99 u32 w1; 100 } __packed; 101 102 #define RTW89_H2CREG_SCH_TX_EN_W0_EN GENMASK(31, 16) 103 #define RTW89_H2CREG_SCH_TX_EN_W1_MASK GENMASK(15, 0) 104 #define RTW89_H2CREG_SCH_TX_EN_W1_BAND BIT(16) 105 106 #define RTW89_H2CREG_WOW_CPUIO_RX_CTRL_EN GENMASK(23, 16) 107 108 #define RTW89_H2CREG_GET_FEATURE_PART_NUM GENMASK(23, 16) 109 110 #define RTW89_H2CREG_MAX 4 111 #define RTW89_C2HREG_MAX 4 112 #define RTW89_C2HREG_HDR_LEN 2 113 #define RTW89_H2CREG_HDR_LEN 2 114 #define RTW89_C2H_TIMEOUT 1000000 115 struct rtw89_mac_c2h_info { 116 u8 id; 117 u8 content_len; 118 union { 119 u32 c2hreg[RTW89_C2HREG_MAX]; 120 struct rtw89_c2hreg_hdr hdr; 121 struct rtw89_c2hreg_phycap phycap; 122 } u; 123 }; 124 125 struct rtw89_mac_h2c_info { 126 u8 id; 127 u8 content_len; 128 union { 129 u32 h2creg[RTW89_H2CREG_MAX]; 130 struct rtw89_h2creg_hdr hdr; 131 struct rtw89_h2creg_sch_tx_en sch_tx_en; 132 } u; 133 }; 134 135 enum rtw89_mac_h2c_type { 136 RTW89_FWCMD_H2CREG_FUNC_H2CREG_LB = 0, 137 RTW89_FWCMD_H2CREG_FUNC_CNSL_CMD, 138 RTW89_FWCMD_H2CREG_FUNC_FWERR, 139 RTW89_FWCMD_H2CREG_FUNC_GET_FEATURE, 140 RTW89_FWCMD_H2CREG_FUNC_GETPKT_INFORM, 141 RTW89_FWCMD_H2CREG_FUNC_SCH_TX_EN, 142 RTW89_FWCMD_H2CREG_FUNC_WOW_TRX_STOP, 143 RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_1, 144 RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_2, 145 RTW89_FWCMD_H2CREG_FUNC_AOAC_RPT_3_REQ, 146 RTW89_FWCMD_H2CREG_FUNC_WOW_CPUIO_RX_CTRL, 147 }; 148 149 enum rtw89_mac_c2h_type { 150 RTW89_FWCMD_C2HREG_FUNC_C2HREG_LB = 0, 151 RTW89_FWCMD_C2HREG_FUNC_ERR_RPT, 152 RTW89_FWCMD_C2HREG_FUNC_ERR_MSG, 153 RTW89_FWCMD_C2HREG_FUNC_PHY_CAP, 154 RTW89_FWCMD_C2HREG_FUNC_TX_PAUSE_RPT, 155 RTW89_FWCMD_C2HREG_FUNC_WOW_CPUIO_RX_ACK = 0xA, 156 RTW89_FWCMD_C2HREG_FUNC_PHY_CAP_PART1 = 0xC, 157 RTW89_FWCMD_C2HREG_FUNC_NULL = 0xFF, 158 }; 159 160 enum rtw89_fw_c2h_category { 161 RTW89_C2H_CAT_TEST, 162 RTW89_C2H_CAT_MAC, 163 RTW89_C2H_CAT_OUTSRC, 164 }; 165 166 enum rtw89_fw_log_level { 167 RTW89_FW_LOG_LEVEL_OFF, 168 RTW89_FW_LOG_LEVEL_CRT, 169 RTW89_FW_LOG_LEVEL_SER, 170 RTW89_FW_LOG_LEVEL_WARN, 171 RTW89_FW_LOG_LEVEL_LOUD, 172 RTW89_FW_LOG_LEVEL_TR, 173 }; 174 175 enum rtw89_fw_log_path { 176 RTW89_FW_LOG_LEVEL_UART, 177 RTW89_FW_LOG_LEVEL_C2H, 178 RTW89_FW_LOG_LEVEL_SNI, 179 }; 180 181 enum rtw89_fw_log_comp { 182 RTW89_FW_LOG_COMP_VER, 183 RTW89_FW_LOG_COMP_INIT, 184 RTW89_FW_LOG_COMP_TASK, 185 RTW89_FW_LOG_COMP_CNS, 186 RTW89_FW_LOG_COMP_H2C, 187 RTW89_FW_LOG_COMP_C2H, 188 RTW89_FW_LOG_COMP_TX, 189 RTW89_FW_LOG_COMP_RX, 190 RTW89_FW_LOG_COMP_IPSEC, 191 RTW89_FW_LOG_COMP_TIMER, 192 RTW89_FW_LOG_COMP_DBGPKT, 193 RTW89_FW_LOG_COMP_PS, 194 RTW89_FW_LOG_COMP_ERROR, 195 RTW89_FW_LOG_COMP_WOWLAN, 196 RTW89_FW_LOG_COMP_SECURE_BOOT, 197 RTW89_FW_LOG_COMP_BTC, 198 RTW89_FW_LOG_COMP_BB, 199 RTW89_FW_LOG_COMP_TWT, 200 RTW89_FW_LOG_COMP_RF, 201 RTW89_FW_LOG_COMP_MCC = 20, 202 RTW89_FW_LOG_COMP_MLO = 26, 203 RTW89_FW_LOG_COMP_SCAN = 28, 204 }; 205 206 enum rtw89_pkt_offload_op { 207 RTW89_PKT_OFLD_OP_ADD, 208 RTW89_PKT_OFLD_OP_DEL, 209 RTW89_PKT_OFLD_OP_READ, 210 211 NUM_OF_RTW89_PKT_OFFLOAD_OP, 212 }; 213 214 #define RTW89_PKT_OFLD_WAIT_TAG(pkt_id, pkt_op) \ 215 ((pkt_id) * NUM_OF_RTW89_PKT_OFFLOAD_OP + (pkt_op)) 216 217 enum rtw89_scanofld_notify_reason { 218 RTW89_SCAN_DWELL_NOTIFY, 219 RTW89_SCAN_PRE_TX_NOTIFY, 220 RTW89_SCAN_POST_TX_NOTIFY, 221 RTW89_SCAN_ENTER_CH_NOTIFY, 222 RTW89_SCAN_LEAVE_CH_NOTIFY, 223 RTW89_SCAN_END_SCAN_NOTIFY, 224 RTW89_SCAN_REPORT_NOTIFY, 225 RTW89_SCAN_CHKPT_NOTIFY, 226 RTW89_SCAN_ENTER_OP_NOTIFY, 227 RTW89_SCAN_LEAVE_OP_NOTIFY, 228 }; 229 230 enum rtw89_scanofld_status { 231 RTW89_SCAN_STATUS_NOTIFY, 232 RTW89_SCAN_STATUS_SUCCESS, 233 RTW89_SCAN_STATUS_FAIL, 234 }; 235 236 enum rtw89_chan_type { 237 RTW89_CHAN_OPERATE = 0, 238 RTW89_CHAN_ACTIVE, 239 RTW89_CHAN_DFS, 240 }; 241 242 enum rtw89_p2pps_action { 243 RTW89_P2P_ACT_INIT = 0, 244 RTW89_P2P_ACT_UPDATE = 1, 245 RTW89_P2P_ACT_REMOVE = 2, 246 RTW89_P2P_ACT_TERMINATE = 3, 247 }; 248 249 #define RTW89_DEFAULT_CQM_HYST 4 250 #define RTW89_DEFAULT_CQM_THOLD -70 251 252 enum rtw89_bcn_fltr_offload_mode { 253 RTW89_BCN_FLTR_OFFLOAD_MODE_0 = 0, 254 RTW89_BCN_FLTR_OFFLOAD_MODE_1, 255 RTW89_BCN_FLTR_OFFLOAD_MODE_2, 256 RTW89_BCN_FLTR_OFFLOAD_MODE_3, 257 258 RTW89_BCN_FLTR_OFFLOAD_MODE_DEFAULT = RTW89_BCN_FLTR_OFFLOAD_MODE_0, 259 }; 260 261 enum rtw89_bcn_fltr_type { 262 RTW89_BCN_FLTR_BEACON_LOSS, 263 RTW89_BCN_FLTR_RSSI, 264 RTW89_BCN_FLTR_NOTIFY, 265 }; 266 267 enum rtw89_bcn_fltr_rssi_event { 268 RTW89_BCN_FLTR_RSSI_NOT_CHANGED, 269 RTW89_BCN_FLTR_RSSI_HIGH, 270 RTW89_BCN_FLTR_RSSI_LOW, 271 }; 272 273 #define FWDL_SECTION_MAX_NUM 10 274 #define FWDL_SECTION_CHKSUM_LEN 8 275 #define FWDL_SECTION_PER_PKT_LEN 2020 276 277 struct rtw89_fw_hdr_section_info { 278 u8 redl; 279 const u8 *addr; 280 u32 len; 281 u32 len_override; 282 u32 dladdr; 283 u32 mssc; 284 u8 type; 285 bool ignore; 286 const u8 *key_addr; 287 u32 key_len; 288 u32 key_idx; 289 }; 290 291 struct rtw89_fw_bin_info { 292 u8 section_num; 293 u32 hdr_len; 294 bool dynamic_hdr_en; 295 u32 dynamic_hdr_len; 296 u8 idmem_share_mode; 297 bool dsp_checksum; 298 bool secure_section_exist; 299 struct rtw89_fw_hdr_section_info section_info[FWDL_SECTION_MAX_NUM]; 300 }; 301 302 struct rtw89_fw_macid_pause_grp { 303 __le32 pause_grp[4]; 304 __le32 mask_grp[4]; 305 } __packed; 306 307 struct rtw89_fw_macid_pause_sleep_grp { 308 struct { 309 __le32 pause_grp[4]; 310 __le32 pause_mask_grp[4]; 311 __le32 sleep_grp[4]; 312 __le32 sleep_mask_grp[4]; 313 } __packed n[4]; 314 } __packed; 315 316 #define RTW89_H2C_MAX_SIZE 2048 317 #define RTW89_CHANNEL_TIME 45 318 #define RTW89_CHANNEL_TIME_6G 20 319 #define RTW89_DFS_CHAN_TIME 105 320 #define RTW89_OFF_CHAN_TIME 100 321 #define RTW89_DWELL_TIME 20 322 #define RTW89_DWELL_TIME_6G 10 323 #define RTW89_SCAN_WIDTH 0 324 #define RTW89_SCANOFLD_MAX_SSID 8 325 #define RTW89_SCANOFLD_MAX_IE_LEN 512 326 #define RTW89_SCANOFLD_PKT_NONE 0xFF 327 #define RTW89_SCANOFLD_DEBUG_MASK 0x1F 328 #define RTW89_CHAN_INVALID 0xFF 329 #define RTW89_MAC_CHINFO_SIZE 28 330 #define RTW89_MAC_CHINFO_SIZE_BE 32 331 #define RTW89_SCAN_LIST_GUARD 4 332 #define RTW89_SCAN_LIST_LIMIT(size) \ 333 ((RTW89_H2C_MAX_SIZE / (size)) - RTW89_SCAN_LIST_GUARD) 334 #define RTW89_SCAN_LIST_LIMIT_AX RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE) 335 #define RTW89_SCAN_LIST_LIMIT_BE RTW89_SCAN_LIST_LIMIT(RTW89_MAC_CHINFO_SIZE_BE) 336 337 #define RTW89_BCN_LOSS_CNT 60 338 339 struct rtw89_mac_chinfo_ax { 340 u8 period; 341 u8 dwell_time; 342 u8 central_ch; 343 u8 pri_ch; 344 u8 bw:3; 345 u8 notify_action:5; 346 u8 num_pkt:4; 347 u8 tx_pkt:1; 348 u8 pause_data:1; 349 u8 ch_band:2; 350 u8 probe_id; 351 u8 dfs_ch:1; 352 u8 tx_null:1; 353 u8 rand_seq_num:1; 354 u8 cfg_tx_pwr:1; 355 u8 rsvd0: 4; 356 u8 pkt_id[RTW89_SCANOFLD_MAX_SSID]; 357 u16 tx_pwr_idx; 358 u8 rsvd1; 359 struct list_head list; 360 bool is_psc; 361 }; 362 363 struct rtw89_mac_chinfo_be { 364 u8 period; 365 u8 dwell_time; 366 u8 central_ch; 367 u8 pri_ch; 368 u8 bw:3; 369 u8 ch_band:2; 370 u8 dfs_ch:1; 371 u8 pause_data:1; 372 u8 tx_null:1; 373 u8 rand_seq_num:1; 374 u8 notify_action:5; 375 u8 probe_id; 376 u8 leave_crit; 377 u8 chkpt_timer; 378 u8 leave_time; 379 u8 leave_th; 380 u16 tx_pkt_ctrl; 381 u8 pkt_id[RTW89_SCANOFLD_MAX_SSID]; 382 u8 sw_def; 383 u16 fw_probe0_ssids; 384 u16 fw_probe0_shortssids; 385 u16 fw_probe0_bssids; 386 387 struct list_head list; 388 bool is_psc; 389 }; 390 391 struct rtw89_pktofld_info { 392 struct list_head list; 393 u8 id; 394 bool wildcard_6ghz; 395 396 /* Below fields are for WiFi 6 chips 6 GHz RNR use only */ 397 u8 ssid[IEEE80211_MAX_SSID_LEN]; 398 u8 ssid_len; 399 u8 bssid[ETH_ALEN]; 400 u16 channel_6ghz; 401 bool cancel; 402 }; 403 404 struct rtw89_h2c_ra { 405 __le32 w0; 406 __le32 w1; 407 __le32 w2; 408 __le32 w3; 409 } __packed; 410 411 #define RTW89_H2C_RA_W0_IS_DIS BIT(0) 412 #define RTW89_H2C_RA_W0_MODE GENMASK(5, 1) 413 #define RTW89_H2C_RA_W0_BW_CAP GENMASK(7, 6) 414 #define RTW89_H2C_RA_W0_MACID GENMASK(15, 8) 415 #define RTW89_H2C_RA_W0_DCM BIT(16) 416 #define RTW89_H2C_RA_W0_ER BIT(17) 417 #define RTW89_H2C_RA_W0_INIT_RATE_LV GENMASK(19, 18) 418 #define RTW89_H2C_RA_W0_UPD_ALL BIT(20) 419 #define RTW89_H2C_RA_W0_SGI BIT(21) 420 #define RTW89_H2C_RA_W0_LDPC BIT(22) 421 #define RTW89_H2C_RA_W0_STBC BIT(23) 422 #define RTW89_H2C_RA_W0_SS_NUM GENMASK(26, 24) 423 #define RTW89_H2C_RA_W0_GILTF GENMASK(29, 27) 424 #define RTW89_H2C_RA_W0_UPD_BW_NSS_MASK BIT(30) 425 #define RTW89_H2C_RA_W0_UPD_MASK BIT(31) 426 #define RTW89_H2C_RA_W1_RAMASK_LO32 GENMASK(31, 0) 427 #define RTW89_H2C_RA_W2_RAMASK_HI32 GENMASK(30, 0) 428 #define RTW89_H2C_RA_W2_BFEE_CSI_CTL BIT(31) 429 #define RTW89_H2C_RA_W3_BAND_NUM GENMASK(7, 0) 430 #define RTW89_H2C_RA_W3_RA_CSI_RATE_EN BIT(8) 431 #define RTW89_H2C_RA_W3_FIXED_CSI_RATE_EN BIT(9) 432 #define RTW89_H2C_RA_W3_CR_TBL_SEL BIT(10) 433 #define RTW89_H2C_RA_W3_FIX_GILTF_EN BIT(11) 434 #define RTW89_H2C_RA_W3_FIX_GILTF GENMASK(14, 12) 435 #define RTW89_H2C_RA_W3_FIXED_CSI_MCS_SS_IDX GENMASK(23, 16) 436 #define RTW89_H2C_RA_W3_FIXED_CSI_MODE GENMASK(25, 24) 437 #define RTW89_H2C_RA_W3_FIXED_CSI_GI_LTF GENMASK(28, 26) 438 #define RTW89_H2C_RA_W3_FIXED_CSI_BW GENMASK(31, 29) 439 440 struct rtw89_h2c_ra_v1 { 441 struct rtw89_h2c_ra v0; 442 __le32 w4; 443 __le32 w5; 444 } __packed; 445 446 #define RTW89_H2C_RA_V1_W4_MODE_EHT GENMASK(6, 0) 447 #define RTW89_H2C_RA_V1_W4_BW_EHT GENMASK(10, 8) 448 #define RTW89_H2C_RA_V1_W4_RAMASK_UHL16 GENMASK(31, 16) 449 #define RTW89_H2C_RA_V1_W5_RAMASK_UHH16 GENMASK(15, 0) 450 451 static inline void RTW89_SET_FWCMD_SEC_IDX(void *cmd, u32 val) 452 { 453 le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(7, 0)); 454 } 455 456 static inline void RTW89_SET_FWCMD_SEC_OFFSET(void *cmd, u32 val) 457 { 458 le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(15, 8)); 459 } 460 461 static inline void RTW89_SET_FWCMD_SEC_LEN(void *cmd, u32 val) 462 { 463 le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(23, 16)); 464 } 465 466 static inline void RTW89_SET_FWCMD_SEC_TYPE(void *cmd, u32 val) 467 { 468 le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(3, 0)); 469 } 470 471 static inline void RTW89_SET_FWCMD_SEC_EXT_KEY(void *cmd, u32 val) 472 { 473 le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(4)); 474 } 475 476 static inline void RTW89_SET_FWCMD_SEC_SPP_MODE(void *cmd, u32 val) 477 { 478 le32p_replace_bits((__le32 *)(cmd) + 0x01, val, BIT(5)); 479 } 480 481 static inline void RTW89_SET_FWCMD_SEC_KEY0(void *cmd, u32 val) 482 { 483 le32p_replace_bits((__le32 *)(cmd) + 0x02, val, GENMASK(31, 0)); 484 } 485 486 static inline void RTW89_SET_FWCMD_SEC_KEY1(void *cmd, u32 val) 487 { 488 le32p_replace_bits((__le32 *)(cmd) + 0x03, val, GENMASK(31, 0)); 489 } 490 491 static inline void RTW89_SET_FWCMD_SEC_KEY2(void *cmd, u32 val) 492 { 493 le32p_replace_bits((__le32 *)(cmd) + 0x04, val, GENMASK(31, 0)); 494 } 495 496 static inline void RTW89_SET_FWCMD_SEC_KEY3(void *cmd, u32 val) 497 { 498 le32p_replace_bits((__le32 *)(cmd) + 0x05, val, GENMASK(31, 0)); 499 } 500 501 static inline void RTW89_SET_EDCA_SEL(void *cmd, u32 val) 502 { 503 le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(1, 0)); 504 } 505 506 static inline void RTW89_SET_EDCA_BAND(void *cmd, u32 val) 507 { 508 le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(3)); 509 } 510 511 static inline void RTW89_SET_EDCA_WMM(void *cmd, u32 val) 512 { 513 le32p_replace_bits((__le32 *)(cmd) + 0x00, val, BIT(4)); 514 } 515 516 static inline void RTW89_SET_EDCA_AC(void *cmd, u32 val) 517 { 518 le32p_replace_bits((__le32 *)(cmd) + 0x00, val, GENMASK(6, 5)); 519 } 520 521 static inline void RTW89_SET_EDCA_PARAM(void *cmd, u32 val) 522 { 523 le32p_replace_bits((__le32 *)(cmd) + 0x01, val, GENMASK(31, 0)); 524 } 525 #define FW_EDCA_PARAM_TXOPLMT_MSK GENMASK(26, 16) 526 #define FW_EDCA_PARAM_CWMAX_MSK GENMASK(15, 12) 527 #define FW_EDCA_PARAM_CWMIN_MSK GENMASK(11, 8) 528 #define FW_EDCA_PARAM_AIFS_MSK GENMASK(7, 0) 529 530 #define FWDL_SECURITY_SECTION_TYPE 9 531 #define FWDL_SECURITY_SIGLEN 512 532 #define FWDL_SECURITY_CHKSUM_LEN 8 533 534 struct rtw89_fw_dynhdr_sec { 535 __le32 w0; 536 u8 content[]; 537 } __packed; 538 539 struct rtw89_fw_dynhdr_hdr { 540 __le32 hdr_len; 541 __le32 setcion_count; 542 /* struct rtw89_fw_dynhdr_sec (nested flexible structures) */ 543 } __packed; 544 545 struct rtw89_fw_hdr_section { 546 __le32 w0; 547 __le32 w1; 548 __le32 w2; 549 __le32 w3; 550 } __packed; 551 552 #define FWSECTION_HDR_W0_DL_ADDR GENMASK(31, 0) 553 #define FWSECTION_HDR_W1_METADATA GENMASK(31, 24) 554 #define FWSECTION_HDR_W1_SECTIONTYPE GENMASK(27, 24) 555 #define FWSECTION_HDR_W1_SEC_SIZE GENMASK(23, 0) 556 #define FWSECTION_HDR_W1_CHECKSUM BIT(28) 557 #define FWSECTION_HDR_W1_REDL BIT(29) 558 #define FWSECTION_HDR_W2_MSSC GENMASK(31, 0) 559 560 struct rtw89_fw_hdr { 561 __le32 w0; 562 __le32 w1; 563 __le32 w2; 564 __le32 w3; 565 __le32 w4; 566 __le32 w5; 567 __le32 w6; 568 __le32 w7; 569 struct rtw89_fw_hdr_section sections[]; 570 /* struct rtw89_fw_dynhdr_hdr (optional) */ 571 } __packed; 572 573 #define FW_HDR_W1_MAJOR_VERSION GENMASK(7, 0) 574 #define FW_HDR_W1_MINOR_VERSION GENMASK(15, 8) 575 #define FW_HDR_W1_SUBVERSION GENMASK(23, 16) 576 #define FW_HDR_W1_SUBINDEX GENMASK(31, 24) 577 #define FW_HDR_W2_COMMITID GENMASK(31, 0) 578 #define FW_HDR_W3_LEN GENMASK(23, 16) 579 #define FW_HDR_W3_HDR_VER GENMASK(31, 24) 580 #define FW_HDR_W4_MONTH GENMASK(7, 0) 581 #define FW_HDR_W4_DATE GENMASK(15, 8) 582 #define FW_HDR_W4_HOUR GENMASK(23, 16) 583 #define FW_HDR_W4_MIN GENMASK(31, 24) 584 #define FW_HDR_W5_YEAR GENMASK(31, 0) 585 #define FW_HDR_W6_SEC_NUM GENMASK(15, 8) 586 #define FW_HDR_W7_PART_SIZE GENMASK(15, 0) 587 #define FW_HDR_W7_DYN_HDR BIT(16) 588 #define FW_HDR_W7_IDMEM_SHARE_MODE GENMASK(21, 18) 589 #define FW_HDR_W7_CMD_VERSERION GENMASK(31, 24) 590 591 struct rtw89_fw_hdr_section_v1 { 592 __le32 w0; 593 __le32 w1; 594 __le32 w2; 595 __le32 w3; 596 } __packed; 597 598 #define FWSECTION_HDR_V1_W0_DL_ADDR GENMASK(31, 0) 599 #define FWSECTION_HDR_V1_W1_METADATA GENMASK(31, 24) 600 #define FWSECTION_HDR_V1_W1_SECTIONTYPE GENMASK(27, 24) 601 #define FWSECTION_HDR_V1_W1_SEC_SIZE GENMASK(23, 0) 602 #define FWSECTION_HDR_V1_W1_CHECKSUM BIT(28) 603 #define FWSECTION_HDR_V1_W1_REDL BIT(29) 604 #define FWSECTION_HDR_V1_W2_MSSC GENMASK(7, 0) 605 #define FORMATTED_MSSC 0xFF 606 #define FORMATTED_MSSC_MASK GENMASK(7, 0) 607 #define FWSECTION_HDR_V1_W2_BBMCU_IDX GENMASK(27, 24) 608 609 struct rtw89_fw_hdr_v1 { 610 __le32 w0; 611 __le32 w1; 612 __le32 w2; 613 __le32 w3; 614 __le32 w4; 615 __le32 w5; 616 __le32 w6; 617 __le32 w7; 618 __le32 w8; 619 __le32 w9; 620 __le32 w10; 621 __le32 w11; 622 struct rtw89_fw_hdr_section_v1 sections[]; 623 } __packed; 624 625 #define FW_HDR_V1_W1_MAJOR_VERSION GENMASK(7, 0) 626 #define FW_HDR_V1_W1_MINOR_VERSION GENMASK(15, 8) 627 #define FW_HDR_V1_W1_SUBVERSION GENMASK(23, 16) 628 #define FW_HDR_V1_W1_SUBINDEX GENMASK(31, 24) 629 #define FW_HDR_V1_W2_COMMITID GENMASK(31, 0) 630 #define FW_HDR_V1_W3_CMD_VERSERION GENMASK(23, 16) 631 #define FW_HDR_V1_W3_HDR_VER GENMASK(31, 24) 632 #define FW_HDR_V1_W4_MONTH GENMASK(7, 0) 633 #define FW_HDR_V1_W4_DATE GENMASK(15, 8) 634 #define FW_HDR_V1_W4_HOUR GENMASK(23, 16) 635 #define FW_HDR_V1_W4_MIN GENMASK(31, 24) 636 #define FW_HDR_V1_W5_YEAR GENMASK(15, 0) 637 #define FW_HDR_V1_W5_HDR_SIZE GENMASK(31, 16) 638 #define FW_HDR_V1_W6_SEC_NUM GENMASK(15, 8) 639 #define FW_HDR_V1_W6_DSP_CHKSUM BIT(24) 640 #define FW_HDR_V1_W7_PART_SIZE GENMASK(15, 0) 641 #define FW_HDR_V1_W7_DYN_HDR BIT(16) 642 #define FW_HDR_V1_W7_IDMEM_SHARE_MODE GENMASK(21, 18) 643 644 enum rtw89_fw_mss_pool_rmp_tbl_type { 645 MSS_POOL_RMP_TBL_BITMASK = 0x0, 646 MSS_POOL_RMP_TBL_RECORD = 0x1, 647 }; 648 649 #define FWDL_MSS_POOL_DEFKEYSETS_SIZE 8 650 651 struct rtw89_fw_mss_pool_hdr { 652 u8 signature[8]; /* equal to mss_signature[] */ 653 __le32 rmp_tbl_offset; 654 __le32 key_raw_offset; 655 u8 defen; 656 u8 rsvd[3]; 657 u8 rmpfmt; /* enum rtw89_fw_mss_pool_rmp_tbl_type */ 658 u8 mssdev_max; 659 __le16 keypair_num; 660 __le16 msscust_max; 661 __le16 msskey_num_max; 662 __le32 rsvd3; 663 u8 rmp_tbl[]; 664 } __packed; 665 666 union rtw89_fw_section_mssc_content { 667 struct { 668 u8 pad[0x20]; 669 u8 bit_in_chip_list; 670 u8 ver; 671 } __packed blacklist; 672 struct { 673 u8 pad[58]; 674 __le32 v; 675 } __packed sb_sel_ver; 676 struct { 677 u8 pad[60]; 678 __le16 v; 679 } __packed key_sign_len; 680 } __packed; 681 682 struct rtw89_fw_blacklist { 683 u8 ver; 684 u8 list[32]; 685 }; 686 687 extern const struct rtw89_fw_blacklist rtw89_fw_blacklist_default; 688 689 static inline void SET_CTRL_INFO_MACID(void *table, u32 val) 690 { 691 le32p_replace_bits((__le32 *)(table) + 0, val, GENMASK(6, 0)); 692 } 693 694 static inline void SET_CTRL_INFO_OPERATION(void *table, u32 val) 695 { 696 le32p_replace_bits((__le32 *)(table) + 0, val, BIT(7)); 697 } 698 #define SET_CMC_TBL_MASK_DATARATE GENMASK(8, 0) 699 static inline void SET_CMC_TBL_DATARATE(void *table, u32 val) 700 { 701 le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(8, 0)); 702 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATARATE, 703 GENMASK(8, 0)); 704 } 705 #define SET_CMC_TBL_MASK_FORCE_TXOP BIT(0) 706 static inline void SET_CMC_TBL_FORCE_TXOP(void *table, u32 val) 707 { 708 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(9)); 709 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_FORCE_TXOP, 710 BIT(9)); 711 } 712 #define SET_CMC_TBL_MASK_DATA_BW GENMASK(1, 0) 713 static inline void SET_CMC_TBL_DATA_BW(void *table, u32 val) 714 { 715 le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(11, 10)); 716 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_BW, 717 GENMASK(11, 10)); 718 } 719 #define SET_CMC_TBL_MASK_DATA_GI_LTF GENMASK(2, 0) 720 static inline void SET_CMC_TBL_DATA_GI_LTF(void *table, u32 val) 721 { 722 le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(14, 12)); 723 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DATA_GI_LTF, 724 GENMASK(14, 12)); 725 } 726 #define SET_CMC_TBL_MASK_DARF_TC_INDEX BIT(0) 727 static inline void SET_CMC_TBL_DARF_TC_INDEX(void *table, u32 val) 728 { 729 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(15)); 730 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DARF_TC_INDEX, 731 BIT(15)); 732 } 733 #define SET_CMC_TBL_MASK_ARFR_CTRL GENMASK(3, 0) 734 static inline void SET_CMC_TBL_ARFR_CTRL(void *table, u32 val) 735 { 736 le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(19, 16)); 737 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ARFR_CTRL, 738 GENMASK(19, 16)); 739 } 740 #define SET_CMC_TBL_MASK_ACQ_RPT_EN BIT(0) 741 static inline void SET_CMC_TBL_ACQ_RPT_EN(void *table, u32 val) 742 { 743 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(20)); 744 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ACQ_RPT_EN, 745 BIT(20)); 746 } 747 #define SET_CMC_TBL_MASK_MGQ_RPT_EN BIT(0) 748 static inline void SET_CMC_TBL_MGQ_RPT_EN(void *table, u32 val) 749 { 750 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(21)); 751 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_MGQ_RPT_EN, 752 BIT(21)); 753 } 754 #define SET_CMC_TBL_MASK_ULQ_RPT_EN BIT(0) 755 static inline void SET_CMC_TBL_ULQ_RPT_EN(void *table, u32 val) 756 { 757 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(22)); 758 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_ULQ_RPT_EN, 759 BIT(22)); 760 } 761 #define SET_CMC_TBL_MASK_TWTQ_RPT_EN BIT(0) 762 static inline void SET_CMC_TBL_TWTQ_RPT_EN(void *table, u32 val) 763 { 764 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(23)); 765 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TWTQ_RPT_EN, 766 BIT(23)); 767 } 768 #define SET_CMC_TBL_MASK_DISRTSFB BIT(0) 769 static inline void SET_CMC_TBL_DISRTSFB(void *table, u32 val) 770 { 771 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(25)); 772 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISRTSFB, 773 BIT(25)); 774 } 775 #define SET_CMC_TBL_MASK_DISDATAFB BIT(0) 776 static inline void SET_CMC_TBL_DISDATAFB(void *table, u32 val) 777 { 778 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(26)); 779 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_DISDATAFB, 780 BIT(26)); 781 } 782 #define SET_CMC_TBL_MASK_TRYRATE BIT(0) 783 static inline void SET_CMC_TBL_TRYRATE(void *table, u32 val) 784 { 785 le32p_replace_bits((__le32 *)(table) + 1, val, BIT(27)); 786 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_TRYRATE, 787 BIT(27)); 788 } 789 #define SET_CMC_TBL_MASK_AMPDU_DENSITY GENMASK(3, 0) 790 static inline void SET_CMC_TBL_AMPDU_DENSITY(void *table, u32 val) 791 { 792 le32p_replace_bits((__le32 *)(table) + 1, val, GENMASK(31, 28)); 793 le32p_replace_bits((__le32 *)(table) + 9, SET_CMC_TBL_MASK_AMPDU_DENSITY, 794 GENMASK(31, 28)); 795 } 796 #define SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE GENMASK(8, 0) 797 static inline void SET_CMC_TBL_DATA_RTY_LOWEST_RATE(void *table, u32 val) 798 { 799 le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(8, 0)); 800 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_DATA_RTY_LOWEST_RATE, 801 GENMASK(8, 0)); 802 } 803 #define SET_CMC_TBL_MASK_AMPDU_TIME_SEL BIT(0) 804 static inline void SET_CMC_TBL_AMPDU_TIME_SEL(void *table, u32 val) 805 { 806 le32p_replace_bits((__le32 *)(table) + 2, val, BIT(9)); 807 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_TIME_SEL, 808 BIT(9)); 809 } 810 #define SET_CMC_TBL_MASK_AMPDU_LEN_SEL BIT(0) 811 static inline void SET_CMC_TBL_AMPDU_LEN_SEL(void *table, u32 val) 812 { 813 le32p_replace_bits((__le32 *)(table) + 2, val, BIT(10)); 814 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_AMPDU_LEN_SEL, 815 BIT(10)); 816 } 817 #define SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL BIT(0) 818 static inline void SET_CMC_TBL_RTS_TXCNT_LMT_SEL(void *table, u32 val) 819 { 820 le32p_replace_bits((__le32 *)(table) + 2, val, BIT(11)); 821 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT_SEL, 822 BIT(11)); 823 } 824 #define SET_CMC_TBL_MASK_RTS_TXCNT_LMT GENMASK(3, 0) 825 static inline void SET_CMC_TBL_RTS_TXCNT_LMT(void *table, u32 val) 826 { 827 le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(15, 12)); 828 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_TXCNT_LMT, 829 GENMASK(15, 12)); 830 } 831 #define SET_CMC_TBL_MASK_RTSRATE GENMASK(8, 0) 832 static inline void SET_CMC_TBL_RTSRATE(void *table, u32 val) 833 { 834 le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(24, 16)); 835 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTSRATE, 836 GENMASK(24, 16)); 837 } 838 #define SET_CMC_TBL_MASK_VCS_STBC BIT(0) 839 static inline void SET_CMC_TBL_VCS_STBC(void *table, u32 val) 840 { 841 le32p_replace_bits((__le32 *)(table) + 2, val, BIT(27)); 842 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_VCS_STBC, 843 BIT(27)); 844 } 845 #define SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE GENMASK(3, 0) 846 static inline void SET_CMC_TBL_RTS_RTY_LOWEST_RATE(void *table, u32 val) 847 { 848 le32p_replace_bits((__le32 *)(table) + 2, val, GENMASK(31, 28)); 849 le32p_replace_bits((__le32 *)(table) + 10, SET_CMC_TBL_MASK_RTS_RTY_LOWEST_RATE, 850 GENMASK(31, 28)); 851 } 852 #define SET_CMC_TBL_MASK_DATA_TX_CNT_LMT GENMASK(5, 0) 853 static inline void SET_CMC_TBL_DATA_TX_CNT_LMT(void *table, u32 val) 854 { 855 le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(5, 0)); 856 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TX_CNT_LMT, 857 GENMASK(5, 0)); 858 } 859 #define SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL BIT(0) 860 static inline void SET_CMC_TBL_DATA_TXCNT_LMT_SEL(void *table, u32 val) 861 { 862 le32p_replace_bits((__le32 *)(table) + 3, val, BIT(6)); 863 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_DATA_TXCNT_LMT_SEL, 864 BIT(6)); 865 } 866 #define SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL BIT(0) 867 static inline void SET_CMC_TBL_MAX_AGG_NUM_SEL(void *table, u32 val) 868 { 869 le32p_replace_bits((__le32 *)(table) + 3, val, BIT(7)); 870 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_MAX_AGG_NUM_SEL, 871 BIT(7)); 872 } 873 #define SET_CMC_TBL_MASK_RTS_EN BIT(0) 874 static inline void SET_CMC_TBL_RTS_EN(void *table, u32 val) 875 { 876 le32p_replace_bits((__le32 *)(table) + 3, val, BIT(8)); 877 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_EN, 878 BIT(8)); 879 } 880 #define SET_CMC_TBL_MASK_CTS2SELF_EN BIT(0) 881 static inline void SET_CMC_TBL_CTS2SELF_EN(void *table, u32 val) 882 { 883 le32p_replace_bits((__le32 *)(table) + 3, val, BIT(9)); 884 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CTS2SELF_EN, 885 BIT(9)); 886 } 887 #define SET_CMC_TBL_MASK_CCA_RTS GENMASK(1, 0) 888 static inline void SET_CMC_TBL_CCA_RTS(void *table, u32 val) 889 { 890 le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(11, 10)); 891 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_CCA_RTS, 892 GENMASK(11, 10)); 893 } 894 #define SET_CMC_TBL_MASK_HW_RTS_EN BIT(0) 895 static inline void SET_CMC_TBL_HW_RTS_EN(void *table, u32 val) 896 { 897 le32p_replace_bits((__le32 *)(table) + 3, val, BIT(12)); 898 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_HW_RTS_EN, 899 BIT(12)); 900 } 901 #define SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE GENMASK(1, 0) 902 static inline void SET_CMC_TBL_RTS_DROP_DATA_MODE(void *table, u32 val) 903 { 904 le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(14, 13)); 905 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_RTS_DROP_DATA_MODE, 906 GENMASK(14, 13)); 907 } 908 #define SET_CMC_TBL_MASK_AMPDU_MAX_LEN GENMASK(10, 0) 909 static inline void SET_CMC_TBL_AMPDU_MAX_LEN(void *table, u32 val) 910 { 911 le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(26, 16)); 912 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_LEN, 913 GENMASK(26, 16)); 914 } 915 #define SET_CMC_TBL_MASK_UL_MU_DIS BIT(0) 916 static inline void SET_CMC_TBL_UL_MU_DIS(void *table, u32 val) 917 { 918 le32p_replace_bits((__le32 *)(table) + 3, val, BIT(27)); 919 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_UL_MU_DIS, 920 BIT(27)); 921 } 922 #define SET_CMC_TBL_MASK_AMPDU_MAX_TIME GENMASK(3, 0) 923 static inline void SET_CMC_TBL_AMPDU_MAX_TIME(void *table, u32 val) 924 { 925 le32p_replace_bits((__le32 *)(table) + 3, val, GENMASK(31, 28)); 926 le32p_replace_bits((__le32 *)(table) + 11, SET_CMC_TBL_MASK_AMPDU_MAX_TIME, 927 GENMASK(31, 28)); 928 } 929 #define SET_CMC_TBL_MASK_MAX_AGG_NUM GENMASK(7, 0) 930 static inline void SET_CMC_TBL_MAX_AGG_NUM(void *table, u32 val) 931 { 932 le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(7, 0)); 933 le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_MAX_AGG_NUM, 934 GENMASK(7, 0)); 935 } 936 #define SET_CMC_TBL_MASK_BA_BMAP GENMASK(1, 0) 937 static inline void SET_CMC_TBL_BA_BMAP(void *table, u32 val) 938 { 939 le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(9, 8)); 940 le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BA_BMAP, 941 GENMASK(9, 8)); 942 } 943 #define SET_CMC_TBL_MASK_VO_LFTIME_SEL GENMASK(2, 0) 944 static inline void SET_CMC_TBL_VO_LFTIME_SEL(void *table, u32 val) 945 { 946 le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(18, 16)); 947 le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VO_LFTIME_SEL, 948 GENMASK(18, 16)); 949 } 950 #define SET_CMC_TBL_MASK_VI_LFTIME_SEL GENMASK(2, 0) 951 static inline void SET_CMC_TBL_VI_LFTIME_SEL(void *table, u32 val) 952 { 953 le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(21, 19)); 954 le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_VI_LFTIME_SEL, 955 GENMASK(21, 19)); 956 } 957 #define SET_CMC_TBL_MASK_BE_LFTIME_SEL GENMASK(2, 0) 958 static inline void SET_CMC_TBL_BE_LFTIME_SEL(void *table, u32 val) 959 { 960 le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(24, 22)); 961 le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BE_LFTIME_SEL, 962 GENMASK(24, 22)); 963 } 964 #define SET_CMC_TBL_MASK_BK_LFTIME_SEL GENMASK(2, 0) 965 static inline void SET_CMC_TBL_BK_LFTIME_SEL(void *table, u32 val) 966 { 967 le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(27, 25)); 968 le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_BK_LFTIME_SEL, 969 GENMASK(27, 25)); 970 } 971 #define SET_CMC_TBL_MASK_SECTYPE GENMASK(3, 0) 972 static inline void SET_CMC_TBL_SECTYPE(void *table, u32 val) 973 { 974 le32p_replace_bits((__le32 *)(table) + 4, val, GENMASK(31, 28)); 975 le32p_replace_bits((__le32 *)(table) + 12, SET_CMC_TBL_MASK_SECTYPE, 976 GENMASK(31, 28)); 977 } 978 #define SET_CMC_TBL_MASK_MULTI_PORT_ID GENMASK(2, 0) 979 static inline void SET_CMC_TBL_MULTI_PORT_ID(void *table, u32 val) 980 { 981 le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(2, 0)); 982 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MULTI_PORT_ID, 983 GENMASK(2, 0)); 984 } 985 #define SET_CMC_TBL_MASK_BMC BIT(0) 986 static inline void SET_CMC_TBL_BMC(void *table, u32 val) 987 { 988 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(3)); 989 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_BMC, 990 BIT(3)); 991 } 992 #define SET_CMC_TBL_MASK_MBSSID GENMASK(3, 0) 993 static inline void SET_CMC_TBL_MBSSID(void *table, u32 val) 994 { 995 le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(7, 4)); 996 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_MBSSID, 997 GENMASK(7, 4)); 998 } 999 #define SET_CMC_TBL_MASK_NAVUSEHDR BIT(0) 1000 static inline void SET_CMC_TBL_NAVUSEHDR(void *table, u32 val) 1001 { 1002 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(8)); 1003 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_NAVUSEHDR, 1004 BIT(8)); 1005 } 1006 #define SET_CMC_TBL_MASK_TXPWR_MODE GENMASK(2, 0) 1007 static inline void SET_CMC_TBL_TXPWR_MODE(void *table, u32 val) 1008 { 1009 le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(11, 9)); 1010 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_TXPWR_MODE, 1011 GENMASK(11, 9)); 1012 } 1013 #define SET_CMC_TBL_MASK_DATA_DCM BIT(0) 1014 static inline void SET_CMC_TBL_DATA_DCM(void *table, u32 val) 1015 { 1016 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(12)); 1017 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_DCM, 1018 BIT(12)); 1019 } 1020 #define SET_CMC_TBL_MASK_DATA_ER BIT(0) 1021 static inline void SET_CMC_TBL_DATA_ER(void *table, u32 val) 1022 { 1023 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(13)); 1024 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_ER, 1025 BIT(13)); 1026 } 1027 #define SET_CMC_TBL_MASK_DATA_LDPC BIT(0) 1028 static inline void SET_CMC_TBL_DATA_LDPC(void *table, u32 val) 1029 { 1030 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(14)); 1031 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_LDPC, 1032 BIT(14)); 1033 } 1034 #define SET_CMC_TBL_MASK_DATA_STBC BIT(0) 1035 static inline void SET_CMC_TBL_DATA_STBC(void *table, u32 val) 1036 { 1037 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(15)); 1038 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_STBC, 1039 BIT(15)); 1040 } 1041 #define SET_CMC_TBL_MASK_A_CTRL_BQR BIT(0) 1042 static inline void SET_CMC_TBL_A_CTRL_BQR(void *table, u32 val) 1043 { 1044 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(16)); 1045 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BQR, 1046 BIT(16)); 1047 } 1048 #define SET_CMC_TBL_MASK_A_CTRL_UPH BIT(0) 1049 static inline void SET_CMC_TBL_A_CTRL_UPH(void *table, u32 val) 1050 { 1051 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(17)); 1052 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_UPH, 1053 BIT(17)); 1054 } 1055 #define SET_CMC_TBL_MASK_A_CTRL_BSR BIT(0) 1056 static inline void SET_CMC_TBL_A_CTRL_BSR(void *table, u32 val) 1057 { 1058 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(18)); 1059 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_BSR, 1060 BIT(18)); 1061 } 1062 #define SET_CMC_TBL_MASK_A_CTRL_CAS BIT(0) 1063 static inline void SET_CMC_TBL_A_CTRL_CAS(void *table, u32 val) 1064 { 1065 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(19)); 1066 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_A_CTRL_CAS, 1067 BIT(19)); 1068 } 1069 #define SET_CMC_TBL_MASK_DATA_BW_ER BIT(0) 1070 static inline void SET_CMC_TBL_DATA_BW_ER(void *table, u32 val) 1071 { 1072 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(20)); 1073 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_DATA_BW_ER, 1074 BIT(20)); 1075 } 1076 #define SET_CMC_TBL_MASK_LSIG_TXOP_EN BIT(0) 1077 static inline void SET_CMC_TBL_LSIG_TXOP_EN(void *table, u32 val) 1078 { 1079 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(21)); 1080 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_LSIG_TXOP_EN, 1081 BIT(21)); 1082 } 1083 #define SET_CMC_TBL_MASK_CTRL_CNT_VLD BIT(0) 1084 static inline void SET_CMC_TBL_CTRL_CNT_VLD(void *table, u32 val) 1085 { 1086 le32p_replace_bits((__le32 *)(table) + 5, val, BIT(27)); 1087 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT_VLD, 1088 BIT(27)); 1089 } 1090 #define SET_CMC_TBL_MASK_CTRL_CNT GENMASK(3, 0) 1091 static inline void SET_CMC_TBL_CTRL_CNT(void *table, u32 val) 1092 { 1093 le32p_replace_bits((__le32 *)(table) + 5, val, GENMASK(31, 28)); 1094 le32p_replace_bits((__le32 *)(table) + 13, SET_CMC_TBL_MASK_CTRL_CNT, 1095 GENMASK(31, 28)); 1096 } 1097 #define SET_CMC_TBL_MASK_RESP_REF_RATE GENMASK(8, 0) 1098 static inline void SET_CMC_TBL_RESP_REF_RATE(void *table, u32 val) 1099 { 1100 le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(8, 0)); 1101 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_RESP_REF_RATE, 1102 GENMASK(8, 0)); 1103 } 1104 #define SET_CMC_TBL_MASK_ALL_ACK_SUPPORT BIT(0) 1105 static inline void SET_CMC_TBL_ALL_ACK_SUPPORT(void *table, u32 val) 1106 { 1107 le32p_replace_bits((__le32 *)(table) + 6, val, BIT(12)); 1108 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ALL_ACK_SUPPORT, 1109 BIT(12)); 1110 } 1111 #define SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT BIT(0) 1112 static inline void SET_CMC_TBL_BSR_QUEUE_SIZE_FORMAT(void *table, u32 val) 1113 { 1114 le32p_replace_bits((__le32 *)(table) + 6, val, BIT(13)); 1115 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_BSR_QUEUE_SIZE_FORMAT, 1116 BIT(13)); 1117 } 1118 #define SET_CMC_TBL_MASK_NTX_PATH_EN GENMASK(3, 0) 1119 static inline void SET_CMC_TBL_NTX_PATH_EN(void *table, u32 val) 1120 { 1121 le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(19, 16)); 1122 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_NTX_PATH_EN, 1123 GENMASK(19, 16)); 1124 } 1125 #define SET_CMC_TBL_MASK_PATH_MAP_A GENMASK(1, 0) 1126 static inline void SET_CMC_TBL_PATH_MAP_A(void *table, u32 val) 1127 { 1128 le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(21, 20)); 1129 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_A, 1130 GENMASK(21, 20)); 1131 } 1132 #define SET_CMC_TBL_MASK_PATH_MAP_B GENMASK(1, 0) 1133 static inline void SET_CMC_TBL_PATH_MAP_B(void *table, u32 val) 1134 { 1135 le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(23, 22)); 1136 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_B, 1137 GENMASK(23, 22)); 1138 } 1139 #define SET_CMC_TBL_MASK_PATH_MAP_C GENMASK(1, 0) 1140 static inline void SET_CMC_TBL_PATH_MAP_C(void *table, u32 val) 1141 { 1142 le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(25, 24)); 1143 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_C, 1144 GENMASK(25, 24)); 1145 } 1146 #define SET_CMC_TBL_MASK_PATH_MAP_D GENMASK(1, 0) 1147 static inline void SET_CMC_TBL_PATH_MAP_D(void *table, u32 val) 1148 { 1149 le32p_replace_bits((__le32 *)(table) + 6, val, GENMASK(27, 26)); 1150 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_PATH_MAP_D, 1151 GENMASK(27, 26)); 1152 } 1153 #define SET_CMC_TBL_MASK_ANTSEL_A BIT(0) 1154 static inline void SET_CMC_TBL_ANTSEL_A(void *table, u32 val) 1155 { 1156 le32p_replace_bits((__le32 *)(table) + 6, val, BIT(28)); 1157 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_A, 1158 BIT(28)); 1159 } 1160 #define SET_CMC_TBL_MASK_ANTSEL_B BIT(0) 1161 static inline void SET_CMC_TBL_ANTSEL_B(void *table, u32 val) 1162 { 1163 le32p_replace_bits((__le32 *)(table) + 6, val, BIT(29)); 1164 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_B, 1165 BIT(29)); 1166 } 1167 #define SET_CMC_TBL_MASK_ANTSEL_C BIT(0) 1168 static inline void SET_CMC_TBL_ANTSEL_C(void *table, u32 val) 1169 { 1170 le32p_replace_bits((__le32 *)(table) + 6, val, BIT(30)); 1171 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_C, 1172 BIT(30)); 1173 } 1174 #define SET_CMC_TBL_MASK_ANTSEL_D BIT(0) 1175 static inline void SET_CMC_TBL_ANTSEL_D(void *table, u32 val) 1176 { 1177 le32p_replace_bits((__le32 *)(table) + 6, val, BIT(31)); 1178 le32p_replace_bits((__le32 *)(table) + 14, SET_CMC_TBL_MASK_ANTSEL_D, 1179 BIT(31)); 1180 } 1181 1182 #define SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING GENMASK(1, 0) 1183 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING_V1(void *table, u32 val) 1184 { 1185 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(1, 0)); 1186 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1187 GENMASK(1, 0)); 1188 } 1189 1190 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40_V1(void *table, u32 val) 1191 { 1192 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(3, 2)); 1193 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1194 GENMASK(3, 2)); 1195 } 1196 1197 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80_V1(void *table, u32 val) 1198 { 1199 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(5, 4)); 1200 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1201 GENMASK(5, 4)); 1202 } 1203 1204 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160_V1(void *table, u32 val) 1205 { 1206 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 6)); 1207 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1208 GENMASK(7, 6)); 1209 } 1210 1211 #define SET_CMC_TBL_MASK_ADDR_CAM_INDEX GENMASK(7, 0) 1212 static inline void SET_CMC_TBL_ADDR_CAM_INDEX(void *table, u32 val) 1213 { 1214 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(7, 0)); 1215 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ADDR_CAM_INDEX, 1216 GENMASK(7, 0)); 1217 } 1218 #define SET_CMC_TBL_MASK_PAID GENMASK(8, 0) 1219 static inline void SET_CMC_TBL_PAID(void *table, u32 val) 1220 { 1221 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(16, 8)); 1222 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_PAID, 1223 GENMASK(16, 8)); 1224 } 1225 #define SET_CMC_TBL_MASK_ULDL BIT(0) 1226 static inline void SET_CMC_TBL_ULDL(void *table, u32 val) 1227 { 1228 le32p_replace_bits((__le32 *)(table) + 7, val, BIT(17)); 1229 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_ULDL, 1230 BIT(17)); 1231 } 1232 #define SET_CMC_TBL_MASK_DOPPLER_CTRL GENMASK(1, 0) 1233 static inline void SET_CMC_TBL_DOPPLER_CTRL(void *table, u32 val) 1234 { 1235 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(19, 18)); 1236 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_DOPPLER_CTRL, 1237 GENMASK(19, 18)); 1238 } 1239 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING(void *table, u32 val) 1240 { 1241 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(21, 20)); 1242 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1243 GENMASK(21, 20)); 1244 } 1245 1246 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING40(void *table, u32 val) 1247 { 1248 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(23, 22)); 1249 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1250 GENMASK(23, 22)); 1251 } 1252 #define SET_CMC_TBL_MASK_TXPWR_TOLERENCE GENMASK(3, 0) 1253 static inline void SET_CMC_TBL_TXPWR_TOLERENCE(void *table, u32 val) 1254 { 1255 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(27, 24)); 1256 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_TXPWR_TOLERENCE, 1257 GENMASK(27, 24)); 1258 } 1259 1260 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING80(void *table, u32 val) 1261 { 1262 le32p_replace_bits((__le32 *)(table) + 7, val, GENMASK(31, 30)); 1263 le32p_replace_bits((__le32 *)(table) + 15, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1264 GENMASK(31, 30)); 1265 } 1266 #define SET_CMC_TBL_MASK_NC GENMASK(2, 0) 1267 static inline void SET_CMC_TBL_NC(void *table, u32 val) 1268 { 1269 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(2, 0)); 1270 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NC, 1271 GENMASK(2, 0)); 1272 } 1273 #define SET_CMC_TBL_MASK_NR GENMASK(2, 0) 1274 static inline void SET_CMC_TBL_NR(void *table, u32 val) 1275 { 1276 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(5, 3)); 1277 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NR, 1278 GENMASK(5, 3)); 1279 } 1280 #define SET_CMC_TBL_MASK_NG GENMASK(1, 0) 1281 static inline void SET_CMC_TBL_NG(void *table, u32 val) 1282 { 1283 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(7, 6)); 1284 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NG, 1285 GENMASK(7, 6)); 1286 } 1287 #define SET_CMC_TBL_MASK_CB GENMASK(1, 0) 1288 static inline void SET_CMC_TBL_CB(void *table, u32 val) 1289 { 1290 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(9, 8)); 1291 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CB, 1292 GENMASK(9, 8)); 1293 } 1294 #define SET_CMC_TBL_MASK_CS GENMASK(1, 0) 1295 static inline void SET_CMC_TBL_CS(void *table, u32 val) 1296 { 1297 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(11, 10)); 1298 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CS, 1299 GENMASK(11, 10)); 1300 } 1301 #define SET_CMC_TBL_MASK_CSI_TXBF_EN BIT(0) 1302 static inline void SET_CMC_TBL_CSI_TXBF_EN(void *table, u32 val) 1303 { 1304 le32p_replace_bits((__le32 *)(table) + 8, val, BIT(12)); 1305 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_TXBF_EN, 1306 BIT(12)); 1307 } 1308 #define SET_CMC_TBL_MASK_CSI_STBC_EN BIT(0) 1309 static inline void SET_CMC_TBL_CSI_STBC_EN(void *table, u32 val) 1310 { 1311 le32p_replace_bits((__le32 *)(table) + 8, val, BIT(13)); 1312 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_STBC_EN, 1313 BIT(13)); 1314 } 1315 #define SET_CMC_TBL_MASK_CSI_LDPC_EN BIT(0) 1316 static inline void SET_CMC_TBL_CSI_LDPC_EN(void *table, u32 val) 1317 { 1318 le32p_replace_bits((__le32 *)(table) + 8, val, BIT(14)); 1319 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_LDPC_EN, 1320 BIT(14)); 1321 } 1322 #define SET_CMC_TBL_MASK_CSI_PARA_EN BIT(0) 1323 static inline void SET_CMC_TBL_CSI_PARA_EN(void *table, u32 val) 1324 { 1325 le32p_replace_bits((__le32 *)(table) + 8, val, BIT(15)); 1326 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_PARA_EN, 1327 BIT(15)); 1328 } 1329 #define SET_CMC_TBL_MASK_CSI_FIX_RATE GENMASK(8, 0) 1330 static inline void SET_CMC_TBL_CSI_FIX_RATE(void *table, u32 val) 1331 { 1332 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(24, 16)); 1333 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_FIX_RATE, 1334 GENMASK(24, 16)); 1335 } 1336 #define SET_CMC_TBL_MASK_CSI_GI_LTF GENMASK(2, 0) 1337 static inline void SET_CMC_TBL_CSI_GI_LTF(void *table, u32 val) 1338 { 1339 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(27, 25)); 1340 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_GI_LTF, 1341 GENMASK(27, 25)); 1342 } 1343 1344 static inline void SET_CMC_TBL_NOMINAL_PKT_PADDING160(void *table, u32 val) 1345 { 1346 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(29, 28)); 1347 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_NOMINAL_PKT_PADDING, 1348 GENMASK(29, 28)); 1349 } 1350 1351 #define SET_CMC_TBL_MASK_CSI_BW GENMASK(1, 0) 1352 static inline void SET_CMC_TBL_CSI_BW(void *table, u32 val) 1353 { 1354 le32p_replace_bits((__le32 *)(table) + 8, val, GENMASK(31, 30)); 1355 le32p_replace_bits((__le32 *)(table) + 16, SET_CMC_TBL_MASK_CSI_BW, 1356 GENMASK(31, 30)); 1357 } 1358 1359 struct rtw89_h2c_cctlinfo_ud_g7 { 1360 __le32 c0; 1361 __le32 w0; 1362 __le32 w1; 1363 __le32 w2; 1364 __le32 w3; 1365 __le32 w4; 1366 __le32 w5; 1367 __le32 w6; 1368 __le32 w7; 1369 __le32 w8; 1370 __le32 w9; 1371 __le32 w10; 1372 __le32 w11; 1373 __le32 w12; 1374 __le32 w13; 1375 __le32 w14; 1376 __le32 w15; 1377 __le32 m0; 1378 __le32 m1; 1379 __le32 m2; 1380 __le32 m3; 1381 __le32 m4; 1382 __le32 m5; 1383 __le32 m6; 1384 __le32 m7; 1385 __le32 m8; 1386 __le32 m9; 1387 __le32 m10; 1388 __le32 m11; 1389 __le32 m12; 1390 __le32 m13; 1391 __le32 m14; 1392 __le32 m15; 1393 } __packed; 1394 1395 #define CCTLINFO_G7_C0_MACID GENMASK(6, 0) 1396 #define CCTLINFO_G7_C0_OP BIT(7) 1397 1398 #define CCTLINFO_G7_W0_DATARATE GENMASK(11, 0) 1399 #define CCTLINFO_G7_W0_DATA_GI_LTF GENMASK(14, 12) 1400 #define CCTLINFO_G7_W0_TRYRATE BIT(15) 1401 #define CCTLINFO_G7_W0_ARFR_CTRL GENMASK(17, 16) 1402 #define CCTLINFO_G7_W0_DIS_HE1SS_STBC BIT(18) 1403 #define CCTLINFO_G7_W0_ACQ_RPT_EN BIT(20) 1404 #define CCTLINFO_G7_W0_MGQ_RPT_EN BIT(21) 1405 #define CCTLINFO_G7_W0_ULQ_RPT_EN BIT(22) 1406 #define CCTLINFO_G7_W0_TWTQ_RPT_EN BIT(23) 1407 #define CCTLINFO_G7_W0_FORCE_TXOP BIT(24) 1408 #define CCTLINFO_G7_W0_DISRTSFB BIT(25) 1409 #define CCTLINFO_G7_W0_DISDATAFB BIT(26) 1410 #define CCTLINFO_G7_W0_NSTR_EN BIT(27) 1411 #define CCTLINFO_G7_W0_AMPDU_DENSITY GENMASK(31, 28) 1412 #define CCTLINFO_G7_W0_ALL (GENMASK(31, 20) | GENMASK(18, 0)) 1413 #define CCTLINFO_G7_W1_DATA_RTY_LOWEST_RATE GENMASK(11, 0) 1414 #define CCTLINFO_G7_W1_RTS_TXCNT_LMT GENMASK(15, 12) 1415 #define CCTLINFO_G7_W1_RTSRATE GENMASK(27, 16) 1416 #define CCTLINFO_G7_W1_RTS_RTY_LOWEST_RATE GENMASK(31, 28) 1417 #define CCTLINFO_G7_W1_ALL GENMASK(31, 0) 1418 #define CCTLINFO_G7_W2_DATA_TX_CNT_LMT GENMASK(5, 0) 1419 #define CCTLINFO_G7_W2_DATA_TXCNT_LMT_SEL BIT(6) 1420 #define CCTLINFO_G7_W2_MAX_AGG_NUM_SEL BIT(7) 1421 #define CCTLINFO_G7_W2_RTS_EN BIT(8) 1422 #define CCTLINFO_G7_W2_CTS2SELF_EN BIT(9) 1423 #define CCTLINFO_G7_W2_CCA_RTS GENMASK(11, 10) 1424 #define CCTLINFO_G7_W2_HW_RTS_EN BIT(12) 1425 #define CCTLINFO_G7_W2_RTS_DROP_DATA_MODE GENMASK(14, 13) 1426 #define CCTLINFO_G7_W2_PRELD_EN BIT(15) 1427 #define CCTLINFO_G7_W2_AMPDU_MAX_LEN GENMASK(26, 16) 1428 #define CCTLINFO_G7_W2_UL_MU_DIS BIT(27) 1429 #define CCTLINFO_G7_W2_AMPDU_MAX_TIME GENMASK(31, 28) 1430 #define CCTLINFO_G7_W2_ALL GENMASK(31, 0) 1431 #define CCTLINFO_G7_W3_MAX_AGG_NUM GENMASK(7, 0) 1432 #define CCTLINFO_G7_W3_DATA_BW GENMASK(10, 8) 1433 #define CCTLINFO_G7_W3_DATA_BW_ER BIT(11) 1434 #define CCTLINFO_G7_W3_BA_BMAP GENMASK(14, 12) 1435 #define CCTLINFO_G7_W3_VCS_STBC BIT(15) 1436 #define CCTLINFO_G7_W3_VO_LFTIME_SEL GENMASK(18, 16) 1437 #define CCTLINFO_G7_W3_VI_LFTIME_SEL GENMASK(21, 19) 1438 #define CCTLINFO_G7_W3_BE_LFTIME_SEL GENMASK(24, 22) 1439 #define CCTLINFO_G7_W3_BK_LFTIME_SEL GENMASK(27, 25) 1440 #define CCTLINFO_G7_W3_AMPDU_TIME_SEL BIT(28) 1441 #define CCTLINFO_G7_W3_AMPDU_LEN_SEL BIT(29) 1442 #define CCTLINFO_G7_W3_RTS_TXCNT_LMT_SEL BIT(30) 1443 #define CCTLINFO_G7_W3_LSIG_TXOP_EN BIT(31) 1444 #define CCTLINFO_G7_W3_ALL GENMASK(31, 0) 1445 #define CCTLINFO_G7_W4_MULTI_PORT_ID GENMASK(2, 0) 1446 #define CCTLINFO_G7_W4_BYPASS_PUNC BIT(3) 1447 #define CCTLINFO_G7_W4_MBSSID GENMASK(7, 4) 1448 #define CCTLINFO_G7_W4_DATA_DCM BIT(8) 1449 #define CCTLINFO_G7_W4_DATA_ER BIT(9) 1450 #define CCTLINFO_G7_W4_DATA_LDPC BIT(10) 1451 #define CCTLINFO_G7_W4_DATA_STBC BIT(11) 1452 #define CCTLINFO_G7_W4_A_CTRL_BQR BIT(12) 1453 #define CCTLINFO_G7_W4_A_CTRL_BSR BIT(14) 1454 #define CCTLINFO_G7_W4_A_CTRL_CAS BIT(15) 1455 #define CCTLINFO_G7_W4_ACT_SUBCH_CBW GENMASK(31, 16) 1456 #define CCTLINFO_G7_W4_ALL (GENMASK(31, 14) | GENMASK(12, 0)) 1457 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING0 GENMASK(1, 0) 1458 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING1 GENMASK(3, 2) 1459 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING2 GENMASK(5, 4) 1460 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING3 GENMASK(7, 6) 1461 #define CCTLINFO_G7_W5_NOMINAL_PKT_PADDING4 GENMASK(9, 8) 1462 #define CCTLINFO_G7_W5_SR_RATE GENMASK(14, 10) 1463 #define CCTLINFO_G7_W5_TID_DISABLE GENMASK(23, 16) 1464 #define CCTLINFO_G7_W5_ADDR_CAM_INDEX GENMASK(31, 24) 1465 #define CCTLINFO_G7_W5_ALL (GENMASK(31, 16) | GENMASK(14, 0)) 1466 #define CCTLINFO_G7_W6_AID12_PAID GENMASK(11, 0) 1467 #define CCTLINFO_G7_W6_RESP_REF_RATE GENMASK(23, 12) 1468 #define CCTLINFO_G7_W6_ULDL BIT(31) 1469 #define CCTLINFO_G7_W6_ALL (BIT(31) | GENMASK(23, 0)) 1470 #define CCTLINFO_G7_W7_NC GENMASK(2, 0) 1471 #define CCTLINFO_G7_W7_NR GENMASK(5, 3) 1472 #define CCTLINFO_G7_W7_NG GENMASK(7, 6) 1473 #define CCTLINFO_G7_W7_CB GENMASK(9, 8) 1474 #define CCTLINFO_G7_W7_CS GENMASK(11, 10) 1475 #define CCTLINFO_G7_W7_CSI_STBC_EN BIT(13) 1476 #define CCTLINFO_G7_W7_CSI_LDPC_EN BIT(14) 1477 #define CCTLINFO_G7_W7_CSI_PARA_EN BIT(15) 1478 #define CCTLINFO_G7_W7_CSI_FIX_RATE GENMASK(27, 16) 1479 #define CCTLINFO_G7_W7_CSI_BW GENMASK(31, 29) 1480 #define CCTLINFO_G7_W7_ALL (GENMASK(31, 29) | GENMASK(27, 13) | GENMASK(11, 0)) 1481 #define CCTLINFO_G7_W8_ALL_ACK_SUPPORT BIT(0) 1482 #define CCTLINFO_G7_W8_BSR_QUEUE_SIZE_FORMAT BIT(1) 1483 #define CCTLINFO_G7_W8_BSR_OM_UPD_EN BIT(2) 1484 #define CCTLINFO_G7_W8_MACID_FWD_IDC BIT(3) 1485 #define CCTLINFO_G7_W8_AZ_SEC_EN BIT(4) 1486 #define CCTLINFO_G7_W8_CSI_SEC_EN BIT(5) 1487 #define CCTLINFO_G7_W8_FIX_UL_ADDRCAM_IDX BIT(6) 1488 #define CCTLINFO_G7_W8_CTRL_CNT_VLD BIT(7) 1489 #define CCTLINFO_G7_W8_CTRL_CNT GENMASK(11, 8) 1490 #define CCTLINFO_G7_W8_RESP_SEC_TYPE GENMASK(15, 12) 1491 #define CCTLINFO_G7_W8_ALL GENMASK(15, 0) 1492 /* W9~13 are reserved */ 1493 #define CCTLINFO_G7_W14_VO_CURR_RATE GENMASK(11, 0) 1494 #define CCTLINFO_G7_W14_VI_CURR_RATE GENMASK(23, 12) 1495 #define CCTLINFO_G7_W14_BE_CURR_RATE_L GENMASK(31, 24) 1496 #define CCTLINFO_G7_W14_ALL GENMASK(31, 0) 1497 #define CCTLINFO_G7_W15_BE_CURR_RATE_H GENMASK(3, 0) 1498 #define CCTLINFO_G7_W15_BK_CURR_RATE GENMASK(15, 4) 1499 #define CCTLINFO_G7_W15_MGNT_CURR_RATE GENMASK(27, 16) 1500 #define CCTLINFO_G7_W15_ALL GENMASK(27, 0) 1501 1502 struct rtw89_h2c_bcn_upd { 1503 __le32 w0; 1504 __le32 w1; 1505 __le32 w2; 1506 } __packed; 1507 1508 #define RTW89_H2C_BCN_UPD_W0_PORT GENMASK(7, 0) 1509 #define RTW89_H2C_BCN_UPD_W0_MBSSID GENMASK(15, 8) 1510 #define RTW89_H2C_BCN_UPD_W0_BAND GENMASK(23, 16) 1511 #define RTW89_H2C_BCN_UPD_W0_GRP_IE_OFST GENMASK(31, 24) 1512 #define RTW89_H2C_BCN_UPD_W1_MACID GENMASK(7, 0) 1513 #define RTW89_H2C_BCN_UPD_W1_SSN_SEL GENMASK(9, 8) 1514 #define RTW89_H2C_BCN_UPD_W1_SSN_MODE GENMASK(11, 10) 1515 #define RTW89_H2C_BCN_UPD_W1_RATE GENMASK(20, 12) 1516 #define RTW89_H2C_BCN_UPD_W1_TXPWR GENMASK(23, 21) 1517 #define RTW89_H2C_BCN_UPD_W2_TXINFO_CTRL_EN BIT(0) 1518 #define RTW89_H2C_BCN_UPD_W2_NTX_PATH_EN GENMASK(4, 1) 1519 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_A GENMASK(6, 5) 1520 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_B GENMASK(8, 7) 1521 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_C GENMASK(10, 9) 1522 #define RTW89_H2C_BCN_UPD_W2_PATH_MAP_D GENMASK(12, 11) 1523 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_A BIT(13) 1524 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_B BIT(14) 1525 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_C BIT(15) 1526 #define RTW89_H2C_BCN_UPD_W2_PATH_ANTSEL_D BIT(16) 1527 #define RTW89_H2C_BCN_UPD_W2_CSA_OFST GENMASK(31, 17) 1528 1529 struct rtw89_h2c_bcn_upd_be { 1530 __le32 w0; 1531 __le32 w1; 1532 __le32 w2; 1533 __le32 w3; 1534 __le32 w4; 1535 __le32 w5; 1536 __le32 w6; 1537 __le32 w7; 1538 __le32 w8; 1539 __le32 w9; 1540 __le32 w10; 1541 __le32 w11; 1542 __le32 w12; 1543 __le32 w13; 1544 __le32 w14; 1545 __le32 w15; 1546 __le32 w16; 1547 __le32 w17; 1548 __le32 w18; 1549 __le32 w19; 1550 __le32 w20; 1551 __le32 w21; 1552 __le32 w22; 1553 __le32 w23; 1554 __le32 w24; 1555 __le32 w25; 1556 __le32 w26; 1557 __le32 w27; 1558 __le32 w28; 1559 __le32 w29; 1560 } __packed; 1561 1562 #define RTW89_H2C_BCN_UPD_BE_W0_PORT GENMASK(7, 0) 1563 #define RTW89_H2C_BCN_UPD_BE_W0_MBSSID GENMASK(15, 8) 1564 #define RTW89_H2C_BCN_UPD_BE_W0_BAND GENMASK(23, 16) 1565 #define RTW89_H2C_BCN_UPD_BE_W0_GRP_IE_OFST GENMASK(31, 24) 1566 #define RTW89_H2C_BCN_UPD_BE_W1_MACID GENMASK(7, 0) 1567 #define RTW89_H2C_BCN_UPD_BE_W1_SSN_SEL GENMASK(9, 8) 1568 #define RTW89_H2C_BCN_UPD_BE_W1_SSN_MODE GENMASK(11, 10) 1569 #define RTW89_H2C_BCN_UPD_BE_W1_RATE GENMASK(20, 12) 1570 #define RTW89_H2C_BCN_UPD_BE_W1_TXPWR GENMASK(23, 21) 1571 #define RTW89_H2C_BCN_UPD_BE_W1_MACID_EXT GENMASK(31, 24) 1572 #define RTW89_H2C_BCN_UPD_BE_W2_TXINFO_CTRL_EN BIT(0) 1573 #define RTW89_H2C_BCN_UPD_BE_W2_NTX_PATH_EN GENMASK(4, 1) 1574 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_A GENMASK(6, 5) 1575 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_B GENMASK(8, 7) 1576 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_C GENMASK(10, 9) 1577 #define RTW89_H2C_BCN_UPD_BE_W2_PATH_MAP_D GENMASK(12, 11) 1578 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_A BIT(13) 1579 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_B BIT(14) 1580 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_C BIT(15) 1581 #define RTW89_H2C_BCN_UPD_BE_W2_ANTSEL_D BIT(16) 1582 #define RTW89_H2C_BCN_UPD_BE_W2_CSA_OFST GENMASK(31, 17) 1583 #define RTW89_H2C_BCN_UPD_BE_W3_MLIE_CSA_OFST GENMASK(15, 0) 1584 #define RTW89_H2C_BCN_UPD_BE_W3_CRITICAL_UPD_FLAG_OFST GENMASK(31, 16) 1585 #define RTW89_H2C_BCN_UPD_BE_W4_VAP1_DTIM_CNT_OFST GENMASK(15, 0) 1586 #define RTW89_H2C_BCN_UPD_BE_W4_VAP2_DTIM_CNT_OFST GENMASK(31, 16) 1587 #define RTW89_H2C_BCN_UPD_BE_W5_VAP3_DTIM_CNT_OFST GENMASK(15, 0) 1588 #define RTW89_H2C_BCN_UPD_BE_W5_VAP4_DTIM_CNT_OFST GENMASK(31, 16) 1589 #define RTW89_H2C_BCN_UPD_BE_W6_VAP5_DTIM_CNT_OFST GENMASK(15, 0) 1590 #define RTW89_H2C_BCN_UPD_BE_W6_VAP6_DTIM_CNT_OFST GENMASK(31, 16) 1591 #define RTW89_H2C_BCN_UPD_BE_W7_VAP7_DTIM_CNT_OFST GENMASK(15, 0) 1592 #define RTW89_H2C_BCN_UPD_BE_W7_ECSA_OFST GENMASK(30, 16) 1593 #define RTW89_H2C_BCN_UPD_BE_W7_PROTECTION_KEY_ID BIT(31) 1594 1595 struct rtw89_h2c_role_maintain { 1596 __le32 w0; 1597 }; 1598 1599 #define RTW89_H2C_ROLE_MAINTAIN_W0_MACID GENMASK(7, 0) 1600 #define RTW89_H2C_ROLE_MAINTAIN_W0_SELF_ROLE GENMASK(9, 8) 1601 #define RTW89_H2C_ROLE_MAINTAIN_W0_UPD_MODE GENMASK(12, 10) 1602 #define RTW89_H2C_ROLE_MAINTAIN_W0_WIFI_ROLE GENMASK(16, 13) 1603 #define RTW89_H2C_ROLE_MAINTAIN_W0_BAND GENMASK(18, 17) 1604 #define RTW89_H2C_ROLE_MAINTAIN_W0_PORT GENMASK(21, 19) 1605 #define RTW89_H2C_ROLE_MAINTAIN_W0_MACID_EXT GENMASK(31, 24) 1606 1607 enum rtw89_fw_sta_type { /* value of RTW89_H2C_JOININFO_W1_STA_TYPE */ 1608 RTW89_FW_N_AC_STA = 0, 1609 RTW89_FW_AX_STA = 1, 1610 RTW89_FW_BE_STA = 2, 1611 }; 1612 1613 struct rtw89_h2c_join { 1614 __le32 w0; 1615 } __packed; 1616 1617 struct rtw89_h2c_join_v1 { 1618 __le32 w0; 1619 __le32 w1; 1620 __le32 w2; 1621 } __packed; 1622 1623 #define RTW89_H2C_JOININFO_W0_MACID GENMASK(7, 0) 1624 #define RTW89_H2C_JOININFO_W0_OP BIT(8) 1625 #define RTW89_H2C_JOININFO_W0_BAND BIT(9) 1626 #define RTW89_H2C_JOININFO_W0_WMM GENMASK(11, 10) 1627 #define RTW89_H2C_JOININFO_W0_TGR BIT(12) 1628 #define RTW89_H2C_JOININFO_W0_ISHESTA BIT(13) 1629 #define RTW89_H2C_JOININFO_W0_DLBW GENMASK(15, 14) 1630 #define RTW89_H2C_JOININFO_W0_TF_MAC_PAD GENMASK(17, 16) 1631 #define RTW89_H2C_JOININFO_W0_DL_T_PE GENMASK(20, 18) 1632 #define RTW89_H2C_JOININFO_W0_PORT_ID GENMASK(23, 21) 1633 #define RTW89_H2C_JOININFO_W0_NET_TYPE GENMASK(25, 24) 1634 #define RTW89_H2C_JOININFO_W0_WIFI_ROLE GENMASK(29, 26) 1635 #define RTW89_H2C_JOININFO_W0_SELF_ROLE GENMASK(31, 30) 1636 #define RTW89_H2C_JOININFO_W1_STA_TYPE GENMASK(2, 0) 1637 #define RTW89_H2C_JOININFO_W1_IS_MLD BIT(3) 1638 #define RTW89_H2C_JOININFO_W1_MAIN_MACID GENMASK(11, 4) 1639 #define RTW89_H2C_JOININFO_W1_MLO_MODE BIT(12) 1640 #define RTW89_H2C_JOININFO_MLO_MODE_MLMR 0 1641 #define RTW89_H2C_JOININFO_MLO_MODE_MLSR 1 1642 #define RTW89_H2C_JOININFO_W1_EMLSR_CAB BIT(13) 1643 #define RTW89_H2C_JOININFO_W1_NSTR_EN BIT(14) 1644 #define RTW89_H2C_JOININFO_W1_INIT_PWR_STATE BIT(15) 1645 #define RTW89_H2C_JOININFO_W1_EMLSR_PADDING GENMASK(18, 16) 1646 #define RTW89_H2C_JOININFO_W1_EMLSR_TRANS_DELAY GENMASK(21, 19) 1647 #define RTW89_H2C_JOININFO_W2_MACID_EXT GENMASK(7, 0) 1648 #define RTW89_H2C_JOININFO_W2_MAIN_MACID_EXT GENMASK(15, 8) 1649 1650 struct rtw89_h2c_notify_dbcc { 1651 __le32 w0; 1652 } __packed; 1653 1654 #define RTW89_H2C_NOTIFY_DBCC_EN BIT(0) 1655 1656 static inline void SET_GENERAL_PKT_MACID(void *h2c, u32 val) 1657 { 1658 le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0)); 1659 } 1660 1661 static inline void SET_GENERAL_PKT_PROBRSP_ID(void *h2c, u32 val) 1662 { 1663 le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); 1664 } 1665 1666 static inline void SET_GENERAL_PKT_PSPOLL_ID(void *h2c, u32 val) 1667 { 1668 le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16)); 1669 } 1670 1671 static inline void SET_GENERAL_PKT_NULL_ID(void *h2c, u32 val) 1672 { 1673 le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); 1674 } 1675 1676 static inline void SET_GENERAL_PKT_QOS_NULL_ID(void *h2c, u32 val) 1677 { 1678 le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0)); 1679 } 1680 1681 static inline void SET_GENERAL_PKT_CTS2SELF_ID(void *h2c, u32 val) 1682 { 1683 le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8)); 1684 } 1685 1686 static inline void SET_LOG_CFG_LEVEL(void *h2c, u32 val) 1687 { 1688 le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0)); 1689 } 1690 1691 static inline void SET_LOG_CFG_PATH(void *h2c, u32 val) 1692 { 1693 le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); 1694 } 1695 1696 static inline void SET_LOG_CFG_COMP(void *h2c, u32 val) 1697 { 1698 le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(31, 0)); 1699 } 1700 1701 static inline void SET_LOG_CFG_COMP_EXT(void *h2c, u32 val) 1702 { 1703 le32p_replace_bits((__le32 *)(h2c) + 2, val, GENMASK(31, 0)); 1704 } 1705 1706 struct rtw89_h2c_ba_cam { 1707 __le32 w0; 1708 __le32 w1; 1709 } __packed; 1710 1711 #define RTW89_H2C_BA_CAM_W0_VALID BIT(0) 1712 #define RTW89_H2C_BA_CAM_W0_INIT_REQ BIT(1) 1713 #define RTW89_H2C_BA_CAM_W0_ENTRY_IDX GENMASK(3, 2) 1714 #define RTW89_H2C_BA_CAM_W0_TID GENMASK(7, 4) 1715 #define RTW89_H2C_BA_CAM_W0_MACID GENMASK(15, 8) 1716 #define RTW89_H2C_BA_CAM_W0_BMAP_SIZE GENMASK(19, 16) 1717 #define RTW89_H2C_BA_CAM_W0_SSN GENMASK(31, 20) 1718 #define RTW89_H2C_BA_CAM_W1_UID GENMASK(7, 0) 1719 #define RTW89_H2C_BA_CAM_W1_STD_EN BIT(8) 1720 #define RTW89_H2C_BA_CAM_W1_BAND BIT(9) 1721 #define RTW89_H2C_BA_CAM_W1_ENTRY_IDX_V1 GENMASK(31, 28) 1722 1723 struct rtw89_h2c_ba_cam_v1 { 1724 __le32 w0; 1725 __le32 w1; 1726 } __packed; 1727 1728 #define RTW89_H2C_BA_CAM_V1_W0_VALID BIT(0) 1729 #define RTW89_H2C_BA_CAM_V1_W0_INIT_REQ BIT(1) 1730 #define RTW89_H2C_BA_CAM_V1_W0_TID_MASK GENMASK(7, 4) 1731 #define RTW89_H2C_BA_CAM_V1_W0_MACID_MASK GENMASK(15, 8) 1732 #define RTW89_H2C_BA_CAM_V1_W0_BMAP_SIZE_MASK GENMASK(19, 16) 1733 #define RTW89_H2C_BA_CAM_V1_W0_SSN_MASK GENMASK(31, 20) 1734 #define RTW89_H2C_BA_CAM_V1_W1_UID_VALUE_MASK GENMASK(7, 0) 1735 #define RTW89_H2C_BA_CAM_V1_W1_STD_ENTRY_EN BIT(8) 1736 #define RTW89_H2C_BA_CAM_V1_W1_BAND_SEL BIT(9) 1737 #define RTW89_H2C_BA_CAM_V1_W1_MLD_EN BIT(10) 1738 #define RTW89_H2C_BA_CAM_V1_W1_ENTRY_IDX_MASK GENMASK(31, 24) 1739 1740 struct rtw89_h2c_ba_cam_init { 1741 __le32 w0; 1742 } __packed; 1743 1744 #define RTW89_H2C_BA_CAM_INIT_USERS_MASK GENMASK(7, 0) 1745 #define RTW89_H2C_BA_CAM_INIT_OFFSET_MASK GENMASK(19, 12) 1746 #define RTW89_H2C_BA_CAM_INIT_BAND_SEL BIT(24) 1747 1748 static inline void SET_LPS_PARM_MACID(void *h2c, u32 val) 1749 { 1750 le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 0)); 1751 } 1752 1753 static inline void SET_LPS_PARM_PSMODE(void *h2c, u32 val) 1754 { 1755 le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); 1756 } 1757 1758 static inline void SET_LPS_PARM_RLBM(void *h2c, u32 val) 1759 { 1760 le32p_replace_bits((__le32 *)h2c, val, GENMASK(19, 16)); 1761 } 1762 1763 static inline void SET_LPS_PARM_SMARTPS(void *h2c, u32 val) 1764 { 1765 le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 20)); 1766 } 1767 1768 static inline void SET_LPS_PARM_AWAKEINTERVAL(void *h2c, u32 val) 1769 { 1770 le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); 1771 } 1772 1773 static inline void SET_LPS_PARM_VOUAPSD(void *h2c, u32 val) 1774 { 1775 le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(0)); 1776 } 1777 1778 static inline void SET_LPS_PARM_VIUAPSD(void *h2c, u32 val) 1779 { 1780 le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(1)); 1781 } 1782 1783 static inline void SET_LPS_PARM_BEUAPSD(void *h2c, u32 val) 1784 { 1785 le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(2)); 1786 } 1787 1788 static inline void SET_LPS_PARM_BKUAPSD(void *h2c, u32 val) 1789 { 1790 le32p_replace_bits((__le32 *)(h2c) + 1, val, BIT(3)); 1791 } 1792 1793 static inline void SET_LPS_PARM_LASTRPWM(void *h2c, u32 val) 1794 { 1795 le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(15, 8)); 1796 } 1797 1798 struct rtw89_h2c_lps_ch_info { 1799 struct { 1800 u8 pri_ch; 1801 u8 central_ch; 1802 u8 bw; 1803 u8 band; 1804 } __packed info[2]; 1805 1806 __le32 mlo_dbcc_mode_lps; 1807 } __packed; 1808 1809 struct rtw89_h2c_lps_ml_cmn_info { 1810 u8 fmt_id; 1811 u8 rfe_type; 1812 u8 rsvd0[2]; 1813 __le32 mlo_dbcc_mode; 1814 u8 central_ch[RTW89_PHY_NUM]; 1815 u8 pri_ch[RTW89_PHY_NUM]; 1816 u8 bw[RTW89_PHY_NUM]; 1817 u8 band[RTW89_PHY_NUM]; 1818 u8 bcn_rate_type[RTW89_PHY_NUM]; 1819 u8 rsvd1[2]; 1820 __le16 tia_gain[RTW89_PHY_NUM][TIA_GAIN_NUM]; 1821 u8 lna_gain[RTW89_PHY_NUM][LNA_GAIN_NUM]; 1822 u8 rsvd2[2]; 1823 u8 tia_lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM + 1]; 1824 u8 lna_op1db[RTW89_PHY_NUM][LNA_GAIN_NUM]; 1825 u8 dup_bcn_ofst[RTW89_PHY_NUM]; 1826 } __packed; 1827 1828 static inline void RTW89_SET_FWCMD_CPU_EXCEPTION_TYPE(void *cmd, u32 val) 1829 { 1830 le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 0)); 1831 } 1832 1833 static inline void RTW89_SET_FWCMD_PKT_DROP_SEL(void *cmd, u32 val) 1834 { 1835 le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0)); 1836 } 1837 1838 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID(void *cmd, u32 val) 1839 { 1840 le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); 1841 } 1842 1843 static inline void RTW89_SET_FWCMD_PKT_DROP_BAND(void *cmd, u32 val) 1844 { 1845 le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); 1846 } 1847 1848 static inline void RTW89_SET_FWCMD_PKT_DROP_PORT(void *cmd, u32 val) 1849 { 1850 le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); 1851 } 1852 1853 static inline void RTW89_SET_FWCMD_PKT_DROP_MBSSID(void *cmd, u32 val) 1854 { 1855 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 0)); 1856 } 1857 1858 static inline void RTW89_SET_FWCMD_PKT_DROP_ROLE_A_INFO_TF_TRS(void *cmd, u32 val) 1859 { 1860 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(15, 8)); 1861 } 1862 1863 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_0(void *cmd, u32 val) 1864 { 1865 le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); 1866 } 1867 1868 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_1(void *cmd, u32 val) 1869 { 1870 le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0)); 1871 } 1872 1873 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_2(void *cmd, u32 val) 1874 { 1875 le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0)); 1876 } 1877 1878 static inline void RTW89_SET_FWCMD_PKT_DROP_MACID_BAND_SEL_3(void *cmd, u32 val) 1879 { 1880 le32p_replace_bits((__le32 *)cmd + 5, val, GENMASK(31, 0)); 1881 } 1882 1883 static inline void RTW89_SET_KEEP_ALIVE_ENABLE(void *h2c, u32 val) 1884 { 1885 le32p_replace_bits((__le32 *)h2c, val, GENMASK(1, 0)); 1886 } 1887 1888 static inline void RTW89_SET_KEEP_ALIVE_PKT_NULL_ID(void *h2c, u32 val) 1889 { 1890 le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); 1891 } 1892 1893 static inline void RTW89_SET_KEEP_ALIVE_PERIOD(void *h2c, u32 val) 1894 { 1895 le32p_replace_bits((__le32 *)h2c, val, GENMASK(24, 16)); 1896 } 1897 1898 static inline void RTW89_SET_KEEP_ALIVE_MACID(void *h2c, u32 val) 1899 { 1900 le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); 1901 } 1902 1903 static inline void RTW89_SET_DISCONNECT_DETECT_ENABLE(void *h2c, u32 val) 1904 { 1905 le32p_replace_bits((__le32 *)h2c, val, BIT(0)); 1906 } 1907 1908 static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_EN(void *h2c, u32 val) 1909 { 1910 le32p_replace_bits((__le32 *)h2c, val, BIT(1)); 1911 } 1912 1913 static inline void RTW89_SET_DISCONNECT_DETECT_DISCONNECT(void *h2c, u32 val) 1914 { 1915 le32p_replace_bits((__le32 *)h2c, val, BIT(2)); 1916 } 1917 1918 static inline void RTW89_SET_DISCONNECT_DETECT_MAC_ID(void *h2c, u32 val) 1919 { 1920 le32p_replace_bits((__le32 *)h2c, val, GENMASK(15, 8)); 1921 } 1922 1923 static inline void RTW89_SET_DISCONNECT_DETECT_CHECK_PERIOD(void *h2c, u32 val) 1924 { 1925 le32p_replace_bits((__le32 *)h2c, val, GENMASK(23, 16)); 1926 } 1927 1928 static inline void RTW89_SET_DISCONNECT_DETECT_TRY_PKT_COUNT(void *h2c, u32 val) 1929 { 1930 le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); 1931 } 1932 1933 static inline void RTW89_SET_DISCONNECT_DETECT_TRYOK_BCNFAIL_COUNT_LIMIT(void *h2c, u32 val) 1934 { 1935 le32p_replace_bits((__le32 *)(h2c) + 1, val, GENMASK(7, 0)); 1936 } 1937 1938 struct rtw89_h2c_wow_global { 1939 __le32 w0; 1940 struct rtw89_wow_key_info key_info; 1941 } __packed; 1942 1943 #define RTW89_H2C_WOW_GLOBAL_W0_ENABLE BIT(0) 1944 #define RTW89_H2C_WOW_GLOBAL_W0_DROP_ALL_PKT BIT(1) 1945 #define RTW89_H2C_WOW_GLOBAL_W0_RX_PARSE_AFTER_WAKE BIT(2) 1946 #define RTW89_H2C_WOW_GLOBAL_W0_WAKE_BAR_PULLED BIT(3) 1947 #define RTW89_H2C_WOW_GLOBAL_W0_MAC_ID GENMASK(15, 8) 1948 #define RTW89_H2C_WOW_GLOBAL_W0_PAIRWISE_SEC_ALGO GENMASK(23, 16) 1949 #define RTW89_H2C_WOW_GLOBAL_W0_GROUP_SEC_ALGO GENMASK(31, 24) 1950 1951 #define RTW89_MAX_SUPPORT_NL_NUM 16 1952 struct rtw89_h2c_cfg_nlo { 1953 __le32 w0; 1954 u8 nlo_cnt; 1955 u8 rsvd[3]; 1956 __le32 patterncheck; 1957 __le32 rsvd1; 1958 __le32 rsvd2; 1959 u8 ssid_len[RTW89_MAX_SUPPORT_NL_NUM]; 1960 u8 chiper[RTW89_MAX_SUPPORT_NL_NUM]; 1961 u8 rsvd3[24]; 1962 u8 ssid[RTW89_MAX_SUPPORT_NL_NUM][IEEE80211_MAX_SSID_LEN]; 1963 } __packed; 1964 1965 #define RTW89_H2C_NLO_W0_ENABLE BIT(0) 1966 #define RTW89_H2C_NLO_W0_IGNORE_CIPHER BIT(2) 1967 #define RTW89_H2C_NLO_W0_MACID GENMASK(31, 24) 1968 1969 static inline void RTW89_SET_WOW_WAKEUP_CTRL_PATTERN_MATCH_ENABLE(void *h2c, u32 val) 1970 { 1971 le32p_replace_bits((__le32 *)h2c, val, BIT(0)); 1972 } 1973 1974 static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAGIC_ENABLE(void *h2c, u32 val) 1975 { 1976 le32p_replace_bits((__le32 *)h2c, val, BIT(1)); 1977 } 1978 1979 static inline void RTW89_SET_WOW_WAKEUP_CTRL_HW_UNICAST_ENABLE(void *h2c, u32 val) 1980 { 1981 le32p_replace_bits((__le32 *)h2c, val, BIT(2)); 1982 } 1983 1984 static inline void RTW89_SET_WOW_WAKEUP_CTRL_FW_UNICAST_ENABLE(void *h2c, u32 val) 1985 { 1986 le32p_replace_bits((__le32 *)h2c, val, BIT(3)); 1987 } 1988 1989 static inline void RTW89_SET_WOW_WAKEUP_CTRL_DEAUTH_ENABLE(void *h2c, u32 val) 1990 { 1991 le32p_replace_bits((__le32 *)h2c, val, BIT(4)); 1992 } 1993 1994 static inline void RTW89_SET_WOW_WAKEUP_CTRL_REKEYP_ENABLE(void *h2c, u32 val) 1995 { 1996 le32p_replace_bits((__le32 *)h2c, val, BIT(5)); 1997 } 1998 1999 static inline void RTW89_SET_WOW_WAKEUP_CTRL_EAP_ENABLE(void *h2c, u32 val) 2000 { 2001 le32p_replace_bits((__le32 *)h2c, val, BIT(6)); 2002 } 2003 2004 static inline void RTW89_SET_WOW_WAKEUP_CTRL_ALL_DATA_ENABLE(void *h2c, u32 val) 2005 { 2006 le32p_replace_bits((__le32 *)h2c, val, BIT(7)); 2007 } 2008 2009 static inline void RTW89_SET_WOW_WAKEUP_CTRL_MAC_ID(void *h2c, u32 val) 2010 { 2011 le32p_replace_bits((__le32 *)h2c, val, GENMASK(31, 24)); 2012 } 2013 2014 static inline void RTW89_SET_WOW_CAM_UPD_R_W(void *h2c, u32 val) 2015 { 2016 le32p_replace_bits((__le32 *)h2c, val, BIT(0)); 2017 } 2018 2019 static inline void RTW89_SET_WOW_CAM_UPD_IDX(void *h2c, u32 val) 2020 { 2021 le32p_replace_bits((__le32 *)h2c, val, GENMASK(7, 1)); 2022 } 2023 2024 static inline void RTW89_SET_WOW_CAM_UPD_WKFM1(void *h2c, u32 val) 2025 { 2026 le32p_replace_bits((__le32 *)h2c + 1, val, GENMASK(31, 0)); 2027 } 2028 2029 static inline void RTW89_SET_WOW_CAM_UPD_WKFM2(void *h2c, u32 val) 2030 { 2031 le32p_replace_bits((__le32 *)h2c + 2, val, GENMASK(31, 0)); 2032 } 2033 2034 static inline void RTW89_SET_WOW_CAM_UPD_WKFM3(void *h2c, u32 val) 2035 { 2036 le32p_replace_bits((__le32 *)h2c + 3, val, GENMASK(31, 0)); 2037 } 2038 2039 static inline void RTW89_SET_WOW_CAM_UPD_WKFM4(void *h2c, u32 val) 2040 { 2041 le32p_replace_bits((__le32 *)h2c + 4, val, GENMASK(31, 0)); 2042 } 2043 2044 static inline void RTW89_SET_WOW_CAM_UPD_CRC(void *h2c, u32 val) 2045 { 2046 le32p_replace_bits((__le32 *)h2c + 5, val, GENMASK(15, 0)); 2047 } 2048 2049 static inline void RTW89_SET_WOW_CAM_UPD_NEGATIVE_PATTERN_MATCH(void *h2c, u32 val) 2050 { 2051 le32p_replace_bits((__le32 *)h2c + 5, val, BIT(22)); 2052 } 2053 2054 static inline void RTW89_SET_WOW_CAM_UPD_SKIP_MAC_HDR(void *h2c, u32 val) 2055 { 2056 le32p_replace_bits((__le32 *)h2c + 5, val, BIT(23)); 2057 } 2058 2059 static inline void RTW89_SET_WOW_CAM_UPD_UC(void *h2c, u32 val) 2060 { 2061 le32p_replace_bits((__le32 *)h2c + 5, val, BIT(24)); 2062 } 2063 2064 static inline void RTW89_SET_WOW_CAM_UPD_MC(void *h2c, u32 val) 2065 { 2066 le32p_replace_bits((__le32 *)h2c + 5, val, BIT(25)); 2067 } 2068 2069 static inline void RTW89_SET_WOW_CAM_UPD_BC(void *h2c, u32 val) 2070 { 2071 le32p_replace_bits((__le32 *)h2c + 5, val, BIT(26)); 2072 } 2073 2074 static inline void RTW89_SET_WOW_CAM_UPD_VALID(void *h2c, u32 val) 2075 { 2076 le32p_replace_bits((__le32 *)h2c + 5, val, BIT(31)); 2077 } 2078 2079 struct rtw89_h2c_wow_gtk_ofld { 2080 __le32 w0; 2081 __le32 w1; 2082 struct rtw89_wow_gtk_info gtk_info; 2083 } __packed; 2084 2085 #define RTW89_H2C_WOW_GTK_OFLD_W0_EN BIT(0) 2086 #define RTW89_H2C_WOW_GTK_OFLD_W0_TKIP_EN BIT(1) 2087 #define RTW89_H2C_WOW_GTK_OFLD_W0_IEEE80211W_EN BIT(2) 2088 #define RTW89_H2C_WOW_GTK_OFLD_W0_PAIRWISE_WAKEUP BIT(3) 2089 #define RTW89_H2C_WOW_GTK_OFLD_W0_NOREKEY_WAKEUP BIT(4) 2090 #define RTW89_H2C_WOW_GTK_OFLD_W0_MAC_ID GENMASK(23, 16) 2091 #define RTW89_H2C_WOW_GTK_OFLD_W0_GTK_RSP_ID GENMASK(31, 24) 2092 #define RTW89_H2C_WOW_GTK_OFLD_W1_PMF_SA_QUERY_ID GENMASK(7, 0) 2093 #define RTW89_H2C_WOW_GTK_OFLD_W1_PMF_BIP_SEC_ALGO GENMASK(9, 8) 2094 #define RTW89_H2C_WOW_GTK_OFLD_W1_ALGO_AKM_SUIT GENMASK(17, 10) 2095 2096 struct rtw89_h2c_arp_offload { 2097 __le32 w0; 2098 __le32 w1; 2099 } __packed; 2100 2101 #define RTW89_H2C_ARP_OFFLOAD_W0_ENABLE BIT(0) 2102 #define RTW89_H2C_ARP_OFFLOAD_W0_ACTION BIT(1) 2103 #define RTW89_H2C_ARP_OFFLOAD_W0_MACID GENMASK(23, 16) 2104 #define RTW89_H2C_ARP_OFFLOAD_W0_PKT_ID GENMASK(31, 24) 2105 #define RTW89_H2C_ARP_OFFLOAD_W1_CONTENT GENMASK(31, 0) 2106 2107 enum rtw89_btc_btf_h2c_class { 2108 BTFC_SET = 0x10, 2109 BTFC_GET = 0x11, 2110 BTFC_FW_EVENT = 0x12, 2111 }; 2112 2113 enum rtw89_btc_btf_set { 2114 SET_REPORT_EN = 0x0, 2115 SET_SLOT_TABLE, 2116 SET_MREG_TABLE, 2117 SET_CX_POLICY, 2118 SET_GPIO_DBG, 2119 SET_DRV_INFO, 2120 SET_DRV_EVENT, 2121 SET_BT_WREG_ADDR, 2122 SET_BT_WREG_VAL, 2123 SET_BT_RREG_ADDR, 2124 SET_BT_WL_CH_INFO, 2125 SET_BT_INFO_REPORT, 2126 SET_BT_IGNORE_WLAN_ACT, 2127 SET_BT_TX_PWR, 2128 SET_BT_LNA_CONSTRAIN, 2129 SET_BT_QUERY_DEV_LIST, 2130 SET_BT_QUERY_DEV_INFO, 2131 SET_BT_PSD_REPORT, 2132 SET_H2C_TEST, 2133 SET_IOFLD_RF, 2134 SET_IOFLD_BB, 2135 SET_IOFLD_MAC, 2136 SET_IOFLD_SCBD, 2137 SET_H2C_MACRO, 2138 SET_MAX1, 2139 }; 2140 2141 enum rtw89_btc_cxdrvinfo { 2142 CXDRVINFO_INIT = 0, 2143 CXDRVINFO_ROLE, 2144 CXDRVINFO_DBCC, 2145 CXDRVINFO_SMAP, 2146 CXDRVINFO_RFK, 2147 CXDRVINFO_RUN, 2148 CXDRVINFO_CTRL, 2149 CXDRVINFO_SCAN, 2150 CXDRVINFO_TRX, /* WL traffic to WL fw */ 2151 CXDRVINFO_TXPWR, 2152 CXDRVINFO_FDDT, 2153 CXDRVINFO_MLO, 2154 CXDRVINFO_OSI, 2155 CXDRVINFO_MAX, 2156 }; 2157 2158 enum rtw89_scan_mode { 2159 RTW89_SCAN_IMMEDIATE, 2160 RTW89_SCAN_DELAY, 2161 }; 2162 2163 enum rtw89_scan_type { 2164 RTW89_SCAN_ONCE, 2165 RTW89_SCAN_NORMAL, 2166 RTW89_SCAN_NORMAL_SLOW, 2167 RTW89_SCAN_SEAMLESS, 2168 RTW89_SCAN_MAX, 2169 }; 2170 2171 static inline void RTW89_SET_FWCMD_CXHDR_TYPE(void *cmd, u8 val) 2172 { 2173 u8p_replace_bits((u8 *)(cmd) + 0, val, GENMASK(7, 0)); 2174 } 2175 2176 static inline void RTW89_SET_FWCMD_CXHDR_LEN(void *cmd, u8 val) 2177 { 2178 u8p_replace_bits((u8 *)(cmd) + 1, val, GENMASK(7, 0)); 2179 } 2180 2181 struct rtw89_h2c_cxhdr { 2182 u8 type; 2183 u8 len; 2184 } __packed; 2185 2186 struct rtw89_h2c_cxhdr_v7 { 2187 u8 type; 2188 u8 ver; 2189 u8 len; 2190 } __packed; 2191 2192 struct rtw89_h2c_cxctrl_v7 { 2193 struct rtw89_h2c_cxhdr_v7 hdr; 2194 struct rtw89_btc_ctrl_v7 ctrl; 2195 } __packed; 2196 2197 #define H2C_LEN_CXDRVHDR sizeof(struct rtw89_h2c_cxhdr) 2198 #define H2C_LEN_CXDRVHDR_V7 sizeof(struct rtw89_h2c_cxhdr_v7) 2199 2200 struct rtw89_btc_wl_role_info_v7_u8 { 2201 u8 connect_cnt; 2202 u8 link_mode; 2203 u8 link_mode_chg; 2204 u8 p2p_2g; 2205 2206 struct rtw89_btc_wl_active_role_v7 active_role[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER]; 2207 } __packed; 2208 2209 struct rtw89_btc_wl_role_info_v7_u32 { 2210 __le32 role_map; 2211 __le32 mrole_type; 2212 __le32 mrole_noa_duration; 2213 __le32 dbcc_en; 2214 __le32 dbcc_chg; 2215 __le32 dbcc_2g_phy; 2216 } __packed; 2217 2218 struct rtw89_h2c_cxrole_v7 { 2219 struct rtw89_h2c_cxhdr_v7 hdr; 2220 struct rtw89_btc_wl_role_info_v7_u8 _u8; 2221 struct rtw89_btc_wl_role_info_v7_u32 _u32; 2222 } __packed; 2223 2224 struct rtw89_btc_wl_role_info_v8_u8 { 2225 u8 connect_cnt; 2226 u8 link_mode; 2227 u8 link_mode_chg; 2228 u8 p2p_2g; 2229 2230 u8 pta_req_band; 2231 u8 dbcc_en; 2232 u8 dbcc_chg; 2233 u8 dbcc_2g_phy; 2234 2235 struct rtw89_btc_wl_rlink rlink[RTW89_BE_BTC_WL_MAX_ROLE_NUMBER][RTW89_MAC_NUM]; 2236 } __packed; 2237 2238 struct rtw89_btc_wl_role_info_v8_u32 { 2239 __le32 role_map; 2240 __le32 mrole_type; 2241 __le32 mrole_noa_duration; 2242 } __packed; 2243 2244 struct rtw89_h2c_cxrole_v8 { 2245 struct rtw89_h2c_cxhdr_v7 hdr; 2246 struct rtw89_btc_wl_role_info_v8_u8 _u8; 2247 struct rtw89_btc_wl_role_info_v8_u32 _u32; 2248 } __packed; 2249 2250 struct rtw89_h2c_cxinit { 2251 struct rtw89_h2c_cxhdr hdr; 2252 u8 ant_type; 2253 u8 ant_num; 2254 u8 ant_iso; 2255 u8 ant_info; 2256 u8 mod_rfe; 2257 u8 mod_cv; 2258 u8 mod_info; 2259 u8 mod_adie_kt; 2260 u8 wl_gch; 2261 u8 info; 2262 u8 rsvd; 2263 u8 rsvd1; 2264 } __packed; 2265 2266 #define RTW89_H2C_CXINIT_ANT_INFO_POS BIT(0) 2267 #define RTW89_H2C_CXINIT_ANT_INFO_DIVERSITY BIT(1) 2268 #define RTW89_H2C_CXINIT_ANT_INFO_BTG_POS GENMASK(3, 2) 2269 #define RTW89_H2C_CXINIT_ANT_INFO_STREAM_CNT GENMASK(7, 4) 2270 2271 #define RTW89_H2C_CXINIT_MOD_INFO_BT_SOLO BIT(0) 2272 #define RTW89_H2C_CXINIT_MOD_INFO_BT_POS BIT(1) 2273 #define RTW89_H2C_CXINIT_MOD_INFO_SW_TYPE BIT(2) 2274 #define RTW89_H2C_CXINIT_MOD_INFO_WA_TYPE GENMASK(5, 3) 2275 2276 #define RTW89_H2C_CXINIT_INFO_WL_ONLY BIT(0) 2277 #define RTW89_H2C_CXINIT_INFO_WL_INITOK BIT(1) 2278 #define RTW89_H2C_CXINIT_INFO_DBCC_EN BIT(2) 2279 #define RTW89_H2C_CXINIT_INFO_CX_OTHER BIT(3) 2280 #define RTW89_H2C_CXINIT_INFO_BT_ONLY BIT(4) 2281 2282 struct rtw89_h2c_cxinit_v7 { 2283 struct rtw89_h2c_cxhdr_v7 hdr; 2284 struct rtw89_btc_init_info_v7 init; 2285 } __packed; 2286 2287 static inline void RTW89_SET_FWCMD_CXROLE_CONNECT_CNT(void *cmd, u8 val) 2288 { 2289 u8p_replace_bits((u8 *)(cmd) + 2, val, GENMASK(7, 0)); 2290 } 2291 2292 static inline void RTW89_SET_FWCMD_CXROLE_LINK_MODE(void *cmd, u8 val) 2293 { 2294 u8p_replace_bits((u8 *)(cmd) + 3, val, GENMASK(7, 0)); 2295 } 2296 2297 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_NONE(void *cmd, u16 val) 2298 { 2299 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(0)); 2300 } 2301 2302 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_STA(void *cmd, u16 val) 2303 { 2304 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(1)); 2305 } 2306 2307 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_AP(void *cmd, u16 val) 2308 { 2309 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(2)); 2310 } 2311 2312 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_VAP(void *cmd, u16 val) 2313 { 2314 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(3)); 2315 } 2316 2317 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC(void *cmd, u16 val) 2318 { 2319 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(4)); 2320 } 2321 2322 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_ADHOC_MASTER(void *cmd, u16 val) 2323 { 2324 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(5)); 2325 } 2326 2327 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_MESH(void *cmd, u16 val) 2328 { 2329 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(6)); 2330 } 2331 2332 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_MONITOR(void *cmd, u16 val) 2333 { 2334 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(7)); 2335 } 2336 2337 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_DEV(void *cmd, u16 val) 2338 { 2339 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(8)); 2340 } 2341 2342 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GC(void *cmd, u16 val) 2343 { 2344 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(9)); 2345 } 2346 2347 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_P2P_GO(void *cmd, u16 val) 2348 { 2349 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(10)); 2350 } 2351 2352 static inline void RTW89_SET_FWCMD_CXROLE_ROLE_NAN(void *cmd, u16 val) 2353 { 2354 le16p_replace_bits((__le16 *)((u8 *)(cmd) + 4), val, BIT(11)); 2355 } 2356 2357 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED(void *cmd, u8 val, int n, u8 offset) 2358 { 2359 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(0)); 2360 } 2361 2362 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PID(void *cmd, u8 val, int n, u8 offset) 2363 { 2364 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(3, 1)); 2365 } 2366 2367 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PHY(void *cmd, u8 val, int n, u8 offset) 2368 { 2369 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(4)); 2370 } 2371 2372 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA(void *cmd, u8 val, int n, u8 offset) 2373 { 2374 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(5)); 2375 } 2376 2377 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BAND(void *cmd, u8 val, int n, u8 offset) 2378 { 2379 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(7, 6)); 2380 } 2381 2382 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS(void *cmd, u8 val, int n, u8 offset) 2383 { 2384 u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, BIT(0)); 2385 } 2386 2387 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BW(void *cmd, u8 val, int n, u8 offset) 2388 { 2389 u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, GENMASK(7, 1)); 2390 } 2391 2392 static inline void RTW89_SET_FWCMD_CXROLE_ACT_ROLE(void *cmd, u8 val, int n, u8 offset) 2393 { 2394 u8p_replace_bits((u8 *)cmd + (8 + (12 + offset) * n), val, GENMASK(7, 0)); 2395 } 2396 2397 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CH(void *cmd, u8 val, int n, u8 offset) 2398 { 2399 u8p_replace_bits((u8 *)cmd + (9 + (12 + offset) * n), val, GENMASK(7, 0)); 2400 } 2401 2402 static inline void RTW89_SET_FWCMD_CXROLE_ACT_TX_LVL(void *cmd, u16 val, int n, u8 offset) 2403 { 2404 le16p_replace_bits((__le16 *)((u8 *)cmd + (10 + (12 + offset) * n)), val, GENMASK(15, 0)); 2405 } 2406 2407 static inline void RTW89_SET_FWCMD_CXROLE_ACT_RX_LVL(void *cmd, u16 val, int n, u8 offset) 2408 { 2409 le16p_replace_bits((__le16 *)((u8 *)cmd + (12 + (12 + offset) * n)), val, GENMASK(15, 0)); 2410 } 2411 2412 static inline void RTW89_SET_FWCMD_CXROLE_ACT_TX_RATE(void *cmd, u16 val, int n, u8 offset) 2413 { 2414 le16p_replace_bits((__le16 *)((u8 *)cmd + (14 + (12 + offset) * n)), val, GENMASK(15, 0)); 2415 } 2416 2417 static inline void RTW89_SET_FWCMD_CXROLE_ACT_RX_RATE(void *cmd, u16 val, int n, u8 offset) 2418 { 2419 le16p_replace_bits((__le16 *)((u8 *)cmd + (16 + (12 + offset) * n)), val, GENMASK(15, 0)); 2420 } 2421 2422 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR(void *cmd, u32 val, int n, u8 offset) 2423 { 2424 le32p_replace_bits((__le32 *)((u8 *)cmd + (20 + (12 + offset) * n)), val, GENMASK(31, 0)); 2425 } 2426 2427 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CONNECTED_V2(void *cmd, u8 val, int n, u8 offset) 2428 { 2429 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(0)); 2430 } 2431 2432 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PID_V2(void *cmd, u8 val, int n, u8 offset) 2433 { 2434 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(3, 1)); 2435 } 2436 2437 static inline void RTW89_SET_FWCMD_CXROLE_ACT_PHY_V2(void *cmd, u8 val, int n, u8 offset) 2438 { 2439 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(4)); 2440 } 2441 2442 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_V2(void *cmd, u8 val, int n, u8 offset) 2443 { 2444 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, BIT(5)); 2445 } 2446 2447 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BAND_V2(void *cmd, u8 val, int n, u8 offset) 2448 { 2449 u8p_replace_bits((u8 *)cmd + (6 + (12 + offset) * n), val, GENMASK(7, 6)); 2450 } 2451 2452 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CLIENT_PS_V2(void *cmd, u8 val, int n, u8 offset) 2453 { 2454 u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, BIT(0)); 2455 } 2456 2457 static inline void RTW89_SET_FWCMD_CXROLE_ACT_BW_V2(void *cmd, u8 val, int n, u8 offset) 2458 { 2459 u8p_replace_bits((u8 *)cmd + (7 + (12 + offset) * n), val, GENMASK(7, 1)); 2460 } 2461 2462 static inline void RTW89_SET_FWCMD_CXROLE_ACT_ROLE_V2(void *cmd, u8 val, int n, u8 offset) 2463 { 2464 u8p_replace_bits((u8 *)cmd + (8 + (12 + offset) * n), val, GENMASK(7, 0)); 2465 } 2466 2467 static inline void RTW89_SET_FWCMD_CXROLE_ACT_CH_V2(void *cmd, u8 val, int n, u8 offset) 2468 { 2469 u8p_replace_bits((u8 *)cmd + (9 + (12 + offset) * n), val, GENMASK(7, 0)); 2470 } 2471 2472 static inline void RTW89_SET_FWCMD_CXROLE_ACT_NOA_DUR_V2(void *cmd, u32 val, int n, u8 offset) 2473 { 2474 le32p_replace_bits((__le32 *)((u8 *)cmd + (10 + (12 + offset) * n)), val, GENMASK(31, 0)); 2475 } 2476 2477 static inline void RTW89_SET_FWCMD_CXROLE_MROLE_TYPE(void *cmd, u32 val, u8 offset) 2478 { 2479 le32p_replace_bits((__le32 *)((u8 *)cmd + offset), val, GENMASK(31, 0)); 2480 } 2481 2482 static inline void RTW89_SET_FWCMD_CXROLE_MROLE_NOA(void *cmd, u32 val, u8 offset) 2483 { 2484 le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 4), val, GENMASK(31, 0)); 2485 } 2486 2487 static inline void RTW89_SET_FWCMD_CXROLE_DBCC_EN(void *cmd, u32 val, u8 offset) 2488 { 2489 le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(0)); 2490 } 2491 2492 static inline void RTW89_SET_FWCMD_CXROLE_DBCC_CHG(void *cmd, u32 val, u8 offset) 2493 { 2494 le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(1)); 2495 } 2496 2497 static inline void RTW89_SET_FWCMD_CXROLE_DBCC_2G_PHY(void *cmd, u32 val, u8 offset) 2498 { 2499 le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, GENMASK(3, 2)); 2500 } 2501 2502 static inline void RTW89_SET_FWCMD_CXROLE_LINK_MODE_CHG(void *cmd, u32 val, u8 offset) 2503 { 2504 le32p_replace_bits((__le32 *)((u8 *)cmd + offset + 8), val, BIT(4)); 2505 } 2506 2507 static inline void RTW89_SET_FWCMD_CXCTRL_MANUAL(void *cmd, u32 val) 2508 { 2509 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(0)); 2510 } 2511 2512 static inline void RTW89_SET_FWCMD_CXCTRL_IGNORE_BT(void *cmd, u32 val) 2513 { 2514 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(1)); 2515 } 2516 2517 static inline void RTW89_SET_FWCMD_CXCTRL_ALWAYS_FREERUN(void *cmd, u32 val) 2518 { 2519 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, BIT(2)); 2520 } 2521 2522 static inline void RTW89_SET_FWCMD_CXCTRL_TRACE_STEP(void *cmd, u32 val) 2523 { 2524 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(18, 3)); 2525 } 2526 2527 static inline void RTW89_SET_FWCMD_CXTRX_TXLV(void *cmd, u8 val) 2528 { 2529 u8p_replace_bits((u8 *)cmd + 2, val, GENMASK(7, 0)); 2530 } 2531 2532 static inline void RTW89_SET_FWCMD_CXTRX_RXLV(void *cmd, u8 val) 2533 { 2534 u8p_replace_bits((u8 *)cmd + 3, val, GENMASK(7, 0)); 2535 } 2536 2537 static inline void RTW89_SET_FWCMD_CXTRX_WLRSSI(void *cmd, u8 val) 2538 { 2539 u8p_replace_bits((u8 *)cmd + 4, val, GENMASK(7, 0)); 2540 } 2541 2542 static inline void RTW89_SET_FWCMD_CXTRX_BTRSSI(void *cmd, u8 val) 2543 { 2544 u8p_replace_bits((u8 *)cmd + 5, val, GENMASK(7, 0)); 2545 } 2546 2547 static inline void RTW89_SET_FWCMD_CXTRX_TXPWR(void *cmd, s8 val) 2548 { 2549 u8p_replace_bits((u8 *)cmd + 6, val, GENMASK(7, 0)); 2550 } 2551 2552 static inline void RTW89_SET_FWCMD_CXTRX_RXGAIN(void *cmd, s8 val) 2553 { 2554 u8p_replace_bits((u8 *)cmd + 7, val, GENMASK(7, 0)); 2555 } 2556 2557 static inline void RTW89_SET_FWCMD_CXTRX_BTTXPWR(void *cmd, s8 val) 2558 { 2559 u8p_replace_bits((u8 *)cmd + 8, val, GENMASK(7, 0)); 2560 } 2561 2562 static inline void RTW89_SET_FWCMD_CXTRX_BTRXGAIN(void *cmd, s8 val) 2563 { 2564 u8p_replace_bits((u8 *)cmd + 9, val, GENMASK(7, 0)); 2565 } 2566 2567 static inline void RTW89_SET_FWCMD_CXTRX_CN(void *cmd, u8 val) 2568 { 2569 u8p_replace_bits((u8 *)cmd + 10, val, GENMASK(7, 0)); 2570 } 2571 2572 static inline void RTW89_SET_FWCMD_CXTRX_NHM(void *cmd, s8 val) 2573 { 2574 u8p_replace_bits((u8 *)cmd + 11, val, GENMASK(7, 0)); 2575 } 2576 2577 static inline void RTW89_SET_FWCMD_CXTRX_BTPROFILE(void *cmd, u8 val) 2578 { 2579 u8p_replace_bits((u8 *)cmd + 12, val, GENMASK(7, 0)); 2580 } 2581 2582 static inline void RTW89_SET_FWCMD_CXTRX_RSVD2(void *cmd, u8 val) 2583 { 2584 u8p_replace_bits((u8 *)cmd + 13, val, GENMASK(7, 0)); 2585 } 2586 2587 static inline void RTW89_SET_FWCMD_CXTRX_TXRATE(void *cmd, u16 val) 2588 { 2589 le16p_replace_bits((__le16 *)((u8 *)cmd + 14), val, GENMASK(15, 0)); 2590 } 2591 2592 static inline void RTW89_SET_FWCMD_CXTRX_RXRATE(void *cmd, u16 val) 2593 { 2594 le16p_replace_bits((__le16 *)((u8 *)cmd + 16), val, GENMASK(15, 0)); 2595 } 2596 2597 static inline void RTW89_SET_FWCMD_CXTRX_TXTP(void *cmd, u32 val) 2598 { 2599 le32p_replace_bits((__le32 *)((u8 *)cmd + 18), val, GENMASK(31, 0)); 2600 } 2601 2602 static inline void RTW89_SET_FWCMD_CXTRX_RXTP(void *cmd, u32 val) 2603 { 2604 le32p_replace_bits((__le32 *)((u8 *)cmd + 22), val, GENMASK(31, 0)); 2605 } 2606 2607 static inline void RTW89_SET_FWCMD_CXTRX_RXERRRA(void *cmd, u32 val) 2608 { 2609 le32p_replace_bits((__le32 *)((u8 *)cmd + 26), val, GENMASK(31, 0)); 2610 } 2611 2612 static inline void RTW89_SET_FWCMD_CXRFK_STATE(void *cmd, u32 val) 2613 { 2614 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(1, 0)); 2615 } 2616 2617 static inline void RTW89_SET_FWCMD_CXRFK_PATH_MAP(void *cmd, u32 val) 2618 { 2619 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(5, 2)); 2620 } 2621 2622 static inline void RTW89_SET_FWCMD_CXRFK_PHY_MAP(void *cmd, u32 val) 2623 { 2624 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(7, 6)); 2625 } 2626 2627 static inline void RTW89_SET_FWCMD_CXRFK_BAND(void *cmd, u32 val) 2628 { 2629 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(9, 8)); 2630 } 2631 2632 static inline void RTW89_SET_FWCMD_CXRFK_TYPE(void *cmd, u32 val) 2633 { 2634 le32p_replace_bits((__le32 *)((u8 *)(cmd) + 2), val, GENMASK(17, 10)); 2635 } 2636 2637 static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_IDX(void *cmd, u32 val) 2638 { 2639 le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(7, 0)); 2640 } 2641 2642 static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_OP(void *cmd, u32 val) 2643 { 2644 le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(10, 8)); 2645 } 2646 2647 static inline void RTW89_SET_FWCMD_PACKET_OFLD_PKT_LENGTH(void *cmd, u32 val) 2648 { 2649 le32p_replace_bits((__le32 *)((u8 *)(cmd)), val, GENMASK(31, 16)); 2650 } 2651 2652 struct rtw89_h2c_chinfo_elem { 2653 __le32 w0; 2654 __le32 w1; 2655 __le32 w2; 2656 __le32 w3; 2657 __le32 w4; 2658 __le32 w5; 2659 __le32 w6; 2660 } __packed; 2661 2662 #define RTW89_H2C_CHINFO_W0_PERIOD GENMASK(7, 0) 2663 #define RTW89_H2C_CHINFO_W0_DWELL GENMASK(15, 8) 2664 #define RTW89_H2C_CHINFO_W0_CENTER_CH GENMASK(23, 16) 2665 #define RTW89_H2C_CHINFO_W0_PRI_CH GENMASK(31, 24) 2666 #define RTW89_H2C_CHINFO_W1_BW GENMASK(2, 0) 2667 #define RTW89_H2C_CHINFO_W1_ACTION GENMASK(7, 3) 2668 #define RTW89_H2C_CHINFO_W1_NUM_PKT GENMASK(11, 8) 2669 #define RTW89_H2C_CHINFO_W1_TX BIT(12) 2670 #define RTW89_H2C_CHINFO_W1_PAUSE_DATA BIT(13) 2671 #define RTW89_H2C_CHINFO_W1_BAND GENMASK(15, 14) 2672 #define RTW89_H2C_CHINFO_W1_PKT_ID GENMASK(23, 16) 2673 #define RTW89_H2C_CHINFO_W1_DFS BIT(24) 2674 #define RTW89_H2C_CHINFO_W1_TX_NULL BIT(25) 2675 #define RTW89_H2C_CHINFO_W1_RANDOM BIT(26) 2676 #define RTW89_H2C_CHINFO_W1_CFG_TX BIT(27) 2677 #define RTW89_H2C_CHINFO_W2_PKT0 GENMASK(7, 0) 2678 #define RTW89_H2C_CHINFO_W2_PKT1 GENMASK(15, 8) 2679 #define RTW89_H2C_CHINFO_W2_PKT2 GENMASK(23, 16) 2680 #define RTW89_H2C_CHINFO_W2_PKT3 GENMASK(31, 24) 2681 #define RTW89_H2C_CHINFO_W3_PKT4 GENMASK(7, 0) 2682 #define RTW89_H2C_CHINFO_W3_PKT5 GENMASK(15, 8) 2683 #define RTW89_H2C_CHINFO_W3_PKT6 GENMASK(23, 16) 2684 #define RTW89_H2C_CHINFO_W3_PKT7 GENMASK(31, 24) 2685 #define RTW89_H2C_CHINFO_W4_POWER_IDX GENMASK(15, 0) 2686 2687 struct rtw89_h2c_chinfo_elem_be { 2688 __le32 w0; 2689 __le32 w1; 2690 __le32 w2; 2691 __le32 w3; 2692 __le32 w4; 2693 __le32 w5; 2694 __le32 w6; 2695 __le32 w7; 2696 } __packed; 2697 2698 #define RTW89_H2C_CHINFO_BE_W0_PERIOD GENMASK(7, 0) 2699 #define RTW89_H2C_CHINFO_BE_W0_DWELL GENMASK(15, 8) 2700 #define RTW89_H2C_CHINFO_BE_W0_CENTER_CH GENMASK(23, 16) 2701 #define RTW89_H2C_CHINFO_BE_W0_PRI_CH GENMASK(31, 24) 2702 #define RTW89_H2C_CHINFO_BE_W1_BW GENMASK(2, 0) 2703 #define RTW89_H2C_CHINFO_BE_W1_CH_BAND GENMASK(4, 3) 2704 #define RTW89_H2C_CHINFO_BE_W1_DFS BIT(5) 2705 #define RTW89_H2C_CHINFO_BE_W1_PAUSE_DATA BIT(6) 2706 #define RTW89_H2C_CHINFO_BE_W1_TX_NULL BIT(7) 2707 #define RTW89_H2C_CHINFO_BE_W1_RANDOM BIT(8) 2708 #define RTW89_H2C_CHINFO_BE_W1_NOTIFY GENMASK(13, 9) 2709 #define RTW89_H2C_CHINFO_BE_W1_PROBE BIT(14) 2710 #define RTW89_H2C_CHINFO_BE_W1_EARLY_LEAVE_CRIT GENMASK(17, 15) 2711 #define RTW89_H2C_CHINFO_BE_W1_CHKPT_TIMER GENMASK(31, 24) 2712 #define RTW89_H2C_CHINFO_BE_W2_EARLY_LEAVE_TIME GENMASK(7, 0) 2713 #define RTW89_H2C_CHINFO_BE_W2_EARLY_LEAVE_TH GENMASK(15, 8) 2714 #define RTW89_H2C_CHINFO_BE_W2_TX_PKT_CTRL GENMASK(31, 16) 2715 #define RTW89_H2C_CHINFO_BE_W3_PKT0 GENMASK(7, 0) 2716 #define RTW89_H2C_CHINFO_BE_W3_PKT1 GENMASK(15, 8) 2717 #define RTW89_H2C_CHINFO_BE_W3_PKT2 GENMASK(23, 16) 2718 #define RTW89_H2C_CHINFO_BE_W3_PKT3 GENMASK(31, 24) 2719 #define RTW89_H2C_CHINFO_BE_W4_PKT4 GENMASK(7, 0) 2720 #define RTW89_H2C_CHINFO_BE_W4_PKT5 GENMASK(15, 8) 2721 #define RTW89_H2C_CHINFO_BE_W4_PKT6 GENMASK(23, 16) 2722 #define RTW89_H2C_CHINFO_BE_W4_PKT7 GENMASK(31, 24) 2723 #define RTW89_H2C_CHINFO_BE_W5_SW_DEF GENMASK(7, 0) 2724 #define RTW89_H2C_CHINFO_BE_W5_FW_PROBE0_SSIDS GENMASK(31, 16) 2725 #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_SHORTSSIDS GENMASK(15, 0) 2726 #define RTW89_H2C_CHINFO_BE_W6_FW_PROBE0_BSSIDS GENMASK(31, 16) 2727 #define RTW89_H2C_CHINFO_BE_W7_PERIOD_V1 GENMASK(15, 0) 2728 2729 struct rtw89_h2c_chinfo { 2730 u8 ch_num; 2731 u8 elem_size; 2732 u8 arg; 2733 u8 rsvd0; 2734 struct rtw89_h2c_chinfo_elem elem[] __counted_by(ch_num); 2735 } __packed; 2736 2737 struct rtw89_h2c_chinfo_be { 2738 u8 ch_num; 2739 u8 elem_size; 2740 u8 arg; 2741 u8 rsvd0; 2742 struct rtw89_h2c_chinfo_elem_be elem[] __counted_by(ch_num); 2743 } __packed; 2744 2745 #define RTW89_H2C_CHINFO_ARG_MAC_IDX_MASK BIT(0) 2746 #define RTW89_H2C_CHINFO_ARG_APPEND_MASK BIT(1) 2747 2748 struct rtw89_h2c_scanofld { 2749 __le32 w0; 2750 __le32 w1; 2751 __le32 w2; 2752 __le32 tsf_high; 2753 __le32 tsf_low; 2754 __le32 w5; 2755 __le32 w6; 2756 } __packed; 2757 2758 #define RTW89_H2C_SCANOFLD_W0_MACID GENMASK(7, 0) 2759 #define RTW89_H2C_SCANOFLD_W0_NORM_CY GENMASK(15, 8) 2760 #define RTW89_H2C_SCANOFLD_W0_PORT_ID GENMASK(18, 16) 2761 #define RTW89_H2C_SCANOFLD_W0_BAND BIT(19) 2762 #define RTW89_H2C_SCANOFLD_W0_OPERATION GENMASK(21, 20) 2763 #define RTW89_H2C_SCANOFLD_W0_TARGET_CH_BAND GENMASK(23, 22) 2764 #define RTW89_H2C_SCANOFLD_W1_NOTIFY_END BIT(0) 2765 #define RTW89_H2C_SCANOFLD_W1_TARGET_CH_MODE BIT(1) 2766 #define RTW89_H2C_SCANOFLD_W1_START_MODE BIT(2) 2767 #define RTW89_H2C_SCANOFLD_W1_SCAN_TYPE GENMASK(4, 3) 2768 #define RTW89_H2C_SCANOFLD_W1_TARGET_CH_BW GENMASK(7, 5) 2769 #define RTW89_H2C_SCANOFLD_W1_TARGET_PRI_CH GENMASK(15, 8) 2770 #define RTW89_H2C_SCANOFLD_W1_TARGET_CENTRAL_CH GENMASK(23, 16) 2771 #define RTW89_H2C_SCANOFLD_W1_PROBE_REQ_PKT_ID GENMASK(31, 24) 2772 #define RTW89_H2C_SCANOFLD_W2_NORM_PD GENMASK(15, 0) 2773 #define RTW89_H2C_SCANOFLD_W2_SLOW_PD GENMASK(23, 16) 2774 #define RTW89_H2C_SCANOFLD_W3_TSF_HIGH GENMASK(31, 0) 2775 #define RTW89_H2C_SCANOFLD_W4_TSF_LOW GENMASK(31, 0) 2776 2777 struct rtw89_h2c_scanofld_be_macc_role { 2778 __le32 w0; 2779 } __packed; 2780 2781 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_BAND GENMASK(1, 0) 2782 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_PORT GENMASK(4, 2) 2783 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_MACID GENMASK(23, 8) 2784 #define RTW89_H2C_SCANOFLD_BE_MACC_ROLE_W0_OPCH_END GENMASK(31, 24) 2785 2786 struct rtw89_h2c_scanofld_be_opch { 2787 __le32 w0; 2788 __le32 w1; 2789 __le32 w2; 2790 __le32 w3; 2791 __le32 w4; 2792 } __packed; 2793 2794 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_MACID GENMASK(15, 0) 2795 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_BAND GENMASK(17, 16) 2796 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_PORT GENMASK(20, 18) 2797 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_POLICY GENMASK(22, 21) 2798 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_TXNULL BIT(23) 2799 #define RTW89_H2C_SCANOFLD_BE_OPCH_W0_POLICY_VAL GENMASK(31, 24) 2800 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_DURATION GENMASK(7, 0) 2801 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_CH_BAND GENMASK(9, 8) 2802 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_BW GENMASK(12, 10) 2803 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_NOTIFY GENMASK(14, 13) 2804 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_PRI_CH GENMASK(23, 16) 2805 #define RTW89_H2C_SCANOFLD_BE_OPCH_W1_CENTRAL_CH GENMASK(31, 24) 2806 #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_PKTS_CTRL GENMASK(7, 0) 2807 #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_SW_DEF GENMASK(15, 8) 2808 #define RTW89_H2C_SCANOFLD_BE_OPCH_W2_SS GENMASK(18, 16) 2809 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT0 GENMASK(7, 0) 2810 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT1 GENMASK(15, 8) 2811 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT2 GENMASK(23, 16) 2812 #define RTW89_H2C_SCANOFLD_BE_OPCH_W3_PKT3 GENMASK(31, 24) 2813 #define RTW89_H2C_SCANOFLD_BE_OPCH_W4_DURATION_V1 GENMASK(15, 0) 2814 2815 struct rtw89_h2c_scanofld_be { 2816 __le32 w0; 2817 __le32 w1; 2818 __le32 w2; 2819 __le32 w3; 2820 __le32 w4; 2821 __le32 w5; 2822 __le32 w6; 2823 __le32 w7; 2824 __le32 w8; 2825 __le32 w9; /* Added after SCAN_OFFLOAD_BE_V1 */ 2826 /* struct rtw89_h2c_scanofld_be_macc_role (flexible number) */ 2827 /* struct rtw89_h2c_scanofld_be_opch (flexible number) */ 2828 } __packed; 2829 2830 #define RTW89_H2C_SCANOFLD_BE_W0_OP GENMASK(1, 0) 2831 #define RTW89_H2C_SCANOFLD_BE_W0_SCAN_MODE GENMASK(3, 2) 2832 #define RTW89_H2C_SCANOFLD_BE_W0_REPEAT GENMASK(5, 4) 2833 #define RTW89_H2C_SCANOFLD_BE_W0_NOTIFY_END BIT(6) 2834 #define RTW89_H2C_SCANOFLD_BE_W0_LEARN_CH BIT(7) 2835 #define RTW89_H2C_SCANOFLD_BE_W0_MACID GENMASK(23, 8) 2836 #define RTW89_H2C_SCANOFLD_BE_W0_PORT GENMASK(26, 24) 2837 #define RTW89_H2C_SCANOFLD_BE_W0_BAND GENMASK(28, 27) 2838 #define RTW89_H2C_SCANOFLD_BE_W0_PROBE_WITH_RATE BIT(29) 2839 #define RTW89_H2C_SCANOFLD_BE_W1_NUM_MACC_ROLE GENMASK(7, 0) 2840 #define RTW89_H2C_SCANOFLD_BE_W1_NUM_OP GENMASK(15, 8) 2841 #define RTW89_H2C_SCANOFLD_BE_W1_NORM_PD GENMASK(31, 16) 2842 #define RTW89_H2C_SCANOFLD_BE_W2_SLOW_PD GENMASK(15, 0) 2843 #define RTW89_H2C_SCANOFLD_BE_W2_NORM_CY GENMASK(23, 16) 2844 #define RTW89_H2C_SCANOFLD_BE_W2_OPCH_END GENMASK(31, 24) 2845 #define RTW89_H2C_SCANOFLD_BE_W3_NUM_SSID GENMASK(7, 0) 2846 #define RTW89_H2C_SCANOFLD_BE_W3_NUM_SHORT_SSID GENMASK(15, 8) 2847 #define RTW89_H2C_SCANOFLD_BE_W3_NUM_BSSID GENMASK(23, 16) 2848 #define RTW89_H2C_SCANOFLD_BE_W3_PROBEID GENMASK(31, 24) 2849 #define RTW89_H2C_SCANOFLD_BE_W4_PROBE_5G GENMASK(7, 0) 2850 #define RTW89_H2C_SCANOFLD_BE_W4_PROBE_6G GENMASK(15, 8) 2851 #define RTW89_H2C_SCANOFLD_BE_W4_DELAY_START GENMASK(31, 16) 2852 #define RTW89_H2C_SCANOFLD_BE_W5_MLO_MODE GENMASK(31, 0) 2853 #define RTW89_H2C_SCANOFLD_BE_W6_CHAN_PROHIB_LOW GENMASK(31, 0) 2854 #define RTW89_H2C_SCANOFLD_BE_W7_CHAN_PROHIB_HIGH GENMASK(31, 0) 2855 #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_2GHZ GENMASK(7, 0) 2856 #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_5GHZ GENMASK(15, 8) 2857 #define RTW89_H2C_SCANOFLD_BE_W8_PROBE_RATE_6GHZ GENMASK(23, 16) 2858 #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_CFG GENMASK(7, 0) 2859 #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_MACC GENMASK(15, 8) 2860 #define RTW89_H2C_SCANOFLD_BE_W9_SIZE_OP GENMASK(23, 16) 2861 2862 struct rtw89_h2c_fwips { 2863 __le32 w0; 2864 } __packed; 2865 2866 #define RTW89_H2C_FW_IPS_W0_MACID GENMASK(7, 0) 2867 #define RTW89_H2C_FW_IPS_W0_ENABLE BIT(8) 2868 2869 struct rtw89_h2c_mlo_link_cfg { 2870 __le32 w0; 2871 }; 2872 2873 #define RTW89_H2C_MLO_LINK_CFG_W0_MACID GENMASK(15, 0) 2874 #define RTW89_H2C_MLO_LINK_CFG_W0_OPTION GENMASK(19, 16) 2875 2876 static inline void RTW89_SET_FWCMD_P2P_MACID(void *cmd, u32 val) 2877 { 2878 le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0)); 2879 } 2880 2881 static inline void RTW89_SET_FWCMD_P2P_P2PID(void *cmd, u32 val) 2882 { 2883 le32p_replace_bits((__le32 *)cmd, val, GENMASK(11, 8)); 2884 } 2885 2886 static inline void RTW89_SET_FWCMD_P2P_NOAID(void *cmd, u32 val) 2887 { 2888 le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 12)); 2889 } 2890 2891 static inline void RTW89_SET_FWCMD_P2P_ACT(void *cmd, u32 val) 2892 { 2893 le32p_replace_bits((__le32 *)cmd, val, GENMASK(19, 16)); 2894 } 2895 2896 static inline void RTW89_SET_FWCMD_P2P_TYPE(void *cmd, u32 val) 2897 { 2898 le32p_replace_bits((__le32 *)cmd, val, BIT(20)); 2899 } 2900 2901 static inline void RTW89_SET_FWCMD_P2P_ALL_SLEP(void *cmd, u32 val) 2902 { 2903 le32p_replace_bits((__le32 *)cmd, val, BIT(21)); 2904 } 2905 2906 static inline void RTW89_SET_FWCMD_NOA_START_TIME(void *cmd, __le32 val) 2907 { 2908 *((__le32 *)cmd + 1) = val; 2909 } 2910 2911 static inline void RTW89_SET_FWCMD_NOA_INTERVAL(void *cmd, __le32 val) 2912 { 2913 *((__le32 *)cmd + 2) = val; 2914 } 2915 2916 static inline void RTW89_SET_FWCMD_NOA_DURATION(void *cmd, __le32 val) 2917 { 2918 *((__le32 *)cmd + 3) = val; 2919 } 2920 2921 static inline void RTW89_SET_FWCMD_NOA_COUNT(void *cmd, u32 val) 2922 { 2923 le32p_replace_bits((__le32 *)(cmd) + 4, val, GENMASK(7, 0)); 2924 } 2925 2926 static inline void RTW89_SET_FWCMD_NOA_CTWINDOW(void *cmd, u32 val) 2927 { 2928 u8 ctwnd; 2929 2930 if (!(val & IEEE80211_P2P_OPPPS_ENABLE_BIT)) 2931 return; 2932 ctwnd = FIELD_GET(IEEE80211_P2P_OPPPS_CTWINDOW_MASK, val); 2933 le32p_replace_bits((__le32 *)(cmd) + 4, ctwnd, GENMASK(23, 8)); 2934 } 2935 2936 static inline void RTW89_SET_FWCMD_TSF32_TOGL_BAND(void *cmd, u32 val) 2937 { 2938 le32p_replace_bits((__le32 *)cmd, val, BIT(0)); 2939 } 2940 2941 static inline void RTW89_SET_FWCMD_TSF32_TOGL_EN(void *cmd, u32 val) 2942 { 2943 le32p_replace_bits((__le32 *)cmd, val, BIT(1)); 2944 } 2945 2946 static inline void RTW89_SET_FWCMD_TSF32_TOGL_PORT(void *cmd, u32 val) 2947 { 2948 le32p_replace_bits((__le32 *)cmd, val, GENMASK(4, 2)); 2949 } 2950 2951 static inline void RTW89_SET_FWCMD_TSF32_TOGL_EARLY(void *cmd, u32 val) 2952 { 2953 le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 16)); 2954 } 2955 2956 enum rtw89_fw_mcc_c2h_rpt_cfg { 2957 RTW89_FW_MCC_C2H_RPT_OFF = 0, 2958 RTW89_FW_MCC_C2H_RPT_FAIL_ONLY = 1, 2959 RTW89_FW_MCC_C2H_RPT_ALL = 2, 2960 }; 2961 2962 struct rtw89_fw_mcc_add_req { 2963 u8 macid; 2964 u8 central_ch_seg0; 2965 u8 central_ch_seg1; 2966 u8 primary_ch; 2967 enum rtw89_bandwidth bandwidth: 4; 2968 u32 group: 2; 2969 u32 c2h_rpt: 2; 2970 u32 dis_tx_null: 1; 2971 u32 dis_sw_retry: 1; 2972 u32 in_curr_ch: 1; 2973 u32 sw_retry_count: 3; 2974 u32 tx_null_early: 4; 2975 u32 btc_in_2g: 1; 2976 u32 pta_en: 1; 2977 u32 rfk_by_pass: 1; 2978 u32 ch_band_type: 2; 2979 u32 rsvd0: 9; 2980 u32 duration; 2981 u8 courtesy_en; 2982 u8 courtesy_num; 2983 u8 courtesy_target; 2984 u8 rsvd1; 2985 }; 2986 2987 static inline void RTW89_SET_FWCMD_ADD_MCC_MACID(void *cmd, u32 val) 2988 { 2989 le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0)); 2990 } 2991 2992 static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG0(void *cmd, u32 val) 2993 { 2994 le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); 2995 } 2996 2997 static inline void RTW89_SET_FWCMD_ADD_MCC_CENTRAL_CH_SEG1(void *cmd, u32 val) 2998 { 2999 le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); 3000 } 3001 3002 static inline void RTW89_SET_FWCMD_ADD_MCC_PRIMARY_CH(void *cmd, u32 val) 3003 { 3004 le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); 3005 } 3006 3007 static inline void RTW89_SET_FWCMD_ADD_MCC_BANDWIDTH(void *cmd, u32 val) 3008 { 3009 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(3, 0)); 3010 } 3011 3012 static inline void RTW89_SET_FWCMD_ADD_MCC_GROUP(void *cmd, u32 val) 3013 { 3014 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(5, 4)); 3015 } 3016 3017 static inline void RTW89_SET_FWCMD_ADD_MCC_C2H_RPT(void *cmd, u32 val) 3018 { 3019 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(7, 6)); 3020 } 3021 3022 static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_TX_NULL(void *cmd, u32 val) 3023 { 3024 le32p_replace_bits((__le32 *)cmd + 1, val, BIT(8)); 3025 } 3026 3027 static inline void RTW89_SET_FWCMD_ADD_MCC_DIS_SW_RETRY(void *cmd, u32 val) 3028 { 3029 le32p_replace_bits((__le32 *)cmd + 1, val, BIT(9)); 3030 } 3031 3032 static inline void RTW89_SET_FWCMD_ADD_MCC_IN_CURR_CH(void *cmd, u32 val) 3033 { 3034 le32p_replace_bits((__le32 *)cmd + 1, val, BIT(10)); 3035 } 3036 3037 static inline void RTW89_SET_FWCMD_ADD_MCC_SW_RETRY_COUNT(void *cmd, u32 val) 3038 { 3039 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(13, 11)); 3040 } 3041 3042 static inline void RTW89_SET_FWCMD_ADD_MCC_TX_NULL_EARLY(void *cmd, u32 val) 3043 { 3044 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(17, 14)); 3045 } 3046 3047 static inline void RTW89_SET_FWCMD_ADD_MCC_BTC_IN_2G(void *cmd, u32 val) 3048 { 3049 le32p_replace_bits((__le32 *)cmd + 1, val, BIT(18)); 3050 } 3051 3052 static inline void RTW89_SET_FWCMD_ADD_MCC_PTA_EN(void *cmd, u32 val) 3053 { 3054 le32p_replace_bits((__le32 *)cmd + 1, val, BIT(19)); 3055 } 3056 3057 static inline void RTW89_SET_FWCMD_ADD_MCC_RFK_BY_PASS(void *cmd, u32 val) 3058 { 3059 le32p_replace_bits((__le32 *)cmd + 1, val, BIT(20)); 3060 } 3061 3062 static inline void RTW89_SET_FWCMD_ADD_MCC_CH_BAND_TYPE(void *cmd, u32 val) 3063 { 3064 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(22, 21)); 3065 } 3066 3067 static inline void RTW89_SET_FWCMD_ADD_MCC_DURATION(void *cmd, u32 val) 3068 { 3069 le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); 3070 } 3071 3072 static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_EN(void *cmd, u32 val) 3073 { 3074 le32p_replace_bits((__le32 *)cmd + 3, val, BIT(0)); 3075 } 3076 3077 static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_NUM(void *cmd, u32 val) 3078 { 3079 le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(15, 8)); 3080 } 3081 3082 static inline void RTW89_SET_FWCMD_ADD_MCC_COURTESY_TARGET(void *cmd, u32 val) 3083 { 3084 le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(23, 16)); 3085 } 3086 3087 enum rtw89_fw_mcc_old_group_actions { 3088 RTW89_FW_MCC_OLD_GROUP_ACT_NONE = 0, 3089 RTW89_FW_MCC_OLD_GROUP_ACT_REPLACE = 1, 3090 }; 3091 3092 struct rtw89_fw_mcc_start_req { 3093 u32 group: 2; 3094 u32 btc_in_group: 1; 3095 u32 old_group_action: 2; 3096 u32 old_group: 2; 3097 u32 rsvd0: 9; 3098 u32 notify_cnt: 3; 3099 u32 rsvd1: 2; 3100 u32 notify_rxdbg_en: 1; 3101 u32 rsvd2: 2; 3102 u32 macid: 8; 3103 u32 tsf_low; 3104 u32 tsf_high; 3105 }; 3106 3107 static inline void RTW89_SET_FWCMD_START_MCC_GROUP(void *cmd, u32 val) 3108 { 3109 le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); 3110 } 3111 3112 static inline void RTW89_SET_FWCMD_START_MCC_BTC_IN_GROUP(void *cmd, u32 val) 3113 { 3114 le32p_replace_bits((__le32 *)cmd, val, BIT(2)); 3115 } 3116 3117 static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP_ACTION(void *cmd, u32 val) 3118 { 3119 le32p_replace_bits((__le32 *)cmd, val, GENMASK(4, 3)); 3120 } 3121 3122 static inline void RTW89_SET_FWCMD_START_MCC_OLD_GROUP(void *cmd, u32 val) 3123 { 3124 le32p_replace_bits((__le32 *)cmd, val, GENMASK(6, 5)); 3125 } 3126 3127 static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_CNT(void *cmd, u32 val) 3128 { 3129 le32p_replace_bits((__le32 *)cmd, val, GENMASK(18, 16)); 3130 } 3131 3132 static inline void RTW89_SET_FWCMD_START_MCC_NOTIFY_RXDBG_EN(void *cmd, u32 val) 3133 { 3134 le32p_replace_bits((__le32 *)cmd, val, BIT(21)); 3135 } 3136 3137 static inline void RTW89_SET_FWCMD_START_MCC_MACID(void *cmd, u32 val) 3138 { 3139 le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); 3140 } 3141 3142 static inline void RTW89_SET_FWCMD_START_MCC_TSF_LOW(void *cmd, u32 val) 3143 { 3144 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0)); 3145 } 3146 3147 static inline void RTW89_SET_FWCMD_START_MCC_TSF_HIGH(void *cmd, u32 val) 3148 { 3149 le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); 3150 } 3151 3152 static inline void RTW89_SET_FWCMD_STOP_MCC_MACID(void *cmd, u32 val) 3153 { 3154 le32p_replace_bits((__le32 *)cmd, val, GENMASK(7, 0)); 3155 } 3156 3157 static inline void RTW89_SET_FWCMD_STOP_MCC_GROUP(void *cmd, u32 val) 3158 { 3159 le32p_replace_bits((__le32 *)cmd, val, GENMASK(9, 8)); 3160 } 3161 3162 static inline void RTW89_SET_FWCMD_STOP_MCC_PREV_GROUPS(void *cmd, u32 val) 3163 { 3164 le32p_replace_bits((__le32 *)cmd, val, BIT(10)); 3165 } 3166 3167 static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_GROUP(void *cmd, u32 val) 3168 { 3169 le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); 3170 } 3171 3172 static inline void RTW89_SET_FWCMD_DEL_MCC_GROUP_PREV_GROUPS(void *cmd, u32 val) 3173 { 3174 le32p_replace_bits((__le32 *)cmd, val, BIT(2)); 3175 } 3176 3177 static inline void RTW89_SET_FWCMD_RESET_MCC_GROUP_GROUP(void *cmd, u32 val) 3178 { 3179 le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); 3180 } 3181 3182 struct rtw89_fw_mcc_tsf_req { 3183 u8 group: 2; 3184 u8 rsvd0: 6; 3185 u8 macid_x; 3186 u8 macid_y; 3187 u8 rsvd1; 3188 }; 3189 3190 static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_GROUP(void *cmd, u32 val) 3191 { 3192 le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); 3193 } 3194 3195 static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_X(void *cmd, u32 val) 3196 { 3197 le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); 3198 } 3199 3200 static inline void RTW89_SET_FWCMD_MCC_REQ_TSF_MACID_Y(void *cmd, u32 val) 3201 { 3202 le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); 3203 } 3204 3205 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_GROUP(void *cmd, u32 val) 3206 { 3207 le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); 3208 } 3209 3210 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_MACID(void *cmd, u32 val) 3211 { 3212 le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); 3213 } 3214 3215 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP_LENGTH(void *cmd, u32 val) 3216 { 3217 le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); 3218 } 3219 3220 static inline void RTW89_SET_FWCMD_MCC_MACID_BITMAP_BITMAP(void *cmd, 3221 u8 *bitmap, u8 len) 3222 { 3223 memcpy((__le32 *)cmd + 1, bitmap, len); 3224 } 3225 3226 static inline void RTW89_SET_FWCMD_MCC_SYNC_GROUP(void *cmd, u32 val) 3227 { 3228 le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); 3229 } 3230 3231 static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_SOURCE(void *cmd, u32 val) 3232 { 3233 le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); 3234 } 3235 3236 static inline void RTW89_SET_FWCMD_MCC_SYNC_MACID_TARGET(void *cmd, u32 val) 3237 { 3238 le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); 3239 } 3240 3241 static inline void RTW89_SET_FWCMD_MCC_SYNC_SYNC_OFFSET(void *cmd, u32 val) 3242 { 3243 le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); 3244 } 3245 3246 struct rtw89_fw_mcc_duration { 3247 u32 group: 2; 3248 u32 btc_in_group: 1; 3249 u32 rsvd0: 5; 3250 u32 start_macid: 8; 3251 u32 macid_x: 8; 3252 u32 macid_y: 8; 3253 u32 start_tsf_low; 3254 u32 start_tsf_high; 3255 u32 duration_x; 3256 u32 duration_y; 3257 }; 3258 3259 static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_GROUP(void *cmd, u32 val) 3260 { 3261 le32p_replace_bits((__le32 *)cmd, val, GENMASK(1, 0)); 3262 } 3263 3264 static 3265 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_BTC_IN_GROUP(void *cmd, u32 val) 3266 { 3267 le32p_replace_bits((__le32 *)cmd, val, BIT(2)); 3268 } 3269 3270 static 3271 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_MACID(void *cmd, u32 val) 3272 { 3273 le32p_replace_bits((__le32 *)cmd, val, GENMASK(15, 8)); 3274 } 3275 3276 static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_X(void *cmd, u32 val) 3277 { 3278 le32p_replace_bits((__le32 *)cmd, val, GENMASK(23, 16)); 3279 } 3280 3281 static inline void RTW89_SET_FWCMD_MCC_SET_DURATION_MACID_Y(void *cmd, u32 val) 3282 { 3283 le32p_replace_bits((__le32 *)cmd, val, GENMASK(31, 24)); 3284 } 3285 3286 static 3287 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_LOW(void *cmd, u32 val) 3288 { 3289 le32p_replace_bits((__le32 *)cmd + 1, val, GENMASK(31, 0)); 3290 } 3291 3292 static 3293 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_START_TSF_HIGH(void *cmd, u32 val) 3294 { 3295 le32p_replace_bits((__le32 *)cmd + 2, val, GENMASK(31, 0)); 3296 } 3297 3298 static 3299 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_X(void *cmd, u32 val) 3300 { 3301 le32p_replace_bits((__le32 *)cmd + 3, val, GENMASK(31, 0)); 3302 } 3303 3304 static 3305 inline void RTW89_SET_FWCMD_MCC_SET_DURATION_DURATION_Y(void *cmd, u32 val) 3306 { 3307 le32p_replace_bits((__le32 *)cmd + 4, val, GENMASK(31, 0)); 3308 } 3309 3310 enum rtw89_h2c_mrc_sch_types { 3311 RTW89_H2C_MRC_SCH_BAND0_ONLY = 0, 3312 RTW89_H2C_MRC_SCH_BAND1_ONLY = 1, 3313 RTW89_H2C_MRC_SCH_DUAL_BAND = 2, 3314 }; 3315 3316 enum rtw89_h2c_mrc_role_types { 3317 RTW89_H2C_MRC_ROLE_WIFI = 0, 3318 RTW89_H2C_MRC_ROLE_BT = 1, 3319 RTW89_H2C_MRC_ROLE_EMPTY = 2, 3320 }; 3321 3322 #define RTW89_MAC_MRC_MAX_ADD_SLOT_NUM 3 3323 #define RTW89_MAC_MRC_MAX_ADD_ROLE_NUM_PER_SLOT 1 /* before MLO */ 3324 3325 struct rtw89_fw_mrc_add_slot_arg { 3326 u16 duration; /* unit: TU */ 3327 bool courtesy_en; 3328 u8 courtesy_period; 3329 u8 courtesy_target; /* slot idx */ 3330 3331 unsigned int role_num; 3332 struct { 3333 enum rtw89_h2c_mrc_role_types role_type; 3334 bool is_master; 3335 bool en_tx_null; 3336 enum rtw89_band band; 3337 enum rtw89_bandwidth bw; 3338 u8 macid; 3339 u8 central_ch; 3340 u8 primary_ch; 3341 u8 null_early; /* unit: TU */ 3342 3343 /* if MLD, for macid: [0, chip::support_mld_num) 3344 * otherwise, for macid: [0, 32) 3345 */ 3346 u32 macid_main_bitmap; 3347 /* for MLD, bit X maps to macid: X + chip::support_mld_num */ 3348 u32 macid_paired_bitmap; 3349 } roles[RTW89_MAC_MRC_MAX_ADD_ROLE_NUM_PER_SLOT]; 3350 }; 3351 3352 struct rtw89_fw_mrc_add_arg { 3353 u8 sch_idx; 3354 enum rtw89_h2c_mrc_sch_types sch_type; 3355 bool btc_in_sch; 3356 3357 unsigned int slot_num; 3358 struct rtw89_fw_mrc_add_slot_arg slots[RTW89_MAC_MRC_MAX_ADD_SLOT_NUM]; 3359 }; 3360 3361 struct rtw89_h2c_mrc_add_role { 3362 __le32 w0; 3363 __le32 w1; 3364 __le32 w2; 3365 __le32 macid_main_bitmap; 3366 __le32 macid_paired_bitmap; 3367 } __packed; 3368 3369 #define RTW89_H2C_MRC_ADD_ROLE_W0_MACID GENMASK(15, 0) 3370 #define RTW89_H2C_MRC_ADD_ROLE_W0_ROLE_TYPE GENMASK(23, 16) 3371 #define RTW89_H2C_MRC_ADD_ROLE_W0_IS_MASTER BIT(24) 3372 #define RTW89_H2C_MRC_ADD_ROLE_W0_IS_ALT_ROLE BIT(25) 3373 #define RTW89_H2C_MRC_ADD_ROLE_W0_TX_NULL_EN BIT(26) 3374 #define RTW89_H2C_MRC_ADD_ROLE_W0_ROLE_ALT_EN BIT(27) 3375 #define RTW89_H2C_MRC_ADD_ROLE_W1_CENTRAL_CH_SEG GENMASK(7, 0) 3376 #define RTW89_H2C_MRC_ADD_ROLE_W1_PRI_CH GENMASK(15, 8) 3377 #define RTW89_H2C_MRC_ADD_ROLE_W1_BW GENMASK(19, 16) 3378 #define RTW89_H2C_MRC_ADD_ROLE_W1_CH_BAND_TYPE GENMASK(21, 20) 3379 #define RTW89_H2C_MRC_ADD_ROLE_W1_RFK_BY_PASS BIT(22) 3380 #define RTW89_H2C_MRC_ADD_ROLE_W1_CAN_BTC BIT(23) 3381 #define RTW89_H2C_MRC_ADD_ROLE_W1_NULL_EARLY GENMASK(31, 24) 3382 #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_PERIOD GENMASK(7, 0) 3383 #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_ROLE_TYPE GENMASK(15, 8) 3384 #define RTW89_H2C_MRC_ADD_ROLE_W2_ALT_ROLE_MACID GENMASK(23, 16) 3385 3386 struct rtw89_h2c_mrc_add_slot { 3387 __le32 w0; 3388 __le32 w1; 3389 struct rtw89_h2c_mrc_add_role roles[]; 3390 } __packed; 3391 3392 #define RTW89_H2C_MRC_ADD_SLOT_W0_DURATION GENMASK(15, 0) 3393 #define RTW89_H2C_MRC_ADD_SLOT_W0_COURTESY_EN BIT(17) 3394 #define RTW89_H2C_MRC_ADD_SLOT_W0_ROLE_NUM GENMASK(31, 24) 3395 #define RTW89_H2C_MRC_ADD_SLOT_W1_COURTESY_PERIOD GENMASK(7, 0) 3396 #define RTW89_H2C_MRC_ADD_SLOT_W1_COURTESY_TARGET GENMASK(15, 8) 3397 3398 struct rtw89_h2c_mrc_add { 3399 __le32 w0; 3400 /* Logically append flexible struct rtw89_h2c_mrc_add_slot, but there 3401 * are other flexible array inside it. We cannot access them correctly 3402 * through this struct. So, in case misusing, we don't really declare 3403 * it here. 3404 */ 3405 } __packed; 3406 3407 #define RTW89_H2C_MRC_ADD_W0_SCH_IDX GENMASK(3, 0) 3408 #define RTW89_H2C_MRC_ADD_W0_SCH_TYPE GENMASK(7, 4) 3409 #define RTW89_H2C_MRC_ADD_W0_SLOT_NUM GENMASK(15, 8) 3410 #define RTW89_H2C_MRC_ADD_W0_BTC_IN_SCH BIT(16) 3411 3412 enum rtw89_h2c_mrc_start_actions { 3413 RTW89_H2C_MRC_START_ACTION_START_NEW = 0, 3414 RTW89_H2C_MRC_START_ACTION_REPLACE_OLD = 1, 3415 }; 3416 3417 struct rtw89_fw_mrc_start_arg { 3418 u8 sch_idx; 3419 u8 old_sch_idx; 3420 u64 start_tsf; 3421 enum rtw89_h2c_mrc_start_actions action; 3422 }; 3423 3424 struct rtw89_h2c_mrc_start { 3425 __le32 w0; 3426 __le32 start_tsf_low; 3427 __le32 start_tsf_high; 3428 } __packed; 3429 3430 #define RTW89_H2C_MRC_START_W0_SCH_IDX GENMASK(3, 0) 3431 #define RTW89_H2C_MRC_START_W0_OLD_SCH_IDX GENMASK(7, 4) 3432 #define RTW89_H2C_MRC_START_W0_ACTION GENMASK(15, 8) 3433 3434 struct rtw89_h2c_mrc_del { 3435 __le32 w0; 3436 } __packed; 3437 3438 #define RTW89_H2C_MRC_DEL_W0_SCH_IDX GENMASK(3, 0) 3439 #define RTW89_H2C_MRC_DEL_W0_DEL_ALL BIT(4) 3440 #define RTW89_H2C_MRC_DEL_W0_STOP_ONLY BIT(5) 3441 #define RTW89_H2C_MRC_DEL_W0_SPECIFIC_ROLE_EN BIT(6) 3442 #define RTW89_H2C_MRC_DEL_W0_STOP_SLOT_IDX GENMASK(15, 8) 3443 #define RTW89_H2C_MRC_DEL_W0_SPECIFIC_ROLE_MACID GENMASK(31, 16) 3444 3445 #define RTW89_MAC_MRC_MAX_REQ_TSF_NUM 2 3446 3447 struct rtw89_fw_mrc_req_tsf_arg { 3448 unsigned int num; 3449 struct { 3450 u8 band; 3451 u8 port; 3452 } infos[RTW89_MAC_MRC_MAX_REQ_TSF_NUM]; 3453 }; 3454 3455 struct rtw89_h2c_mrc_req_tsf { 3456 u8 req_tsf_num; 3457 u8 infos[] __counted_by(req_tsf_num); 3458 } __packed; 3459 3460 #define RTW89_H2C_MRC_REQ_TSF_INFO_BAND GENMASK(3, 0) 3461 #define RTW89_H2C_MRC_REQ_TSF_INFO_PORT GENMASK(7, 4) 3462 3463 enum rtw89_h2c_mrc_upd_bitmap_actions { 3464 RTW89_H2C_MRC_UPD_BITMAP_ACTION_DEL = 0, 3465 RTW89_H2C_MRC_UPD_BITMAP_ACTION_ADD = 1, 3466 }; 3467 3468 struct rtw89_fw_mrc_upd_bitmap_arg { 3469 u8 sch_idx; 3470 u8 macid; 3471 u8 client_macid; 3472 enum rtw89_h2c_mrc_upd_bitmap_actions action; 3473 }; 3474 3475 struct rtw89_h2c_mrc_upd_bitmap { 3476 __le32 w0; 3477 __le32 w1; 3478 } __packed; 3479 3480 #define RTW89_H2C_MRC_UPD_BITMAP_W0_SCH_IDX GENMASK(3, 0) 3481 #define RTW89_H2C_MRC_UPD_BITMAP_W0_ACTION BIT(4) 3482 #define RTW89_H2C_MRC_UPD_BITMAP_W0_MACID GENMASK(31, 16) 3483 #define RTW89_H2C_MRC_UPD_BITMAP_W1_CLIENT_MACID GENMASK(15, 0) 3484 3485 struct rtw89_fw_mrc_sync_arg { 3486 u8 offset; /* unit: TU */ 3487 struct { 3488 u8 band; 3489 u8 port; 3490 } src, dest; 3491 }; 3492 3493 struct rtw89_h2c_mrc_sync { 3494 __le32 w0; 3495 __le32 w1; 3496 } __packed; 3497 3498 #define RTW89_H2C_MRC_SYNC_W0_SYNC_EN BIT(0) 3499 #define RTW89_H2C_MRC_SYNC_W0_SRC_PORT GENMASK(11, 8) 3500 #define RTW89_H2C_MRC_SYNC_W0_SRC_BAND GENMASK(15, 12) 3501 #define RTW89_H2C_MRC_SYNC_W0_DEST_PORT GENMASK(19, 16) 3502 #define RTW89_H2C_MRC_SYNC_W0_DEST_BAND GENMASK(23, 20) 3503 #define RTW89_H2C_MRC_SYNC_W1_OFFSET GENMASK(15, 0) 3504 3505 struct rtw89_fw_mrc_upd_duration_arg { 3506 u8 sch_idx; 3507 u64 start_tsf; 3508 3509 unsigned int slot_num; 3510 struct { 3511 u8 slot_idx; 3512 u16 duration; /* unit: TU */ 3513 } slots[RTW89_MAC_MRC_MAX_ADD_SLOT_NUM]; 3514 }; 3515 3516 struct rtw89_h2c_mrc_upd_duration { 3517 __le32 w0; 3518 __le32 start_tsf_low; 3519 __le32 start_tsf_high; 3520 __le32 slots[]; 3521 } __packed; 3522 3523 #define RTW89_H2C_MRC_UPD_DURATION_W0_SCH_IDX GENMASK(3, 0) 3524 #define RTW89_H2C_MRC_UPD_DURATION_W0_SLOT_NUM GENMASK(15, 8) 3525 #define RTW89_H2C_MRC_UPD_DURATION_W0_BTC_IN_SCH BIT(16) 3526 #define RTW89_H2C_MRC_UPD_DURATION_SLOT_SLOT_IDX GENMASK(7, 0) 3527 #define RTW89_H2C_MRC_UPD_DURATION_SLOT_DURATION GENMASK(31, 16) 3528 3529 struct rtw89_h2c_wow_aoac { 3530 __le32 w0; 3531 } __packed; 3532 3533 struct rtw89_h2c_ap_info { 3534 __le32 w0; 3535 } __packed; 3536 3537 #define RTW89_H2C_AP_INFO_W0_PWR_INT_EN BIT(0) 3538 3539 #define RTW89_C2H_HEADER_LEN 8 3540 3541 struct rtw89_c2h_hdr { 3542 __le32 w0; 3543 __le32 w1; 3544 } __packed; 3545 3546 #define RTW89_C2H_HDR_W0_CATEGORY GENMASK(1, 0) 3547 #define RTW89_C2H_HDR_W0_CLASS GENMASK(7, 2) 3548 #define RTW89_C2H_HDR_W0_FUNC GENMASK(15, 8) 3549 #define RTW89_C2H_HDR_W1_LEN GENMASK(13, 0) 3550 3551 struct rtw89_fw_c2h_attr { 3552 u8 category; 3553 u8 class; 3554 u8 func; 3555 u16 len; 3556 }; 3557 3558 static inline struct rtw89_fw_c2h_attr *RTW89_SKB_C2H_CB(struct sk_buff *skb) 3559 { 3560 static_assert(sizeof(skb->cb) >= sizeof(struct rtw89_fw_c2h_attr)); 3561 3562 return (struct rtw89_fw_c2h_attr *)skb->cb; 3563 } 3564 3565 struct rtw89_c2h_done_ack { 3566 __le32 w0; 3567 __le32 w1; 3568 __le32 w2; 3569 } __packed; 3570 3571 #define RTW89_C2H_DONE_ACK_W2_CAT GENMASK(1, 0) 3572 #define RTW89_C2H_DONE_ACK_W2_CLASS GENMASK(7, 2) 3573 #define RTW89_C2H_DONE_ACK_W2_FUNC GENMASK(15, 8) 3574 #define RTW89_C2H_DONE_ACK_W2_H2C_RETURN GENMASK(23, 16) 3575 #define RTW89_C2H_SCAN_DONE_ACK_RETURN GENMASK(5, 0) 3576 #define RTW89_C2H_DONE_ACK_W2_H2C_SEQ GENMASK(31, 24) 3577 3578 #define RTW89_GET_MAC_C2H_REV_ACK_CAT(c2h) \ 3579 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0)) 3580 #define RTW89_GET_MAC_C2H_REV_ACK_CLASS(c2h) \ 3581 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2)) 3582 #define RTW89_GET_MAC_C2H_REV_ACK_FUNC(c2h) \ 3583 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8)) 3584 #define RTW89_GET_MAC_C2H_REV_ACK_H2C_SEQ(c2h) \ 3585 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(23, 16)) 3586 3587 struct rtw89_fw_c2h_log_fmt { 3588 __le16 signature; 3589 u8 feature; 3590 u8 syntax; 3591 __le32 fmt_id; 3592 u8 file_num; 3593 __le16 line_num; 3594 u8 argc; 3595 union { 3596 DECLARE_FLEX_ARRAY(u8, raw); 3597 DECLARE_FLEX_ARRAY(__le32, argv); 3598 } __packed u; 3599 } __packed; 3600 3601 #define RTW89_C2H_FW_FORMATTED_LOG_MIN_LEN 11 3602 #define RTW89_C2H_FW_LOG_FEATURE_PARA_INT BIT(2) 3603 #define RTW89_C2H_FW_LOG_MAX_PARA_NUM 16 3604 #define RTW89_C2H_FW_LOG_SIGNATURE 0xA5A5 3605 #define RTW89_C2H_FW_LOG_STR_BUF_SIZE 512 3606 3607 struct rtw89_c2h_mac_bcnfltr_rpt { 3608 __le32 w0; 3609 __le32 w1; 3610 __le32 w2; 3611 } __packed; 3612 3613 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_MACID GENMASK(7, 0) 3614 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_TYPE GENMASK(9, 8) 3615 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_EVENT GENMASK(11, 10) 3616 #define RTW89_C2H_MAC_BCNFLTR_RPT_W2_MA GENMASK(23, 16) 3617 3618 struct rtw89_c2h_ra_rpt { 3619 struct rtw89_c2h_hdr hdr; 3620 __le32 w2; 3621 __le32 w3; 3622 } __packed; 3623 3624 #define RTW89_C2H_RA_RPT_W2_MACID GENMASK(15, 0) 3625 #define RTW89_C2H_RA_RPT_W2_RETRY_RATIO GENMASK(23, 16) 3626 #define RTW89_C2H_RA_RPT_W2_MCSNSS_B7 BIT(31) 3627 #define RTW89_C2H_RA_RPT_W3_MCSNSS GENMASK(6, 0) 3628 #define RTW89_C2H_RA_RPT_W3_MD_SEL GENMASK(9, 8) 3629 #define RTW89_C2H_RA_RPT_W3_GILTF GENMASK(12, 10) 3630 #define RTW89_C2H_RA_RPT_W3_BW GENMASK(14, 13) 3631 #define RTW89_C2H_RA_RPT_W3_MD_SEL_B2 BIT(15) 3632 #define RTW89_C2H_RA_RPT_W3_BW_B2 BIT(16) 3633 3634 struct rtw89_c2h_fw_scan_rpt { 3635 struct rtw89_c2h_hdr hdr; 3636 u8 phy_idx; 3637 u8 band; 3638 u8 center_ch; 3639 u8 ofdm_pd_idx; /* in unit of 2 dBm */ 3640 #define PD_LOWER_BOUND_BASE 102 3641 s8 cck_pd_idx; 3642 u8 rsvd0; 3643 u8 rsvd1; 3644 u8 rsvd2; 3645 } __packed; 3646 3647 /* For WiFi 6 chips: 3648 * VHT, HE, HT-old: [6:4]: NSS, [3:0]: MCS 3649 * HT-new: [6:5]: NA, [4:0]: MCS 3650 * For WiFi 7 chips (V1): 3651 * HT, VHT, HE, EHT: [7:5]: NSS, [4:0]: MCS 3652 */ 3653 #define RTW89_RA_RATE_MASK_NSS GENMASK(6, 4) 3654 #define RTW89_RA_RATE_MASK_MCS GENMASK(3, 0) 3655 #define RTW89_RA_RATE_MASK_NSS_V1 GENMASK(7, 5) 3656 #define RTW89_RA_RATE_MASK_MCS_V1 GENMASK(4, 0) 3657 #define RTW89_RA_RATE_MASK_HT_MCS GENMASK(4, 0) 3658 #define RTW89_MK_HT_RATE(nss, mcs) (FIELD_PREP(GENMASK(4, 3), nss) | \ 3659 FIELD_PREP(GENMASK(2, 0), mcs)) 3660 3661 #define RTW89_GET_MAC_C2H_PKTOFLD_ID(c2h) \ 3662 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 0)) 3663 #define RTW89_GET_MAC_C2H_PKTOFLD_OP(c2h) \ 3664 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(10, 8)) 3665 #define RTW89_GET_MAC_C2H_PKTOFLD_LEN(c2h) \ 3666 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(31, 16)) 3667 3668 struct rtw89_c2h_scanofld { 3669 __le32 w0; 3670 __le32 w1; 3671 __le32 w2; 3672 __le32 w3; 3673 __le32 w4; 3674 __le32 w5; 3675 __le32 w6; 3676 __le32 w7; 3677 __le32 w8; 3678 } __packed; 3679 3680 #define RTW89_C2H_SCANOFLD_W2_PRI_CH GENMASK(7, 0) 3681 #define RTW89_C2H_SCANOFLD_W2_RSN GENMASK(19, 16) 3682 #define RTW89_C2H_SCANOFLD_W2_STATUS GENMASK(23, 20) 3683 #define RTW89_C2H_SCANOFLD_W2_PERIOD GENMASK(31, 24) 3684 #define RTW89_C2H_SCANOFLD_W5_TX_FAIL GENMASK(3, 0) 3685 #define RTW89_C2H_SCANOFLD_W5_AIR_DENSITY GENMASK(7, 4) 3686 #define RTW89_C2H_SCANOFLD_W5_BAND GENMASK(25, 24) 3687 #define RTW89_C2H_SCANOFLD_W5_MAC_IDX BIT(26) 3688 #define RTW89_C2H_SCANOFLD_W6_SW_DEF GENMASK(7, 0) 3689 #define RTW89_C2H_SCANOFLD_W6_EXPECT_PERIOD GENMASK(15, 8) 3690 #define RTW89_C2H_SCANOFLD_W6_FW_DEF GENMASK(23, 16) 3691 #define RTW89_C2H_SCANOFLD_W7_REPORT_TSF GENMASK(31, 0) 3692 #define RTW89_C2H_SCANOFLD_W8_PERIOD_V1 GENMASK(15, 0) 3693 #define RTW89_C2H_SCANOFLD_W8_EXPECT_PERIOD_V1 GENMASK(31, 16) 3694 3695 #define RTW89_GET_MAC_C2H_MCC_RCV_ACK_GROUP(c2h) \ 3696 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0)) 3697 #define RTW89_GET_MAC_C2H_MCC_RCV_ACK_H2C_FUNC(c2h) \ 3698 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8)) 3699 3700 #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_GROUP(c2h) \ 3701 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(1, 0)) 3702 #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_RETURN(c2h) \ 3703 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 2)) 3704 #define RTW89_GET_MAC_C2H_MCC_REQ_ACK_H2C_FUNC(c2h) \ 3705 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8)) 3706 3707 struct rtw89_mac_mcc_tsf_rpt { 3708 u32 macid_x; 3709 u32 macid_y; 3710 u32 tsf_x_low; 3711 u32 tsf_x_high; 3712 u32 tsf_y_low; 3713 u32 tsf_y_high; 3714 }; 3715 3716 static_assert(sizeof(struct rtw89_mac_mcc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE); 3717 3718 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_X(c2h) \ 3719 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 0)) 3720 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_MACID_Y(c2h) \ 3721 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8)) 3722 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_GROUP(c2h) \ 3723 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(17, 16)) 3724 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_X(c2h) \ 3725 le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(31, 0)) 3726 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_X(c2h) \ 3727 le32_get_bits(*((const __le32 *)(c2h) + 4), GENMASK(31, 0)) 3728 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_LOW_Y(c2h) \ 3729 le32_get_bits(*((const __le32 *)(c2h) + 5), GENMASK(31, 0)) 3730 #define RTW89_GET_MAC_C2H_MCC_TSF_RPT_TSF_HIGH_Y(c2h) \ 3731 le32_get_bits(*((const __le32 *)(c2h) + 6), GENMASK(31, 0)) 3732 3733 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_STATUS(c2h) \ 3734 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(5, 0)) 3735 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_GROUP(c2h) \ 3736 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(7, 6)) 3737 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_MACID(c2h) \ 3738 le32_get_bits(*((const __le32 *)(c2h) + 2), GENMASK(15, 8)) 3739 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_LOW(c2h) \ 3740 le32_get_bits(*((const __le32 *)(c2h) + 3), GENMASK(31, 0)) 3741 #define RTW89_GET_MAC_C2H_MCC_STATUS_RPT_TSF_HIGH(c2h) \ 3742 le32_get_bits(*((const __le32 *)(c2h) + 4), GENMASK(31, 0)) 3743 3744 struct rtw89_c2h_mlo_link_cfg_rpt { 3745 struct rtw89_c2h_hdr hdr; 3746 __le32 w2; 3747 } __packed; 3748 3749 #define RTW89_C2H_MLO_LINK_CFG_RPT_W2_MACID GENMASK(15, 0) 3750 #define RTW89_C2H_MLO_LINK_CFG_RPT_W2_STATUS GENMASK(19, 16) 3751 3752 enum rtw89_c2h_mlo_link_status { 3753 RTW89_C2H_MLO_LINK_CFG_IDLE = 0, 3754 RTW89_C2H_MLO_LINK_CFG_DONE = 1, 3755 RTW89_C2H_MLO_LINK_CFG_ISSUE_NULL_FAIL = 2, 3756 RTW89_C2H_MLO_LINK_CFG_TX_NULL_FAIL = 3, 3757 RTW89_C2H_MLO_LINK_CFG_ROLE_NOT_EXIST = 4, 3758 RTW89_C2H_MLO_LINK_CFG_NULL_1_TIMEOUT = 5, 3759 RTW89_C2H_MLO_LINK_CFG_NULL_0_TIMEOUT = 6, 3760 RTW89_C2H_MLO_LINK_CFG_RUNNING = 0xff, 3761 }; 3762 3763 struct rtw89_mac_mrc_tsf_rpt { 3764 unsigned int num; 3765 u64 tsfs[RTW89_MAC_MRC_MAX_REQ_TSF_NUM]; 3766 }; 3767 3768 static_assert(sizeof(struct rtw89_mac_mrc_tsf_rpt) <= RTW89_COMPLETION_BUF_SIZE); 3769 3770 struct rtw89_c2h_mrc_tsf_rpt_info { 3771 __le32 tsf_low; 3772 __le32 tsf_high; 3773 } __packed; 3774 3775 struct rtw89_c2h_mrc_tsf_rpt { 3776 struct rtw89_c2h_hdr hdr; 3777 __le32 w2; 3778 struct rtw89_c2h_mrc_tsf_rpt_info infos[]; 3779 } __packed; 3780 3781 #define RTW89_C2H_MRC_TSF_RPT_W2_REQ_TSF_NUM GENMASK(7, 0) 3782 3783 struct rtw89_c2h_mrc_status_rpt { 3784 struct rtw89_c2h_hdr hdr; 3785 __le32 w2; 3786 __le32 tsf_low; 3787 __le32 tsf_high; 3788 } __packed; 3789 3790 #define RTW89_C2H_MRC_STATUS_RPT_W2_STATUS GENMASK(5, 0) 3791 #define RTW89_C2H_MRC_STATUS_RPT_W2_SCH_IDX GENMASK(7, 6) 3792 3793 struct rtw89_c2h_pkt_ofld_rsp { 3794 __le32 w0; 3795 __le32 w1; 3796 __le32 w2; 3797 } __packed; 3798 3799 #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_ID GENMASK(7, 0) 3800 #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_OP GENMASK(10, 8) 3801 #define RTW89_C2H_PKT_OFLD_RSP_W2_PTK_LEN GENMASK(31, 16) 3802 3803 struct rtw89_c2h_tx_duty_rpt { 3804 struct rtw89_c2h_hdr c2h_hdr; 3805 __le32 w2; 3806 } __packed; 3807 3808 #define RTW89_C2H_TX_DUTY_RPT_W2_TIMER_ERR GENMASK(2, 0) 3809 3810 struct rtw89_c2h_wow_aoac_report { 3811 struct rtw89_c2h_hdr c2h_hdr; 3812 u8 rpt_ver; 3813 u8 sec_type; 3814 u8 key_idx; 3815 u8 pattern_idx; 3816 u8 rekey_ok; 3817 u8 rsvd1[3]; 3818 u8 ptk_tx_iv[8]; 3819 u8 eapol_key_replay_count[8]; 3820 u8 gtk[32]; 3821 u8 ptk_rx_iv[8]; 3822 u8 gtk_rx_iv[4][8]; 3823 __le64 igtk_key_id; 3824 __le64 igtk_ipn; 3825 u8 igtk[32]; 3826 u8 csa_pri_ch; 3827 u8 csa_bw_ch_offset; 3828 u8 csa_ch_band_chsw_failed; 3829 u8 csa_rsvd1; 3830 } __packed; 3831 3832 #define RTW89_C2H_WOW_AOAC_RPT_REKEY_IDX BIT(0) 3833 3834 struct rtw89_c2h_pwr_int_notify { 3835 struct rtw89_c2h_hdr hdr; 3836 __le32 w2; 3837 } __packed; 3838 3839 #define RTW89_C2H_PWR_INT_NOTIFY_W2_MACID GENMASK(15, 0) 3840 #define RTW89_C2H_PWR_INT_NOTIFY_W2_PWR_STATUS BIT(16) 3841 3842 struct rtw89_h2c_tx_duty { 3843 __le32 w0; 3844 __le32 w1; 3845 } __packed; 3846 3847 #define RTW89_H2C_TX_DUTY_W0_PAUSE_INTVL_MASK GENMASK(15, 0) 3848 #define RTW89_H2C_TX_DUTY_W0_TX_INTVL_MASK GENMASK(31, 16) 3849 #define RTW89_H2C_TX_DUTY_W1_STOP BIT(0) 3850 3851 struct rtw89_h2c_bcnfltr { 3852 __le32 w0; 3853 } __packed; 3854 3855 #define RTW89_H2C_BCNFLTR_W0_MON_RSSI BIT(0) 3856 #define RTW89_H2C_BCNFLTR_W0_MON_BCN BIT(1) 3857 #define RTW89_H2C_BCNFLTR_W0_MON_EN BIT(2) 3858 #define RTW89_H2C_BCNFLTR_W0_MODE GENMASK(4, 3) 3859 #define RTW89_H2C_BCNFLTR_W0_BCN_LOSS_CNT_H3 GENMASK(7, 5) 3860 #define RTW89_H2C_BCNFLTR_W0_BCN_LOSS_CNT_L4 GENMASK(11, 8) 3861 #define RTW89_H2C_BCNFLTR_W0_RSSI_HYST GENMASK(15, 12) 3862 #define RTW89_H2C_BCNFLTR_W0_RSSI_THRESHOLD GENMASK(23, 16) 3863 #define RTW89_H2C_BCNFLTR_W0_MAC_ID GENMASK(31, 24) 3864 3865 struct rtw89_h2c_ofld_rssi { 3866 __le32 w0; 3867 __le32 w1; 3868 } __packed; 3869 3870 #define RTW89_H2C_OFLD_RSSI_W0_MACID GENMASK(7, 0) 3871 #define RTW89_H2C_OFLD_RSSI_W0_NUM GENMASK(15, 8) 3872 #define RTW89_H2C_OFLD_RSSI_W1_VAL GENMASK(7, 0) 3873 3874 struct rtw89_h2c_ofld { 3875 __le32 w0; 3876 } __packed; 3877 3878 #define RTW89_H2C_OFLD_W0_MAC_ID GENMASK(7, 0) 3879 #define RTW89_H2C_OFLD_W0_TX_TP GENMASK(17, 8) 3880 #define RTW89_H2C_OFLD_W0_RX_TP GENMASK(27, 18) 3881 3882 #define RTW89_MFW_SIG 0xFF 3883 3884 struct rtw89_mfw_info { 3885 u8 cv; 3886 u8 type; /* enum rtw89_fw_type */ 3887 u8 mp; 3888 u8 rsvd; 3889 __le32 shift; 3890 __le32 size; 3891 u8 rsvd2[4]; 3892 } __packed; 3893 3894 struct rtw89_mfw_hdr { 3895 u8 sig; /* RTW89_MFW_SIG */ 3896 u8 fw_nr; 3897 u8 rsvd0[2]; 3898 struct { 3899 u8 major; 3900 u8 minor; 3901 u8 sub; 3902 u8 idx; 3903 } ver; 3904 u8 rsvd1[8]; 3905 struct rtw89_mfw_info info[]; 3906 } __packed; 3907 3908 struct rtw89_fw_logsuit_hdr { 3909 __le32 rsvd; 3910 __le32 count; 3911 __le32 ids[]; 3912 } __packed; 3913 3914 #define RTW89_FW_ELEMENT_ALIGN 16 3915 3916 enum rtw89_fw_element_id { 3917 RTW89_FW_ELEMENT_ID_BBMCU0 = 0, 3918 RTW89_FW_ELEMENT_ID_BBMCU1 = 1, 3919 RTW89_FW_ELEMENT_ID_BB_REG = 2, 3920 RTW89_FW_ELEMENT_ID_BB_GAIN = 3, 3921 RTW89_FW_ELEMENT_ID_RADIO_A = 4, 3922 RTW89_FW_ELEMENT_ID_RADIO_B = 5, 3923 RTW89_FW_ELEMENT_ID_RADIO_C = 6, 3924 RTW89_FW_ELEMENT_ID_RADIO_D = 7, 3925 RTW89_FW_ELEMENT_ID_RF_NCTL = 8, 3926 RTW89_FW_ELEMENT_ID_TXPWR_BYRATE = 9, 3927 RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ = 10, 3928 RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ = 11, 3929 RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ = 12, 3930 RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ = 13, 3931 RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ = 14, 3932 RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ = 15, 3933 RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT = 16, 3934 RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU = 17, 3935 RTW89_FW_ELEMENT_ID_TXPWR_TRK = 18, 3936 RTW89_FW_ELEMENT_ID_RFKLOG_FMT = 19, 3937 RTW89_FW_ELEMENT_ID_REGD = 20, 3938 RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_2GHZ = 21, 3939 RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_5GHZ = 22, 3940 RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_6GHZ = 23, 3941 RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_RU_2GHZ = 24, 3942 RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_RU_5GHZ = 25, 3943 RTW89_FW_ELEMENT_ID_TXPWR_DA_LMT_RU_6GHZ = 26, 3944 3945 RTW89_FW_ELEMENT_ID_NUM, 3946 }; 3947 3948 #define BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ \ 3949 (BIT(RTW89_FW_ELEMENT_ID_TXPWR_BYRATE) | \ 3950 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_2GHZ) | \ 3951 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_5GHZ) | \ 3952 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_2GHZ) | \ 3953 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_5GHZ) | \ 3954 BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT) | \ 3955 BIT(RTW89_FW_ELEMENT_ID_TX_SHAPE_LMT_RU)) 3956 3957 #define BITS_OF_RTW89_TXPWR_FW_ELEMENTS \ 3958 (BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ | \ 3959 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_6GHZ) | \ 3960 BIT(RTW89_FW_ELEMENT_ID_TXPWR_LMT_RU_6GHZ)) 3961 3962 #define RTW89_AX_GEN_DEF_NEEDED_FW_ELEMENTS_NO_6GHZ \ 3963 (BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \ 3964 BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \ 3965 BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \ 3966 BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \ 3967 BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \ 3968 BITS_OF_RTW89_TXPWR_FW_ELEMENTS_NO_6GHZ) 3969 3970 #define RTW89_BE_GEN_DEF_NEEDED_FW_ELEMENTS (BIT(RTW89_FW_ELEMENT_ID_BBMCU0) | \ 3971 BIT(RTW89_FW_ELEMENT_ID_BB_REG) | \ 3972 BIT(RTW89_FW_ELEMENT_ID_RADIO_A) | \ 3973 BIT(RTW89_FW_ELEMENT_ID_RADIO_B) | \ 3974 BIT(RTW89_FW_ELEMENT_ID_RF_NCTL) | \ 3975 BIT(RTW89_FW_ELEMENT_ID_TXPWR_TRK) | \ 3976 BITS_OF_RTW89_TXPWR_FW_ELEMENTS) 3977 3978 struct __rtw89_fw_txpwr_element { 3979 u8 rsvd0; 3980 u8 rsvd1; 3981 u8 rfe_type; 3982 u8 ent_sz; 3983 __le32 num_ents; 3984 u8 content[]; 3985 } __packed; 3986 3987 struct __rtw89_fw_regd_element { 3988 u8 rsvd0; 3989 u8 rsvd1; 3990 u8 rsvd2; 3991 u8 ent_sz; 3992 __le32 num_ents; 3993 u8 content[]; 3994 } __packed; 3995 3996 enum rtw89_fw_txpwr_trk_type { 3997 __RTW89_FW_TXPWR_TRK_TYPE_6GHZ_START = 0, 3998 RTW89_FW_TXPWR_TRK_TYPE_6GB_N = 0, 3999 RTW89_FW_TXPWR_TRK_TYPE_6GB_P = 1, 4000 RTW89_FW_TXPWR_TRK_TYPE_6GA_N = 2, 4001 RTW89_FW_TXPWR_TRK_TYPE_6GA_P = 3, 4002 __RTW89_FW_TXPWR_TRK_TYPE_6GHZ_MAX = 3, 4003 4004 __RTW89_FW_TXPWR_TRK_TYPE_5GHZ_START = 4, 4005 RTW89_FW_TXPWR_TRK_TYPE_5GB_N = 4, 4006 RTW89_FW_TXPWR_TRK_TYPE_5GB_P = 5, 4007 RTW89_FW_TXPWR_TRK_TYPE_5GA_N = 6, 4008 RTW89_FW_TXPWR_TRK_TYPE_5GA_P = 7, 4009 __RTW89_FW_TXPWR_TRK_TYPE_5GHZ_MAX = 7, 4010 4011 __RTW89_FW_TXPWR_TRK_TYPE_2GHZ_START = 8, 4012 RTW89_FW_TXPWR_TRK_TYPE_2GB_N = 8, 4013 RTW89_FW_TXPWR_TRK_TYPE_2GB_P = 9, 4014 RTW89_FW_TXPWR_TRK_TYPE_2GA_N = 10, 4015 RTW89_FW_TXPWR_TRK_TYPE_2GA_P = 11, 4016 RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_N = 12, 4017 RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_P = 13, 4018 RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_N = 14, 4019 RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_P = 15, 4020 __RTW89_FW_TXPWR_TRK_TYPE_2GHZ_MAX = 15, 4021 4022 RTW89_FW_TXPWR_TRK_TYPE_NR, 4023 }; 4024 4025 struct rtw89_fw_txpwr_track_cfg { 4026 const s8 (*delta[RTW89_FW_TXPWR_TRK_TYPE_NR])[DELTA_SWINGIDX_SIZE]; 4027 }; 4028 4029 #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_6GHZ \ 4030 (BIT(RTW89_FW_TXPWR_TRK_TYPE_6GB_N) | \ 4031 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GB_P) | \ 4032 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GA_N) | \ 4033 BIT(RTW89_FW_TXPWR_TRK_TYPE_6GA_P)) 4034 #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_5GHZ \ 4035 (BIT(RTW89_FW_TXPWR_TRK_TYPE_5GB_N) | \ 4036 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GB_P) | \ 4037 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GA_N) | \ 4038 BIT(RTW89_FW_TXPWR_TRK_TYPE_5GA_P)) 4039 #define RTW89_DEFAULT_NEEDED_FW_TXPWR_TRK_2GHZ \ 4040 (BIT(RTW89_FW_TXPWR_TRK_TYPE_2GB_N) | \ 4041 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GB_P) | \ 4042 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GA_N) | \ 4043 BIT(RTW89_FW_TXPWR_TRK_TYPE_2GA_P) | \ 4044 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_N) | \ 4045 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_B_P) | \ 4046 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_N) | \ 4047 BIT(RTW89_FW_TXPWR_TRK_TYPE_2G_CCK_A_P)) 4048 4049 struct rtw89_fw_element_hdr { 4050 __le32 id; /* enum rtw89_fw_element_id */ 4051 __le32 size; /* exclude header size */ 4052 u8 ver[4]; 4053 __le32 rsvd0; 4054 __le32 rsvd1; 4055 __le32 rsvd2; 4056 union { 4057 struct { 4058 u8 priv[8]; 4059 u8 contents[]; 4060 } __packed common; 4061 struct { 4062 u8 idx; 4063 u8 rsvd[7]; 4064 struct { 4065 __le32 addr; 4066 __le32 data; 4067 } __packed regs[]; 4068 } __packed reg2; 4069 struct { 4070 u8 cv; 4071 u8 priv[7]; 4072 u8 contents[]; 4073 } __packed bbmcu; 4074 struct { 4075 __le32 bitmap; /* bitmap of enum rtw89_fw_txpwr_trk_type */ 4076 __le32 rsvd; 4077 s8 contents[][DELTA_SWINGIDX_SIZE]; 4078 } __packed txpwr_trk; 4079 struct { 4080 u8 nr; 4081 u8 rsvd[3]; 4082 u8 rfk_id; /* enum rtw89_phy_c2h_rfk_log_func */ 4083 u8 rsvd1[3]; 4084 __le16 offset[]; 4085 } __packed rfk_log_fmt; 4086 struct __rtw89_fw_txpwr_element txpwr; 4087 struct __rtw89_fw_regd_element regd; 4088 } __packed u; 4089 } __packed; 4090 4091 struct fwcmd_hdr { 4092 __le32 hdr0; 4093 __le32 hdr1; 4094 }; 4095 4096 union rtw89_compat_fw_hdr { 4097 struct rtw89_mfw_hdr mfw_hdr; 4098 struct rtw89_fw_hdr fw_hdr; 4099 }; 4100 4101 static inline u32 rtw89_compat_fw_hdr_ver_code(const void *fw_buf) 4102 { 4103 const union rtw89_compat_fw_hdr *compat = (typeof(compat))fw_buf; 4104 4105 if (compat->mfw_hdr.sig == RTW89_MFW_SIG) 4106 return RTW89_MFW_HDR_VER_CODE(&compat->mfw_hdr); 4107 else 4108 return RTW89_FW_HDR_VER_CODE(&compat->fw_hdr); 4109 } 4110 4111 static inline void rtw89_fw_get_filename(char *buf, size_t size, 4112 const char *fw_basename, int fw_format) 4113 { 4114 if (fw_format <= 0) 4115 snprintf(buf, size, "%s.bin", fw_basename); 4116 else 4117 snprintf(buf, size, "%s-%d.bin", fw_basename, fw_format); 4118 } 4119 4120 #define RTW89_H2C_RF_PAGE_SIZE 500 4121 #define RTW89_H2C_RF_PAGE_NUM 3 4122 struct rtw89_fw_h2c_rf_reg_info { 4123 enum rtw89_rf_path rf_path; 4124 __le32 rtw89_phy_config_rf_h2c[RTW89_H2C_RF_PAGE_NUM][RTW89_H2C_RF_PAGE_SIZE]; 4125 u16 curr_idx; 4126 }; 4127 4128 #define H2C_SEC_CAM_LEN 24 4129 4130 #define H2C_HEADER_LEN 8 4131 #define H2C_HDR_CAT GENMASK(1, 0) 4132 #define H2C_HDR_CLASS GENMASK(7, 2) 4133 #define H2C_HDR_FUNC GENMASK(15, 8) 4134 #define H2C_HDR_DEL_TYPE GENMASK(19, 16) 4135 #define H2C_HDR_H2C_SEQ GENMASK(31, 24) 4136 #define H2C_HDR_TOTAL_LEN GENMASK(13, 0) 4137 #define H2C_HDR_REC_ACK BIT(14) 4138 #define H2C_HDR_DONE_ACK BIT(15) 4139 4140 #define FWCMD_TYPE_H2C 0 4141 4142 #define H2C_CAT_TEST 0x0 4143 4144 /* CLASS 5 - FW STATUS TEST */ 4145 #define H2C_CL_FW_STATUS_TEST 0x5 4146 #define H2C_FUNC_CPU_EXCEPTION 0x1 4147 4148 #define H2C_CAT_MAC 0x1 4149 4150 /* CLASS 0 - FW INFO */ 4151 #define H2C_CL_FW_INFO 0x0 4152 #define H2C_FUNC_LOG_CFG 0x0 4153 #define H2C_FUNC_MAC_GENERAL_PKT 0x1 4154 4155 /* CLASS 1 - WOW */ 4156 #define H2C_CL_MAC_WOW 0x1 4157 enum rtw89_wow_h2c_func { 4158 H2C_FUNC_KEEP_ALIVE = 0x0, 4159 H2C_FUNC_DISCONNECT_DETECT = 0x1, 4160 H2C_FUNC_WOW_GLOBAL = 0x2, 4161 H2C_FUNC_GTK_OFLD = 0x3, 4162 H2C_FUNC_ARP_OFLD = 0x4, 4163 H2C_FUNC_NLO = 0x7, 4164 H2C_FUNC_WAKEUP_CTRL = 0x8, 4165 H2C_FUNC_WOW_CAM_UPD = 0xC, 4166 H2C_FUNC_AOAC_REPORT_REQ = 0xD, 4167 4168 NUM_OF_RTW89_WOW_H2C_FUNC, 4169 }; 4170 4171 #define RTW89_WOW_WAIT_COND(tag, func) \ 4172 ((tag) * NUM_OF_RTW89_WOW_H2C_FUNC + (func)) 4173 4174 #define RTW89_WOW_WAIT_COND_AOAC \ 4175 RTW89_WOW_WAIT_COND(0 /* don't care */, H2C_FUNC_AOAC_REPORT_REQ) 4176 4177 /* CLASS 2 - PS */ 4178 #define H2C_CL_MAC_PS 0x2 4179 enum rtw89_ps_h2c_func { 4180 H2C_FUNC_MAC_LPS_PARM = 0x0, 4181 H2C_FUNC_P2P_ACT = 0x1, 4182 H2C_FUNC_IPS_CFG = 0x3, 4183 4184 NUM_OF_RTW89_PS_H2C_FUNC, 4185 }; 4186 4187 #define RTW89_PS_WAIT_COND(tag, func) \ 4188 ((tag) * NUM_OF_RTW89_PS_H2C_FUNC + (func)) 4189 4190 #define RTW89_PS_WAIT_COND_IPS_CFG \ 4191 RTW89_PS_WAIT_COND(0 /* don't care */, H2C_FUNC_IPS_CFG) 4192 4193 /* CLASS 3 - FW download */ 4194 #define H2C_CL_MAC_FWDL 0x3 4195 #define H2C_FUNC_MAC_FWHDR_DL 0x0 4196 4197 /* CLASS 5 - Frame Exchange */ 4198 #define H2C_CL_MAC_FR_EXCHG 0x5 4199 #define H2C_FUNC_MAC_CCTLINFO_UD 0x2 4200 #define H2C_FUNC_MAC_BCN_UPD 0x5 4201 #define H2C_FUNC_MAC_DCTLINFO_UD_V1 0x9 4202 #define H2C_FUNC_MAC_CCTLINFO_UD_V1 0xa 4203 #define H2C_FUNC_MAC_DCTLINFO_UD_V2 0xc 4204 #define H2C_FUNC_MAC_BCN_UPD_BE 0xd 4205 #define H2C_FUNC_MAC_CCTLINFO_UD_G7 0x11 4206 4207 /* CLASS 6 - Address CAM */ 4208 #define H2C_CL_MAC_ADDR_CAM_UPDATE 0x6 4209 #define H2C_FUNC_MAC_ADDR_CAM_UPD 0x0 4210 4211 /* CLASS 8 - Media Status Report */ 4212 #define H2C_CL_MAC_MEDIA_RPT 0x8 4213 #define H2C_FUNC_MAC_JOININFO 0x0 4214 #define H2C_FUNC_MAC_FWROLE_MAINTAIN 0x4 4215 #define H2C_FUNC_NOTIFY_DBCC 0x5 4216 4217 /* CLASS 9 - FW offload */ 4218 #define H2C_CL_MAC_FW_OFLD 0x9 4219 enum rtw89_fw_ofld_h2c_func { 4220 H2C_FUNC_PACKET_OFLD = 0x1, 4221 H2C_FUNC_MAC_MACID_PAUSE = 0x8, 4222 H2C_FUNC_USR_EDCA = 0xF, 4223 H2C_FUNC_TSF32_TOGL = 0x10, 4224 H2C_FUNC_OFLD_CFG = 0x14, 4225 H2C_FUNC_ADD_SCANOFLD_CH = 0x16, 4226 H2C_FUNC_SCANOFLD = 0x17, 4227 H2C_FUNC_TX_DUTY = 0x18, 4228 H2C_FUNC_PKT_DROP = 0x1b, 4229 H2C_FUNC_CFG_BCNFLTR = 0x1e, 4230 H2C_FUNC_OFLD_RSSI = 0x1f, 4231 H2C_FUNC_OFLD_TP = 0x20, 4232 H2C_FUNC_MAC_MACID_PAUSE_SLEEP = 0x28, 4233 H2C_FUNC_SCANOFLD_BE = 0x2c, 4234 4235 NUM_OF_RTW89_FW_OFLD_H2C_FUNC, 4236 }; 4237 4238 #define RTW89_FW_OFLD_WAIT_COND(tag, func) \ 4239 ((tag) * NUM_OF_RTW89_FW_OFLD_H2C_FUNC + (func)) 4240 4241 #define RTW89_FW_OFLD_WAIT_COND_PKT_OFLD(pkt_id, pkt_op) \ 4242 RTW89_FW_OFLD_WAIT_COND(RTW89_PKT_OFLD_WAIT_TAG(pkt_id, pkt_op), \ 4243 H2C_FUNC_PACKET_OFLD) 4244 4245 #define RTW89_SCANOFLD_WAIT_COND_ADD_CH RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_ADD_SCANOFLD_CH) 4246 4247 #define RTW89_SCANOFLD_WAIT_COND_START RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_SCANOFLD) 4248 #define RTW89_SCANOFLD_WAIT_COND_STOP RTW89_FW_OFLD_WAIT_COND(1, H2C_FUNC_SCANOFLD) 4249 #define RTW89_SCANOFLD_BE_WAIT_COND_START RTW89_FW_OFLD_WAIT_COND(0, H2C_FUNC_SCANOFLD_BE) 4250 #define RTW89_SCANOFLD_BE_WAIT_COND_STOP RTW89_FW_OFLD_WAIT_COND(1, H2C_FUNC_SCANOFLD_BE) 4251 4252 4253 /* CLASS 10 - Security CAM */ 4254 #define H2C_CL_MAC_SEC_CAM 0xa 4255 #define H2C_FUNC_MAC_SEC_UPD 0x1 4256 4257 /* CLASS 12 - BA CAM */ 4258 #define H2C_CL_BA_CAM 0xc 4259 #define H2C_FUNC_MAC_BA_CAM 0x0 4260 #define H2C_FUNC_MAC_BA_CAM_V1 0x1 4261 #define H2C_FUNC_MAC_BA_CAM_INIT 0x2 4262 4263 /* CLASS 14 - MCC */ 4264 #define H2C_CL_MCC 0xe 4265 enum rtw89_mcc_h2c_func { 4266 H2C_FUNC_ADD_MCC = 0x0, 4267 H2C_FUNC_START_MCC = 0x1, 4268 H2C_FUNC_STOP_MCC = 0x2, 4269 H2C_FUNC_DEL_MCC_GROUP = 0x3, 4270 H2C_FUNC_RESET_MCC_GROUP = 0x4, 4271 H2C_FUNC_MCC_REQ_TSF = 0x5, 4272 H2C_FUNC_MCC_MACID_BITMAP = 0x6, 4273 H2C_FUNC_MCC_SYNC = 0x7, 4274 H2C_FUNC_MCC_SET_DURATION = 0x8, 4275 4276 NUM_OF_RTW89_MCC_H2C_FUNC, 4277 }; 4278 4279 #define RTW89_MCC_WAIT_COND(group, func) \ 4280 ((group) * NUM_OF_RTW89_MCC_H2C_FUNC + (func)) 4281 4282 /* CLASS 20 - MLO */ 4283 #define H2C_CL_MLO 0x14 4284 enum rtw89_mlo_h2c_func { 4285 H2C_FUNC_MLO_TBL_CFG = 0x0, 4286 H2C_FUNC_MLO_STA_CFG = 0x1, 4287 H2C_FUNC_MLO_TTLM = 0x2, 4288 H2C_FUNC_MLO_DM_CFG = 0x3, 4289 H2C_FUNC_MLO_EMLSR_STA_CFG = 0x4, 4290 H2C_FUNC_MLO_MCMLO_RELINK_DROP = 0x5, 4291 H2C_FUNC_MLO_MCMLO_SN_SYNC = 0x6, 4292 H2C_FUNC_MLO_RELINK = 0x7, 4293 H2C_FUNC_MLO_LINK_CFG = 0x8, 4294 H2C_FUNC_MLO_DM_DBG = 0x9, 4295 4296 NUM_OF_RTW89_MLO_H2C_FUNC, 4297 }; 4298 4299 #define RTW89_MLO_WAIT_COND(macid, func) \ 4300 ((macid) * NUM_OF_RTW89_MLO_H2C_FUNC + (func)) 4301 4302 /* CLASS 24 - MRC */ 4303 #define H2C_CL_MRC 0x18 4304 enum rtw89_mrc_h2c_func { 4305 H2C_FUNC_MRC_REQ_TSF = 0x0, 4306 H2C_FUNC_ADD_MRC = 0x1, 4307 H2C_FUNC_START_MRC = 0x2, 4308 H2C_FUNC_DEL_MRC = 0x3, 4309 H2C_FUNC_MRC_SYNC = 0x4, 4310 H2C_FUNC_MRC_UPD_DURATION = 0x5, 4311 H2C_FUNC_MRC_UPD_BITMAP = 0x6, 4312 4313 NUM_OF_RTW89_MRC_H2C_FUNC, 4314 }; 4315 4316 /* can consider MRC's sch_idx as MCC's group */ 4317 #define RTW89_MRC_WAIT_COND(sch_idx, func) \ 4318 ((sch_idx) * NUM_OF_RTW89_MRC_H2C_FUNC + (func)) 4319 4320 #define RTW89_MRC_WAIT_COND_REQ_TSF \ 4321 RTW89_MRC_WAIT_COND(0 /* don't care */, H2C_FUNC_MRC_REQ_TSF) 4322 4323 /* CLASS 36 - AP */ 4324 #define H2C_CL_AP 0x24 4325 #define H2C_FUNC_AP_INFO 0x0 4326 4327 #define H2C_CAT_OUTSRC 0x2 4328 4329 #define H2C_CL_OUTSRC_RA 0x1 4330 #define H2C_FUNC_OUTSRC_RA_MACIDCFG 0x0 4331 4332 #define H2C_CL_OUTSRC_DM 0x2 4333 #define H2C_FUNC_FW_LPS_CH_INFO 0xb 4334 #define H2C_FUNC_FW_LPS_ML_CMN_INFO 0xe 4335 4336 #define H2C_CL_OUTSRC_RF_REG_A 0x8 4337 #define H2C_CL_OUTSRC_RF_REG_B 0x9 4338 #define H2C_CL_OUTSRC_RF_FW_NOTIFY 0xa 4339 #define H2C_FUNC_OUTSRC_RF_GET_MCCCH 0x2 4340 #define H2C_CL_OUTSRC_RF_FW_RFK 0xb 4341 4342 enum rtw89_rfk_offload_h2c_func { 4343 H2C_FUNC_RFK_TSSI_OFFLOAD = 0x0, 4344 H2C_FUNC_RFK_IQK_OFFLOAD = 0x1, 4345 H2C_FUNC_RFK_DPK_OFFLOAD = 0x3, 4346 H2C_FUNC_RFK_TXGAPK_OFFLOAD = 0x4, 4347 H2C_FUNC_RFK_DACK_OFFLOAD = 0x5, 4348 H2C_FUNC_RFK_RXDCK_OFFLOAD = 0x6, 4349 H2C_FUNC_RFK_PRE_NOTIFY = 0x8, 4350 }; 4351 4352 struct rtw89_fw_h2c_rf_get_mccch { 4353 __le32 ch_0; 4354 __le32 ch_1; 4355 __le32 band_0; 4356 __le32 band_1; 4357 __le32 current_channel; 4358 __le32 current_band_type; 4359 } __packed; 4360 4361 #define NUM_OF_RTW89_FW_RFK_PATH 2 4362 #define NUM_OF_RTW89_FW_RFK_TBL 3 4363 4364 struct rtw89_fw_h2c_rfk_pre_info_common { 4365 struct { 4366 __le32 ch[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL]; 4367 __le32 band[NUM_OF_RTW89_FW_RFK_PATH][NUM_OF_RTW89_FW_RFK_TBL]; 4368 } __packed dbcc; 4369 4370 __le32 mlo_mode; 4371 struct { 4372 __le32 cur_ch[NUM_OF_RTW89_FW_RFK_PATH]; 4373 __le32 cur_band[NUM_OF_RTW89_FW_RFK_PATH]; 4374 } __packed tbl; 4375 4376 __le32 phy_idx; 4377 } __packed; 4378 4379 struct rtw89_fw_h2c_rfk_pre_info_v0 { 4380 struct rtw89_fw_h2c_rfk_pre_info_common common; 4381 4382 __le32 cur_band; 4383 __le32 cur_bw; 4384 __le32 cur_center_ch; 4385 4386 __le32 ktbl_sel0; 4387 __le32 ktbl_sel1; 4388 __le32 rfmod0; 4389 __le32 rfmod1; 4390 4391 __le32 mlo_1_1; 4392 __le32 rfe_type; 4393 __le32 drv_mode; 4394 4395 struct { 4396 __le32 ch[NUM_OF_RTW89_FW_RFK_PATH]; 4397 __le32 band[NUM_OF_RTW89_FW_RFK_PATH]; 4398 } __packed mlo; 4399 } __packed; 4400 4401 struct rtw89_fw_h2c_rfk_pre_info_v1 { 4402 struct rtw89_fw_h2c_rfk_pre_info_common common; 4403 __le32 mlo_1_1; 4404 } __packed; 4405 4406 struct rtw89_fw_h2c_rfk_pre_info { 4407 struct rtw89_fw_h2c_rfk_pre_info_v1 base_v1; 4408 __le32 cur_bandwidth[NUM_OF_RTW89_FW_RFK_PATH]; 4409 } __packed; 4410 4411 struct rtw89_h2c_rf_tssi { 4412 __le16 len; 4413 u8 phy; 4414 u8 ch; 4415 u8 bw; 4416 u8 band; 4417 u8 hwtx_en; 4418 u8 cv; 4419 s8 curr_tssi_cck_de[2]; 4420 s8 curr_tssi_cck_de_20m[2]; 4421 s8 curr_tssi_cck_de_40m[2]; 4422 s8 curr_tssi_efuse_cck_de[2]; 4423 s8 curr_tssi_ofdm_de[2]; 4424 s8 curr_tssi_ofdm_de_20m[2]; 4425 s8 curr_tssi_ofdm_de_40m[2]; 4426 s8 curr_tssi_ofdm_de_80m[2]; 4427 s8 curr_tssi_ofdm_de_160m[2]; 4428 s8 curr_tssi_ofdm_de_320m[2]; 4429 s8 curr_tssi_efuse_ofdm_de[2]; 4430 s8 curr_tssi_ofdm_de_diff_20m[2]; 4431 s8 curr_tssi_ofdm_de_diff_80m[2]; 4432 s8 curr_tssi_ofdm_de_diff_160m[2]; 4433 s8 curr_tssi_ofdm_de_diff_320m[2]; 4434 s8 curr_tssi_trim_de[2]; 4435 u8 pg_thermal[2]; 4436 u8 ftable[2][128]; 4437 u8 tssi_mode; 4438 } __packed; 4439 4440 struct rtw89_h2c_rf_iqk { 4441 __le32 phy_idx; 4442 __le32 dbcc; 4443 } __packed; 4444 4445 struct rtw89_h2c_rf_dpk { 4446 u8 len; 4447 u8 phy; 4448 u8 dpk_enable; 4449 u8 kpath; 4450 u8 cur_band; 4451 u8 cur_bw; 4452 u8 cur_ch; 4453 u8 dpk_dbg_en; 4454 } __packed; 4455 4456 struct rtw89_h2c_rf_txgapk { 4457 u8 len; 4458 u8 ktype; 4459 u8 phy; 4460 u8 kpath; 4461 u8 band; 4462 u8 bw; 4463 u8 ch; 4464 u8 cv; 4465 } __packed; 4466 4467 struct rtw89_h2c_rf_dack { 4468 __le32 len; 4469 __le32 phy; 4470 __le32 type; 4471 } __packed; 4472 4473 struct rtw89_h2c_rf_rxdck_v0 { 4474 u8 len; 4475 u8 phy; 4476 u8 is_afe; 4477 u8 kpath; 4478 u8 cur_band; 4479 u8 cur_bw; 4480 u8 cur_ch; 4481 u8 rxdck_dbg_en; 4482 } __packed; 4483 4484 struct rtw89_h2c_rf_rxdck { 4485 struct rtw89_h2c_rf_rxdck_v0 v0; 4486 u8 is_chl_k; 4487 } __packed; 4488 4489 enum rtw89_rf_log_type { 4490 RTW89_RF_RUN_LOG = 0, 4491 RTW89_RF_RPT_LOG = 1, 4492 }; 4493 4494 struct rtw89_c2h_rf_log_hdr { 4495 u8 type; /* enum rtw89_rf_log_type */ 4496 __le16 len; 4497 u8 content[]; 4498 } __packed; 4499 4500 struct rtw89_c2h_rf_run_log { 4501 __le32 fmt_idx; 4502 __le32 arg[4]; 4503 } __packed; 4504 4505 struct rtw89_c2h_rf_iqk_rpt_log { 4506 bool iqk_tx_fail[2]; 4507 bool iqk_rx_fail[2]; 4508 bool is_iqk_init; 4509 bool is_reload; 4510 bool is_wb_txiqk[2]; 4511 bool is_wb_rxiqk[2]; 4512 bool is_nbiqk; 4513 bool txiqk_en; 4514 bool rxiqk_en; 4515 bool lok_en; 4516 bool iqk_xym_en; 4517 bool iqk_sram_en; 4518 bool iqk_fft_en; 4519 bool is_fw_iqk; 4520 bool is_iqk_enable; 4521 bool iqk_cfir_en; 4522 bool thermal_rek_en; 4523 u8 iqk_band[2]; 4524 u8 iqk_ch[2]; 4525 u8 iqk_bw[2]; 4526 u8 iqk_times; 4527 u8 version; 4528 u8 phy; 4529 u8 fwk_status; 4530 u8 rsvd; 4531 __le32 reload_cnt; 4532 __le32 iqk_fail_cnt; 4533 __le32 lok_idac[2]; 4534 __le32 lok_vbuf[2]; 4535 __le32 rftxgain[2][4]; 4536 __le32 rfrxgain[2][4]; 4537 __le32 tx_xym[2][4]; 4538 __le32 rx_xym[2][4]; 4539 } __packed; 4540 4541 struct rtw89_c2h_rf_dpk_rpt_log { 4542 u8 ver; 4543 u8 idx[2]; 4544 u8 band[2]; 4545 u8 bw[2]; 4546 u8 ch[2]; 4547 u8 path_ok[2]; 4548 u8 txagc[2]; 4549 u8 ther[2]; 4550 u8 gs[2]; 4551 u8 dc_i[4]; 4552 u8 dc_q[4]; 4553 u8 corr_val[2]; 4554 u8 corr_idx[2]; 4555 u8 is_timeout[2]; 4556 u8 rxbb_ov[2]; 4557 u8 rsvd; 4558 } __packed; 4559 4560 struct rtw89_c2h_rf_dack_rpt_log { 4561 u8 fwdack_ver; 4562 u8 fwdack_info_ver; 4563 u8 msbk_d[2][2][16]; 4564 u8 dadck_d[2][2]; 4565 u8 cdack_d[2][2][2]; 4566 u8 addck2_hd[2][2][2]; 4567 u8 addck2_ld[2][2][2]; 4568 u8 adgaink_d[2][2]; 4569 u8 biask_hd[2][2]; 4570 u8 biask_ld[2][2]; 4571 u8 addck_timeout; 4572 u8 cdack_timeout; 4573 u8 dadck_timeout; 4574 u8 msbk_timeout; 4575 u8 adgaink_timeout; 4576 u8 wbadcdck_timeout; 4577 u8 drck_timeout; 4578 u8 dack_fail; 4579 u8 wbdck_d[2]; 4580 u8 rck_d; 4581 } __packed; 4582 4583 struct rtw89_c2h_rf_rxdck_rpt_log { 4584 u8 ver; 4585 u8 band[2]; 4586 u8 bw[2]; 4587 u8 ch[2]; 4588 u8 timeout[2]; 4589 } __packed; 4590 4591 struct rtw89_c2h_rf_tssi_rpt_log { 4592 s8 alignment_power[2][2][4]; 4593 u8 alignment_power_cw_h[2][2][4]; 4594 u8 alignment_power_cw_l[2][2][4]; 4595 u8 tssi_alimk_state[2][2]; 4596 u8 default_txagc_offset[2][2]; 4597 } __packed; 4598 4599 struct rtw89_c2h_rf_txgapk_rpt_log { 4600 __le32 r0x8010[2]; 4601 __le32 chk_cnt; 4602 u8 track_d[2][17]; 4603 u8 power_d[2][17]; 4604 u8 is_txgapk_ok; 4605 u8 chk_id; 4606 u8 ver; 4607 u8 rsv1; 4608 } __packed; 4609 4610 struct rtw89_c2h_rfk_report { 4611 struct rtw89_c2h_hdr hdr; 4612 u8 state; /* enum rtw89_rfk_report_state */ 4613 u8 version; 4614 } __packed; 4615 4616 struct rtw89_c2h_rf_tas_info { 4617 struct rtw89_c2h_hdr hdr; 4618 __le32 cur_idx; 4619 __le16 txpwr_history[20]; 4620 } __packed; 4621 4622 #define RTW89_FW_RSVD_PLE_SIZE 0x800 4623 4624 #define RTW89_FW_BACKTRACE_INFO_SIZE 8 4625 #define RTW89_VALID_FW_BACKTRACE_SIZE(_size) \ 4626 ((_size) % RTW89_FW_BACKTRACE_INFO_SIZE == 0) 4627 4628 #define RTW89_FW_BACKTRACE_MAX_SIZE 512 /* 8 * 64 (entries) */ 4629 #define RTW89_FW_BACKTRACE_KEY 0xBACEBACE 4630 4631 #define FWDL_WAIT_CNT 400000 4632 4633 int rtw89_fw_check_rdy(struct rtw89_dev *rtwdev, enum rtw89_fwdl_check_type type); 4634 int rtw89_fw_recognize(struct rtw89_dev *rtwdev); 4635 int rtw89_fw_recognize_elements(struct rtw89_dev *rtwdev); 4636 const struct firmware * 4637 rtw89_early_fw_feature_recognize(struct device *device, 4638 const struct rtw89_chip_info *chip, 4639 struct rtw89_fw_info *early_fw, 4640 int *used_fw_format); 4641 int rtw89_fw_download(struct rtw89_dev *rtwdev, enum rtw89_fw_type type, 4642 bool include_bb); 4643 void rtw89_load_firmware_work(struct work_struct *work); 4644 void rtw89_unload_firmware(struct rtw89_dev *rtwdev); 4645 int rtw89_wait_firmware_completion(struct rtw89_dev *rtwdev); 4646 int rtw89_fw_log_prepare(struct rtw89_dev *rtwdev); 4647 void rtw89_fw_log_dump(struct rtw89_dev *rtwdev, u8 *buf, u32 len); 4648 void rtw89_h2c_pkt_set_hdr(struct rtw89_dev *rtwdev, struct sk_buff *skb, 4649 u8 type, u8 cat, u8 class, u8 func, 4650 bool rack, bool dack, u32 len); 4651 int rtw89_fw_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev, 4652 struct rtw89_vif_link *rtwvif_link, 4653 struct rtw89_sta_link *rtwsta_link); 4654 int rtw89_fw_h2c_default_cmac_tbl_g7(struct rtw89_dev *rtwdev, 4655 struct rtw89_vif_link *rtwvif_link, 4656 struct rtw89_sta_link *rtwsta_link); 4657 int rtw89_fw_h2c_default_dmac_tbl_v2(struct rtw89_dev *rtwdev, 4658 struct rtw89_vif_link *rtwvif_link, 4659 struct rtw89_sta_link *rtwsta_link); 4660 int rtw89_fw_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev, 4661 struct rtw89_vif_link *rtwvif_link, 4662 struct rtw89_sta_link *rtwsta_link); 4663 int rtw89_fw_h2c_assoc_cmac_tbl_g7(struct rtw89_dev *rtwdev, 4664 struct rtw89_vif_link *rtwvif_link, 4665 struct rtw89_sta_link *rtwsta_link); 4666 int rtw89_fw_h2c_ampdu_cmac_tbl_g7(struct rtw89_dev *rtwdev, 4667 struct rtw89_vif_link *rtwvif_link, 4668 struct rtw89_sta_link *rtwsta_link); 4669 int rtw89_fw_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev, 4670 struct rtw89_sta_link *rtwsta_link); 4671 int rtw89_fw_h2c_txtime_cmac_tbl_g7(struct rtw89_dev *rtwdev, 4672 struct rtw89_sta_link *rtwsta_link); 4673 int rtw89_fw_h2c_txpath_cmac_tbl(struct rtw89_dev *rtwdev, 4674 struct rtw89_sta_link *rtwsta_link); 4675 int rtw89_fw_h2c_update_beacon(struct rtw89_dev *rtwdev, 4676 struct rtw89_vif_link *rtwvif_link); 4677 int rtw89_fw_h2c_update_beacon_be(struct rtw89_dev *rtwdev, 4678 struct rtw89_vif_link *rtwvif_link); 4679 int rtw89_fw_h2c_cam(struct rtw89_dev *rtwdev, struct rtw89_vif_link *vif, 4680 struct rtw89_sta_link *rtwsta_link, const u8 *scan_mac_addr); 4681 int rtw89_fw_h2c_dctl_sec_cam_v1(struct rtw89_dev *rtwdev, 4682 struct rtw89_vif_link *rtwvif_link, 4683 struct rtw89_sta_link *rtwsta_link); 4684 int rtw89_fw_h2c_dctl_sec_cam_v2(struct rtw89_dev *rtwdev, 4685 struct rtw89_vif_link *rtwvif_link, 4686 struct rtw89_sta_link *rtwsta_link); 4687 void rtw89_fw_c2h_irqsafe(struct rtw89_dev *rtwdev, struct sk_buff *c2h); 4688 void rtw89_fw_c2h_work(struct wiphy *wiphy, struct wiphy_work *work); 4689 int rtw89_fw_h2c_role_maintain(struct rtw89_dev *rtwdev, 4690 struct rtw89_vif_link *rtwvif_link, 4691 struct rtw89_sta_link *rtwsta_link, 4692 enum rtw89_upd_mode upd_mode); 4693 int rtw89_fw_h2c_join_info(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4694 struct rtw89_sta_link *rtwsta_link, bool dis_conn); 4695 int rtw89_fw_h2c_notify_dbcc(struct rtw89_dev *rtwdev, bool en); 4696 int rtw89_fw_h2c_macid_pause(struct rtw89_dev *rtwdev, u8 sh, u8 grp, 4697 bool pause); 4698 int rtw89_fw_h2c_set_edca(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4699 u8 ac, u32 val); 4700 int rtw89_fw_h2c_set_ofld_cfg(struct rtw89_dev *rtwdev); 4701 int rtw89_fw_h2c_tx_duty(struct rtw89_dev *rtwdev, u8 lv); 4702 int rtw89_fw_h2c_set_bcn_fltr_cfg(struct rtw89_dev *rtwdev, 4703 struct rtw89_vif_link *rtwvif_link, 4704 bool connect); 4705 int rtw89_fw_h2c_rssi_offload(struct rtw89_dev *rtwdev, 4706 struct rtw89_rx_phy_ppdu *phy_ppdu); 4707 int rtw89_fw_h2c_tp_offload(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link); 4708 int rtw89_fw_h2c_ra(struct rtw89_dev *rtwdev, struct rtw89_ra_info *ra, bool csi); 4709 int rtw89_fw_h2c_cxdrv_init(struct rtw89_dev *rtwdev, u8 type); 4710 int rtw89_fw_h2c_cxdrv_init_v7(struct rtw89_dev *rtwdev, u8 type); 4711 int rtw89_fw_h2c_cxdrv_role(struct rtw89_dev *rtwdev, u8 type); 4712 int rtw89_fw_h2c_cxdrv_role_v1(struct rtw89_dev *rtwdev, u8 type); 4713 int rtw89_fw_h2c_cxdrv_role_v2(struct rtw89_dev *rtwdev, u8 type); 4714 int rtw89_fw_h2c_cxdrv_role_v7(struct rtw89_dev *rtwdev, u8 type); 4715 int rtw89_fw_h2c_cxdrv_role_v8(struct rtw89_dev *rtwdev, u8 type); 4716 int rtw89_fw_h2c_cxdrv_ctrl(struct rtw89_dev *rtwdev, u8 type); 4717 int rtw89_fw_h2c_cxdrv_ctrl_v7(struct rtw89_dev *rtwdev, u8 type); 4718 int rtw89_fw_h2c_cxdrv_trx(struct rtw89_dev *rtwdev, u8 type); 4719 int rtw89_fw_h2c_cxdrv_rfk(struct rtw89_dev *rtwdev, u8 type); 4720 int rtw89_fw_h2c_del_pkt_offload(struct rtw89_dev *rtwdev, u8 id); 4721 int rtw89_fw_h2c_add_pkt_offload(struct rtw89_dev *rtwdev, u8 *id, 4722 struct sk_buff *skb_ofld); 4723 int rtw89_fw_h2c_scan_offload_ax(struct rtw89_dev *rtwdev, 4724 struct rtw89_scan_option *opt, 4725 struct rtw89_vif_link *vif, 4726 bool wowlan); 4727 int rtw89_fw_h2c_scan_offload_be(struct rtw89_dev *rtwdev, 4728 struct rtw89_scan_option *opt, 4729 struct rtw89_vif_link *vif, 4730 bool wowlan); 4731 int rtw89_fw_h2c_rf_reg(struct rtw89_dev *rtwdev, 4732 struct rtw89_fw_h2c_rf_reg_info *info, 4733 u16 len, u8 page); 4734 int rtw89_fw_h2c_rf_ntfy_mcc(struct rtw89_dev *rtwdev); 4735 int rtw89_fw_h2c_rf_pre_ntfy(struct rtw89_dev *rtwdev, 4736 enum rtw89_phy_idx phy_idx); 4737 int rtw89_fw_h2c_rf_tssi(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 4738 const struct rtw89_chan *chan, enum rtw89_tssi_mode tssi_mode); 4739 int rtw89_fw_h2c_rf_iqk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 4740 const struct rtw89_chan *chan); 4741 int rtw89_fw_h2c_rf_dpk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 4742 const struct rtw89_chan *chan); 4743 int rtw89_fw_h2c_rf_txgapk(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 4744 const struct rtw89_chan *chan); 4745 int rtw89_fw_h2c_rf_dack(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 4746 const struct rtw89_chan *chan); 4747 int rtw89_fw_h2c_rf_rxdck(struct rtw89_dev *rtwdev, enum rtw89_phy_idx phy_idx, 4748 const struct rtw89_chan *chan, bool is_chl_k); 4749 int rtw89_fw_h2c_raw_with_hdr(struct rtw89_dev *rtwdev, 4750 u8 h2c_class, u8 h2c_func, u8 *buf, u16 len, 4751 bool rack, bool dack); 4752 int rtw89_fw_h2c_raw(struct rtw89_dev *rtwdev, const u8 *buf, u16 len); 4753 void rtw89_fw_send_all_early_h2c(struct rtw89_dev *rtwdev); 4754 void __rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev); 4755 void rtw89_fw_free_all_early_h2c(struct rtw89_dev *rtwdev); 4756 int rtw89_fw_h2c_general_pkt(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4757 u8 macid); 4758 void rtw89_fw_release_general_pkt_list_vif(struct rtw89_dev *rtwdev, 4759 struct rtw89_vif_link *rtwvif_link, 4760 bool notify_fw); 4761 void rtw89_fw_release_general_pkt_list(struct rtw89_dev *rtwdev, bool notify_fw); 4762 int rtw89_fw_h2c_ba_cam(struct rtw89_dev *rtwdev, 4763 struct rtw89_vif_link *rtwvif_link, 4764 struct rtw89_sta_link *rtwsta_link, 4765 bool valid, struct ieee80211_ampdu_params *params); 4766 int rtw89_fw_h2c_ba_cam_v1(struct rtw89_dev *rtwdev, 4767 struct rtw89_vif_link *rtwvif_link, 4768 struct rtw89_sta_link *rtwsta_link, 4769 bool valid, struct ieee80211_ampdu_params *params); 4770 void rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(struct rtw89_dev *rtwdev); 4771 int rtw89_fw_h2c_init_ba_cam_users(struct rtw89_dev *rtwdev, u8 users, 4772 u8 offset, u8 mac_idx); 4773 4774 int rtw89_fw_h2c_lps_parm(struct rtw89_dev *rtwdev, 4775 struct rtw89_lps_parm *lps_param); 4776 int rtw89_fw_h2c_lps_ch_info(struct rtw89_dev *rtwdev, struct rtw89_vif *rtwvif); 4777 int rtw89_fw_h2c_lps_ml_cmn_info(struct rtw89_dev *rtwdev, 4778 struct rtw89_vif *rtwvif); 4779 int rtw89_fw_h2c_fwips(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4780 bool enable); 4781 struct sk_buff *rtw89_fw_h2c_alloc_skb_with_hdr(struct rtw89_dev *rtwdev, u32 len); 4782 struct sk_buff *rtw89_fw_h2c_alloc_skb_no_hdr(struct rtw89_dev *rtwdev, u32 len); 4783 int rtw89_fw_msg_reg(struct rtw89_dev *rtwdev, 4784 struct rtw89_mac_h2c_info *h2c_info, 4785 struct rtw89_mac_c2h_info *c2h_info); 4786 int rtw89_fw_h2c_fw_log(struct rtw89_dev *rtwdev, bool enable); 4787 void rtw89_fw_st_dbg_dump(struct rtw89_dev *rtwdev); 4788 int rtw89_hw_scan_start(struct rtw89_dev *rtwdev, 4789 struct rtw89_vif_link *rtwvif_link, 4790 struct ieee80211_scan_request *scan_req); 4791 void rtw89_hw_scan_complete(struct rtw89_dev *rtwdev, 4792 struct rtw89_vif_link *rtwvif_link, 4793 bool aborted); 4794 int rtw89_hw_scan_offload(struct rtw89_dev *rtwdev, 4795 struct rtw89_vif_link *rtwvif_link, 4796 bool enable); 4797 void rtw89_hw_scan_abort(struct rtw89_dev *rtwdev, 4798 struct rtw89_vif_link *rtwvif_link); 4799 int rtw89_hw_scan_prep_chan_list_ax(struct rtw89_dev *rtwdev, 4800 struct rtw89_vif_link *rtwvif_link); 4801 void rtw89_hw_scan_free_chan_list_ax(struct rtw89_dev *rtwdev); 4802 int rtw89_hw_scan_add_chan_list_ax(struct rtw89_dev *rtwdev, 4803 struct rtw89_vif_link *rtwvif_link); 4804 int rtw89_pno_scan_add_chan_list_ax(struct rtw89_dev *rtwdev, 4805 struct rtw89_vif_link *rtwvif_link); 4806 int rtw89_hw_scan_prep_chan_list_be(struct rtw89_dev *rtwdev, 4807 struct rtw89_vif_link *rtwvif_link); 4808 void rtw89_hw_scan_free_chan_list_be(struct rtw89_dev *rtwdev); 4809 int rtw89_hw_scan_add_chan_list_be(struct rtw89_dev *rtwdev, 4810 struct rtw89_vif_link *rtwvif_link); 4811 int rtw89_pno_scan_add_chan_list_be(struct rtw89_dev *rtwdev, 4812 struct rtw89_vif_link *rtwvif_link); 4813 int rtw89_fw_h2c_trigger_cpu_exception(struct rtw89_dev *rtwdev); 4814 int rtw89_fw_h2c_pkt_drop(struct rtw89_dev *rtwdev, 4815 const struct rtw89_pkt_drop_params *params); 4816 int rtw89_fw_h2c_p2p_act(struct rtw89_dev *rtwdev, 4817 struct rtw89_vif_link *rtwvif_link, 4818 struct ieee80211_bss_conf *bss_conf, 4819 struct ieee80211_p2p_noa_desc *desc, 4820 u8 act, u8 noa_id); 4821 int rtw89_fw_h2c_tsf32_toggle(struct rtw89_dev *rtwdev, 4822 struct rtw89_vif_link *rtwvif_link, 4823 bool en); 4824 int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4825 bool enable); 4826 int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev, 4827 struct rtw89_vif_link *rtwvif_link, bool enable); 4828 int rtw89_fw_h2c_cfg_pno(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4829 bool enable); 4830 int rtw89_fw_h2c_keep_alive(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4831 bool enable); 4832 int rtw89_fw_h2c_arp_offload(struct rtw89_dev *rtwdev, 4833 struct rtw89_vif_link *rtwvif_link, bool enable); 4834 int rtw89_fw_h2c_disconnect_detect(struct rtw89_dev *rtwdev, 4835 struct rtw89_vif_link *rtwvif_link, bool enable); 4836 int rtw89_fw_h2c_wow_global(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4837 bool enable); 4838 int rtw89_fw_h2c_wow_wakeup_ctrl(struct rtw89_dev *rtwdev, 4839 struct rtw89_vif_link *rtwvif_link, bool enable); 4840 int rtw89_fw_wow_cam_update(struct rtw89_dev *rtwdev, 4841 struct rtw89_wow_cam_info *cam_info); 4842 int rtw89_fw_h2c_wow_gtk_ofld(struct rtw89_dev *rtwdev, 4843 struct rtw89_vif_link *rtwvif_link, 4844 bool enable); 4845 int rtw89_fw_h2c_wow_request_aoac(struct rtw89_dev *rtwdev); 4846 int rtw89_fw_h2c_add_mcc(struct rtw89_dev *rtwdev, 4847 const struct rtw89_fw_mcc_add_req *p); 4848 int rtw89_fw_h2c_start_mcc(struct rtw89_dev *rtwdev, 4849 const struct rtw89_fw_mcc_start_req *p); 4850 int rtw89_fw_h2c_stop_mcc(struct rtw89_dev *rtwdev, u8 group, u8 macid, 4851 bool prev_groups); 4852 int rtw89_fw_h2c_del_mcc_group(struct rtw89_dev *rtwdev, u8 group, 4853 bool prev_groups); 4854 int rtw89_fw_h2c_reset_mcc_group(struct rtw89_dev *rtwdev, u8 group); 4855 int rtw89_fw_h2c_mcc_req_tsf(struct rtw89_dev *rtwdev, 4856 const struct rtw89_fw_mcc_tsf_req *req, 4857 struct rtw89_mac_mcc_tsf_rpt *rpt); 4858 int rtw89_fw_h2c_mcc_macid_bitmap(struct rtw89_dev *rtwdev, u8 group, u8 macid, 4859 u8 *bitmap); 4860 int rtw89_fw_h2c_mcc_sync(struct rtw89_dev *rtwdev, u8 group, u8 source, 4861 u8 target, u8 offset); 4862 int rtw89_fw_h2c_mcc_set_duration(struct rtw89_dev *rtwdev, 4863 const struct rtw89_fw_mcc_duration *p); 4864 int rtw89_fw_h2c_mrc_add(struct rtw89_dev *rtwdev, 4865 const struct rtw89_fw_mrc_add_arg *arg); 4866 int rtw89_fw_h2c_mrc_start(struct rtw89_dev *rtwdev, 4867 const struct rtw89_fw_mrc_start_arg *arg); 4868 int rtw89_fw_h2c_mrc_del(struct rtw89_dev *rtwdev, u8 sch_idx, u8 slot_idx); 4869 int rtw89_fw_h2c_mrc_req_tsf(struct rtw89_dev *rtwdev, 4870 const struct rtw89_fw_mrc_req_tsf_arg *arg, 4871 struct rtw89_mac_mrc_tsf_rpt *rpt); 4872 int rtw89_fw_h2c_mrc_upd_bitmap(struct rtw89_dev *rtwdev, 4873 const struct rtw89_fw_mrc_upd_bitmap_arg *arg); 4874 int rtw89_fw_h2c_mrc_sync(struct rtw89_dev *rtwdev, 4875 const struct rtw89_fw_mrc_sync_arg *arg); 4876 int rtw89_fw_h2c_mrc_upd_duration(struct rtw89_dev *rtwdev, 4877 const struct rtw89_fw_mrc_upd_duration_arg *arg); 4878 int rtw89_fw_h2c_ap_info_refcount(struct rtw89_dev *rtwdev, bool en); 4879 int rtw89_fw_h2c_mlo_link_cfg(struct rtw89_dev *rtwdev, struct rtw89_vif_link *rtwvif_link, 4880 bool enable); 4881 4882 static inline void rtw89_fw_h2c_init_ba_cam(struct rtw89_dev *rtwdev) 4883 { 4884 const struct rtw89_chip_info *chip = rtwdev->chip; 4885 4886 if (chip->bacam_ver == RTW89_BACAM_V0_EXT) 4887 rtw89_fw_h2c_init_dynamic_ba_cam_v0_ext(rtwdev); 4888 } 4889 4890 static inline int rtw89_chip_h2c_default_cmac_tbl(struct rtw89_dev *rtwdev, 4891 struct rtw89_vif_link *rtwvif_link, 4892 struct rtw89_sta_link *rtwsta_link) 4893 { 4894 const struct rtw89_chip_info *chip = rtwdev->chip; 4895 4896 return chip->ops->h2c_default_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link); 4897 } 4898 4899 static inline int rtw89_chip_h2c_default_dmac_tbl(struct rtw89_dev *rtwdev, 4900 struct rtw89_vif_link *rtwvif_link, 4901 struct rtw89_sta_link *rtwsta_link) 4902 { 4903 const struct rtw89_chip_info *chip = rtwdev->chip; 4904 4905 if (chip->ops->h2c_default_dmac_tbl) 4906 return chip->ops->h2c_default_dmac_tbl(rtwdev, rtwvif_link, rtwsta_link); 4907 4908 return 0; 4909 } 4910 4911 static inline int rtw89_chip_h2c_update_beacon(struct rtw89_dev *rtwdev, 4912 struct rtw89_vif_link *rtwvif_link) 4913 { 4914 const struct rtw89_chip_info *chip = rtwdev->chip; 4915 4916 return chip->ops->h2c_update_beacon(rtwdev, rtwvif_link); 4917 } 4918 4919 static inline int rtw89_chip_h2c_assoc_cmac_tbl(struct rtw89_dev *rtwdev, 4920 struct rtw89_vif_link *rtwvif_link, 4921 struct rtw89_sta_link *rtwsta_link) 4922 { 4923 const struct rtw89_chip_info *chip = rtwdev->chip; 4924 4925 return chip->ops->h2c_assoc_cmac_tbl(rtwdev, rtwvif_link, rtwsta_link); 4926 } 4927 4928 static inline 4929 int rtw89_chip_h2c_ampdu_link_cmac_tbl(struct rtw89_dev *rtwdev, 4930 struct rtw89_vif_link *rtwvif_link, 4931 struct rtw89_sta_link *rtwsta_link) 4932 { 4933 const struct rtw89_chip_info *chip = rtwdev->chip; 4934 4935 if (chip->ops->h2c_ampdu_cmac_tbl) 4936 return chip->ops->h2c_ampdu_cmac_tbl(rtwdev, rtwvif_link, 4937 rtwsta_link); 4938 4939 return 0; 4940 } 4941 4942 static inline int rtw89_chip_h2c_ampdu_cmac_tbl(struct rtw89_dev *rtwdev, 4943 struct rtw89_vif *rtwvif, 4944 struct rtw89_sta *rtwsta) 4945 { 4946 struct rtw89_vif_link *rtwvif_link; 4947 struct rtw89_sta_link *rtwsta_link; 4948 unsigned int link_id; 4949 int ret; 4950 4951 rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) { 4952 rtwvif_link = rtwsta_link->rtwvif_link; 4953 ret = rtw89_chip_h2c_ampdu_link_cmac_tbl(rtwdev, rtwvif_link, 4954 rtwsta_link); 4955 if (ret) 4956 return ret; 4957 } 4958 4959 return 0; 4960 } 4961 4962 static inline 4963 int rtw89_chip_h2c_txtime_cmac_tbl(struct rtw89_dev *rtwdev, 4964 struct rtw89_sta_link *rtwsta_link) 4965 { 4966 const struct rtw89_chip_info *chip = rtwdev->chip; 4967 4968 return chip->ops->h2c_txtime_cmac_tbl(rtwdev, rtwsta_link); 4969 } 4970 4971 static inline 4972 int rtw89_chip_h2c_ba_cam(struct rtw89_dev *rtwdev, struct rtw89_sta *rtwsta, 4973 bool valid, struct ieee80211_ampdu_params *params) 4974 { 4975 const struct rtw89_chip_info *chip = rtwdev->chip; 4976 struct rtw89_vif_link *rtwvif_link; 4977 struct rtw89_sta_link *rtwsta_link; 4978 unsigned int link_id; 4979 int ret; 4980 4981 rtw89_sta_for_each_link(rtwsta, rtwsta_link, link_id) { 4982 rtwvif_link = rtwsta_link->rtwvif_link; 4983 ret = chip->ops->h2c_ba_cam(rtwdev, rtwvif_link, rtwsta_link, 4984 valid, params); 4985 if (ret) 4986 return ret; 4987 } 4988 4989 return 0; 4990 } 4991 4992 /* Must consider compatibility; don't insert new in the mid. 4993 * Fill each field's default value in rtw89_regd_entcpy(). 4994 */ 4995 struct rtw89_fw_regd_entry { 4996 u8 alpha2_0; 4997 u8 alpha2_1; 4998 u8 rule_2ghz; 4999 u8 rule_5ghz; 5000 u8 rule_6ghz; 5001 __le32 fmap; 5002 } __packed; 5003 5004 /* must consider compatibility; don't insert new in the mid */ 5005 struct rtw89_fw_txpwr_byrate_entry { 5006 u8 band; 5007 u8 nss; 5008 u8 rs; 5009 u8 shf; 5010 u8 len; 5011 __le32 data; 5012 u8 bw; 5013 u8 ofdma; 5014 } __packed; 5015 5016 /* must consider compatibility; don't insert new in the mid */ 5017 struct rtw89_fw_txpwr_lmt_2ghz_entry { 5018 u8 bw; 5019 u8 nt; 5020 u8 rs; 5021 u8 bf; 5022 u8 regd; 5023 u8 ch_idx; 5024 s8 v; 5025 } __packed; 5026 5027 /* must consider compatibility; don't insert new in the mid */ 5028 struct rtw89_fw_txpwr_lmt_5ghz_entry { 5029 u8 bw; 5030 u8 nt; 5031 u8 rs; 5032 u8 bf; 5033 u8 regd; 5034 u8 ch_idx; 5035 s8 v; 5036 } __packed; 5037 5038 /* must consider compatibility; don't insert new in the mid */ 5039 struct rtw89_fw_txpwr_lmt_6ghz_entry { 5040 u8 bw; 5041 u8 nt; 5042 u8 rs; 5043 u8 bf; 5044 u8 regd; 5045 u8 reg_6ghz_power; 5046 u8 ch_idx; 5047 s8 v; 5048 } __packed; 5049 5050 /* must consider compatibility; don't insert new in the mid */ 5051 struct rtw89_fw_txpwr_lmt_ru_2ghz_entry { 5052 u8 ru; 5053 u8 nt; 5054 u8 regd; 5055 u8 ch_idx; 5056 s8 v; 5057 } __packed; 5058 5059 /* must consider compatibility; don't insert new in the mid */ 5060 struct rtw89_fw_txpwr_lmt_ru_5ghz_entry { 5061 u8 ru; 5062 u8 nt; 5063 u8 regd; 5064 u8 ch_idx; 5065 s8 v; 5066 } __packed; 5067 5068 /* must consider compatibility; don't insert new in the mid */ 5069 struct rtw89_fw_txpwr_lmt_ru_6ghz_entry { 5070 u8 ru; 5071 u8 nt; 5072 u8 regd; 5073 u8 reg_6ghz_power; 5074 u8 ch_idx; 5075 s8 v; 5076 } __packed; 5077 5078 /* must consider compatibility; don't insert new in the mid */ 5079 struct rtw89_fw_tx_shape_lmt_entry { 5080 u8 band; 5081 u8 tx_shape_rs; 5082 u8 regd; 5083 u8 v; 5084 } __packed; 5085 5086 /* must consider compatibility; don't insert new in the mid */ 5087 struct rtw89_fw_tx_shape_lmt_ru_entry { 5088 u8 band; 5089 u8 regd; 5090 u8 v; 5091 } __packed; 5092 5093 const struct rtw89_rfe_parms * 5094 rtw89_load_rfe_data_from_fw(struct rtw89_dev *rtwdev, 5095 const struct rtw89_rfe_parms *init); 5096 5097 enum rtw89_wow_wakeup_ver { 5098 RTW89_WOW_REASON_V0, 5099 RTW89_WOW_REASON_V1, 5100 RTW89_WOW_REASON_NUM, 5101 }; 5102 5103 #endif 5104