xref: /freebsd/sys/dev/iwx/if_iwx_debug.h (revision cd92dd23241e22dce06ebeb0c8e98eec5afcc896)
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