1 /*- 2 * SPDX-License-Identifier: BSD-2-Clause 3 * 4 * Copyright (c) 2015 Adrian Chadd <adrian@FreeBSD.org> 5 * Copyright (c) 2025 The FreeBSD Foundation 6 * 7 * Portions of this software were developed by Tom Jones <thj@FreeBSD.org> 8 * under sponsorship from the FreeBSD Foundation. 9 */ 10 11 #ifndef __IF_IWX_DEBUG_H__ 12 #define __IF_IWX_DEBUG_H__ 13 14 #ifdef IWX_DEBUG 15 enum { 16 IWX_DEBUG_XMIT = 0x00000001, /* basic xmit operation */ 17 IWX_DEBUG_RECV = 0x00000002, /* basic recv operation */ 18 IWX_DEBUG_STATE = 0x00000004, /* 802.11 state transitions */ 19 IWX_DEBUG_TXPOW = 0x00000008, /* tx power processing */ 20 IWX_DEBUG_RESET = 0x00000010, /* reset processing */ 21 IWX_DEBUG_OPS = 0x00000020, /* iwx_ops processing */ 22 IWX_DEBUG_BEACON = 0x00000040, /* beacon handling */ 23 IWX_DEBUG_WATCHDOG = 0x00000080, /* watchdog timeout */ 24 IWX_DEBUG_INTR = 0x00000100, /* ISR */ 25 IWX_DEBUG_CALIBRATE = 0x00000200, /* periodic calibration */ 26 IWX_DEBUG_NODE = 0x00000400, /* node management */ 27 IWX_DEBUG_LED = 0x00000800, /* led management */ 28 IWX_DEBUG_CMD = 0x00001000, /* cmd submission */ 29 IWX_DEBUG_TXRATE = 0x00002000, /* TX rate debugging */ 30 IWX_DEBUG_PWRSAVE = 0x00004000, /* Power save operations */ 31 IWX_DEBUG_SCAN = 0x00008000, /* Scan related operations */ 32 IWX_DEBUG_STATS = 0x00010000, /* Statistics updates */ 33 IWX_DEBUG_FIRMWARE_TLV = 0x00020000, /* Firmware TLV parsing */ 34 IWX_DEBUG_TRANS = 0x00040000, /* Transport layer (eg PCIe) */ 35 IWX_DEBUG_EEPROM = 0x00080000, /* EEPROM/channel information */ 36 IWX_DEBUG_TEMP = 0x00100000, /* Thermal Sensor handling */ 37 IWX_DEBUG_FW = 0x00200000, /* Firmware management */ 38 IWX_DEBUG_LAR = 0x00400000, /* Location Aware Regulatory */ 39 IWX_DEBUG_TE = 0x00800000, /* Time Event handling */ 40 /* 0x0n000000 are available */ 41 IWX_DEBUG_NI = 0x10000000, /* Not Implemented */ 42 IWX_DEBUG_REGISTER = 0x20000000, /* print chipset register */ 43 IWX_DEBUG_TRACE = 0x40000000, /* Print begin and start driver function */ 44 IWX_DEBUG_FATAL = 0x80000000, /* fatal errors */ 45 IWX_DEBUG_ANY = 0xffffffff 46 }; 47 48 #define IWX_DPRINTF(sc, m, fmt, ...) do { \ 49 if (sc->sc_debug & (m)) \ 50 device_printf(sc->sc_dev, fmt, ##__VA_ARGS__); \ 51 } while (0) 52 #else 53 #define IWX_DPRINTF(sc, m, fmt, ...) do { (void) sc; } while (0) 54 #endif 55 56 void print_opcode(const char *, int, int, uint32_t); 57 void print_ratenflags(const char *, int , uint32_t , int ); 58 void iwx_dump_cmd(uint32_t , void *, uint16_t, const char *, int); 59 void iwx_bbl_add_entry(uint64_t, int, int); 60 void iwx_bbl_print_log(void); 61 62 #define IWX_BBL_NONE 0x00 63 #define IWX_BBL_PKT_TX 0x01 64 #define IWX_BBL_PKT_RX 0x02 65 #define IWX_BBL_PKT_DUP 0x04 66 #define IWX_BBL_CMD_TX 0x10 67 #define IWX_BBL_CMD_RX 0x20 68 #define IWX_BBL_ANY 0xFF 69 70 static int print_mask = IWX_BBL_NONE; //IWX_BBL_NONE | IWX_BBL_CMD_TX; 71 static int print_codes[][2] = { 72 #if 0 73 for example: 74 IWX_LEGACY_GROUP, IWX_ADD_STA_KEY, 75 IWX_LEGACY_GROUP, IWX_SCD_QUEUE_CONFIG_CMD, 76 IWX_LEGACY_GROUP, IWX_ADD_STA, 77 IWX_LEGACY_GROUP, IWX_REMOVE_STA, 78 #endif 79 }; 80 81 static int dump_mask = IWX_BBL_NONE; 82 static int dump_codes[][2] = { 83 #if 0 84 for example: 85 IWX_LEGACY_GROUP, IWX_ADD_STA_KEY, 86 IWX_LEGACY_GROUP, IWX_SCD_QUEUE_CONFIG_CMD, 87 IWX_LEGACY_GROUP, IWX_ADD_STA, 88 IWX_LEGACY_GROUP, IWX_REMOVE_STA, 89 #endif 90 }; 91 92 struct opcode_label { 93 uint8_t opcode; 94 const char *label; 95 }; 96 97 static struct opcode_label command_group[] = { 98 { 0x0, "IWX_LEGACY_GROUP"}, 99 { 0x1, "IWX_LONG_GROUP"}, 100 { 0x2, "IWX_SYSTEM_GROUP"}, 101 { 0x3, "IWX_MAC_CONF_GROUP"}, 102 { 0x4, "IWX_PHY_OPS_GROUP"}, 103 { 0x5, "IWX_DATA_PATH_GROUP"}, 104 { 0xb, "IWX_PROT_OFFLOAD_GROUP"}, 105 { 0xc, "IWX_REGULATORY_AND_NVM_GROUP"}, 106 { 0, NULL } 107 }; 108 109 static struct opcode_label legacy_opcodes[] = { 110 { 0xc0, "IWX_REPLY_RX_PHY_CMD" }, 111 { 0xc1, "IWX_REPLY_RX_MPDU_CMD" }, 112 { 0xc2, "IWX_BAR_FRAME_RELEASE" }, 113 { 0xc3, "IWX_FRAME_RELEASE" }, 114 { 0xc5, "IWX_BA_NOTIF" }, 115 { 0x62, "IWX_TEMPERATURE_NOTIFICATION" }, 116 { 0xc8, "IWX_MCC_UPDATE_CMD" }, 117 { 0xc9, "IWX_MCC_CHUB_UPDATE_CMD" }, 118 { 0x65, "IWX_CALIBRATION_CFG_CMD" }, 119 { 0x66, "IWX_CALIBRATION_RES_NOTIFICATION" }, 120 { 0x67, "IWX_CALIBRATION_COMPLETE_NOTIFICATION" }, 121 { 0x68, "IWX_RADIO_VERSION_NOTIFICATION" }, 122 { 0x00, "IWX_CMD_DTS_MEASUREMENT_TRIGGER_WIDE" }, 123 { 0x01, "IWX_SOC_CONFIGURATION_CMD" }, 124 { 0x02, "IWX_REPLY_ERROR" }, 125 { 0x03, "IWX_CTDP_CONFIG_CMD" }, 126 { 0x04, "IWX_INIT_COMPLETE_NOTIF" }, 127 { 0x05, "IWX_SESSION_PROTECTION_CMD" }, 128 { 0x5d, "IWX_BT_COEX_CI" }, 129 { 0x07, "IWX_FW_ERROR_RECOVERY_CMD" }, 130 { 0x08, "IWX_RLC_CONFIG_CMD" }, 131 { 0xd0, "IWX_MCAST_FILTER_CMD" }, 132 { 0xd1, "IWX_REPLY_SF_CFG_CMD" }, 133 { 0xd2, "IWX_REPLY_BEACON_FILTERING_CMD" }, 134 { 0xd3, "IWX_D3_CONFIG_CMD" }, 135 { 0xd4, "IWX_PROT_OFFLOAD_CONFIG_CMD" }, 136 { 0xd5, "IWX_OFFLOADS_QUERY_CMD" }, 137 { 0xd6, "IWX_REMOTE_WAKE_CONFIG_CMD" }, 138 { 0x77, "IWX_POWER_TABLE_CMD" }, 139 { 0x78, "IWX_PSM_UAPSD_AP_MISBEHAVING_NOTIFICATION" }, 140 { 0xcc, "IWX_BT_COEX_PRIO_TABLE" }, 141 { 0xcd, "IWX_BT_COEX_PROT_ENV" }, 142 { 0xce, "IWX_BT_PROFILE_NOTIFICATION" }, 143 { 0x6a, "IWX_PHY_CONFIGURATION_CMD" }, 144 { 0x16, "IWX_RX_BAID_ALLOCATION_CONFIG_CMD" }, 145 { 0x17, "IWX_ADD_STA_KEY" }, 146 { 0x18, "IWX_ADD_STA" }, 147 { 0x19, "IWX_REMOVE_STA" }, 148 { 0xe0, "IWX_WOWLAN_PATTERNS" }, 149 { 0xe1, "IWX_WOWLAN_CONFIGURATION" }, 150 { 0xe2, "IWX_WOWLAN_TSC_RSC_PARAM" }, 151 { 0xe3, "IWX_WOWLAN_TKIP_PARAM" }, 152 { 0xe4, "IWX_WOWLAN_KEK_KCK_MATERIAL" }, 153 { 0xe5, "IWX_WOWLAN_GET_STATUSES" }, 154 { 0xe6, "IWX_WOWLAN_TX_POWER_PER_DB" }, 155 { 0x0f, "IWX_SCAN_COMPLETE_UMAC" }, 156 { 0x88, "IWX_NVM_ACCESS_CMD" }, 157 { 0x20, "IWX_WEP_KEY" }, 158 { 0xdc, "IWX_CMD_DTS_MEASUREMENT_TRIGGER" }, 159 { 0xdd, "IWX_DTS_MEASUREMENT_NOTIFICATION" }, 160 { 0x28, "IWX_MAC_CONTEXT_CMD" }, 161 { 0x29, "IWX_TIME_EVENT_CMD" }, 162 { 0x01, "IWX_ALIVE" }, 163 { 0xf0, "IWX_REPLY_DEBUG_CMD" }, 164 { 0x90, "IWX_BEACON_NOTIFICATION" }, 165 { 0xf5, "IWX_RX_NO_DATA_NOTIF" }, 166 { 0x08, "IWX_PHY_CONTEXT_CMD" }, 167 { 0x91, "IWX_BEACON_TEMPLATE_CMD" }, 168 { 0xf6, "IWX_THERMAL_DUAL_CHAIN_REQUEST" }, 169 { 0x09, "IWX_DBG_CFG" }, 170 { 0xf7, "IWX_DEBUG_LOG_MSG" }, 171 { 0x1c, "IWX_TX_CMD" }, 172 { 0x1d, "IWX_SCD_QUEUE_CFG" }, 173 { 0x1e, "IWX_TXPATH_FLUSH" }, 174 { 0x1f, "IWX_MGMT_MCAST_KEY" }, 175 { 0x98, "IWX_TX_ANT_CONFIGURATION_CMD" }, 176 { 0xee, "IWX_LTR_CONFIG" }, 177 { 0x8e, "IWX_SET_CALIB_DEFAULT_CMD" }, 178 { 0xFE, "IWX_CT_KILL_NOTIFICATION" }, 179 { 0xFF, "IWX_DTS_MEASUREMENT_NOTIF_WIDE" }, 180 { 0x2a, "IWX_TIME_EVENT_NOTIFICATION" }, 181 { 0x2b, "IWX_BINDING_CONTEXT_CMD" }, 182 { 0x2c, "IWX_TIME_QUOTA_CMD" }, 183 { 0x2d, "IWX_NON_QOS_TX_COUNTER_CMD" }, 184 { 0xa0, "IWX_CARD_STATE_CMD" }, 185 { 0xa1, "IWX_CARD_STATE_NOTIFICATION" }, 186 { 0xa2, "IWX_MISSED_BEACONS_NOTIFICATION" }, 187 { 0x0c, "IWX_SCAN_CFG_CMD" }, 188 { 0x0d, "IWX_SCAN_REQ_UMAC" }, 189 { 0xfb, "IWX_SESSION_PROTECTION_NOTIF" }, 190 { 0x0e, "IWX_SCAN_ABORT_UMAC" }, 191 { 0xfe, "IWX_PNVM_INIT_COMPLETE" }, 192 { 0xa9, "IWX_MAC_PM_POWER_TABLE" }, 193 { 0xff, "IWX_FSEQ_VER_MISMATCH_NOTIFICATION | IWX_REPLY_MAX" }, 194 { 0x9b, "IWX_BT_CONFIG" }, 195 { 0x9c, "IWX_STATISTICS_CMD" }, 196 { 0x9d, "IWX_STATISTICS_NOTIFICATION" }, 197 { 0x9f, "IWX_REDUCE_TX_POWER_CMD" }, 198 { 0xb1, "IWX_MFUART_LOAD_NOTIFICATION" }, 199 { 0xb5, "IWX_SCAN_ITERATION_COMPLETE_UMAC" }, 200 { 0x54, "IWX_NET_DETECT_CONFIG_CMD" }, 201 { 0x56, "IWX_NET_DETECT_PROFILES_QUERY_CMD" }, 202 { 0x57, "IWX_NET_DETECT_PROFILES_CMD" }, 203 { 0x58, "IWX_NET_DETECT_HOTSPOTS_CMD" }, 204 { 0x59, "IWX_NET_DETECT_HOTSPOTS_QUERY_CMD" }, 205 { 0, NULL } 206 }; 207 208 /* SYSTEM_GROUP group subcommand IDs */ 209 static struct opcode_label system_opcodes[] = { 210 { 0x00, "IWX_SHARED_MEM_CFG_CMD" }, 211 { 0x01, "IWX_SOC_CONFIGURATION_CMD" }, 212 { 0x03, "IWX_INIT_EXTENDED_CFG_CMD" }, 213 { 0x07, "IWX_FW_ERROR_RECOVERY_CMD" }, 214 { 0xff, "IWX_FSEQ_VER_MISMATCH_NOTIFICATION | IWX_REPLY_MAX" }, 215 { 0, NULL } 216 }; 217 218 /* MAC_CONF group subcommand IDs */ 219 static struct opcode_label macconf_opcodes[] = { 220 { 0x05, "IWX_SESSION_PROTECTION_CMD" }, 221 { 0xfb, "IWX_SESSION_PROTECTION_NOTIF" }, 222 { 0, NULL } 223 }; 224 225 /* DATA_PATH group subcommand IDs */ 226 static struct opcode_label data_opcodes[] = { 227 { 0x00, "IWX_DQA_ENABLE_CMD" }, 228 { 0x08, "IWX_RLC_CONFIG_CMD" }, 229 { 0x0f, "IWX_TLC_MNG_CONFIG_CMD" }, 230 { 0x16, "IWX_RX_BAID_ALLOCATION_CONFIG_CMD" }, 231 { 0x17, "IWX_SCD_QUEUE_CONFIG_CMD" }, 232 { 0xf5, "IWX_RX_NO_DATA_NOTIF" }, 233 { 0xf6, "IWX_THERMAL_DUAL_CHAIN_REQUEST" }, 234 { 0xf7, "IWX_TLC_MNG_UPDATE_NOTIF" }, 235 { 0, NULL } 236 }; 237 238 /* REGULATORY_AND_NVM group subcommand IDs */ 239 static struct opcode_label reg_opcodes[] = { 240 { 0x00, "IWX_NVM_ACCESS_COMPLETE" }, 241 { 0x02, "IWX_NVM_GET_INFO " }, 242 { 0xfe, "IWX_PNVM_INIT_COMPLETE" }, 243 { 0, NULL } 244 }; 245 246 /* PHY_OPS subcommand IDs */ 247 static struct opcode_label phyops_opcodes[] = { 248 {0x00, "IWX_CMD_DTS_MEASUREMENT_TRIGGER_WIDE"}, 249 {0x03, "IWX_CTDP_CONFIG_CMD"}, 250 {0x04, "IWX_TEMP_REPORTING_THRESHOLDS_CMD"}, 251 {0xFE, "IWX_CT_KILL_NOTIFICATION"}, 252 {0xFF, "IWX_DTS_MEASUREMENT_NOTIF_WIDE"}, 253 }; 254 255 struct iwx_bbl_entry { 256 uint8_t type; 257 uint64_t code; 258 uint32_t seq; 259 uint32_t ticks; 260 uint32_t count; 261 }; 262 #define IWX_BBL_ENTRIES 2000 263 static struct iwx_bbl_entry iwx_bb_log[IWX_BBL_ENTRIES]; 264 265 #endif /* __IF_IWX_DEBUG_H__ */ 266