xref: /illumos-gate/usr/src/cmd/mdb/common/modules/qlc/qlc.c (revision eb82ff87b34e625264561b2d267577cf9821dab0)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2010 QLogic Corporation.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * ISP2xxx Solaris Fibre Channel Adapter (FCA) qlc mdb source file.
29  *
30  * ***********************************************************************
31  * *									**
32  * *				NOTICE					**
33  * *		COPYRIGHT (C) 1996-2010 QLOGIC CORPORATION		**
34  * *			ALL RIGHTS RESERVED				**
35  * *									**
36  * ***********************************************************************
37  *
38  */
39 
40 #pragma ident	"Copyright 2010 QLogic Corporation; ql_mdb.c"
41 
42 #include <sys/mdb_modapi.h>
43 #include <ql_apps.h>
44 #include <ql_api.h>
45 #include <ql_init.h>
46 #include <ql_debug.h>
47 
48 /*
49  * local prototypes
50  */
51 static int32_t ql_doprint(uintptr_t, int8_t *);
52 static void ql_dump_flags(uint64_t, int8_t **);
53 static int qlclinks_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
54 static int qlcstate_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
55 static int qlc_osc_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
56 static int qlc_wdog_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
57 static int qlc_getdump_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
58 static int qlc_gettrace_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
59 #if 0
60 static int qlc_triggerdump_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
61 #endif
62 static int qlcver_dcmd(uintptr_t, uint_t, int, const mdb_arg_t *);
63 static int qlstates_walk_init(mdb_walk_state_t *);
64 static int qlstates_walk_step(mdb_walk_state_t *);
65 static void qlstates_walk_fini(mdb_walk_state_t *);
66 static int qlsrb_walk_init(mdb_walk_state_t *);
67 static int qlsrb_walk_step(mdb_walk_state_t *);
68 static void qlsrb_walk_fini(mdb_walk_state_t *);
69 static int get_next_link(ql_link_t *);
70 static int get_first_link(ql_head_t *, ql_link_t *);
71 
72 static int ql_24xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
73     const mdb_arg_t *);
74 static int ql_23xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
75     const mdb_arg_t *);
76 static int ql_25xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
77     const mdb_arg_t *);
78 static int ql_81xx_dump_dcmd(ql_adapter_state_t *, uint_t, int,
79     const mdb_arg_t *);
80 static void ql_elog_common(ql_adapter_state_t *, boolean_t);
81 
82 /*
83  * local adapter state flags strings
84  */
85 int8_t *adapter_state_flags[] = {
86 	"FCA_BOUND",
87 	"QL_OPENED",
88 	"ONLINE",
89 	"INTERRUPTS_ENABLED",
90 	"ABORT_CMDS_LOOP_DOWN_TMO",
91 	"POINT_TO_POINT",
92 	"IP_ENABLED",
93 	"IP_INITIALIZED",
94 	"MENLO_LOGIN_OPERATIONAL",
95 	"ADAPTER_SUSPENDED",
96 	"ADAPTER_TIMER_BUSY",
97 	"PARITY_ERROR",
98 	"FLASH_ERRLOG_MARKER",
99 	"VP_ENABLED",
100 	"FDISC_ENABLED",
101 	"FUNCTION_1",
102 	"MPI_RESET_NEEDED",
103 	NULL
104 };
105 
106 int8_t *adapter_config_flags[] = {
107 	"ENABLE_HARD_ADDRESS",
108 	"ENABLE_64BIT_ADDRESSING",
109 	"ENABLE_LIP_RESET",
110 	"ENABLE_FULL_LIP_LOGIN",
111 	"ENABLE_TARGET_RESET",
112 	"ENABLE_LINK_DOWN_REPORTING",
113 	"DISABLE_EXTENDED_LOGGING_TRACE",
114 	"ENABLE_FCP_2_SUPPORT",
115 	"MULTI_CHIP_ADAPTER",
116 	"SBUS_CARD",
117 	"CTRL_2300",
118 	"CTRL_6322",
119 	"CTRL_2200",
120 	"CTRL_2422",
121 	"CTRL_25XX",
122 	"ENABLE_EXTENDED_LOGGING",
123 	"DISABLE_RISC_CODE_LOAD",
124 	"SET_CACHE_LINE_SIZE_1",
125 	"CTRL_MENLO",
126 	"EXT_FW_INTERFACE",
127 	"LOAD_FLASH_FW",
128 	"DUMP_MAILBOX_TIMEOUT",
129 	"DUMP_ISP_SYSTEM_ERROR",
130 	"DUMP_DRIVER_COMMAND_TIMEOUT",
131 	"DUMP_LOOP_OFFLINE_TIMEOUT",
132 	"ENABLE_FWEXTTRACE",
133 	"ENABLE_FWFCETRACE",
134 	"FW_MISMATCH",
135 	"CTRL_81XX",
136 	"CTRL_8021",
137 	"ENABLE_FAST_TIMEOUT",
138 	"LR_SUPPORT",
139 	NULL
140 };
141 
142 /*
143  * local task daemon flags strings
144  */
145 int8_t *task_daemon_flags[] = {
146 	"TASK_DAEMON_STOP_FLG",
147 	"TASK_DAEMON_SLEEPING_FLG",
148 	"TASK_DAEMON_ALIVE_FLG",
149 	"TASK_DAEMON_IDLE_CHK_FLG",
150 	"SUSPENDED_WAKEUP_FLG",
151 	"FC_STATE_CHANGE",
152 	"NEED_UNSOLICITED_BUFFERS",
153 	"RESET_MARKER_NEEDED",
154 	"RESET_ACTIVE",
155 	"ISP_ABORT_NEEDED",
156 	"ABORT_ISP_ACTIVE",
157 	"LOOP_RESYNC_NEEDED",
158 	"LOOP_RESYNC_ACTIVE",
159 	"LOOP_DOWN",
160 	"DRIVER_STALL",
161 	"COMMAND_WAIT_NEEDED",
162 	"COMMAND_WAIT_ACTIVE",
163 	"STATE_ONLINE",
164 	"ABORT_QUEUES_NEEDED",
165 	"TASK_DAEMON_STALLED_FLG",
166 	"TASK_THREAD_CALLED",
167 	"FIRMWARE_UP",
168 	"LIP_RESET_PENDING",
169 	"FIRMWARE_LOADED",
170 	"RSCN_UPDATE_NEEDED",
171 	"HANDLE_PORT_BYPASS_CHANGE",
172 	"PORT_RETRY_NEEDED",
173 	"TASK_DAEMON_POWERING_DOWN",
174 	"TD_IIDMA_NEEDED",
175 	"SEND_PLOGI",
176 	"IDC_ACK_NEEDED",
177 	NULL
178 };
179 
180 /*
181  * local interrupt aif flags
182  */
183 int8_t *aif_flags[] = {
184 	"IFLG_INTR_LEGACY",
185 	"IFLG_INTR_FIXED",
186 	"IFLG_INTR_MSI",
187 	"IFLG_INTR_MSIX",
188 	NULL
189 };
190 
191 int8_t *qlsrb_flags[] = {
192 	"SRB_ISP_STARTED",
193 	"SRB_ISP_COMPLETED",
194 	"SRB_RETRY",
195 	"SRB_POLL",
196 	"SRB_WATCHDOG_ENABLED",
197 	"SRB_ABORT",
198 	"SRB_UB_IN_FCA",
199 	"SRB_UB_IN_ISP",
200 	"SRB_UB_CALLBACK",
201 	"SRB_UB_RSCN",
202 	"SRB_UB_FCP",
203 	"SRB_FCP_CMD_PKT",
204 	"SRB_FCP_DATA_PKT",
205 	"SRB_FCP_RSP_PKT",
206 	"SRB_IP_PKT",
207 	"SRB_GENERIC_SERVICES_PKT",
208 	"SRB_COMMAND_TIMEOUT",
209 	"SRB_ABORTING",
210 	"SRB_IN_DEVICE_QUEUE",
211 	"SRB_IN_TOKEN_ARRAY",
212 	"SRB_UB_FREE_REQUESTED",
213 	"SRB_UB_ACQUIRED",
214 	"SRB_MS_PKT",
215 	NULL
216 };
217 
218 int8_t *qllun_flags[] = {
219 	"LQF_UNTAGGED_PENDING",
220 	NULL
221 };
222 
223 int8_t *qltgt_flags[] = {
224 	"TQF_TAPE_DEVICE",
225 	"TQF_QUEUE_SUSPENDED",
226 	"TQF_FABRIC_DEVICE",
227 	"TQF_INITIATOR_DEVICE",
228 	"TQF_RSCN_RCVD",
229 	"TQF_NEED_AUTHENTICATION",
230 	"TQF_PLOGI_PROGRS",
231 	"TQF_IIDMA_NEEDED",
232 	NULL
233 };
234 
235 int8_t *qldump_flags[] = {
236 	"QL_DUMPING",
237 	"QL_DUMP_VALID",
238 	"QL_DUMP_UPLOADED",
239 	NULL
240 };
241 
242 /*
243  * qlclinks_dcmd
244  *	mdb dcmd which prints out the ql_hba pointers
245  *
246  * Input:
247  *	addr  = User supplied address -- error if supplied.
248  *	flags = mdb flags.
249  *	argc  = Number of user supplied args -- error if non-zero.
250  *	argv  = Arg array.
251  *
252  * Returns:
253  *	DCMD_ERR, DCMD_USAGE, or DCMD_OK
254  *
255  * Context:
256  *	User context.
257  *
258  */
259 /*ARGSUSED*/
260 static int
261 qlclinks_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
262 {
263 	ql_head_t		ql_hba;
264 	ql_adapter_state_t	*qlstate;
265 	uintptr_t		hbaptr = NULL;
266 
267 	if ((flags & DCMD_ADDRSPEC) || argc != 0) {
268 		return (DCMD_USAGE);
269 	}
270 
271 	if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
272 		mdb_warn("failed to read ql_hba structure");
273 		return (DCMD_ERR);
274 	}
275 
276 	if (&ql_hba == NULL) {
277 		mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
278 		return (DCMD_ERR);
279 	}
280 
281 	mdb_printf("\nqlc adapter state linkages (f=0x%llx, l=0x%llx)\n\n",
282 	    ql_hba.first, ql_hba.last);
283 
284 	if ((qlstate = (ql_adapter_state_t *)mdb_alloc(
285 	    sizeof (ql_adapter_state_t), UM_SLEEP)) == NULL) {
286 		mdb_warn("Unable to allocate memory for ql_adapter_state\n");
287 		return (DCMD_OK);
288 	}
289 
290 	(void) mdb_inc_indent((ulong_t)4);
291 	mdb_printf("%<u>%-?s\t%-45s%</u>\n\n", "baseaddr", "instance");
292 
293 	hbaptr = (uintptr_t)ql_hba.first;
294 	while (hbaptr != NULL) {
295 
296 		if (mdb_vread(qlstate, sizeof (ql_adapter_state_t),
297 		    hbaptr) == -1) {
298 			mdb_free(qlstate, sizeof (ql_adapter_state_t));
299 			mdb_warn("failed to read ql_adapter_state at %p",
300 			    hbaptr);
301 			return (DCMD_OK);
302 		}
303 
304 		mdb_printf("%<b>0x%016p%t%d%</b>\n",
305 		    qlstate->hba.base_address, qlstate->instance);
306 
307 		/*
308 		 * If vp exists, loop through those
309 		 */
310 
311 		if ((qlstate->flags & VP_ENABLED) &&
312 		    (qlstate->vp_next != NULL)) {
313 
314 			ql_adapter_state_t	*vqlstate;
315 			uintptr_t		vhbaptr = NULL;
316 
317 			vhbaptr = (uintptr_t)qlstate->vp_next;
318 
319 			if ((vqlstate = (ql_adapter_state_t *)mdb_alloc(
320 			    sizeof (ql_adapter_state_t), UM_SLEEP)) == NULL) {
321 				mdb_warn("Unable to allocate memory for "
322 				    "ql_adapter_state vp\n");
323 				mdb_free(qlstate, sizeof (ql_adapter_state_t));
324 				return (DCMD_OK);
325 			}
326 
327 			(void) mdb_inc_indent((ulong_t)30);
328 
329 			mdb_printf("%<u>vp baseaddr\t\tvp index%</u>\n");
330 
331 			while (vhbaptr != NULL) {
332 
333 				if (mdb_vread(vqlstate,
334 				    sizeof (ql_adapter_state_t), vhbaptr) ==
335 				    -1) {
336 					mdb_free(vqlstate,
337 					    sizeof (ql_adapter_state_t));
338 					mdb_free(qlstate,
339 					    sizeof (ql_adapter_state_t));
340 					mdb_warn("failed to read vp "
341 					    "ql_adapter_state at %p", vhbaptr);
342 					return (DCMD_OK);
343 				}
344 
345 				mdb_printf("%<b>0x%016p%t%d%</b>\n",
346 				    vqlstate->hba.base_address,
347 				    vqlstate->vp_index);
348 
349 				vhbaptr = (uintptr_t)vqlstate->vp_next;
350 			}
351 
352 			mdb_free(vqlstate, sizeof (ql_adapter_state_t));
353 
354 			(void) mdb_dec_indent((ulong_t)30);
355 
356 			mdb_printf("\n");
357 		}
358 
359 		hbaptr = (uintptr_t)qlstate->hba.next;
360 	}
361 
362 	(void) mdb_dec_indent((ulong_t)4);
363 
364 	mdb_free(qlstate, sizeof (ql_adapter_state_t));
365 
366 	return (DCMD_OK);
367 }
368 
369 /*
370  * qlcver_dcmd
371  *	mdb dcmd which prints out the qlc driver version the mdb
372  *	module was compiled with, and the verison of qlc which is
373  *	currently loaded on the machine.
374  *
375  * Input:
376  *	addr  = User supplied address -- error if supplied.
377  *	flags = mdb flags.
378  *	argc  = Number of user supplied args -- error if non-zero.
379  *	argv  = Arg array.
380  *
381  * Returns:
382  *	DCMD_USAGE, or DCMD_OK
383  *
384  * Context:
385  *	User context.
386  *
387  */
388 /*ARGSUSED*/
389 static int
390 qlcver_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
391 {
392 	int8_t		qlcversion[100];
393 	struct fw_table	fw_table[10], *fwt = NULL;
394 	uint8_t		*fwverptr = NULL;
395 	ql_head_t	ql_hba;
396 	uint32_t	found = 0;
397 
398 	if ((flags & DCMD_ADDRSPEC) || argc != 0) {
399 		return (DCMD_USAGE);
400 	}
401 
402 	if (mdb_readvar(&qlcversion, "qlc_driver_version") == -1) {
403 		mdb_warn("unable to read qlc driver version\n");
404 	} else {
405 		mdb_printf("\n%s version currently loaded is: %s\n",
406 		    QL_NAME, qlcversion);
407 	}
408 
409 	mdb_printf("qlc mdb library compiled with %s version: %s\n",
410 	    QL_NAME, QL_VERSION);
411 
412 	if ((fwverptr = (uint8_t *)(mdb_alloc(50, UM_SLEEP))) == NULL) {
413 		mdb_warn("unable to alloc fwverptr\n");
414 		return (DCMD_OK);
415 	}
416 
417 	if (mdb_readvar(&fw_table, "fw_table") == -1) {
418 		mdb_warn("unable to read firmware table\n");
419 	} else {
420 		ql_adapter_state_t	*qlstate;
421 		uintptr_t		hbaptr = NULL;
422 
423 		if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
424 			mdb_warn("failed to read ql_hba structure");
425 			return (DCMD_ERR);
426 		}
427 
428 		if ((qlstate = (ql_adapter_state_t *)mdb_alloc(
429 		    sizeof (ql_adapter_state_t), UM_SLEEP)) == NULL) {
430 			mdb_warn("Unable to allocate memory for "
431 			    "ql_adapter_state\n");
432 			return (DCMD_OK);
433 		}
434 
435 		mdb_printf("\n%-8s%-11s%s\n", "f/w", "compiled", "loaded");
436 		mdb_printf("%<u>%-8s%-11s%-13s%s%</u>\n\n", "class", "version",
437 		    "version", "instance list");
438 
439 		for (fwt = &fw_table[0]; fwt->fw_class; fwt++) {
440 
441 			if (mdb_vread(fwverptr, sizeof (void *),
442 			    (uintptr_t)fwt->fw_version) == -1) {
443 				mdb_warn("unable to read fwverptr\n");
444 				mdb_free(fwverptr, sizeof (void *));
445 				mdb_free(qlstate, sizeof (ql_adapter_state_t));
446 				return (DCMD_OK);
447 			}
448 
449 			mdb_printf("%x\t%-11s", fwt->fw_class, fwverptr);
450 
451 			if (&ql_hba == NULL) {
452 				mdb_warn("failed to read ql_hba structure");
453 				hbaptr = NULL;
454 			} else {
455 				hbaptr = (uintptr_t)ql_hba.first;
456 			}
457 
458 			found = 0;
459 			while (hbaptr != NULL) {
460 
461 				if (mdb_vread(qlstate,
462 				    sizeof (ql_adapter_state_t), hbaptr) ==
463 				    -1) {
464 					mdb_warn("failed to read "
465 					    "ql_adapter_state at %p", hbaptr);
466 					break;
467 				}
468 
469 				if (qlstate->fw_class == fwt->fw_class) {
470 					if (found == 0) {
471 						mdb_printf("%x.%02x.%02x\t",
472 						    qlstate->fw_major_version,
473 						    qlstate->fw_minor_version,
474 						    qlstate->
475 						    fw_subminor_version);
476 						mdb_printf("%d",
477 						    qlstate->instance);
478 					} else {
479 						mdb_printf(", %d",
480 						    qlstate->instance);
481 					}
482 					found = 1;
483 				}
484 
485 				hbaptr = (uintptr_t)qlstate->hba.next;
486 			}
487 
488 			if (found == 1) {
489 				mdb_printf("\n");
490 			} else {
491 				mdb_printf("not loaded\n");
492 			}
493 		}
494 
495 		mdb_free(qlstate, sizeof (ql_adapter_state_t));
496 		mdb_free(fwverptr, sizeof (void *));
497 	}
498 
499 	return (DCMD_OK);
500 }
501 
502 /*
503  * qlc_el_dcmd
504  *	mdb dcmd which turns the extended logging bit on or off
505  *	for the specificed qlc instance(s).
506  *
507  * Input:
508  *	addr  = User supplied address -- error if supplied.
509  *	flags = mdb flags.
510  *	argc  = Number of user supplied args -- error if non-zero.
511  *	argv  = Arg array.
512  *
513  * Returns:
514  *	DCMD_USAGE, or DCMD_OK
515  *
516  * Context:
517  *	User context.
518  *
519  */
520 /*ARGSUSED*/
521 static int
522 qlc_el_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
523 {
524 	int8_t			qlcversion[100];
525 	boolean_t		elswitch;
526 	uint32_t		argcnt;
527 	int			mdbs;
528 	uint32_t		instance;
529 	uint32_t		qlsize = sizeof (ql_adapter_state_t);
530 	ql_adapter_state_t	*qlstate;
531 	uintptr_t		hbaptr = NULL;
532 	ql_head_t		ql_hba;
533 
534 	if ((mdbs = mdb_get_state()) == MDB_STATE_DEAD) {
535 		mdb_warn("Cannot change core file data (state=%xh)\n", mdbs);
536 		return (DCMD_OK);
537 	}
538 
539 	if ((flags & DCMD_ADDRSPEC) || argc < 2) {
540 		return (DCMD_USAGE);
541 	}
542 
543 	/*
544 	 * Check and make sure the driver version and the mdb versions
545 	 * match so all the structures and flags line up
546 	 */
547 
548 	if (mdb_readvar(&qlcversion, "qlc_driver_version") == -1) {
549 		mdb_warn("unable to read qlc driver version\n");
550 		return (DCMD_OK);
551 	}
552 
553 	if ((strcmp(QL_VERSION, (const char *)&qlcversion)) != 0) {
554 		mdb_warn("Error: qlc driver/qlc mdb version mismatch\n");
555 		mdb_printf("\tqlc mdb library compiled version is: %s\n",
556 		    QL_VERSION);
557 		mdb_printf("\tqlc driver version is: %s\n", qlcversion);
558 
559 		return (DCMD_OK);
560 	}
561 
562 	if ((strcasecmp(argv[0].a_un.a_str, "on")) == 0) {
563 		elswitch = TRUE;
564 	} else if ((strcasecmp(argv[0].a_un.a_str, "off")) == 0) {
565 		elswitch = FALSE;
566 	} else {
567 		return (DCMD_USAGE);
568 	}
569 
570 	if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
571 		mdb_warn("failed to read ql_hba structure");
572 		return (DCMD_ERR);
573 	}
574 
575 	if (&ql_hba == NULL) {
576 		mdb_warn("failed to read ql_hba structure - is qlc loaded?");
577 		return (DCMD_ERR);
578 	}
579 
580 	if ((qlstate = (ql_adapter_state_t *)mdb_alloc(qlsize,
581 	    UM_SLEEP)) == NULL) {
582 		mdb_warn("Unable to allocate memory for "
583 		    "ql_adapter_state\n");
584 		return (DCMD_OK);
585 	}
586 
587 	if ((strcasecmp(argv[1].a_un.a_str, "all")) == 0) {
588 
589 		if (argc != 2) {
590 			mdb_free(qlstate, qlsize);
591 			return (DCMD_USAGE);
592 		}
593 
594 		hbaptr = (uintptr_t)ql_hba.first;
595 
596 		while (hbaptr != NULL) {
597 
598 			if (mdb_vread(qlstate, qlsize, hbaptr) == -1) {
599 				mdb_free(qlstate, qlsize);
600 				mdb_warn("failed to read ql_adapter_state "
601 				    "at %p", hbaptr);
602 				return (DCMD_OK);
603 			}
604 
605 			ql_elog_common(qlstate, elswitch);
606 
607 			hbaptr = (uintptr_t)qlstate->hba.next;
608 		}
609 	} else {
610 		for (argcnt = 1; argcnt < argc; argcnt++) {
611 
612 			instance = (uint32_t)mdb_strtoull(
613 			    argv[argcnt].a_un.a_str);
614 
615 			/* find the correct instance to change */
616 			hbaptr = (uintptr_t)ql_hba.first;
617 			while (hbaptr != NULL) {
618 
619 				if (mdb_vread(qlstate, qlsize, hbaptr) == -1) {
620 					mdb_free(qlstate, qlsize);
621 					mdb_warn("failed to read "
622 					    "ql_adapter_state at %p", hbaptr);
623 					return (DCMD_OK);
624 				}
625 
626 				if (qlstate->instance == instance) {
627 					break;
628 				}
629 
630 				hbaptr = (uintptr_t)qlstate->hba.next;
631 			}
632 
633 			if (hbaptr == NULL) {
634 				mdb_printf("instance %d is not loaded",
635 				    instance);
636 				continue;
637 			}
638 
639 			ql_elog_common(qlstate, elswitch);
640 		}
641 	}
642 
643 	mdb_free(qlstate, qlsize);
644 
645 	return (DCMD_OK);
646 }
647 
648 /*
649  * qlc_elog_common
650  *	mdb helper function which set/resets the extended logging bit
651  *
652  * Input:
653  *	qlstate  = adapter state structure
654  *	elswitch = boolean which specifies to reset (0) or set (1) the
655  *		   extended logging bit.
656  *
657  * Returns:
658  *
659  * Context:
660  *	User context.
661  *
662  */
663 static void
664 ql_elog_common(ql_adapter_state_t *qlstate, boolean_t elswitch)
665 {
666 	uintptr_t	hbaptr = (uintptr_t)qlstate->hba.base_address;
667 	size_t		qlsize = sizeof (ql_adapter_state_t);
668 
669 	if (elswitch) {
670 		if ((qlstate->cfg_flags & CFG_ENABLE_EXTENDED_LOGGING) == 0) {
671 
672 			qlstate->cfg_flags |= CFG_ENABLE_EXTENDED_LOGGING;
673 
674 			if ((mdb_vwrite((const void *)qlstate, qlsize,
675 			    hbaptr)) != (ssize_t)qlsize) {
676 				mdb_warn("instance %d - unable to update",
677 				    qlstate->instance);
678 			} else {
679 				mdb_printf("instance %d extended logging is "
680 				    "now on\n", qlstate->instance);
681 			}
682 		} else {
683 			mdb_printf("instance %d extended logging is "
684 			    "already on\n", qlstate->instance);
685 		}
686 	} else {
687 		if ((qlstate->cfg_flags & CFG_ENABLE_EXTENDED_LOGGING) != 0) {
688 
689 			qlstate->cfg_flags &= ~CFG_ENABLE_EXTENDED_LOGGING;
690 
691 			if ((mdb_vwrite((const void *)qlstate, qlsize,
692 			    hbaptr)) != (ssize_t)qlsize) {
693 				mdb_warn("instance %d - unable to update",
694 				    qlstate->instance);
695 			} else {
696 				mdb_printf("instance %d extended logging is "
697 				    "now off\n", qlstate->instance);
698 			}
699 		} else {
700 			mdb_printf("instance %d extended logging is "
701 			    "already off\n", qlstate->instance);
702 		}
703 	}
704 }
705 
706 /*
707  * qlc_ocs_dcmd
708  *	mdb dcmd which prints out the outstanding command array using
709  *	caller supplied address (which sb the ha structure).
710  *
711  * Input:
712  *	addr  = User supplied ha address.
713  *	flags = mdb flags.
714  *	argc  = Number of user supplied args.
715  *	argv  = Arg array.
716  *
717  * Returns:
718  *	DCMD_USAGE, or DCMD_OK
719  *
720  * Context:
721  *	User context.
722  *
723  *
724  */
725 static int
726 /*ARGSUSED*/
727 qlc_osc_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
728 {
729 	ql_adapter_state_t	*qlstate;
730 	uintptr_t		qlosc, ptr1;
731 	uint32_t		indx, found = 0;
732 	ql_srb_t		*qlsrb;
733 
734 	if (!(flags & DCMD_ADDRSPEC)) {
735 		return (DCMD_USAGE);
736 	}
737 
738 	if ((qlstate = (ql_adapter_state_t *)
739 	    mdb_alloc(sizeof (ql_adapter_state_t), UM_SLEEP)) == NULL) {
740 		mdb_warn("Unable to allocate memory for ql_adapter_state\n");
741 		return (DCMD_OK);
742 	}
743 	if (mdb_vread(qlstate, sizeof (ql_adapter_state_t), addr) == -1) {
744 		mdb_free(qlstate, sizeof (ql_adapter_state_t));
745 		mdb_warn("failed to read ql_adapter_state at %p", addr);
746 		return (DCMD_OK);
747 	}
748 
749 	qlosc = (uintptr_t)qlstate->outstanding_cmds;
750 	mdb_printf("qlc instance: %d, base addr = %llx, osc base = %p\n",
751 	    qlstate->instance, qlstate->hba.base_address, qlosc);
752 
753 	if ((qlsrb = (ql_srb_t *)mdb_alloc(sizeof (ql_srb_t), UM_SLEEP)) ==
754 	    NULL) {
755 		mdb_free(qlstate, sizeof (ql_adapter_state_t));
756 		mdb_warn("failed to allocate space for srb_t\n");
757 		return (DCMD_OK);
758 	}
759 	for (indx = 0; indx < MAX_OUTSTANDING_COMMANDS; indx++, qlosc += 8) {
760 		if (mdb_vread(&ptr1, 8, qlosc) == -1) {
761 			mdb_warn("failed to read ptr1, indx=%d", indx);
762 			break;
763 		}
764 		if (ptr1 == 0) {
765 			continue;
766 		}
767 
768 		mdb_printf("osc ptr = %p, indx = %xh\n", ptr1, indx);
769 
770 		if (mdb_vread(qlsrb, sizeof (ql_srb_t), ptr1) == -1) {
771 			mdb_warn("failed to read ql_srb_t at %p", ptr1);
772 			break;
773 		}
774 		(void) ql_doprint(ptr1, "struct ql_srb");
775 		found++;
776 	}
777 
778 	mdb_free(qlsrb, sizeof (ql_srb_t));
779 	mdb_free(qlstate, sizeof (ql_adapter_state_t));
780 
781 	mdb_printf("number of outstanding command srb's is: %d\n", found);
782 
783 	return (DCMD_OK);
784 }
785 
786 /*
787  * qlc_wdog_dcmd
788  *	mdb dcmd which prints out the commands which are linked
789  *	on the watchdog linked list. Caller supplied address (which
790  *	sb the ha structure).
791  *
792  * Input:
793  *	addr  = User supplied ha address.
794  *	flags = mdb flags.
795  *	argc  = Number of user supplied args.
796  *	argv  = Arg array.
797  *
798  * Returns:
799  *	DCMD_USAGE, or DCMD_OK
800  *
801  * Context:
802  *	User context.
803  *
804  *
805  */
806 static int
807 /*ARGSUSED*/
808 qlc_wdog_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
809 {
810 	ql_adapter_state_t	*qlstate;
811 	uint16_t		index, count;
812 	ql_head_t		*dev;
813 	ql_srb_t		*srb;
814 	ql_tgt_t		*tq;
815 	ql_lun_t		*lq;
816 	ql_link_t		*tqlink, *srblink, *lqlink;
817 	int			nextlink;
818 
819 	if (!(flags & DCMD_ADDRSPEC)) {
820 		mdb_warn("Address required\n", addr);
821 		return (DCMD_USAGE);
822 	}
823 
824 	if ((qlstate = (ql_adapter_state_t *)
825 	    mdb_alloc(sizeof (ql_adapter_state_t), UM_SLEEP)) == NULL) {
826 		mdb_warn("Unable to allocate memory for ql_adapter_state\n");
827 		return (DCMD_OK);
828 	}
829 
830 	if (mdb_vread(qlstate, sizeof (ql_adapter_state_t), addr) == -1) {
831 		mdb_free(qlstate, sizeof (ql_adapter_state_t));
832 		mdb_warn("failed to read ql_adapter_state at %p", addr);
833 		return (DCMD_OK);
834 	}
835 
836 	/*
837 	 * Read in the device array
838 	 */
839 	dev = (ql_head_t *)
840 	    mdb_alloc(sizeof (ql_head_t) * DEVICE_HEAD_LIST_SIZE, UM_SLEEP);
841 
842 	if (mdb_vread(dev, sizeof (ql_head_t) * DEVICE_HEAD_LIST_SIZE,
843 	    (uintptr_t)qlstate->dev) == -1) {
844 		mdb_warn("failed to read ql_head_t (dev) at %p", qlstate->dev);
845 		mdb_free(qlstate, sizeof (ql_adapter_state_t));
846 		mdb_free(dev, sizeof (ql_head_t) * DEVICE_HEAD_LIST_SIZE);
847 		return (DCMD_OK);
848 	}
849 
850 	tqlink = (ql_link_t *)mdb_alloc(sizeof (ql_link_t), UM_SLEEP);
851 	tq = (ql_tgt_t *)mdb_alloc(sizeof (ql_tgt_t), UM_SLEEP);
852 	lqlink = (ql_link_t *)mdb_alloc(sizeof (ql_link_t), UM_SLEEP);
853 	lq = (ql_lun_t *)mdb_alloc(sizeof (ql_lun_t), UM_SLEEP);
854 	srblink = (ql_link_t *)mdb_alloc(sizeof (ql_link_t), UM_SLEEP);
855 	srb = (ql_srb_t *)mdb_alloc(sizeof (ql_srb_t), UM_SLEEP);
856 
857 	/*
858 	 * Validate the devices watchdog queue
859 	 */
860 	for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
861 
862 		/* Skip empty ones */
863 		if (dev[index].first == NULL) {
864 			continue;
865 		}
866 
867 		mdb_printf("dev array index = %x\n", index);
868 
869 		/* Loop through targets on device linked list */
870 		/* get the first link */
871 
872 		nextlink = get_first_link(&dev[index], tqlink);
873 
874 		/*
875 		 * traverse the targets linked list at this device array index.
876 		 */
877 		while (nextlink == DCMD_OK) {
878 			/* Get the target */
879 			if (mdb_vread(tq, sizeof (ql_tgt_t),
880 			    (uintptr_t)(tqlink->base_address)) == -1) {
881 				mdb_warn("failed to read ql_tgt at %p",
882 				    tqlink->base_address);
883 				break;
884 			}
885 			mdb_printf("tgt q base = %llx, ",
886 			    tqlink->base_address);
887 
888 			mdb_printf("flags: (%xh)", tq->flags);
889 
890 			if (tq->flags) {
891 				ql_dump_flags((uint64_t)tq->flags, qltgt_flags);
892 			}
893 
894 			mdb_printf("tgt: %02x%02x%02x%02x%02x%02x%02x%02x ",
895 			    tq->node_name[0], tq->node_name[1],
896 			    tq->node_name[2], tq->node_name[3],
897 			    tq->node_name[4], tq->node_name[5],
898 			    tq->node_name[6], tq->node_name[7]);
899 
900 			/*
901 			 * Loop through commands on this targets watchdog queue.
902 			 */
903 
904 			/* Get the first link on the targets cmd wdg q. */
905 			if (tq->wdg.first == NULL) {
906 				mdb_printf(" watchdog list empty ");
907 				break;
908 			} else {
909 				if (mdb_vread(srblink, sizeof (ql_link_t),
910 				    (uintptr_t)tq->wdg.first) == -1) {
911 					mdb_warn("failed to read ql_link_t"
912 					    " at %p", tq->wdg.first);
913 					break;
914 				}
915 				/* There is aleast one. */
916 				count = 1;
917 				/*
918 				 * Count the remaining items in the
919 				 * cmd watchdog list.
920 				 */
921 				while (srblink->next != NULL) {
922 					/* Read in the next ql_link_t header */
923 					if (mdb_vread(srblink,
924 					    sizeof (ql_link_t),
925 					    (uintptr_t)srblink->next) == -1) {
926 						mdb_warn("failed to read"
927 						    " ql_link_t next at %p",
928 						    srblink->next);
929 						break;
930 					}
931 					count = (uint16_t)(count + 1);
932 				}
933 				mdb_printf(" watchdog list: %d entries\n",
934 				    count);
935 				/* get the first one again */
936 				if (mdb_vread(srblink, sizeof (ql_link_t),
937 				    (uintptr_t)tq->wdg.first) == -1) {
938 					mdb_warn("failed to read ql_link_t"
939 					    " at %p", tq->wdg.first);
940 					break;
941 				}
942 			}
943 			/*
944 			 * Traverse the targets cmd watchdog linked list
945 			 * verifying srb's from the list are on a lun cmd list.
946 			 */
947 			while (nextlink == DCMD_OK) {
948 				int	found = 0;
949 				/* get the srb */
950 				if (mdb_vread(srb, sizeof (ql_srb_t),
951 				    (uintptr_t)srblink->base_address) == -1) {
952 					mdb_warn("failed to read ql_srb_t"
953 					" at %p", srblink->base_address);
954 					break;
955 				}
956 				mdb_printf("ql_srb %llx ",
957 				    srblink->base_address);
958 
959 				/*
960 				 * Get the lun q the srb is on
961 				 */
962 				if (mdb_vread(lq, sizeof (ql_lun_t),
963 				    (uintptr_t)srb->lun_queue) == -1) {
964 					mdb_warn("failed to read ql_srb_t"
965 					    " at %p", srb->lun_queue);
966 					break;
967 				}
968 				nextlink = get_first_link(&lq->cmd, lqlink);
969 				/*
970 				 * traverse the lun cmd linked list looking
971 				 * for the srb from the targets watchdog list
972 				 */
973 				while (nextlink == DCMD_OK) {
974 					if (srblink->base_address ==
975 					    lqlink->base_address) {
976 						mdb_printf("on lun %d cmd q\n",
977 						    lq->lun_no);
978 						found = 1;
979 						break;
980 					}
981 					/* get next item on lun cmd list */
982 					nextlink = get_next_link(lqlink);
983 				}
984 				if (!found) {
985 					mdb_printf("not found on lun cmd q\n");
986 				}
987 				/* get next item in the watchdog list */
988 				nextlink = get_next_link(srblink);
989 			} /* End targets command watchdog list */
990 			/* get next item in this target list */
991 			nextlink = get_next_link(tqlink);
992 		} /* End traverse the device targets linked list */
993 		mdb_printf("\n");
994 	} /* End device array */
995 
996 	mdb_free(tq, sizeof (ql_tgt_t));
997 	mdb_free(lq, sizeof (ql_lun_t));
998 	mdb_free(srb, sizeof (ql_srb_t));
999 	mdb_free(tqlink, sizeof (ql_link_t));
1000 	mdb_free(srblink, sizeof (ql_link_t));
1001 	mdb_free(lqlink, sizeof (ql_link_t));
1002 	mdb_free(qlstate, sizeof (ql_adapter_state_t));
1003 	mdb_free(dev, sizeof (ql_head_t)*DEVICE_HEAD_LIST_SIZE);
1004 
1005 	return (DCMD_OK);
1006 }
1007 
1008 /*
1009  * get_first_link
1010  *	Gets the first ql_link_t header on ql_head.
1011  *
1012  * Input:
1013  *	ql_head  = pointer to a ql_head_t structure.
1014  *	ql_link  = pointer to a ql_link_t structure.
1015  *
1016  * Returns:
1017  *	DCMD_ABORT, or DCMD_OK
1018  *
1019  * Context:
1020  *	User context.
1021  *
1022  */
1023 static int
1024 get_first_link(ql_head_t *qlhead, ql_link_t *qllink)
1025 {
1026 	int	rval = DCMD_ABORT;
1027 
1028 	if (qlhead != NULL) {
1029 		if (qlhead->first != NULL) {
1030 			/* Read in the first ql_link_t header */
1031 			if (mdb_vread(qllink, sizeof (ql_link_t),
1032 			    (uintptr_t)(qlhead->first)) == -1) {
1033 				mdb_warn("failed to read ql_link_t "
1034 				    "next at %p", qlhead->first);
1035 			} else {
1036 				rval = DCMD_OK;
1037 			}
1038 		}
1039 	}
1040 	return (rval);
1041 }
1042 
1043 /*
1044  * get_next_link
1045  *	Gets the next ql_link_t structure.
1046  *
1047  * Input:
1048  *	ql_link  = pointer to a ql_link_t structure.
1049  *
1050  * Returns:
1051  *	DCMD_ABORT, or DCMD_OK
1052  *
1053  * Context:
1054  *	User context.
1055  *
1056  */
1057 static int
1058 get_next_link(ql_link_t *qllink)
1059 {
1060 	int	rval = DCMD_ABORT;
1061 
1062 	if (qllink != NULL) {
1063 		if (qllink->next != NULL) {
1064 			/* Read in the next ql_link_t header */
1065 			if (mdb_vread(qllink, sizeof (ql_link_t),
1066 			    (uintptr_t)(qllink->next)) == -1) {
1067 				mdb_warn("failed to read ql_link_t "
1068 				    "next at %p", qllink->next);
1069 			} else {
1070 				rval = DCMD_OK;
1071 			}
1072 		}
1073 	}
1074 	return (rval);
1075 }
1076 
1077 /*
1078  * qlcstate_dcmd
1079  *	mdb dcmd which prints out the ql_state info using
1080  *	caller supplied address.
1081  *
1082  * Input:
1083  *	addr  = User supplied address.
1084  *	flags = mdb flags.
1085  *	argc  = Number of user supplied args.
1086  *	argv  = Arg array.
1087  *
1088  * Returns:
1089  *	DCMD_USAGE, or DCMD_OK
1090  *
1091  * Context:
1092  *	User context.
1093  *
1094  */
1095 static int
1096 qlcstate_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
1097 {
1098 	ql_adapter_state_t	*qlstate;
1099 	int			verbose = 0;
1100 
1101 	if (!(flags & DCMD_ADDRSPEC)) {
1102 		return (DCMD_USAGE);
1103 	}
1104 
1105 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose) !=
1106 	    argc) {
1107 		return (DCMD_USAGE);
1108 	}
1109 
1110 	if ((qlstate = (ql_adapter_state_t *)
1111 	    mdb_alloc(sizeof (ql_adapter_state_t), UM_SLEEP)) == NULL) {
1112 		mdb_warn("failed to allocate memory for ql_adapter_state\n");
1113 		return (DCMD_OK);
1114 	}
1115 	if (mdb_vread(qlstate, sizeof (ql_adapter_state_t), addr) == -1) {
1116 		mdb_free(qlstate, sizeof (ql_adapter_state_t));
1117 		mdb_warn("failed to read ql_adapter_state at %p", addr);
1118 		return (DCMD_OK);
1119 	}
1120 
1121 	mdb_printf("qlc instance: %d, base addr = %llx\n", qlstate->instance,
1122 	    addr);
1123 
1124 	mdb_printf("\nadapter state flags:\n");
1125 	ql_dump_flags((uint64_t)qlstate->flags, adapter_state_flags);
1126 	mdb_printf("\nadapter cfg flags:\n");
1127 	ql_dump_flags((uint64_t)qlstate->cfg_flags, adapter_config_flags);
1128 	mdb_printf("\ntask daemon state flags:\n");
1129 	ql_dump_flags((uint64_t)qlstate->task_daemon_flags,
1130 	    task_daemon_flags);
1131 
1132 	if (verbose) {
1133 		(void) ql_doprint(addr, "struct ql_adapter_state");
1134 	}
1135 
1136 	mdb_free(qlstate, sizeof (ql_adapter_state_t));
1137 
1138 	return (DCMD_OK);
1139 }
1140 
1141 /*
1142  * qlcstates_walk_init
1143  *	mdb walker init which prints out all qlc states info.
1144  *
1145  * Input:
1146  *	wsp - Pointer to walker state struct
1147  *
1148  * Returns:
1149  *	WALK_ERR, or WALK_NEXT
1150  *
1151  * Context:
1152  *	User context.
1153  *
1154  */
1155 static int
1156 qlstates_walk_init(mdb_walk_state_t *wsp)
1157 {
1158 	ql_head_t	ql_hba;
1159 
1160 	if (wsp->walk_addr == NULL) {
1161 		if ((mdb_readvar(&ql_hba, "ql_hba") == -1) ||
1162 		    (&ql_hba == NULL)) {
1163 			mdb_warn("failed to read ql_hba structure");
1164 			return (WALK_ERR);
1165 		}
1166 
1167 		wsp->walk_addr = (uintptr_t)ql_hba.first;
1168 		wsp->walk_data = mdb_alloc(sizeof (ql_adapter_state_t),
1169 		    UM_SLEEP);
1170 		return (WALK_NEXT);
1171 	} else {
1172 		return (ql_doprint(wsp->walk_addr, "struct ql_adapter_state"));
1173 	}
1174 }
1175 
1176 /*
1177  * qlstates_walk_step
1178  *	mdb walker step which prints out all qlc states info.
1179  *
1180  * Input:
1181  *	wsp - Pointer to walker state struct
1182  *
1183  * Returns:
1184  *	WALK_DONE, or WALK_NEXT
1185  *
1186  * Context:
1187  *	User context.
1188  *
1189  */
1190 static int
1191 qlstates_walk_step(mdb_walk_state_t *wsp)
1192 {
1193 	ql_adapter_state_t	*qlstate;
1194 
1195 	if (wsp->walk_addr == NULL) {
1196 		return (WALK_DONE);
1197 	}
1198 
1199 	if (mdb_vread(wsp->walk_data, sizeof (ql_adapter_state_t),
1200 	    wsp->walk_addr) == -1) {
1201 		mdb_warn("failed to read ql_adapter_state at %p",
1202 		    wsp->walk_addr);
1203 		return (WALK_DONE);
1204 	}
1205 
1206 	qlstate = (ql_adapter_state_t *)(wsp->walk_data);
1207 	mdb_printf("qlc instance: %d, base addr = %llx\n",
1208 	    qlstate->instance, wsp->walk_addr);
1209 
1210 	mdb_printf("\nadapter state flags:\n");
1211 	ql_dump_flags((uint64_t)qlstate->flags, adapter_state_flags);
1212 	mdb_printf("\nadapter cfg flags:\n");
1213 	ql_dump_flags((uint64_t)qlstate->cfg_flags, adapter_config_flags);
1214 	mdb_printf("\ntask daemon state flags:\n");
1215 	ql_dump_flags((uint64_t)qlstate->task_daemon_flags,
1216 	    task_daemon_flags);
1217 
1218 	mdb_printf("\nadapter state:\n");
1219 	(void) ql_doprint(wsp->walk_addr, "struct ql_adapter_state");
1220 
1221 	mdb_printf("\n");
1222 
1223 	wsp->walk_addr = (uintptr_t)
1224 	    (((ql_adapter_state_t *)wsp->walk_data)->hba.next);
1225 
1226 	return (WALK_NEXT);
1227 }
1228 
1229 /*
1230  * qlstates_walk_fini
1231  *	mdb walker fini which wraps up the walker
1232  *
1233  * Input:
1234  *	wsp - Pointer to walker state struct
1235  *
1236  * Returns:
1237  *
1238  * Context:
1239  *	User context.
1240  *
1241  */
1242 static void
1243 qlstates_walk_fini(mdb_walk_state_t *wsp)
1244 {
1245 	mdb_free(wsp->walk_data, sizeof (ql_adapter_state_t));
1246 }
1247 
1248 /*
1249  * qlsrb_walk_init
1250  *	mdb walker init which prints out linked srb's
1251  *
1252  * Input:
1253  *	wsp - Pointer to walker ql_srb struct
1254  *
1255  * Returns:
1256  *	WALK_ERR, or WALK_NEXT
1257  *
1258  * Context:
1259  *	User context.
1260  *
1261  */
1262 static int
1263 qlsrb_walk_init(mdb_walk_state_t *wsp)
1264 {
1265 	if (wsp->walk_addr == NULL) {
1266 		mdb_warn("failed to read ql_srb addr at %p",
1267 		    wsp->walk_addr);
1268 		return (WALK_ERR);
1269 	}
1270 
1271 	wsp->walk_data = mdb_alloc(sizeof (ql_srb_t), UM_SLEEP);
1272 
1273 	return (WALK_NEXT);
1274 }
1275 
1276 /*
1277  * qlcsrb_walk_step
1278  *	mdb walker step which prints out linked ql_srb structures
1279  *
1280  * Input:
1281  *	wsp - Pointer to walker srb struct
1282  *
1283  * Returns:
1284  *	WALK_DONE, or WALK_NEXT
1285  *
1286  * Context:
1287  *	User context.
1288  *
1289  */
1290 static int
1291 qlsrb_walk_step(mdb_walk_state_t *wsp)
1292 {
1293 	ql_srb_t	*qlsrb;
1294 
1295 	if (wsp->walk_addr == NULL)
1296 		return (WALK_DONE);
1297 
1298 	if (mdb_vread(wsp->walk_data, sizeof (ql_srb_t),
1299 	    wsp->walk_addr) == -1) {
1300 		mdb_warn("failed to read ql_srb at %p", wsp->walk_addr);
1301 		return (WALK_DONE);
1302 	}
1303 
1304 	qlsrb = (ql_srb_t *)(wsp->walk_data);
1305 	mdb_printf("ql_srb base addr = %llx\n", wsp->walk_addr);
1306 
1307 	mdb_printf("\nql_srb flags:\n");
1308 	ql_dump_flags((uint64_t)qlsrb->flags, qlsrb_flags);
1309 
1310 	mdb_printf("\nql_srb:\n");
1311 	(void) ql_doprint(wsp->walk_addr, "struct ql_srb");
1312 
1313 	mdb_printf("\n");
1314 
1315 	wsp->walk_addr = (uintptr_t)
1316 	    (((ql_srb_t *)wsp->walk_data)->cmd.next);
1317 
1318 	return (WALK_NEXT);
1319 }
1320 
1321 /*
1322  * qlsrb_walk_fini
1323  *	mdb walker fini which wraps up the walker
1324  *
1325  * Input:
1326  *	wsp - Pointer to walker state struct
1327  *
1328  * Returns:
1329  *
1330  * Context:
1331  *	User context.
1332  *
1333  */
1334 static void
1335 qlsrb_walk_fini(mdb_walk_state_t *wsp)
1336 {
1337 	mdb_free(wsp->walk_data, sizeof (ql_srb_t));
1338 }
1339 
1340 /*
1341  * qllunq_dcmd
1342  *	mdb walker which prints out lun q's
1343  *
1344  * Input:
1345  *	wsp - Pointer to walker ql_lun struct
1346  *
1347  * Returns:
1348  *	WALK_ERR, or WALK_NEXT
1349  *
1350  * Context:
1351  *	User context.
1352  *
1353  */
1354 static int
1355 qllunq_walk_init(mdb_walk_state_t *wsp)
1356 {
1357 	if (wsp->walk_addr == NULL) {
1358 		mdb_warn("failed to read ql_lun addr at %p",
1359 		    wsp->walk_addr);
1360 		return (WALK_ERR);
1361 	}
1362 
1363 	wsp->walk_data = mdb_alloc(sizeof (ql_lun_t), UM_SLEEP);
1364 
1365 	return (WALK_NEXT);
1366 }
1367 
1368 /*
1369  * qlclunq_walk_step
1370  *	mdb walker step which prints out linked ql_lun structures
1371  *
1372  * Input:
1373  *	wsp - Pointer to walker srb struct
1374  *
1375  * Returns:
1376  *	WALK_DONE, or WALK_NEXT
1377  *
1378  * Context:
1379  *	User context.
1380  *
1381  */
1382 static int
1383 qllunq_walk_step(mdb_walk_state_t *wsp)
1384 {
1385 	ql_lun_t	*qllun;
1386 	ql_link_t	ql_link;
1387 	ql_link_t	*qllink;
1388 
1389 	if (wsp->walk_addr == NULL)
1390 		return (WALK_DONE);
1391 
1392 	if (mdb_vread(wsp->walk_data, sizeof (ql_lun_t),
1393 	    wsp->walk_addr) == -1) {
1394 		mdb_warn("failed to read ql_lun at %p", wsp->walk_addr);
1395 		return (WALK_DONE);
1396 	}
1397 
1398 	qllun = (ql_lun_t *)(wsp->walk_data);
1399 	mdb_printf("ql_lun base addr = %llx\n", wsp->walk_addr);
1400 
1401 	mdb_printf("\nql_lun flags:\n");
1402 	ql_dump_flags((uint64_t)qllun->flags, qllun_flags);
1403 
1404 	mdb_printf("\nql_lun:\n");
1405 	(void) ql_doprint(wsp->walk_addr, "struct ql_lun");
1406 
1407 	mdb_printf("\n");
1408 
1409 	qllink = (ql_link_t *)
1410 	    (((ql_lun_t *)wsp->walk_data)->link.next);
1411 
1412 	if (qllink == NULL) {
1413 		return (WALK_DONE);
1414 	} else {
1415 		/*
1416 		 * Read in the next link_t header
1417 		 */
1418 		if (mdb_vread(&ql_link, sizeof (ql_link_t),
1419 		    (uintptr_t)qllink) == -1) {
1420 			mdb_warn("failed to read ql_link_t "
1421 			    "next at %p", qllink->next);
1422 			return (WALK_DONE);
1423 		}
1424 		qllink = &ql_link;
1425 	}
1426 
1427 	wsp->walk_addr = (uintptr_t)qllink->base_address;
1428 
1429 	return (WALK_NEXT);
1430 }
1431 
1432 /*
1433  * qllunq_walk_fini
1434  *	mdb walker fini which wraps up the walker
1435  *
1436  * Input:
1437  *	wsp - Pointer to walker state struct
1438  *
1439  * Returns:
1440  *
1441  * Context:
1442  *	User context.
1443  *
1444  */
1445 static void
1446 qllunq_walk_fini(mdb_walk_state_t *wsp)
1447 {
1448 	mdb_free(wsp->walk_data, sizeof (ql_lun_t));
1449 }
1450 
1451 /*
1452  * qltgtq_dcmd
1453  *	mdb dcmd which prints out an hs's tq struct info.
1454  *
1455  * Input:
1456  *	addr  = User supplied address. (NB: nust be an ha)
1457  *	flags = mdb flags.
1458  *	argc  = Number of user supplied args.
1459  *	argv  = Arg array.
1460  *
1461  * Returns:
1462  *	DCMD_USAGE, or DCMD_OK
1463  *
1464  * Context:
1465  *	User context.
1466  *
1467  */
1468 /*ARGSUSED*/
1469 static int
1470 qltgtq_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
1471 {
1472 	ql_adapter_state_t	*ha;
1473 	ql_link_t		*link;
1474 	ql_tgt_t		*tq;
1475 	uint32_t		index;
1476 	ql_head_t		*dev;
1477 
1478 	if ((!(flags & DCMD_ADDRSPEC)) || addr == NULL) {
1479 		mdb_warn("ql_hba structure addr is required");
1480 		return (DCMD_USAGE);
1481 	}
1482 
1483 	/*
1484 	 * Get the adapter state struct which was passed
1485 	 */
1486 
1487 	ha = (ql_adapter_state_t *)mdb_alloc(sizeof (ql_adapter_state_t),
1488 	    UM_SLEEP);
1489 
1490 	if (mdb_vread(ha, sizeof (ql_adapter_state_t), addr) == -1) {
1491 		mdb_warn("failed to read ql_adapter_state at %p", addr);
1492 		mdb_free(ha, sizeof (ql_adapter_state_t));
1493 		return (DCMD_OK);
1494 	}
1495 
1496 	if (ha->dev == NULL) {
1497 		mdb_warn("dev ptr is NULL for ha: %p", addr);
1498 		mdb_free(ha, sizeof (ql_adapter_state_t));
1499 		return (DCMD_OK);
1500 	}
1501 
1502 	/*
1503 	 * Read in the device array
1504 	 */
1505 	dev = (ql_head_t *)
1506 	    mdb_alloc(sizeof (ql_head_t) * DEVICE_HEAD_LIST_SIZE, UM_SLEEP);
1507 
1508 	if (mdb_vread(dev, sizeof (ql_head_t) * DEVICE_HEAD_LIST_SIZE,
1509 	    (uintptr_t)ha->dev) == -1) {
1510 		mdb_warn("failed to read ql_head_t (dev) at %p", ha->dev);
1511 		mdb_free(ha, sizeof (ql_adapter_state_t));
1512 		mdb_free(dev, sizeof (ql_head_t) * DEVICE_HEAD_LIST_SIZE);
1513 	}
1514 
1515 	tq = (ql_tgt_t *)mdb_alloc(sizeof (ql_tgt_t), UM_SLEEP);
1516 	link = (ql_link_t *)mdb_alloc(sizeof (ql_link_t), UM_SLEEP);
1517 
1518 	for (index = 0; index < DEVICE_HEAD_LIST_SIZE; index++) {
1519 
1520 		if (dev[index].first == NULL) {
1521 			continue;
1522 		}
1523 
1524 		if (mdb_vread(link, sizeof (ql_link_t),
1525 		    (uintptr_t)dev[index].first) == -1) {
1526 			mdb_warn("failed to read ql_link_t at %p",
1527 			    dev[index].first);
1528 			break;
1529 		}
1530 
1531 		while (link != NULL) {
1532 			if (mdb_vread(tq, sizeof (ql_tgt_t),
1533 			    (uintptr_t)(link->base_address)) == -1) {
1534 				mdb_warn("failed to read ql_tgt at %p",
1535 				    link->base_address);
1536 				break;
1537 			}
1538 
1539 			mdb_printf("tgt queue base addr = %llx\n",
1540 			    link->base_address);
1541 
1542 			mdb_printf("\ntgt queue flags: (%xh)\n", tq->flags);
1543 			ql_dump_flags((uint64_t)tq->flags, qltgt_flags);
1544 
1545 			mdb_printf("\ntgt queue:\n");
1546 
1547 			(void) ql_doprint((uintptr_t)link->base_address,
1548 			    "struct ql_target");
1549 
1550 			mdb_printf("\n");
1551 
1552 			if (get_next_link(link) != DCMD_OK) {
1553 				break;
1554 			}
1555 		}
1556 	}
1557 
1558 	mdb_free(ha, sizeof (ql_adapter_state_t));
1559 	mdb_free(tq, sizeof (ql_tgt_t));
1560 	mdb_free(link, sizeof (ql_link_t));
1561 	mdb_free(dev, sizeof (ql_head_t)*DEVICE_HEAD_LIST_SIZE);
1562 
1563 	return (DCMD_OK);
1564 }
1565 
1566 /*
1567  * ql_triggerdump_dcmd
1568  *	Triggers the driver to take a firmware dump
1569  *
1570  * Input:
1571  *	addr  = User supplied address (optional)
1572  *	flags = mdb flags.
1573  *	argc  = Number of user supplied args.
1574  *	argv  = Arg array (instance #, optional).
1575  *
1576  * Returns:
1577  *	DCMD_OK or DCMD_ERR
1578  *
1579  * Context:
1580  *	User context.
1581  *
1582  */
1583 
1584 #if 0
1585 
1586 /*ARGSUSED*/
1587 static int
1588 qlc_triggerdump_dcmd(uintptr_t addr, uint_t flags, int argc,
1589     const mdb_arg_t *argv)
1590 {
1591 	ql_adapter_state_t	*qlstate;
1592 	uintptr_t		hbaptr = NULL;
1593 	ql_head_t		ql_hba;
1594 	uint32_t		qlsize = sizeof (ql_adapter_state_t);
1595 	int			mdbs;
1596 
1597 	if ((mdbs = mdb_get_state()) == MDB_STATE_DEAD) {
1598 		mdb_warn("Cannot change core file data (state=%xh)\n", mdbs);
1599 		return (DCMD_OK);
1600 	}
1601 
1602 	if ((qlstate = (ql_adapter_state_t *)mdb_alloc(qlsize,
1603 	    UM_SLEEP)) == NULL) {
1604 		mdb_warn("Unable to allocate memory for ql_adapter_state\n");
1605 		return (DCMD_OK);
1606 	}
1607 
1608 	if (addr == NULL) {
1609 		char		*tptr;
1610 		uint32_t	instance;
1611 
1612 		if (argc == 0) {
1613 			mdb_warn("must specify either the ha addr or "
1614 			    "the instance number\n");
1615 			mdb_free(qlstate, qlsize);
1616 			return (DCMD_OK);
1617 		}
1618 
1619 		/*
1620 		 * find the specified instance in the ha list
1621 		 */
1622 
1623 		instance = (uint32_t)strtol(argv[1].a_un.a_str, &tptr, 16);
1624 		if (tptr == argv[1].a_un.a_str) {
1625 			mdb_printf("instance # is illegal: '%s'\n",
1626 			    argv[1].a_un.a_str);
1627 			mdb_free(qlstate, qlsize);
1628 			return (DCMD_OK);
1629 		}
1630 
1631 		if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
1632 			mdb_warn("failed to read ql_hba structure");
1633 			mdb_free(qlstate, qlsize);
1634 			return (DCMD_ERR);
1635 		}
1636 
1637 		if (&ql_hba == NULL) {
1638 			mdb_warn("failed to read ql_hba structure - "
1639 			    "is qlc loaded?");
1640 			mdb_free(qlstate, qlsize);
1641 			return (DCMD_ERR);
1642 		}
1643 
1644 		hbaptr = (uintptr_t)ql_hba.first;
1645 		while (hbaptr != NULL) {
1646 
1647 			if (mdb_vread(qlstate, qlsize, hbaptr) == -1) {
1648 				mdb_free(qlstate, qlsize);
1649 				mdb_warn("failed to read "
1650 				    "ql_adapter_state at %p", hbaptr);
1651 				return (DCMD_OK);
1652 			}
1653 
1654 			if (qlstate->instance == instance) {
1655 				break;
1656 			}
1657 
1658 			hbaptr = (uintptr_t)qlstate->hba.next;
1659 		}
1660 	} else {
1661 
1662 		/*
1663 		 * verify the addr specified
1664 		 */
1665 
1666 		if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
1667 			mdb_warn("failed to read ql_hba structure");
1668 			mdb_free(qlstate, qlsize);
1669 			return (DCMD_ERR);
1670 		}
1671 
1672 		if (&ql_hba == NULL) {
1673 			mdb_warn("failed to read ql_hba structure - "
1674 			    "is qlc loaded?");
1675 			mdb_free(qlstate, qlsize);
1676 			return (DCMD_ERR);
1677 		}
1678 
1679 		hbaptr = (uintptr_t)ql_hba.first;
1680 		while (hbaptr != NULL) {
1681 
1682 			if (mdb_vread(qlstate, qlsize, hbaptr) == -1) {
1683 				mdb_free(qlstate, qlsize);
1684 				mdb_warn("failed to read "
1685 				    "ql_adapter_state at %p", hbaptr);
1686 				return (DCMD_OK);
1687 			}
1688 
1689 			if (hbaptr == addr) {
1690 				break;
1691 			}
1692 
1693 			hbaptr = (uintptr_t)qlstate->hba.next;
1694 		}
1695 	}
1696 
1697 	if (hbaptr == NULL) {
1698 		mdb_free(qlstate, qlsize);
1699 		if (argc == 0) {
1700 			mdb_warn("addr specified is not in the hba list\n");
1701 		} else {
1702 			mdb_warn("instance specified does not exist\n");
1703 		}
1704 		return (DCMD_OK);
1705 	}
1706 
1707 	if (((qlstate->ql_dump_state & QL_DUMP_VALID) != 0) ||
1708 	    (qlstate->ql_dump_ptr != NULL)) {
1709 		mdb_warn("instance %d already has a valid dump\n",
1710 		    qlstate->instance);
1711 		mdb_free(qlstate, qlsize);
1712 		return (DCMD_OK);
1713 	}
1714 }
1715 #endif
1716 
1717 /*
1718  * ql_getdump_dcmd
1719  *	prints out the firmware dump buffer
1720  *
1721  * Input:
1722  *	addr  = User supplied address. (NB: must be an ha)
1723  *	flags = mdb flags.
1724  *	argc  = Number of user supplied args.
1725  *	argv  = Arg array.
1726  *
1727  * Returns:
1728  *	DCMD_OK or DCMD_ERR
1729  *
1730  * Context:
1731  *	User context.
1732  *
1733  */
1734 static int
1735 qlc_getdump_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
1736 {
1737 	ql_adapter_state_t	*ha;
1738 	ql_head_t		ql_hba;
1739 	uintptr_t		hbaptr = NULL;
1740 	int			verbose = 0;
1741 
1742 	if ((!(flags & DCMD_ADDRSPEC)) || addr == NULL) {
1743 		mdb_warn("ql_adapter_state structure addr is required");
1744 		return (DCMD_USAGE);
1745 	}
1746 
1747 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose) !=
1748 	    argc) {
1749 		return (DCMD_USAGE);
1750 	}
1751 
1752 	/*
1753 	 * Get the adapter state struct which was passed
1754 	 */
1755 	if ((ha = (ql_adapter_state_t *)mdb_alloc(sizeof (ql_adapter_state_t),
1756 	    UM_SLEEP)) == NULL) {
1757 		mdb_warn("failed to allocate memory for ql_adapter_state\n");
1758 		return (DCMD_OK);
1759 	}
1760 
1761 	/*
1762 	 * show user which instances have valid f/w dumps available if
1763 	 * user has specified verbose option
1764 	 */
1765 	if (mdb_readvar(&ql_hba, "ql_hba") == -1) {
1766 		mdb_warn("failed to read ql_hba structure");
1767 	} else if (&ql_hba == NULL) {
1768 		mdb_warn("failed to read ql_hba structure -- is qlc loaded?");
1769 	} else if (verbose) {
1770 		hbaptr = (uintptr_t)ql_hba.first;
1771 		while (hbaptr != NULL) {
1772 
1773 			if (mdb_vread(ha, sizeof (ql_adapter_state_t),
1774 			    hbaptr) == -1) {
1775 				mdb_free(ha, sizeof (ql_adapter_state_t));
1776 				mdb_warn("failed read ql_adapter_state at %p",
1777 				    hbaptr);
1778 				return (DCMD_OK);
1779 			}
1780 
1781 			mdb_printf("instance %d:\n", ha->instance);
1782 			(void) mdb_inc_indent((ulong_t)4);
1783 
1784 			if (ha->ql_dump_state == 0) {
1785 				mdb_printf("no dump flags\n");
1786 			} else {
1787 				ql_dump_flags((uint64_t)ha->ql_dump_state,
1788 				    qldump_flags);
1789 			}
1790 
1791 			if (ha->ql_dump_ptr == NULL) {
1792 				mdb_printf("no dump address\n");
1793 			} else {
1794 				mdb_printf("dump address is: %p\n",
1795 				    ha->ql_dump_ptr);
1796 			}
1797 
1798 			(void) mdb_dec_indent((ulong_t)4);
1799 
1800 			hbaptr = (uintptr_t)ha->hba.next;
1801 		}
1802 		mdb_printf("\n");
1803 	}
1804 
1805 	if (mdb_vread(ha, sizeof (ql_adapter_state_t), addr) == -1) {
1806 		mdb_warn("failed to read ql_adapter_state at %p", addr);
1807 		mdb_free(ha, sizeof (ql_adapter_state_t));
1808 		return (DCMD_OK);
1809 	}
1810 
1811 	/*
1812 	 * If its not a valid dump or there's not a f/w dump binary (???)
1813 	 * then bail out
1814 	 */
1815 	if (((ha->ql_dump_state & QL_DUMP_VALID) == 0) ||
1816 	    (ha->ql_dump_ptr == NULL)) {
1817 		mdb_warn("dump does not exist for instance %d (%x, %p)\n",
1818 		    ha->instance, ha->ql_dump_state, ha->ql_dump_ptr);
1819 		mdb_free(ha, sizeof (ql_adapter_state_t));
1820 		return (DCMD_OK);
1821 	}
1822 
1823 	if (CFG_IST(ha, CFG_CTRL_2422)) {
1824 		(void) ql_24xx_dump_dcmd(ha, flags, argc, argv);
1825 	} else if (CFG_IST(ha, CFG_CTRL_25XX))  {
1826 		(void) ql_25xx_dump_dcmd(ha, flags, argc, argv);
1827 	} else if (CFG_IST(ha, CFG_CTRL_81XX))  {
1828 		(void) ql_81xx_dump_dcmd(ha, flags, argc, argv);
1829 	} else if (!(CFG_IST(ha, CFG_CTRL_8021)))  {
1830 		(void) ql_23xx_dump_dcmd(ha, flags, argc, argv);
1831 	}
1832 
1833 	mdb_free(ha, sizeof (ql_adapter_state_t));
1834 
1835 	return (DCMD_OK);
1836 }
1837 
1838 /*
1839  * ql_23xx_dump_dcmd
1840  *	prints out a firmware dump buffer
1841  *
1842  * Input:
1843  *	addr  = User supplied address. (NB: nust be an ha)
1844  *	flags = mdb flags.
1845  *	argc  = Number of user supplied args.
1846  *	argv  = Arg array.
1847  *
1848  * Returns:
1849  *	DCMD_OK or DCMD_ERR
1850  *
1851  * Context:
1852  *	User context.
1853  *
1854  */
1855 /*ARGSUSED*/
1856 static int
1857 ql_23xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
1858     const mdb_arg_t *argv)
1859 {
1860 	ql_fw_dump_t	*fw;
1861 	uint32_t	cnt = 0;
1862 	int		mbox_cnt;
1863 
1864 	fw = (ql_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
1865 
1866 	if (mdb_vread(fw, ha->ql_dump_size,
1867 	    (uintptr_t)ha->ql_dump_ptr) == -1) {
1868 		mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
1869 		mdb_free(fw, ha->ql_dump_size);
1870 		return (DCMD_OK);
1871 	}
1872 
1873 	if (ha->cfg_flags & CFG_CTRL_2300) {
1874 		mdb_printf("\nISP 2300IP ");
1875 	} else if (ha->cfg_flags & CFG_CTRL_6322) {
1876 		mdb_printf("\nISP 6322FLX ");
1877 	} else {
1878 		mdb_printf("\nISP 2200IP ");
1879 	}
1880 
1881 	mdb_printf("Firmware Version %d.%d.%d\n",
1882 	    ha->fw_major_version, ha->fw_minor_version,
1883 	    ha->fw_subminor_version);
1884 
1885 	mdb_printf("\nPBIU Registers:");
1886 	for (cnt = 0; cnt < sizeof (fw->pbiu_reg) / 2; cnt++) {
1887 		if (cnt % 8 == 0) {
1888 			mdb_printf("\n");
1889 		}
1890 		mdb_printf("%04x  ", fw->pbiu_reg[cnt]);
1891 	}
1892 
1893 	if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
1894 		mdb_printf("\n\nReqQ-RspQ-Risc2Host Status registers:");
1895 		for (cnt = 0; cnt < sizeof (fw->risc_host_reg) / 2; cnt++) {
1896 			if (cnt % 8 == 0) {
1897 				mdb_printf("\n");
1898 			}
1899 			mdb_printf("%04x  ", fw->risc_host_reg[cnt]);
1900 		}
1901 	}
1902 
1903 	mdb_printf("\n\nMailbox Registers:");
1904 	mbox_cnt = (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) ? 16 : 8;
1905 	for (cnt = 0; cnt < mbox_cnt; cnt++) {
1906 		if (cnt % 8 == 0) {
1907 			mdb_printf("\n");
1908 		}
1909 		mdb_printf("%04x  ", fw->mailbox_reg[cnt]);
1910 	}
1911 
1912 	if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
1913 		mdb_printf("\n\nAuto Request Response DMA Registers:");
1914 		for (cnt = 0; cnt < sizeof (fw->resp_dma_reg) / 2; cnt++) {
1915 			if (cnt % 8 == 0) {
1916 				mdb_printf("\n");
1917 			}
1918 			mdb_printf("%04x  ", fw->resp_dma_reg[cnt]);
1919 		}
1920 	}
1921 
1922 	mdb_printf("\n\nDMA Registers:");
1923 	for (cnt = 0; cnt < sizeof (fw->dma_reg) / 2; cnt++) {
1924 		if (cnt % 8 == 0) {
1925 			mdb_printf("\n");
1926 		}
1927 		mdb_printf("%04x  ", fw->dma_reg[cnt]);
1928 	}
1929 
1930 	mdb_printf("\n\nRISC Hardware Registers:");
1931 	for (cnt = 0; cnt < sizeof (fw->risc_hdw_reg) / 2; cnt++) {
1932 		if (cnt % 8 == 0) {
1933 			mdb_printf("\n");
1934 		}
1935 		mdb_printf("%04x  ", fw->risc_hdw_reg[cnt]);
1936 	}
1937 
1938 	mdb_printf("\n\nRISC GP0 Registers:");
1939 	for (cnt = 0; cnt < sizeof (fw->risc_gp0_reg) / 2; cnt++) {
1940 		if (cnt % 8 == 0) {
1941 			mdb_printf("\n");
1942 		}
1943 		mdb_printf("%04x  ", fw->risc_gp0_reg[cnt]);
1944 	}
1945 
1946 	mdb_printf("\n\nRISC GP1 Registers:");
1947 	for (cnt = 0; cnt < sizeof (fw->risc_gp1_reg) / 2; cnt++) {
1948 		if (cnt % 8 == 0) {
1949 			mdb_printf("\n");
1950 		}
1951 		mdb_printf("%04x  ", fw->risc_gp1_reg[cnt]);
1952 	}
1953 
1954 	mdb_printf("\n\nRISC GP2 Registers:");
1955 	for (cnt = 0; cnt < sizeof (fw->risc_gp2_reg) / 2; cnt++) {
1956 		if (cnt % 8 == 0) {
1957 			mdb_printf("\n");
1958 		}
1959 		mdb_printf("%04x  ", fw->risc_gp2_reg[cnt]);
1960 	}
1961 
1962 	mdb_printf("\n\nRISC GP3 Registers:");
1963 	for (cnt = 0; cnt < sizeof (fw->risc_gp3_reg) / 2; cnt++) {
1964 		if (cnt % 8 == 0) {
1965 			mdb_printf("\n");
1966 		}
1967 		mdb_printf("%04x  ", fw->risc_gp3_reg[cnt]);
1968 	}
1969 
1970 	mdb_printf("\n\nRISC GP4 Registers:");
1971 	for (cnt = 0; cnt < sizeof (fw->risc_gp4_reg) / 2; cnt++) {
1972 		if (cnt % 8 == 0) {
1973 			mdb_printf("\n");
1974 		}
1975 		mdb_printf("%04x  ", fw->risc_gp4_reg[cnt]);
1976 	}
1977 
1978 	mdb_printf("\n\nRISC GP5 Registers:");
1979 	for (cnt = 0; cnt < sizeof (fw->risc_gp5_reg) / 2; cnt++) {
1980 		if (cnt % 8 == 0) {
1981 			mdb_printf("\n");
1982 		}
1983 		mdb_printf("%04x  ", fw->risc_gp5_reg[cnt]);
1984 	}
1985 
1986 	mdb_printf("\n\nRISC GP6 Registers:");
1987 	for (cnt = 0; cnt < sizeof (fw->risc_gp6_reg) / 2; cnt++) {
1988 		if (cnt % 8 == 0) {
1989 			mdb_printf("\n");
1990 		}
1991 		mdb_printf("%04x  ", fw->risc_gp6_reg[cnt]);
1992 	}
1993 
1994 	mdb_printf("\n\nRISC GP7 Registers:");
1995 	for (cnt = 0; cnt < sizeof (fw->risc_gp7_reg) / 2; cnt++) {
1996 		if (cnt % 8 == 0) {
1997 			mdb_printf("\n");
1998 		}
1999 		mdb_printf("%04x  ", fw->risc_gp7_reg[cnt]);
2000 	}
2001 
2002 	mdb_printf("\n\nFrame Buffer Hardware Registers:");
2003 	for (cnt = 0; cnt < sizeof (fw->frame_buf_hdw_reg) / 2; cnt++) {
2004 		if ((cnt == 16) &&
2005 		    ((ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) == 0)) {
2006 			break;
2007 		}
2008 		if (cnt % 8 == 0) {
2009 			mdb_printf("\n");
2010 		}
2011 		mdb_printf("%04x  ", fw->frame_buf_hdw_reg[cnt]);
2012 	}
2013 
2014 	mdb_printf("\n\nFPM B0 Registers:");
2015 	for (cnt = 0; cnt < sizeof (fw->fpm_b0_reg) / 2; cnt++) {
2016 		if (cnt % 8 == 0) {
2017 			mdb_printf("\n");
2018 		}
2019 		mdb_printf("%04x  ", fw->fpm_b0_reg[cnt]);
2020 	}
2021 
2022 	mdb_printf("\n\nFPM B1 Registers:");
2023 	for (cnt = 0; cnt < sizeof (fw->fpm_b1_reg) / 2; cnt++) {
2024 		if (cnt % 8 == 0) {
2025 			mdb_printf("\n");
2026 		}
2027 		mdb_printf("%04x  ", fw->fpm_b1_reg[cnt]);
2028 	}
2029 
2030 	if (ha->cfg_flags & (CFG_CTRL_2300 | CFG_CTRL_6322)) {
2031 		mdb_printf("\n\nCode RAM Dump:");
2032 		for (cnt = 0; cnt < sizeof (fw->risc_ram) / 2; cnt++) {
2033 			if (cnt % 8 == 0) {
2034 				mdb_printf("\n%05x: ", cnt + 0x0800);
2035 			}
2036 			mdb_printf("%04x  ", fw->risc_ram[cnt]);
2037 		}
2038 
2039 		mdb_printf("\n\nStack RAM Dump:");
2040 		for (cnt = 0; cnt < sizeof (fw->stack_ram) / 2; cnt++) {
2041 			if (cnt % 8 == 0) {
2042 				mdb_printf("\n%05x: ", cnt + 0x010000);
2043 			}
2044 			mdb_printf("%04x  ", fw->stack_ram[cnt]);
2045 		}
2046 
2047 		mdb_printf("\n\nData RAM Dump:");
2048 		for (cnt = 0; cnt < sizeof (fw->data_ram) / 2; cnt++) {
2049 			if (cnt % 8 == 0) {
2050 				mdb_printf("\n%05x: ", cnt + 0x010800);
2051 			}
2052 			mdb_printf("%04x  ", fw->data_ram[cnt]);
2053 		}
2054 
2055 		mdb_printf("\n\n[<==END] ISP Debug Dump.\n");
2056 
2057 		mdb_printf("\n\nRequest Queue");
2058 
2059 		for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
2060 			if (cnt % 8 == 0) {
2061 				mdb_printf("\n%08x: ", cnt);
2062 			}
2063 			mdb_printf("%08x ", fw->req_q[cnt]);
2064 		}
2065 
2066 		mdb_printf("\n\nResponse Queue");
2067 
2068 		for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
2069 			if (cnt % 8 == 0) {
2070 				mdb_printf("\n%08x: ", cnt);
2071 			}
2072 			mdb_printf("%08x ", fw->rsp_q[cnt]);
2073 		}
2074 
2075 		mdb_printf("\n");
2076 
2077 	} else {
2078 		mdb_printf("\n\nRISC SRAM:");
2079 		for (cnt = 0; cnt < 0xf000; cnt++) {
2080 			if (cnt % 8 == 0) {
2081 				mdb_printf("\n%04x: ", cnt + 0x1000);
2082 			}
2083 			mdb_printf("%04x  ", fw->risc_ram[cnt]);
2084 		}
2085 	}
2086 
2087 	mdb_free(fw, ha->ql_dump_size);
2088 
2089 	return (DCMD_OK);
2090 }
2091 
2092 /*
2093  * ql_24xx_dump_dcmd
2094  *	prints out a firmware dump buffer
2095  *
2096  * Input:
2097  *	addr  = User supplied address. (NB: nust be an ha)
2098  *	flags = mdb flags.
2099  *	argc  = Number of user supplied args.
2100  *	argv  = Arg array.
2101  *
2102  * Returns:
2103  *	DCMD_OK or DCMD_ERR
2104  *
2105  * Context:
2106  *	User context.
2107  *
2108  */
2109 /*ARGSUSED*/
2110 static int
2111 ql_24xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
2112     const mdb_arg_t *argv)
2113 {
2114 	ql_24xx_fw_dump_t	*fw;
2115 	uint32_t		cnt = 0;
2116 
2117 	fw = (ql_24xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
2118 
2119 	if (mdb_vread(fw, ha->ql_dump_size,
2120 	    (uintptr_t)ha->ql_dump_ptr) == -1) {
2121 		mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
2122 		mdb_free(fw, ha->ql_dump_size);
2123 		return (DCMD_OK);
2124 	}
2125 
2126 	mdb_printf("ISP FW Version %d.%02d.%02d Attributes %X\n",
2127 	    ha->fw_major_version, ha->fw_minor_version,
2128 	    ha->fw_subminor_version, ha->fw_attributes);
2129 
2130 	mdb_printf("\nHCCR Register\n%08x\n", fw->hccr);
2131 
2132 	mdb_printf("\nHost Interface Registers");
2133 	for (cnt = 0; cnt < sizeof (fw->host_reg) / 4; cnt++) {
2134 		if (cnt % 8 == 0) {
2135 			mdb_printf("\n");
2136 		}
2137 		mdb_printf("%08x ", fw->host_reg[cnt]);
2138 	}
2139 
2140 	mdb_printf("\n\nMailbox Registers");
2141 	for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
2142 		if (cnt % 16 == 0) {
2143 			mdb_printf("\n");
2144 		}
2145 		mdb_printf("%04x ", fw->mailbox_reg[cnt]);
2146 	}
2147 
2148 	mdb_printf("\n\nXSEQ GP Registers");
2149 	for (cnt = 0; cnt < sizeof (fw->xseq_gp_reg) / 4; cnt++) {
2150 		if (cnt % 8 == 0) {
2151 			mdb_printf("\n");
2152 		}
2153 		mdb_printf("%08x ", fw->xseq_gp_reg[cnt]);
2154 	}
2155 
2156 	mdb_printf("\n\nXSEQ-0 Registers");
2157 	for (cnt = 0; cnt < sizeof (fw->xseq_0_reg) / 4; cnt++) {
2158 		if (cnt % 8 == 0) {
2159 			mdb_printf("\n");
2160 		}
2161 		mdb_printf("%08x ", fw->xseq_0_reg[cnt]);
2162 	}
2163 
2164 	mdb_printf("\n\nXSEQ-1 Registers");
2165 	for (cnt = 0; cnt < sizeof (fw->xseq_1_reg) / 4; cnt++) {
2166 		if (cnt % 8 == 0) {
2167 			mdb_printf("\n");
2168 		}
2169 		mdb_printf("%08x ", fw->xseq_1_reg[cnt]);
2170 	}
2171 
2172 	mdb_printf("\n\nRSEQ GP Registers");
2173 	for (cnt = 0; cnt < sizeof (fw->rseq_gp_reg) / 4; cnt++) {
2174 		if (cnt % 8 == 0) {
2175 			mdb_printf("\n");
2176 		}
2177 		mdb_printf("%08x ", fw->rseq_gp_reg[cnt]);
2178 	}
2179 
2180 	mdb_printf("\n\nRSEQ-0 Registers");
2181 	for (cnt = 0; cnt < sizeof (fw->rseq_0_reg) / 4; cnt++) {
2182 		if (cnt % 8 == 0) {
2183 			mdb_printf("\n");
2184 		}
2185 		mdb_printf("%08x ", fw->rseq_0_reg[cnt]);
2186 	}
2187 
2188 	mdb_printf("\n\nRSEQ-1 Registers");
2189 	for (cnt = 0; cnt < sizeof (fw->rseq_1_reg) / 4; cnt++) {
2190 		if (cnt % 8 == 0) {
2191 			mdb_printf("\n");
2192 		}
2193 		mdb_printf("%08x ", fw->rseq_1_reg[cnt]);
2194 	}
2195 
2196 	mdb_printf("\n\nRSEQ-2 Registers");
2197 	for (cnt = 0; cnt < sizeof (fw->rseq_2_reg) / 4; cnt++) {
2198 		if (cnt % 8 == 0) {
2199 			mdb_printf("\n");
2200 		}
2201 		mdb_printf("%08x ", fw->rseq_2_reg[cnt]);
2202 	}
2203 
2204 	mdb_printf("\n\nCommand DMA Registers");
2205 	for (cnt = 0; cnt < sizeof (fw->cmd_dma_reg) / 4; cnt++) {
2206 		if (cnt % 8 == 0) {
2207 			mdb_printf("\n");
2208 		}
2209 		mdb_printf("%08x ", fw->cmd_dma_reg[cnt]);
2210 	}
2211 
2212 	mdb_printf("\n\nRequest0 Queue DMA Channel Registers");
2213 	for (cnt = 0; cnt < sizeof (fw->req0_dma_reg) / 4; cnt++) {
2214 		if (cnt % 8 == 0) {
2215 			mdb_printf("\n");
2216 		}
2217 		mdb_printf("%08x ", fw->req0_dma_reg[cnt]);
2218 	}
2219 
2220 	mdb_printf("\n\nResponse0 Queue DMA Channel Registers");
2221 	for (cnt = 0; cnt < sizeof (fw->resp0_dma_reg) / 4; cnt++) {
2222 		if (cnt % 8 == 0) {
2223 			mdb_printf("\n");
2224 		}
2225 		mdb_printf("%08x ", fw->resp0_dma_reg[cnt]);
2226 	}
2227 
2228 	mdb_printf("\n\nRequest1 Queue DMA Channel Registers");
2229 	for (cnt = 0; cnt < sizeof (fw->req1_dma_reg) / 4; cnt++) {
2230 		if (cnt % 8 == 0) {
2231 			mdb_printf("\n");
2232 		}
2233 		mdb_printf("%08x ", fw->req1_dma_reg[cnt]);
2234 	}
2235 
2236 	mdb_printf("\n\nXMT0 Data DMA Registers");
2237 	for (cnt = 0; cnt < sizeof (fw->xmt0_dma_reg) / 4; cnt++) {
2238 		if (cnt % 8 == 0) {
2239 			mdb_printf("\n");
2240 		}
2241 		mdb_printf("%08x ", fw->xmt0_dma_reg[cnt]);
2242 	}
2243 
2244 	mdb_printf("\n\nXMT1 Data DMA Registers");
2245 	for (cnt = 0; cnt < sizeof (fw->xmt1_dma_reg) / 4; cnt++) {
2246 		if (cnt % 8 == 0) {
2247 			mdb_printf("\n");
2248 		}
2249 		mdb_printf("%08x ", fw->xmt1_dma_reg[cnt]);
2250 	}
2251 
2252 	mdb_printf("\n\nXMT2 Data DMA Registers");
2253 	for (cnt = 0; cnt < sizeof (fw->xmt2_dma_reg) / 4; cnt++) {
2254 		if (cnt % 8 == 0) {
2255 			mdb_printf("\n");
2256 		}
2257 		mdb_printf("%08x ", fw->xmt2_dma_reg[cnt]);
2258 	}
2259 
2260 	mdb_printf("\n\nXMT3 Data DMA Registers");
2261 	for (cnt = 0; cnt < sizeof (fw->xmt3_dma_reg) / 4; cnt++) {
2262 		if (cnt % 8 == 0) {
2263 			mdb_printf("\n");
2264 		}
2265 		mdb_printf("%08x ", fw->xmt3_dma_reg[cnt]);
2266 	}
2267 
2268 	mdb_printf("\n\nXMT4 Data DMA Registers");
2269 	for (cnt = 0; cnt < sizeof (fw->xmt4_dma_reg) / 4; cnt++) {
2270 		if (cnt % 8 == 0) {
2271 			mdb_printf("\n");
2272 		}
2273 		mdb_printf("%08x ", fw->xmt4_dma_reg[cnt]);
2274 	}
2275 
2276 	mdb_printf("\n\nXMT Data DMA Common Registers");
2277 	for (cnt = 0; cnt < sizeof (fw->xmt_data_dma_reg) / 4; cnt++) {
2278 		if (cnt % 8 == 0) {
2279 			mdb_printf("\n");
2280 		}
2281 		mdb_printf("%08x ", fw->xmt_data_dma_reg[cnt]);
2282 	}
2283 
2284 	mdb_printf("\n\nRCV Thread 0 Data DMA Registers");
2285 	for (cnt = 0; cnt < sizeof (fw->rcvt0_data_dma_reg) / 4; cnt++) {
2286 		if (cnt % 8 == 0) {
2287 			mdb_printf("\n");
2288 		}
2289 		mdb_printf("%08x ", fw->rcvt0_data_dma_reg[cnt]);
2290 	}
2291 
2292 	mdb_printf("\n\nRCV Thread 1 Data DMA Registers");
2293 	for (cnt = 0; cnt < sizeof (fw->rcvt1_data_dma_reg) / 4; cnt++) {
2294 		if (cnt % 8 == 0) {
2295 			mdb_printf("\n");
2296 		}
2297 		mdb_printf("%08x ", fw->rcvt1_data_dma_reg[cnt]);
2298 	}
2299 
2300 	mdb_printf("\n\nRISC GP Registers");
2301 	for (cnt = 0; cnt < sizeof (fw->risc_gp_reg) / 4; cnt++) {
2302 		if (cnt % 8 == 0) {
2303 			mdb_printf("\n");
2304 		}
2305 		mdb_printf("%08x ", fw->risc_gp_reg[cnt]);
2306 	}
2307 
2308 	mdb_printf("\n\nShadow Registers");
2309 	for (cnt = 0; cnt < sizeof (fw->shadow_reg) / 4; cnt++) {
2310 		if (cnt % 8 == 0) {
2311 			mdb_printf("\n");
2312 		}
2313 		mdb_printf("%08x ", fw->shadow_reg[cnt]);
2314 	}
2315 
2316 	mdb_printf("\n\nLMC Registers");
2317 	for (cnt = 0; cnt < sizeof (fw->lmc_reg) / 4; cnt++) {
2318 		if (cnt % 8 == 0) {
2319 			mdb_printf("\n");
2320 		}
2321 		mdb_printf("%08x ", fw->lmc_reg[cnt]);
2322 	}
2323 
2324 	mdb_printf("\n\nFPM Hardware Registers");
2325 	for (cnt = 0; cnt < sizeof (fw->fpm_hdw_reg) / 4; cnt++) {
2326 		if (cnt % 8 == 0) {
2327 			mdb_printf("\n");
2328 		}
2329 		mdb_printf("%08x ", fw->fpm_hdw_reg[cnt]);
2330 	}
2331 
2332 	mdb_printf("\n\nFB Hardware Registers");
2333 	for (cnt = 0; cnt < sizeof (fw->fb_hdw_reg) / 4; cnt++) {
2334 		if (cnt % 8 == 0) {
2335 			mdb_printf("\n");
2336 		}
2337 		mdb_printf("%08x ", fw->fb_hdw_reg[cnt]);
2338 	}
2339 
2340 	mdb_printf("\n\nCode RAM");
2341 	for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
2342 		if (cnt % 8 == 0) {
2343 			mdb_printf("\n%08x: ", cnt + 0x20000);
2344 		}
2345 		mdb_printf("%08x ", fw->code_ram[cnt]);
2346 	}
2347 
2348 	mdb_printf("\n\nExternal Memory");
2349 	for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
2350 		if (cnt % 8 == 0) {
2351 			mdb_printf("\n%08x: ", cnt + 0x100000);
2352 		}
2353 		mdb_printf("%08x ", fw->ext_mem[cnt]);
2354 	}
2355 
2356 	mdb_printf("\n[<==END] ISP Debug Dump");
2357 
2358 	mdb_printf("\n\nRequest Queue");
2359 
2360 	for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
2361 		if (cnt % 8 == 0) {
2362 			mdb_printf("\n%08x: ", cnt);
2363 		}
2364 		mdb_printf("%08x ", fw->req_q[cnt]);
2365 	}
2366 
2367 	mdb_printf("\n\nResponse Queue");
2368 
2369 	for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
2370 		if (cnt % 8 == 0) {
2371 			mdb_printf("\n%08x: ", cnt);
2372 		}
2373 		mdb_printf("%08x ", fw->rsp_q[cnt]);
2374 	}
2375 
2376 	if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
2377 	    (ha->fwexttracebuf.bp != NULL)) {
2378 		uint32_t cnt_b = 0;
2379 		uint32_t *w32 = ha->fwexttracebuf.bp;
2380 
2381 		mdb_printf("\n\nExtended Trace Buffer Memory");
2382 		/* show data address as a byte address, data as long words */
2383 		for (cnt = 0; cnt < FWEXTSIZE / 4; cnt++) {
2384 			cnt_b = cnt * 4;
2385 			if (cnt_b % 32 == 0) {
2386 				mdb_printf("\n%08x: ", w32 + cnt_b);
2387 			}
2388 			mdb_printf("%08x ", fw->ext_trace_buf[cnt]);
2389 		}
2390 	}
2391 
2392 	if ((ha->cfg_flags & CFG_ENABLE_FWFCETRACE) &&
2393 	    (ha->fwfcetracebuf.bp != NULL)) {
2394 		uint32_t cnt_b = 0;
2395 		uint32_t *w32 = ha->fwfcetracebuf.bp;
2396 
2397 		mdb_printf("\n\nFC Event Trace Buffer Memory");
2398 		/* show data address as a byte address, data as long words */
2399 		for (cnt = 0; cnt < FWFCESIZE / 4; cnt++) {
2400 			cnt_b = cnt * 4;
2401 			if (cnt_b % 32 == 0) {
2402 				mdb_printf("\n%08x: ", w32 + cnt_b);
2403 			}
2404 			mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
2405 		}
2406 	}
2407 	mdb_free(fw, ha->ql_dump_size);
2408 
2409 	return (DCMD_OK);
2410 }
2411 
2412 /*
2413  * ql_25xx_dump_dcmd
2414  *	prints out a firmware dump buffer
2415  *
2416  * Input:
2417  *	addr  = User supplied address. (NB: nust be an ha)
2418  *	flags = mdb flags.
2419  *	argc  = Number of user supplied args.
2420  *	argv  = Arg array.
2421  *
2422  * Returns:
2423  *	DCMD_OK or DCMD_ERR
2424  *
2425  * Context:
2426  *	User context.
2427  *
2428  */
2429 /*ARGSUSED*/
2430 static int
2431 ql_25xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
2432     const mdb_arg_t *argv)
2433 {
2434 	ql_25xx_fw_dump_t	*fw;
2435 	uint32_t		cnt = 0;
2436 
2437 	fw = (ql_25xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
2438 
2439 	if (mdb_vread(fw, ha->ql_dump_size,
2440 	    (uintptr_t)ha->ql_dump_ptr) == -1) {
2441 		mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
2442 		mdb_free(fw, ha->ql_dump_size);
2443 		return (DCMD_OK);
2444 	}
2445 
2446 	mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
2447 	    ha->fw_major_version, ha->fw_minor_version,
2448 	    ha->fw_subminor_version, ha->fw_attributes);
2449 
2450 	mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
2451 
2452 	mdb_printf("\n\nHostRisc Registers");
2453 	for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
2454 		if (cnt % 8 == 0) {
2455 			mdb_printf("\n");
2456 		}
2457 		mdb_printf("%08x ", fw->hostrisc_reg[cnt]);
2458 	}
2459 
2460 	mdb_printf("\n\nPCIe Registers");
2461 	for (cnt = 0; cnt < sizeof (fw->pcie_reg) / 4; cnt++) {
2462 		if (cnt % 8 == 0) {
2463 			mdb_printf("\n");
2464 		}
2465 		mdb_printf("%08x ", fw->pcie_reg[cnt]);
2466 	}
2467 
2468 	mdb_printf("\n\nHost Interface Registers");
2469 	for (cnt = 0; cnt < sizeof (fw->host_reg) / 4; cnt++) {
2470 		if (cnt % 8 == 0) {
2471 			mdb_printf("\n");
2472 		}
2473 		mdb_printf("%08x ", fw->host_reg[cnt]);
2474 	}
2475 
2476 	mdb_printf("\n\nShadow Registers");
2477 	for (cnt = 0; cnt < sizeof (fw->shadow_reg) / 4; cnt++) {
2478 		if (cnt % 8 == 0) {
2479 			mdb_printf("\n");
2480 		}
2481 
2482 		mdb_printf("%08x ", fw->shadow_reg[cnt]);
2483 	}
2484 
2485 	mdb_printf("\n\nMailbox Registers");
2486 	for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
2487 		if (cnt % 16 == 0) {
2488 			mdb_printf("\n");
2489 		}
2490 		mdb_printf("%04x ", fw->mailbox_reg[cnt]);
2491 	}
2492 
2493 	mdb_printf("\n\nXSEQ GP Registers");
2494 	for (cnt = 0; cnt < sizeof (fw->xseq_gp_reg) / 4; cnt++) {
2495 		if (cnt % 8 == 0) {
2496 			mdb_printf("\n");
2497 		}
2498 		mdb_printf("%08x ", fw->xseq_gp_reg[cnt]);
2499 	}
2500 
2501 	mdb_printf("\n\nXSEQ-0 Registers");
2502 	for (cnt = 0; cnt < sizeof (fw->xseq_0_reg) / 4; cnt++) {
2503 		if (cnt % 8 == 0) {
2504 			mdb_printf("\n");
2505 		}
2506 		mdb_printf("%08x ", fw->xseq_0_reg[cnt]);
2507 	}
2508 
2509 	mdb_printf("\n\nXSEQ-1 Registers");
2510 	for (cnt = 0; cnt < sizeof (fw->xseq_1_reg) / 4; cnt++) {
2511 		if (cnt % 8 == 0) {
2512 			mdb_printf("\n");
2513 		}
2514 		mdb_printf("%08x ", fw->xseq_1_reg[cnt]);
2515 	}
2516 
2517 	mdb_printf("\n\nRSEQ GP Registers");
2518 	for (cnt = 0; cnt < sizeof (fw->rseq_gp_reg) / 4; cnt++) {
2519 		if (cnt % 8 == 0) {
2520 			mdb_printf("\n");
2521 		}
2522 		mdb_printf("%08x ", fw->rseq_gp_reg[cnt]);
2523 	}
2524 
2525 	mdb_printf("\n\nRSEQ-0 Registers");
2526 	for (cnt = 0; cnt < sizeof (fw->rseq_0_reg) / 4; cnt++) {
2527 		if (cnt % 8 == 0) {
2528 			mdb_printf("\n");
2529 		}
2530 		mdb_printf("%08x ", fw->rseq_0_reg[cnt]);
2531 	}
2532 
2533 	mdb_printf("\n\nRSEQ-1 Registers");
2534 	for (cnt = 0; cnt < sizeof (fw->rseq_1_reg) / 4; cnt++) {
2535 		if (cnt % 8 == 0) {
2536 			mdb_printf("\n");
2537 		}
2538 		mdb_printf("%08x ", fw->rseq_1_reg[cnt]);
2539 	}
2540 
2541 	mdb_printf("\n\nRSEQ-2 Registers");
2542 	for (cnt = 0; cnt < sizeof (fw->rseq_2_reg) / 4; cnt++) {
2543 		if (cnt % 8 == 0) {
2544 			mdb_printf("\n");
2545 		}
2546 		mdb_printf("%08x ", fw->rseq_2_reg[cnt]);
2547 	}
2548 
2549 	mdb_printf("\n\nASEQ GP Registers");
2550 	for (cnt = 0; cnt < sizeof (fw->aseq_gp_reg) / 4; cnt++) {
2551 		if (cnt % 8 == 0) {
2552 			mdb_printf("\n");
2553 		}
2554 		mdb_printf("%08x ", fw->aseq_gp_reg[cnt]);
2555 	}
2556 
2557 	mdb_printf("\n\nASEQ-0 GP Registers");
2558 	for (cnt = 0; cnt < sizeof (fw->aseq_0_reg) / 4; cnt++) {
2559 		if (cnt % 8 == 0) {
2560 			mdb_printf("\n");
2561 		}
2562 
2563 		mdb_printf("%08x ", fw->aseq_0_reg[cnt]);
2564 	}
2565 
2566 	mdb_printf("\n\nASEQ-1 GP Registers");
2567 	for (cnt = 0; cnt < sizeof (fw->aseq_1_reg) / 4; cnt++) {
2568 		if (cnt % 8 == 0) {
2569 			mdb_printf("\n");
2570 		}
2571 
2572 		mdb_printf("%08x ", fw->aseq_1_reg[cnt]);
2573 	}
2574 
2575 	mdb_printf("\n\nASEQ-2 GP Registers");
2576 	for (cnt = 0; cnt < sizeof (fw->aseq_2_reg) / 4; cnt++) {
2577 		if (cnt % 8 == 0) {
2578 			mdb_printf("\n");
2579 		}
2580 		mdb_printf("%08x ", fw->aseq_2_reg[cnt]);
2581 	}
2582 
2583 	mdb_printf("\n\nCommand DMA Registers");
2584 	for (cnt = 0; cnt < sizeof (fw->cmd_dma_reg) / 4; cnt++) {
2585 		if (cnt % 8 == 0) {
2586 			mdb_printf("\n");
2587 		}
2588 		mdb_printf("%08x ", fw->cmd_dma_reg[cnt]);
2589 	}
2590 
2591 	mdb_printf("\n\nRequest0 Queue DMA Channel Registers");
2592 	for (cnt = 0; cnt < sizeof (fw->req0_dma_reg) / 4; cnt++) {
2593 		if (cnt % 8 == 0) {
2594 			mdb_printf("\n");
2595 		}
2596 		mdb_printf("%08x ", fw->req0_dma_reg[cnt]);
2597 	}
2598 
2599 	mdb_printf("\n\nResponse0 Queue DMA Channel Registers");
2600 	for (cnt = 0; cnt < sizeof (fw->resp0_dma_reg) / 4; cnt++) {
2601 		if (cnt % 8 == 0) {
2602 			mdb_printf("\n");
2603 		}
2604 		mdb_printf("%08x ", fw->resp0_dma_reg[cnt]);
2605 	}
2606 
2607 	mdb_printf("\n\nRequest1 Queue DMA Channel Registers");
2608 	for (cnt = 0; cnt < sizeof (fw->req1_dma_reg) / 4; cnt++) {
2609 		if (cnt % 8 == 0) {
2610 			mdb_printf("\n");
2611 		}
2612 		mdb_printf("%08x ", fw->req1_dma_reg[cnt]);
2613 	}
2614 
2615 	mdb_printf("\n\nXMT0 Data DMA Registers");
2616 	for (cnt = 0; cnt < sizeof (fw->xmt0_dma_reg) / 4; cnt++) {
2617 		if (cnt % 8 == 0) {
2618 			mdb_printf("\n");
2619 		}
2620 		mdb_printf("%08x ", fw->xmt0_dma_reg[cnt]);
2621 	}
2622 
2623 	mdb_printf("\n\nXMT1 Data DMA Registers");
2624 	for (cnt = 0; cnt < sizeof (fw->xmt1_dma_reg) / 4; cnt++) {
2625 		if (cnt % 8 == 0) {
2626 			mdb_printf("\n");
2627 		}
2628 		mdb_printf("%08x ", fw->xmt1_dma_reg[cnt]);
2629 	}
2630 
2631 	mdb_printf("\n\nXMT2 Data DMA Registers");
2632 	for (cnt = 0; cnt < sizeof (fw->xmt2_dma_reg) / 4; cnt++) {
2633 		if (cnt % 8 == 0) {
2634 			mdb_printf("\n");
2635 		}
2636 		mdb_printf("%08x ", fw->xmt2_dma_reg[cnt]);
2637 	}
2638 
2639 	mdb_printf("\n\nXMT3 Data DMA Registers");
2640 	for (cnt = 0; cnt < sizeof (fw->xmt3_dma_reg) / 4; cnt++) {
2641 		if (cnt % 8 == 0) {
2642 			mdb_printf("\n");
2643 		}
2644 		mdb_printf("%08x ", fw->xmt3_dma_reg[cnt]);
2645 	}
2646 
2647 	mdb_printf("\n\nXMT4 Data DMA Registers");
2648 	for (cnt = 0; cnt < sizeof (fw->xmt4_dma_reg) / 4; cnt++) {
2649 		if (cnt % 8 == 0) {
2650 			mdb_printf("\n");
2651 		}
2652 		mdb_printf("%08x ", fw->xmt4_dma_reg[cnt]);
2653 	}
2654 
2655 	mdb_printf("\n\nXMT Data DMA Common Registers");
2656 	for (cnt = 0; cnt < sizeof (fw->xmt_data_dma_reg) / 4; cnt++) {
2657 		if (cnt % 8 == 0) {
2658 			mdb_printf("\n");
2659 		}
2660 		mdb_printf("%08x ", fw->xmt_data_dma_reg[cnt]);
2661 	}
2662 
2663 	mdb_printf("\n\nRCV Thread 0 Data DMA Registers");
2664 	for (cnt = 0; cnt < sizeof (fw->rcvt0_data_dma_reg) / 4; cnt++) {
2665 		if (cnt % 8 == 0) {
2666 			mdb_printf("\n");
2667 		}
2668 		mdb_printf("%08x ", fw->rcvt0_data_dma_reg[cnt]);
2669 	}
2670 
2671 	mdb_printf("\n\nRCV Thread 1 Data DMA Registers");
2672 	for (cnt = 0; cnt < sizeof (fw->rcvt1_data_dma_reg) / 4; cnt++) {
2673 		if (cnt % 8 == 0) {
2674 			mdb_printf("\n");
2675 		}
2676 		mdb_printf("%08x ", fw->rcvt1_data_dma_reg[cnt]);
2677 	}
2678 
2679 	mdb_printf("\n\nRISC GP Registers");
2680 	for (cnt = 0; cnt < sizeof (fw->risc_gp_reg) / 4; cnt++) {
2681 		if (cnt % 8 == 0) {
2682 			mdb_printf("\n");
2683 		}
2684 		mdb_printf("%08x ", fw->risc_gp_reg[cnt]);
2685 	}
2686 
2687 	mdb_printf("\n\nRISC IO Register\n%08x", fw->risc_io);
2688 
2689 	mdb_printf("\n\nLMC Registers");
2690 	for (cnt = 0; cnt < sizeof (fw->lmc_reg) / 4; cnt++) {
2691 		if (cnt % 8 == 0) {
2692 			mdb_printf("\n");
2693 		}
2694 		mdb_printf("%08x ", fw->lmc_reg[cnt]);
2695 	}
2696 
2697 	mdb_printf("\n\nFPM Hardware Registers");
2698 	for (cnt = 0; cnt < sizeof (fw->fpm_hdw_reg) / 4; cnt++) {
2699 		if (cnt % 8 == 0) {
2700 			mdb_printf("\n");
2701 		}
2702 		mdb_printf("%08x ", fw->fpm_hdw_reg[cnt]);
2703 	}
2704 
2705 	mdb_printf("\n\nFB Hardware Registers");
2706 	for (cnt = 0; cnt < sizeof (fw->fb_hdw_reg) / 4; cnt++) {
2707 		if (cnt % 8 == 0) {
2708 			mdb_printf("\n");
2709 		}
2710 		mdb_printf("%08x ", fw->fb_hdw_reg[cnt]);
2711 	}
2712 
2713 	mdb_printf("\n\nCode RAM");
2714 	for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
2715 		if (cnt % 8 == 0) {
2716 			mdb_printf("\n%08x: ", cnt + 0x20000);
2717 		}
2718 		mdb_printf("%08x ", fw->code_ram[cnt]);
2719 	}
2720 
2721 	mdb_printf("\n\nExternal Memory");
2722 	for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
2723 		if (cnt % 8 == 0) {
2724 			mdb_printf("\n%08x: ", cnt + 0x100000);
2725 		}
2726 		mdb_printf("%08x ", fw->ext_mem[cnt]);
2727 	}
2728 
2729 	mdb_printf("\n[<==END] ISP Debug Dump");
2730 
2731 	mdb_printf("\n\nRequest Queue");
2732 
2733 	for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
2734 		if (cnt % 8 == 0) {
2735 			mdb_printf("\n%08x: ", cnt);
2736 		}
2737 		mdb_printf("%08x ", fw->req_q[cnt]);
2738 	}
2739 
2740 	mdb_printf("\n\nResponse Queue");
2741 
2742 	for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
2743 		if (cnt % 8 == 0) {
2744 			mdb_printf("\n%08x: ", cnt);
2745 		}
2746 		mdb_printf("%08x ", fw->rsp_q[cnt]);
2747 	}
2748 
2749 	if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
2750 	    (ha->fwexttracebuf.bp != NULL)) {
2751 		uint32_t cnt_b = 0;
2752 		uint32_t *w32 = ha->fwexttracebuf.bp;
2753 
2754 		mdb_printf("\n\nExtended Trace Buffer Memory");
2755 		/* show data address as a byte address, data as long words */
2756 		for (cnt = 0; cnt < FWEXTSIZE / 4; cnt++) {
2757 			cnt_b = cnt * 4;
2758 			if (cnt_b % 32 == 0) {
2759 				mdb_printf("\n%08x: ", w32 + cnt_b);
2760 			}
2761 			mdb_printf("%08x ", fw->ext_trace_buf[cnt]);
2762 		}
2763 	}
2764 
2765 	if ((ha->cfg_flags & CFG_ENABLE_FWFCETRACE) &&
2766 	    (ha->fwfcetracebuf.bp != NULL)) {
2767 		uint32_t cnt_b = 0;
2768 		uint32_t *w32 = ha->fwfcetracebuf.bp;
2769 
2770 		mdb_printf("\n\nFC Event Trace Buffer Memory");
2771 		/* show data address as a byte address, data as long words */
2772 		for (cnt = 0; cnt < FWFCESIZE / 4; cnt++) {
2773 			cnt_b = cnt * 4;
2774 			if (cnt_b % 32 == 0) {
2775 				mdb_printf("\n%08x: ", w32 + cnt_b);
2776 			}
2777 			mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
2778 		}
2779 	}
2780 
2781 	mdb_free(fw, ha->ql_dump_size);
2782 
2783 	mdb_printf("\n\nreturn exit\n");
2784 
2785 	return (DCMD_OK);
2786 }
2787 
2788 /*
2789  * ql_81xx_dump_dcmd
2790  *	prints out a firmware dump buffer
2791  *
2792  * Input:
2793  *	addr  = User supplied address. (NB: nust be an ha)
2794  *	flags = mdb flags.
2795  *	argc  = Number of user supplied args.
2796  *	argv  = Arg array.
2797  *
2798  * Returns:
2799  *	DCMD_OK or DCMD_ERR
2800  *
2801  * Context:
2802  *	User context.
2803  *
2804  */
2805 /*ARGSUSED*/
2806 static int
2807 ql_81xx_dump_dcmd(ql_adapter_state_t *ha, uint_t flags, int argc,
2808     const mdb_arg_t *argv)
2809 {
2810 	ql_81xx_fw_dump_t	*fw;
2811 	uint32_t		cnt = 0;
2812 
2813 	fw = (ql_81xx_fw_dump_t *)mdb_alloc(ha->ql_dump_size, UM_SLEEP);
2814 
2815 	if (mdb_vread(fw, ha->ql_dump_size,
2816 	    (uintptr_t)ha->ql_dump_ptr) == -1) {
2817 		mdb_warn("failed to read ql_dump_ptr (no f/w dump active?)");
2818 		mdb_free(fw, ha->ql_dump_size);
2819 		return (DCMD_OK);
2820 	}
2821 
2822 	mdb_printf("\nISP FW Version %d.%02d.%02d Attributes %X\n",
2823 	    ha->fw_major_version, ha->fw_minor_version,
2824 	    ha->fw_subminor_version, ha->fw_attributes);
2825 
2826 	mdb_printf("\nR2H Register\n%08x\n", fw->r2h_status);
2827 
2828 	mdb_printf("\n\nHostRisc Registers");
2829 	for (cnt = 0; cnt < sizeof (fw->hostrisc_reg) / 4; cnt++) {
2830 		if (cnt % 8 == 0) {
2831 			mdb_printf("\n");
2832 		}
2833 		mdb_printf("%08x ", fw->hostrisc_reg[cnt]);
2834 	}
2835 
2836 	mdb_printf("\n\nPCIe Registers");
2837 	for (cnt = 0; cnt < sizeof (fw->pcie_reg) / 4; cnt++) {
2838 		if (cnt % 8 == 0) {
2839 			mdb_printf("\n");
2840 		}
2841 		mdb_printf("%08x ", fw->pcie_reg[cnt]);
2842 	}
2843 
2844 	mdb_printf("\n\nHost Interface Registers");
2845 	for (cnt = 0; cnt < sizeof (fw->host_reg) / 4; cnt++) {
2846 		if (cnt % 8 == 0) {
2847 			mdb_printf("\n");
2848 		}
2849 		mdb_printf("%08x ", fw->host_reg[cnt]);
2850 	}
2851 
2852 	mdb_printf("\n\nShadow Registers");
2853 	for (cnt = 0; cnt < sizeof (fw->shadow_reg) / 4; cnt++) {
2854 		if (cnt % 8 == 0) {
2855 			mdb_printf("\n");
2856 		}
2857 
2858 		mdb_printf("%08x ", fw->shadow_reg[cnt]);
2859 	}
2860 
2861 	mdb_printf("\n\nMailbox Registers");
2862 	for (cnt = 0; cnt < sizeof (fw->mailbox_reg) / 2; cnt++) {
2863 		if (cnt % 16 == 0) {
2864 			mdb_printf("\n");
2865 		}
2866 		mdb_printf("%04x ", fw->mailbox_reg[cnt]);
2867 	}
2868 
2869 	mdb_printf("\n\nXSEQ GP Registers");
2870 	for (cnt = 0; cnt < sizeof (fw->xseq_gp_reg) / 4; cnt++) {
2871 		if (cnt % 8 == 0) {
2872 			mdb_printf("\n");
2873 		}
2874 		mdb_printf("%08x ", fw->xseq_gp_reg[cnt]);
2875 	}
2876 
2877 	mdb_printf("\n\nXSEQ-0 Registers");
2878 	for (cnt = 0; cnt < sizeof (fw->xseq_0_reg) / 4; cnt++) {
2879 		if (cnt % 8 == 0) {
2880 			mdb_printf("\n");
2881 		}
2882 		mdb_printf("%08x ", fw->xseq_0_reg[cnt]);
2883 	}
2884 
2885 	mdb_printf("\n\nXSEQ-1 Registers");
2886 	for (cnt = 0; cnt < sizeof (fw->xseq_1_reg) / 4; cnt++) {
2887 		if (cnt % 8 == 0) {
2888 			mdb_printf("\n");
2889 		}
2890 		mdb_printf("%08x ", fw->xseq_1_reg[cnt]);
2891 	}
2892 
2893 	mdb_printf("\n\nRSEQ GP Registers");
2894 	for (cnt = 0; cnt < sizeof (fw->rseq_gp_reg) / 4; cnt++) {
2895 		if (cnt % 8 == 0) {
2896 			mdb_printf("\n");
2897 		}
2898 		mdb_printf("%08x ", fw->rseq_gp_reg[cnt]);
2899 	}
2900 
2901 	mdb_printf("\n\nRSEQ-0 Registers");
2902 	for (cnt = 0; cnt < sizeof (fw->rseq_0_reg) / 4; cnt++) {
2903 		if (cnt % 8 == 0) {
2904 			mdb_printf("\n");
2905 		}
2906 		mdb_printf("%08x ", fw->rseq_0_reg[cnt]);
2907 	}
2908 
2909 	mdb_printf("\n\nRSEQ-1 Registers");
2910 	for (cnt = 0; cnt < sizeof (fw->rseq_1_reg) / 4; cnt++) {
2911 		if (cnt % 8 == 0) {
2912 			mdb_printf("\n");
2913 		}
2914 		mdb_printf("%08x ", fw->rseq_1_reg[cnt]);
2915 	}
2916 
2917 	mdb_printf("\n\nRSEQ-2 Registers");
2918 	for (cnt = 0; cnt < sizeof (fw->rseq_2_reg) / 4; cnt++) {
2919 		if (cnt % 8 == 0) {
2920 			mdb_printf("\n");
2921 		}
2922 		mdb_printf("%08x ", fw->rseq_2_reg[cnt]);
2923 	}
2924 
2925 	mdb_printf("\n\nASEQ GP Registers");
2926 	for (cnt = 0; cnt < sizeof (fw->aseq_gp_reg) / 4; cnt++) {
2927 		if (cnt % 8 == 0) {
2928 			mdb_printf("\n");
2929 		}
2930 		mdb_printf("%08x ", fw->aseq_gp_reg[cnt]);
2931 	}
2932 
2933 	mdb_printf("\n\nASEQ-0 GP Registers");
2934 	for (cnt = 0; cnt < sizeof (fw->aseq_0_reg) / 4; cnt++) {
2935 		if (cnt % 8 == 0) {
2936 			mdb_printf("\n");
2937 		}
2938 
2939 		mdb_printf("%08x ", fw->aseq_0_reg[cnt]);
2940 	}
2941 
2942 	mdb_printf("\n\nASEQ-1 GP Registers");
2943 	for (cnt = 0; cnt < sizeof (fw->aseq_1_reg) / 4; cnt++) {
2944 		if (cnt % 8 == 0) {
2945 			mdb_printf("\n");
2946 		}
2947 
2948 		mdb_printf("%08x ", fw->aseq_1_reg[cnt]);
2949 	}
2950 
2951 	mdb_printf("\n\nASEQ-2 GP Registers");
2952 	for (cnt = 0; cnt < sizeof (fw->aseq_2_reg) / 4; cnt++) {
2953 		if (cnt % 8 == 0) {
2954 			mdb_printf("\n");
2955 		}
2956 		mdb_printf("%08x ", fw->aseq_2_reg[cnt]);
2957 	}
2958 
2959 	mdb_printf("\n\nCommand DMA Registers");
2960 	for (cnt = 0; cnt < sizeof (fw->cmd_dma_reg) / 4; cnt++) {
2961 		if (cnt % 8 == 0) {
2962 			mdb_printf("\n");
2963 		}
2964 		mdb_printf("%08x ", fw->cmd_dma_reg[cnt]);
2965 	}
2966 
2967 	mdb_printf("\n\nRequest0 Queue DMA Channel Registers");
2968 	for (cnt = 0; cnt < sizeof (fw->req0_dma_reg) / 4; cnt++) {
2969 		if (cnt % 8 == 0) {
2970 			mdb_printf("\n");
2971 		}
2972 		mdb_printf("%08x ", fw->req0_dma_reg[cnt]);
2973 	}
2974 
2975 	mdb_printf("\n\nResponse0 Queue DMA Channel Registers");
2976 	for (cnt = 0; cnt < sizeof (fw->resp0_dma_reg) / 4; cnt++) {
2977 		if (cnt % 8 == 0) {
2978 			mdb_printf("\n");
2979 		}
2980 		mdb_printf("%08x ", fw->resp0_dma_reg[cnt]);
2981 	}
2982 
2983 	mdb_printf("\n\nRequest1 Queue DMA Channel Registers");
2984 	for (cnt = 0; cnt < sizeof (fw->req1_dma_reg) / 4; cnt++) {
2985 		if (cnt % 8 == 0) {
2986 			mdb_printf("\n");
2987 		}
2988 		mdb_printf("%08x ", fw->req1_dma_reg[cnt]);
2989 	}
2990 
2991 	mdb_printf("\n\nXMT0 Data DMA Registers");
2992 	for (cnt = 0; cnt < sizeof (fw->xmt0_dma_reg) / 4; cnt++) {
2993 		if (cnt % 8 == 0) {
2994 			mdb_printf("\n");
2995 		}
2996 		mdb_printf("%08x ", fw->xmt0_dma_reg[cnt]);
2997 	}
2998 
2999 	mdb_printf("\n\nXMT1 Data DMA Registers");
3000 	for (cnt = 0; cnt < sizeof (fw->xmt1_dma_reg) / 4; cnt++) {
3001 		if (cnt % 8 == 0) {
3002 			mdb_printf("\n");
3003 		}
3004 		mdb_printf("%08x ", fw->xmt1_dma_reg[cnt]);
3005 	}
3006 
3007 	mdb_printf("\n\nXMT2 Data DMA Registers");
3008 	for (cnt = 0; cnt < sizeof (fw->xmt2_dma_reg) / 4; cnt++) {
3009 		if (cnt % 8 == 0) {
3010 			mdb_printf("\n");
3011 		}
3012 		mdb_printf("%08x ", fw->xmt2_dma_reg[cnt]);
3013 	}
3014 
3015 	mdb_printf("\n\nXMT3 Data DMA Registers");
3016 	for (cnt = 0; cnt < sizeof (fw->xmt3_dma_reg) / 4; cnt++) {
3017 		if (cnt % 8 == 0) {
3018 			mdb_printf("\n");
3019 		}
3020 		mdb_printf("%08x ", fw->xmt3_dma_reg[cnt]);
3021 	}
3022 
3023 	mdb_printf("\n\nXMT4 Data DMA Registers");
3024 	for (cnt = 0; cnt < sizeof (fw->xmt4_dma_reg) / 4; cnt++) {
3025 		if (cnt % 8 == 0) {
3026 			mdb_printf("\n");
3027 		}
3028 		mdb_printf("%08x ", fw->xmt4_dma_reg[cnt]);
3029 	}
3030 
3031 	mdb_printf("\n\nXMT Data DMA Common Registers");
3032 	for (cnt = 0; cnt < sizeof (fw->xmt_data_dma_reg) / 4; cnt++) {
3033 		if (cnt % 8 == 0) {
3034 			mdb_printf("\n");
3035 		}
3036 		mdb_printf("%08x ", fw->xmt_data_dma_reg[cnt]);
3037 	}
3038 
3039 	mdb_printf("\n\nRCV Thread 0 Data DMA Registers");
3040 	for (cnt = 0; cnt < sizeof (fw->rcvt0_data_dma_reg) / 4; cnt++) {
3041 		if (cnt % 8 == 0) {
3042 			mdb_printf("\n");
3043 		}
3044 		mdb_printf("%08x ", fw->rcvt0_data_dma_reg[cnt]);
3045 	}
3046 
3047 	mdb_printf("\n\nRCV Thread 1 Data DMA Registers");
3048 	for (cnt = 0; cnt < sizeof (fw->rcvt1_data_dma_reg) / 4; cnt++) {
3049 		if (cnt % 8 == 0) {
3050 			mdb_printf("\n");
3051 		}
3052 		mdb_printf("%08x ", fw->rcvt1_data_dma_reg[cnt]);
3053 	}
3054 
3055 	mdb_printf("\n\nRISC GP Registers");
3056 	for (cnt = 0; cnt < sizeof (fw->risc_gp_reg) / 4; cnt++) {
3057 		if (cnt % 8 == 0) {
3058 			mdb_printf("\n");
3059 		}
3060 		mdb_printf("%08x ", fw->risc_gp_reg[cnt]);
3061 	}
3062 
3063 	mdb_printf("\n\nRISC IO Register\n%08x", fw->risc_io);
3064 
3065 	mdb_printf("\n\nLMC Registers");
3066 	for (cnt = 0; cnt < sizeof (fw->lmc_reg) / 4; cnt++) {
3067 		if (cnt % 8 == 0) {
3068 			mdb_printf("\n");
3069 		}
3070 		mdb_printf("%08x ", fw->lmc_reg[cnt]);
3071 	}
3072 
3073 	mdb_printf("\n\nFPM Hardware Registers");
3074 	for (cnt = 0; cnt < sizeof (fw->fpm_hdw_reg) / 4; cnt++) {
3075 		if (cnt % 8 == 0) {
3076 			mdb_printf("\n");
3077 		}
3078 		mdb_printf("%08x ", fw->fpm_hdw_reg[cnt]);
3079 	}
3080 
3081 	mdb_printf("\n\nFB Hardware Registers");
3082 	for (cnt = 0; cnt < sizeof (fw->fb_hdw_reg) / 4; cnt++) {
3083 		if (cnt % 8 == 0) {
3084 			mdb_printf("\n");
3085 		}
3086 		mdb_printf("%08x ", fw->fb_hdw_reg[cnt]);
3087 	}
3088 
3089 	mdb_printf("\n\nCode RAM");
3090 	for (cnt = 0; cnt < sizeof (fw->code_ram) / 4; cnt++) {
3091 		if (cnt % 8 == 0) {
3092 			mdb_printf("\n%08x: ", cnt + 0x20000);
3093 		}
3094 		mdb_printf("%08x ", fw->code_ram[cnt]);
3095 	}
3096 
3097 	mdb_printf("\n\nExternal Memory");
3098 	for (cnt = 0; cnt < ha->fw_ext_memory_size / 4; cnt++) {
3099 		if (cnt % 8 == 0) {
3100 			mdb_printf("\n%08x: ", cnt + 0x100000);
3101 		}
3102 		mdb_printf("%08x ", fw->ext_mem[cnt]);
3103 	}
3104 
3105 	mdb_printf("\n[<==END] ISP Debug Dump");
3106 
3107 	mdb_printf("\n\nRequest Queue");
3108 
3109 	for (cnt = 0; cnt < REQUEST_QUEUE_SIZE / 4; cnt++) {
3110 		if (cnt % 8 == 0) {
3111 			mdb_printf("\n%08x: ", cnt);
3112 		}
3113 		mdb_printf("%08x ", fw->req_q[cnt]);
3114 	}
3115 
3116 	mdb_printf("\n\nResponse Queue");
3117 
3118 	for (cnt = 0; cnt < RESPONSE_QUEUE_SIZE / 4; cnt++) {
3119 		if (cnt % 8 == 0) {
3120 			mdb_printf("\n%08x: ", cnt);
3121 		}
3122 		mdb_printf("%08x ", fw->rsp_q[cnt]);
3123 	}
3124 
3125 	if ((ha->cfg_flags & CFG_ENABLE_FWEXTTRACE) &&
3126 	    (ha->fwexttracebuf.bp != NULL)) {
3127 		uint32_t cnt_b = 0;
3128 		uint32_t *w32 = ha->fwexttracebuf.bp;
3129 
3130 		mdb_printf("\n\nExtended Trace Buffer Memory");
3131 		/* show data address as a byte address, data as long words */
3132 		for (cnt = 0; cnt < FWEXTSIZE / 4; cnt++) {
3133 			cnt_b = cnt * 4;
3134 			if (cnt_b % 32 == 0) {
3135 				mdb_printf("\n%08x: ", w32 + cnt_b);
3136 			}
3137 			mdb_printf("%08x ", fw->ext_trace_buf[cnt]);
3138 		}
3139 	}
3140 
3141 	if ((ha->cfg_flags & CFG_ENABLE_FWFCETRACE) &&
3142 	    (ha->fwfcetracebuf.bp != NULL)) {
3143 		uint32_t cnt_b = 0;
3144 		uint32_t *w32 = ha->fwfcetracebuf.bp;
3145 
3146 		mdb_printf("\n\nFC Event Trace Buffer Memory");
3147 		/* show data address as a byte address, data as long words */
3148 		for (cnt = 0; cnt < FWFCESIZE / 4; cnt++) {
3149 			cnt_b = cnt * 4;
3150 			if (cnt_b % 32 == 0) {
3151 				mdb_printf("\n%08x: ", w32 + cnt_b);
3152 			}
3153 			mdb_printf("%08x ", fw->fce_trace_buf[cnt]);
3154 		}
3155 	}
3156 
3157 	mdb_free(fw, ha->ql_dump_size);
3158 
3159 	mdb_printf("\n\nreturn exit\n");
3160 
3161 	return (DCMD_OK);
3162 }
3163 
3164 /*
3165  * ql_gettrace_dcmd
3166  *	prints out the Extended Logging trace buffer
3167  *
3168  * Input:
3169  *	addr  = User supplied address. (NB: must be an ha)
3170  *	flags = mdb flags.
3171  *	argc  = Number of user supplied args.
3172  *	argv  = Arg array.
3173  *
3174  * Returns:
3175  *	DCMD_OK or DCMD_ERR
3176  *
3177  * Context:
3178  *	User context.
3179  *
3180  */
3181 static int
3182 qlc_gettrace_dcmd(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
3183 {
3184 	ql_adapter_state_t	*ha;
3185 	int			verbose = 0;
3186 	int			wrapped = 0;
3187 	char			*trace_start;
3188 	char			*trace_end;
3189 	char			*dump_start = 0;
3190 	char			*trace_next  = 0;
3191 	char			*dump_current  = 0;
3192 	el_trace_desc_t		*trace_desc;
3193 
3194 	if ((!(flags & DCMD_ADDRSPEC)) || addr == NULL) {
3195 		mdb_warn("ql_adapter_state structure addr is required");
3196 		return (DCMD_USAGE);
3197 	}
3198 
3199 	if (mdb_getopts(argc, argv, 'v', MDB_OPT_SETBITS, TRUE, &verbose) !=
3200 	    argc) {
3201 		return (DCMD_USAGE);
3202 	}
3203 
3204 	/*
3205 	 * Get the adapter state struct which was passed
3206 	 */
3207 	if ((ha = (ql_adapter_state_t *)mdb_alloc(sizeof (ql_adapter_state_t),
3208 	    UM_SLEEP)) == NULL) {
3209 		mdb_warn("failed to allocate memory for ql_adapter_state\n");
3210 		return (DCMD_OK);
3211 	}
3212 
3213 	if (mdb_vread(ha, sizeof (ql_adapter_state_t), addr) == -1) {
3214 		mdb_warn("failed to read ql_adapter_state at %p", addr);
3215 		mdb_free(ha, sizeof (ql_adapter_state_t));
3216 		return (DCMD_OK);
3217 	}
3218 
3219 	/*
3220 	 * If its not a valid trace descriptor then bail out
3221 	 */
3222 	if (ha->el_trace_desc == NULL) {
3223 		mdb_warn("trace descriptor does not exist for instance %d\n",
3224 		    ha->instance);
3225 		mdb_free(ha, sizeof (ql_adapter_state_t));
3226 		return (DCMD_OK);
3227 	} else {
3228 		trace_desc = (el_trace_desc_t *)
3229 		    mdb_alloc(sizeof (el_trace_desc_t), UM_SLEEP);
3230 		if (mdb_vread(trace_desc, sizeof (el_trace_desc_t),
3231 		    (uintptr_t)ha->el_trace_desc) == -1) {
3232 			mdb_warn("failed to read ql_adapter_state at %p",
3233 			    addr);
3234 			mdb_free(trace_desc, sizeof (el_trace_desc_t));
3235 			mdb_free(ha, sizeof (ql_adapter_state_t));
3236 			return (DCMD_OK);
3237 		}
3238 		if (trace_desc->trace_buffer == NULL) {
3239 			mdb_warn("trace buffer does not exist for "
3240 			    "instance %d\n", ha->instance);
3241 			mdb_free(trace_desc, sizeof (el_trace_desc_t));
3242 			mdb_free(ha, sizeof (ql_adapter_state_t));
3243 			return (DCMD_OK);
3244 		}
3245 	}
3246 
3247 	/* Get the trace buffer */
3248 
3249 	trace_start = (char *)
3250 	    mdb_zalloc(trace_desc->trace_buffer_size, UM_SLEEP);
3251 
3252 	if (mdb_vread(trace_start, trace_desc->trace_buffer_size,
3253 	    (uintptr_t)trace_desc->trace_buffer) == -1) {
3254 		mdb_warn("failed to read trace buffer?)");
3255 		mdb_free(trace_start, trace_desc->trace_buffer_size);
3256 		mdb_free(ha, sizeof (ql_adapter_state_t));
3257 		return (DCMD_OK);
3258 	}
3259 
3260 	/* set the end of the trace buffer. */
3261 	trace_end = trace_start + trace_desc->trace_buffer_size;
3262 
3263 	/* Find the start point of trace. */
3264 	trace_next = trace_start + trace_desc->next;
3265 
3266 	/*
3267 	 * If the buffer has not wrapped next will point at a null so
3268 	 * start is the begining of the buffer.  If next points at a char
3269 	 * then we must traverse the buffer further until a null is detected.
3270 	 * The location after the null will be the beginning of the oldest
3271 	 * whole object in the buffer, which we use as the start.
3272 	 */
3273 
3274 	if ((trace_next + EL_BUFFER_RESERVE) >= trace_end) {
3275 		dump_start = trace_start;
3276 	} else if (*trace_next != NULL) {
3277 		dump_start = trace_next + (strlen(trace_next) + 1);
3278 	} else {
3279 		dump_start = trace_start;
3280 	}
3281 
3282 	dump_current = dump_start;
3283 
3284 	mdb_printf("\nExtended Logging trace buffer @%x, start @%x, "
3285 	    "size=%d\n\n", trace_start, dump_current,
3286 	    trace_desc->trace_buffer_size);
3287 
3288 	/* Don't run off the end, no matter what. */
3289 	while (((uintptr_t)dump_current - (uintptr_t)trace_start) <=
3290 	    (uintptr_t)trace_desc->trace_buffer_size) {
3291 		/* Show it... */
3292 		mdb_printf("%s", dump_current);
3293 		/* Calculate the next and make it the current */
3294 		dump_current += (strlen(dump_current) + 1);
3295 		/* check for wrap */
3296 		if ((dump_current + EL_BUFFER_RESERVE) >= trace_end) {
3297 			mdb_printf("Wraping %x\n", dump_current);
3298 			dump_current = trace_start;
3299 			wrapped = 1;
3300 		} else if (wrapped) {
3301 			/*   Don't go past next. */
3302 			if ((trace_start + trace_desc->next) <= dump_current) {
3303 				mdb_printf("Done %x", dump_current);
3304 				break;
3305 			}
3306 		} else if (*dump_current == NULL) {
3307 			mdb_printf("Done %x(null)", dump_current);
3308 			break;
3309 		}
3310 	}
3311 
3312 	mdb_free(ha, sizeof (ql_adapter_state_t));
3313 	mdb_free(trace_start, trace_desc->trace_buffer_size);
3314 	mdb_free(trace_desc, sizeof (el_trace_desc_t));
3315 
3316 	return (DCMD_OK);
3317 }
3318 /*
3319  * ql_doprint
3320  *	ql generic function to call the print dcmd
3321  *
3322  * Input:
3323  *	addr - address to struct
3324  *	prtsting - address to string
3325  *
3326  * Returns:
3327  *	WALK_DONE
3328  *
3329  * Context:
3330  *	User context.
3331  *
3332  */
3333 static int32_t
3334 ql_doprint(uintptr_t addr, int8_t *prtstring)
3335 {
3336 	struct	mdb_arg		printarg;
3337 
3338 	printarg.a_un.a_str = (int8_t *)(mdb_zalloc(strlen(prtstring),
3339 	    UM_SLEEP));
3340 	printarg.a_type = MDB_TYPE_STRING;
3341 	(void) strcpy((int8_t *)(printarg.a_un.a_str), prtstring);
3342 
3343 	if ((mdb_call_dcmd("print", addr, DCMD_ADDRSPEC, 1,
3344 	    &printarg)) == -1) {
3345 		mdb_warn("ql_doprint: failed print dcmd: %s"
3346 		    "at addr: %llxh", prtstring, addr);
3347 	}
3348 
3349 	mdb_free((void *)(printarg.a_un.a_str), strlen(prtstring));
3350 	return (WALK_DONE);
3351 }
3352 
3353 /*
3354  * ql_dump_flags
3355  *	mdb utility to print the flag string
3356  *
3357  * Input:
3358  *	flags - flags to print
3359  *	strings - text to print when flag is set
3360  *
3361  * Returns:
3362  *
3363  *
3364  * Context:
3365  *	User context.
3366  *
3367  */
3368 static void
3369 ql_dump_flags(uint64_t flags, int8_t **strings)
3370 {
3371 	int		i, linel, first = 1;
3372 	uint64_t	mask = 1;
3373 
3374 	linel = 8;
3375 	mdb_printf("\t");
3376 	for (i = 0; i < 64; i++) {
3377 		if (strings[i] == NULL)
3378 			break;
3379 		if (flags & mask) {
3380 			if (!first) {
3381 				mdb_printf(" | ");
3382 			} else {
3383 				first = 0;
3384 			}
3385 			linel += (int32_t)strlen(strings[i]) + 3;
3386 			if (linel > 80) {
3387 				mdb_printf("\n\t");
3388 				linel = (int32_t)strlen(strings[i]) + 1 + 8;
3389 			}
3390 			mdb_printf("%s", strings[i]);
3391 		}
3392 		mask <<= 1;
3393 	}
3394 	mdb_printf("\n");
3395 }
3396 
3397 /*
3398  * MDB module linkage information
3399  *
3400  *
3401  * dcmd structures for the _mdb_init function
3402  */
3403 static const mdb_dcmd_t dcmds[] = {
3404 	{ "qlclinks", NULL, "Prints qlc link information", qlclinks_dcmd },
3405 	{ "qlcosc", NULL, "Prints outstanding cmd info", qlc_osc_dcmd },
3406 	{ "qlcver", NULL, "Prints driver/mdb version", qlcver_dcmd },
3407 	{ "qlc_elog", "[on|off] [<inst #>|all]", "Turns qlc extended logging "
3408 	    "on / off", qlc_el_dcmd },
3409 	{ "qlcstate", ":[-v]", "Prints qlc adapter state information",
3410 	    qlcstate_dcmd },
3411 	{ "qlctgtq", NULL, "Prints qlc target queues", qltgtq_dcmd },
3412 	{ "qlcwdog", NULL, "Prints out watchdog linked list", qlc_wdog_dcmd},
3413 	{ "qlcgetdump", ":[-v]", "Retrieves the ASCII f/w dump",
3414 	    qlc_getdump_dcmd },
3415 	{ "qlcgettrace", ":[-v]", "Retrieves the ASCII Extended Logging trace",
3416 	    qlc_gettrace_dcmd },
3417 	{ NULL }
3418 };
3419 
3420 /*
3421  * walker structures for the _mdb_init function
3422  */
3423 static const mdb_walker_t walkers[] = {
3424 	{ "qlcstates", "walk list of qlc ql_state_t structures",
3425 	    qlstates_walk_init, qlstates_walk_step, qlstates_walk_fini },
3426 	{ "qlcsrbs", "walk list of qlc ql_srb_t strctures",
3427 	    qlsrb_walk_init, qlsrb_walk_step, qlsrb_walk_fini },
3428 	{ "qlclunq", "walk list of qlc ql_lun_t strctures",
3429 	    qllunq_walk_init, qllunq_walk_step, qllunq_walk_fini },
3430 	{ NULL }
3431 };
3432 
3433 static const mdb_modinfo_t ql_mdb_modinfo = {
3434 	MDB_API_VERSION, dcmds, walkers
3435 };
3436 
3437 /*
3438  * Registration function which lists the dcmds and walker structures
3439  */
3440 const mdb_modinfo_t *
3441 _mdb_init(void)
3442 {
3443 	return (&ql_mdb_modinfo);
3444 }
3445