1 /* SPDX-License-Identifier: ISC */ 2 /* Copyright (C) 2020 MediaTek Inc. */ 3 4 #ifndef __MT7915_MCU_H 5 #define __MT7915_MCU_H 6 7 #include "../mt76_connac_mcu.h" 8 9 enum { 10 MCU_ATE_SET_TRX = 0x1, 11 MCU_ATE_SET_FREQ_OFFSET = 0xa, 12 MCU_ATE_SET_SLOT_TIME = 0x13, 13 MCU_ATE_CLEAN_TXQUEUE = 0x1c, 14 }; 15 16 struct mt7915_mcu_thermal_ctrl { 17 u8 ctrl_id; 18 u8 band_idx; 19 union { 20 struct { 21 u8 protect_type; /* 1: duty admit, 2: radio off */ 22 u8 trigger_type; /* 0: low, 1: high */ 23 } __packed type; 24 struct { 25 u8 duty_level; /* level 0~3 */ 26 u8 duty_cycle; 27 } __packed duty; 28 }; 29 } __packed; 30 31 struct mt7915_mcu_thermal_notify { 32 struct mt76_connac2_mcu_rxd rxd; 33 34 struct mt7915_mcu_thermal_ctrl ctrl; 35 __le32 temperature; 36 u8 rsv[8]; 37 } __packed; 38 39 struct mt7915_mcu_csa_notify { 40 struct mt76_connac2_mcu_rxd rxd; 41 42 u8 omac_idx; 43 u8 csa_count; 44 u8 band_idx; 45 u8 rsv; 46 } __packed; 47 48 struct mt7915_mcu_bcc_notify { 49 struct mt76_connac2_mcu_rxd rxd; 50 51 u8 band_idx; 52 u8 omac_idx; 53 u8 cca_count; 54 u8 rsv; 55 } __packed; 56 57 struct mt7915_mcu_rdd_report { 58 struct mt76_connac2_mcu_rxd rxd; 59 60 u8 band_idx; 61 u8 long_detected; 62 u8 constant_prf_detected; 63 u8 staggered_prf_detected; 64 u8 radar_type_idx; 65 u8 periodic_pulse_num; 66 u8 long_pulse_num; 67 u8 hw_pulse_num; 68 69 u8 out_lpn; 70 u8 out_spn; 71 u8 out_crpn; 72 u8 out_crpw; 73 u8 out_crbn; 74 u8 out_stgpn; 75 u8 out_stgpw; 76 77 u8 rsv; 78 79 __le32 out_pri_const; 80 __le32 out_pri_stg[3]; 81 82 struct { 83 __le32 start; 84 __le16 pulse_width; 85 __le16 pulse_power; 86 u8 mdrdy_flag; 87 u8 rsv[3]; 88 } long_pulse[32]; 89 90 struct { 91 __le32 start; 92 __le16 pulse_width; 93 __le16 pulse_power; 94 u8 mdrdy_flag; 95 u8 rsv[3]; 96 } periodic_pulse[32]; 97 98 struct { 99 __le32 start; 100 __le16 pulse_width; 101 __le16 pulse_power; 102 u8 sc_pass; 103 u8 sw_reset; 104 u8 mdrdy_flag; 105 u8 tx_active; 106 } hw_pulse[32]; 107 } __packed; 108 109 struct mt7915_mcu_background_chain_ctrl { 110 u8 chan; /* primary channel */ 111 u8 central_chan; /* central channel */ 112 u8 bw; 113 u8 tx_stream; 114 u8 rx_stream; 115 116 u8 monitor_chan; /* monitor channel */ 117 u8 monitor_central_chan;/* monitor central channel */ 118 u8 monitor_bw; 119 u8 monitor_tx_stream; 120 u8 monitor_rx_stream; 121 122 u8 scan_mode; /* 0: ScanStop 123 * 1: ScanStart 124 * 2: ScanRunning 125 */ 126 u8 band_idx; /* DBDC */ 127 u8 monitor_scan_type; 128 u8 band; /* 0: 2.4GHz, 1: 5GHz */ 129 u8 rsv[2]; 130 } __packed; 131 132 struct mt7915_mcu_sr_ctrl { 133 u8 action; 134 u8 argnum; 135 u8 band_idx; 136 u8 status; 137 u8 drop_ta_idx; 138 u8 sta_idx; /* 256 sta */ 139 u8 rsv[2]; 140 __le32 val; 141 } __packed; 142 143 struct mt7915_mcu_eeprom { 144 u8 buffer_mode; 145 u8 format; 146 __le16 len; 147 } __packed; 148 149 struct mt7915_mcu_eeprom_info { 150 __le32 addr; 151 __le32 valid; 152 u8 data[16]; 153 } __packed; 154 155 struct mt7915_mcu_phy_rx_info { 156 u8 category; 157 u8 rate; 158 u8 mode; 159 u8 nsts; 160 u8 gi; 161 u8 coding; 162 u8 stbc; 163 u8 bw; 164 }; 165 166 struct mt7915_mcu_mib { 167 __le32 band; 168 __le32 offs; 169 __le64 data; 170 } __packed; 171 172 enum mt7915_chan_mib_offs { 173 /* mt7915 */ 174 MIB_TX_TIME = 81, 175 MIB_RX_TIME, 176 MIB_OBSS_AIRTIME = 86, 177 MIB_NON_WIFI_TIME, 178 MIB_TXOP_INIT_COUNT, 179 180 /* mt7916 */ 181 MIB_TX_TIME_V2 = 6, 182 MIB_RX_TIME_V2 = 8, 183 MIB_OBSS_AIRTIME_V2 = 490, 184 MIB_NON_WIFI_TIME_V2 185 }; 186 187 struct mt7915_mcu_txpower_sku { 188 u8 format_id; 189 u8 limit_type; 190 u8 band_idx; 191 s8 txpower_sku[MT7915_SKU_RATE_NUM]; 192 } __packed; 193 194 struct edca { 195 u8 queue; 196 u8 set; 197 u8 aifs; 198 u8 cw_min; 199 __le16 cw_max; 200 __le16 txop; 201 }; 202 203 struct mt7915_mcu_tx { 204 u8 total; 205 u8 action; 206 u8 valid; 207 u8 mode; 208 209 struct edca edca[IEEE80211_NUM_ACS]; 210 } __packed; 211 212 struct mt7915_mcu_muru_stats { 213 __le32 event_id; 214 struct { 215 __le32 cck_cnt; 216 __le32 ofdm_cnt; 217 __le32 htmix_cnt; 218 __le32 htgf_cnt; 219 __le32 vht_su_cnt; 220 __le32 vht_2mu_cnt; 221 __le32 vht_3mu_cnt; 222 __le32 vht_4mu_cnt; 223 __le32 he_su_cnt; 224 __le32 he_ext_su_cnt; 225 __le32 he_2ru_cnt; 226 __le32 he_2mu_cnt; 227 __le32 he_3ru_cnt; 228 __le32 he_3mu_cnt; 229 __le32 he_4ru_cnt; 230 __le32 he_4mu_cnt; 231 __le32 he_5to8ru_cnt; 232 __le32 he_9to16ru_cnt; 233 __le32 he_gtr16ru_cnt; 234 } dl; 235 236 struct { 237 __le32 hetrig_su_cnt; 238 __le32 hetrig_2ru_cnt; 239 __le32 hetrig_3ru_cnt; 240 __le32 hetrig_4ru_cnt; 241 __le32 hetrig_5to8ru_cnt; 242 __le32 hetrig_9to16ru_cnt; 243 __le32 hetrig_gtr16ru_cnt; 244 __le32 hetrig_2mu_cnt; 245 __le32 hetrig_3mu_cnt; 246 __le32 hetrig_4mu_cnt; 247 } ul; 248 }; 249 250 #define WMM_AIFS_SET BIT(0) 251 #define WMM_CW_MIN_SET BIT(1) 252 #define WMM_CW_MAX_SET BIT(2) 253 #define WMM_TXOP_SET BIT(3) 254 #define WMM_PARAM_SET GENMASK(3, 0) 255 256 enum { 257 MCU_FW_LOG_WM, 258 MCU_FW_LOG_WA, 259 MCU_FW_LOG_TO_HOST, 260 }; 261 262 enum { 263 MCU_TWT_AGRT_ADD, 264 MCU_TWT_AGRT_MODIFY, 265 MCU_TWT_AGRT_DELETE, 266 MCU_TWT_AGRT_TEARDOWN, 267 MCU_TWT_AGRT_GET_TSF, 268 }; 269 270 enum { 271 MCU_WA_PARAM_CMD_QUERY, 272 MCU_WA_PARAM_CMD_SET, 273 MCU_WA_PARAM_CMD_CAPABILITY, 274 MCU_WA_PARAM_CMD_DEBUG, 275 }; 276 277 enum { 278 MCU_WA_PARAM_PDMA_RX = 0x04, 279 MCU_WA_PARAM_CPU_UTIL = 0x0b, 280 MCU_WA_PARAM_RED = 0x0e, 281 MCU_WA_PARAM_RED_SETTING = 0x40, 282 }; 283 284 enum mcu_mmps_mode { 285 MCU_MMPS_STATIC, 286 MCU_MMPS_DYNAMIC, 287 MCU_MMPS_RSV, 288 MCU_MMPS_DISABLE, 289 }; 290 291 struct bss_info_bmc_rate { 292 __le16 tag; 293 __le16 len; 294 __le16 bc_trans; 295 __le16 mc_trans; 296 u8 short_preamble; 297 u8 rsv[7]; 298 } __packed; 299 300 struct bss_info_ra { 301 __le16 tag; 302 __le16 len; 303 u8 op_mode; 304 u8 adhoc_en; 305 u8 short_preamble; 306 u8 tx_streams; 307 u8 rx_streams; 308 u8 algo; 309 u8 force_sgi; 310 u8 force_gf; 311 u8 ht_mode; 312 u8 has_20_sta; /* Check if any sta support GF. */ 313 u8 bss_width_trigger_events; 314 u8 vht_nss_cap; 315 u8 vht_bw_signal; /* not use */ 316 u8 vht_force_sgi; /* not use */ 317 u8 se_off; 318 u8 antenna_idx; 319 u8 train_up_rule; 320 u8 rsv[3]; 321 unsigned short train_up_high_thres; 322 short train_up_rule_rssi; 323 unsigned short low_traffic_thres; 324 __le16 max_phyrate; 325 __le32 phy_cap; 326 __le32 interval; 327 __le32 fast_interval; 328 } __packed; 329 330 struct bss_info_hw_amsdu { 331 __le16 tag; 332 __le16 len; 333 __le32 cmp_bitmap_0; 334 __le32 cmp_bitmap_1; 335 __le16 trig_thres; 336 u8 enable; 337 u8 rsv; 338 } __packed; 339 340 struct bss_info_color { 341 __le16 tag; 342 __le16 len; 343 u8 disable; 344 u8 color; 345 u8 rsv[2]; 346 } __packed; 347 348 struct bss_info_he { 349 __le16 tag; 350 __le16 len; 351 u8 he_pe_duration; 352 u8 vht_op_info_present; 353 __le16 he_rts_thres; 354 __le16 max_nss_mcs[CMD_HE_MCS_BW_NUM]; 355 u8 rsv[6]; 356 } __packed; 357 358 struct bss_info_bcn { 359 __le16 tag; 360 __le16 len; 361 u8 ver; 362 u8 enable; 363 __le16 sub_ntlv; 364 } __packed __aligned(4); 365 366 struct bss_info_bcn_cntdwn { 367 __le16 tag; 368 __le16 len; 369 u8 cnt; 370 u8 rsv[3]; 371 } __packed __aligned(4); 372 373 struct bss_info_bcn_mbss { 374 #define MAX_BEACON_NUM 32 375 __le16 tag; 376 __le16 len; 377 __le32 bitmap; 378 __le16 offset[MAX_BEACON_NUM]; 379 u8 rsv[8]; 380 } __packed __aligned(4); 381 382 struct bss_info_bcn_cont { 383 __le16 tag; 384 __le16 len; 385 __le16 tim_ofs; 386 __le16 csa_ofs; 387 __le16 bcc_ofs; 388 __le16 pkt_len; 389 } __packed __aligned(4); 390 391 struct bss_info_inband_discovery { 392 __le16 tag; 393 __le16 len; 394 u8 tx_type; 395 u8 tx_mode; 396 u8 tx_interval; 397 u8 enable; 398 __le16 rsv; 399 __le16 prob_rsp_len; 400 } __packed __aligned(4); 401 402 enum { 403 BSS_INFO_BCN_CSA, 404 BSS_INFO_BCN_BCC, 405 BSS_INFO_BCN_MBSSID, 406 BSS_INFO_BCN_CONTENT, 407 BSS_INFO_BCN_DISCOV, 408 BSS_INFO_BCN_MAX 409 }; 410 411 enum { 412 RATE_PARAM_FIXED = 3, 413 RATE_PARAM_MMPS_UPDATE = 5, 414 RATE_PARAM_FIXED_HE_LTF = 7, 415 RATE_PARAM_FIXED_MCS, 416 RATE_PARAM_FIXED_GI = 11, 417 RATE_PARAM_AUTO = 20, 418 RATE_PARAM_SPE_UPDATE = 22, 419 }; 420 421 #define RATE_CFG_MCS GENMASK(3, 0) 422 #define RATE_CFG_NSS GENMASK(7, 4) 423 #define RATE_CFG_GI GENMASK(11, 8) 424 #define RATE_CFG_BW GENMASK(15, 12) 425 #define RATE_CFG_STBC GENMASK(19, 16) 426 #define RATE_CFG_LDPC GENMASK(23, 20) 427 #define RATE_CFG_PHY_TYPE GENMASK(27, 24) 428 #define RATE_CFG_HE_LTF GENMASK(31, 28) 429 430 enum { 431 TX_POWER_LIMIT_ENABLE, 432 TX_POWER_LIMIT_TABLE = 0x4, 433 TX_POWER_LIMIT_INFO = 0x7, 434 TX_POWER_LIMIT_FRAME = 0x11, 435 TX_POWER_LIMIT_FRAME_MIN = 0x12, 436 }; 437 438 enum { 439 SPR_ENABLE = 0x1, 440 SPR_ENABLE_SD = 0x3, 441 SPR_ENABLE_MODE = 0x5, 442 SPR_ENABLE_DPD = 0x23, 443 SPR_ENABLE_TX = 0x25, 444 SPR_SET_SRG_BITMAP = 0x80, 445 SPR_SET_PARAM = 0xc2, 446 SPR_SET_SIGA = 0xdc, 447 }; 448 449 enum { 450 THERMAL_PROTECT_PARAMETER_CTRL, 451 THERMAL_PROTECT_BASIC_INFO, 452 THERMAL_PROTECT_ENABLE, 453 THERMAL_PROTECT_DISABLE, 454 THERMAL_PROTECT_DUTY_CONFIG, 455 THERMAL_PROTECT_MECH_INFO, 456 THERMAL_PROTECT_DUTY_INFO, 457 THERMAL_PROTECT_STATE_ACT, 458 }; 459 460 enum { 461 MT_BF_SOUNDING_ON = 1, 462 MT_BF_TYPE_UPDATE = 20, 463 MT_BF_MODULE_UPDATE = 25 464 }; 465 466 enum { 467 MURU_SET_ARB_OP_MODE = 14, 468 MURU_SET_PLATFORM_TYPE = 25, 469 }; 470 471 enum { 472 MURU_PLATFORM_TYPE_PERF_LEVEL_1 = 1, 473 MURU_PLATFORM_TYPE_PERF_LEVEL_2, 474 }; 475 476 /* tx cmd tx statistics */ 477 enum { 478 MURU_SET_TXC_TX_STATS_EN = 150, 479 MURU_GET_TXC_TX_STATS = 151, 480 }; 481 482 enum { 483 SER_QUERY, 484 /* recovery */ 485 SER_SET_RECOVER_L1, 486 SER_SET_RECOVER_L2, 487 SER_SET_RECOVER_L3_RX_ABORT, 488 SER_SET_RECOVER_L3_TX_ABORT, 489 SER_SET_RECOVER_L3_TX_DISABLE, 490 SER_SET_RECOVER_L3_BF, 491 SER_SET_RECOVER_FULL, 492 SER_SET_SYSTEM_ASSERT, 493 /* action */ 494 SER_ENABLE = 2, 495 SER_RECOVER 496 }; 497 498 #define MT7915_MAX_BEACON_SIZE 512 499 #define MT7915_MAX_INBAND_FRAME_SIZE 256 500 #define MT7915_MAX_BSS_OFFLOAD_SIZE (MT7915_MAX_BEACON_SIZE + \ 501 MT7915_MAX_INBAND_FRAME_SIZE + \ 502 MT7915_BEACON_UPDATE_SIZE) 503 504 #define MT7915_BSS_UPDATE_MAX_SIZE (sizeof(struct sta_req_hdr) + \ 505 sizeof(struct bss_info_omac) + \ 506 sizeof(struct bss_info_basic) +\ 507 sizeof(struct bss_info_rf_ch) +\ 508 sizeof(struct bss_info_ra) + \ 509 sizeof(struct bss_info_hw_amsdu) +\ 510 sizeof(struct bss_info_he) + \ 511 sizeof(struct bss_info_bmc_rate) +\ 512 sizeof(struct bss_info_ext_bss)) 513 514 #define MT7915_BEACON_UPDATE_SIZE (sizeof(struct sta_req_hdr) + \ 515 sizeof(struct bss_info_bcn_cntdwn) + \ 516 sizeof(struct bss_info_bcn_mbss) + \ 517 sizeof(struct bss_info_bcn_cont) + \ 518 sizeof(struct bss_info_inband_discovery)) 519 520 static inline s8 521 mt7915_get_power_bound(struct mt7915_phy *phy, s8 txpower) 522 { 523 struct mt76_phy *mphy = phy->mt76; 524 int n_chains = hweight8(mphy->antenna_mask); 525 526 txpower = mt76_get_sar_power(mphy, mphy->chandef.chan, txpower * 2); 527 txpower -= mt76_tx_power_nss_delta(n_chains); 528 529 return txpower; 530 } 531 532 #endif 533