xref: /freebsd/sys/dev/aac/aac_debug.c (revision ae41709ab46305df80f7f35bb478a3c8ebf22ebb)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3  *
4  * Copyright (c) 2000 Michael Smith
5  * Copyright (c) 2001 Scott Long
6  * Copyright (c) 2000 BSDi
7  * Copyright (c) 2001 Adaptec, Inc.
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #include <sys/cdefs.h>
33 __FBSDID("$FreeBSD$");
34 
35 /*
36  * Debugging support.
37  */
38 #include "opt_aac.h"
39 
40 #include <sys/param.h>
41 #include <sys/systm.h>
42 #include <sys/kernel.h>
43 #include <sys/conf.h>
44 
45 #include <sys/bus.h>
46 
47 #include <machine/resource.h>
48 #include <machine/bus.h>
49 
50 #include <dev/aac/aacreg.h>
51 #include <sys/aac_ioctl.h>
52 #include <dev/aac/aacvar.h>
53 
54 #ifdef AAC_DEBUG
55 int	aac_debug_enable = 0;
56 void	aac_printstate0(void);
57 
58 /*
59  * Dump the command queue indices
60  */
61 void
62 aac_print_queues(struct aac_softc *sc)
63 {
64 	device_printf(sc->aac_dev, "FIB queue header at %p  queues at %p\n",
65 	    &sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][0],
66 	    &sc->aac_queues->qt_HostNormCmdQueue[0]);
67 	device_printf(sc->aac_dev, "HOST_NORM_CMD  %d/%d (%d)\n",
68 	    sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
69 				      AAC_PRODUCER_INDEX],
70 	    sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
71 				      AAC_CONSUMER_INDEX],
72 	    AAC_HOST_NORM_CMD_ENTRIES);
73 	device_printf(sc->aac_dev, "HOST_HIGH_CMD  %d/%d (%d)\n",
74 	    sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
75 				      AAC_PRODUCER_INDEX],
76 	    sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
77 				      AAC_CONSUMER_INDEX],
78 	    AAC_HOST_HIGH_CMD_ENTRIES);
79 	device_printf(sc->aac_dev, "ADAP_NORM_CMD  %d/%d (%d)\n",
80 	    sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
81 				      AAC_PRODUCER_INDEX],
82 	    sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
83 				      AAC_CONSUMER_INDEX],
84 	    AAC_ADAP_NORM_CMD_ENTRIES);
85 	device_printf(sc->aac_dev, "ADAP_HIGH_CMD  %d/%d (%d)\n",
86 	    sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
87 				      AAC_PRODUCER_INDEX],
88 	    sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
89 				      AAC_CONSUMER_INDEX],
90 	    AAC_ADAP_HIGH_CMD_ENTRIES);
91 	device_printf(sc->aac_dev, "HOST_NORM_RESP %d/%d (%d)\n",
92 	    sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
93 				      AAC_PRODUCER_INDEX],
94 	    sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
95 				      AAC_CONSUMER_INDEX],
96 	    AAC_HOST_NORM_RESP_ENTRIES);
97 	device_printf(sc->aac_dev, "HOST_HIGH_RESP %d/%d (%d)\n",
98 	    sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
99 				      AAC_PRODUCER_INDEX],
100 	    sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
101 				      AAC_CONSUMER_INDEX],
102 	    AAC_HOST_HIGH_RESP_ENTRIES);
103 	device_printf(sc->aac_dev, "ADAP_NORM_RESP %d/%d (%d)\n",
104 	    sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
105 				      AAC_PRODUCER_INDEX],
106 	    sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
107 				      AAC_CONSUMER_INDEX],
108 	    AAC_ADAP_NORM_RESP_ENTRIES);
109 	device_printf(sc->aac_dev, "ADAP_HIGH_RESP %d/%d (%d)\n",
110 	    sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
111 				      AAC_PRODUCER_INDEX],
112 	    sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
113 				      AAC_CONSUMER_INDEX],
114 	    AAC_ADAP_HIGH_RESP_ENTRIES);
115 	device_printf(sc->aac_dev, "AACQ_FREE      %d/%d\n",
116 	    sc->aac_qstat[AACQ_FREE].q_length, sc->aac_qstat[AACQ_FREE].q_max);
117 	device_printf(sc->aac_dev, "AACQ_BIO       %d/%d\n",
118 	    sc->aac_qstat[AACQ_BIO].q_length, sc->aac_qstat[AACQ_BIO].q_max);
119 	device_printf(sc->aac_dev, "AACQ_READY     %d/%d\n",
120 	    sc->aac_qstat[AACQ_READY].q_length,
121 	    sc->aac_qstat[AACQ_READY].q_max);
122 	device_printf(sc->aac_dev, "AACQ_BUSY      %d/%d\n",
123 	    sc->aac_qstat[AACQ_BUSY].q_length, sc->aac_qstat[AACQ_BUSY].q_max);
124 }
125 
126 /*
127  * Print the command queue states for controller 0 (callable from DDB)
128  */
129 void
130 aac_printstate0(void)
131 {
132 	struct aac_softc *sc;
133 
134 	sc = devclass_get_softc(devclass_find("aac"), 0);
135 
136 	aac_print_queues(sc);
137 	switch (sc->aac_hwif) {
138 	case AAC_HWIF_I960RX:
139 	case AAC_HWIF_NARK:
140 		device_printf(sc->aac_dev, "IDBR 0x%08x  IIMR 0x%08x  "
141 		    "IISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_IDBR),
142 		    AAC_MEM0_GETREG4(sc, AAC_RX_IIMR), AAC_MEM0_GETREG4(sc, AAC_RX_IISR));
143 		device_printf(sc->aac_dev, "ODBR 0x%08x  OIMR 0x%08x  "
144 		    "OISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_ODBR),
145 		    AAC_MEM0_GETREG4(sc, AAC_RX_OIMR), AAC_MEM0_GETREG4(sc, AAC_RX_OISR));
146 		AAC_MEM0_SETREG4(sc, AAC_RX_OIMR, 0/*~(AAC_DB_COMMAND_READY |
147 			    AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)*/);
148 		device_printf(sc->aac_dev, "ODBR 0x%08x  OIMR 0x%08x  "
149 		    "OISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_ODBR),
150 		    AAC_MEM0_GETREG4(sc, AAC_RX_OIMR), AAC_MEM0_GETREG4(sc, AAC_RX_OISR));
151 		break;
152 	case AAC_HWIF_STRONGARM:
153 		/* XXX implement */
154 		break;
155 	}
156 }
157 
158 /*
159  * Panic in a slightly informative fashion
160  */
161 void
162 aac_panic(struct aac_softc *sc, char *reason)
163 {
164 	aac_print_queues(sc);
165 	panic("%s", reason);
166 }
167 
168 /*
169  * Print a FIB
170  */
171 void
172 aac_print_fib(struct aac_softc *sc, struct aac_fib *fib, const char *caller)
173 {
174 	if (fib == NULL) {
175 		device_printf(sc->aac_dev,
176 			      "aac_print_fib called with NULL fib\n");
177 		return;
178 	}
179 	device_printf(sc->aac_dev, "%s: FIB @ %p\n", caller, fib);
180 	device_printf(sc->aac_dev, "  XferState %b\n", fib->Header.XferState,
181 		      "\20"
182 		      "\1HOSTOWNED"
183 		      "\2ADAPTEROWNED"
184 		      "\3INITIALISED"
185 		      "\4EMPTY"
186 		      "\5FROMPOOL"
187 		      "\6FROMHOST"
188 		      "\7FROMADAP"
189 		      "\10REXPECTED"
190 		      "\11RNOTEXPECTED"
191 		      "\12DONEADAP"
192 		      "\13DONEHOST"
193 		      "\14HIGH"
194 		      "\15NORM"
195 		      "\16ASYNC"
196 		      "\17PAGEFILEIO"
197 		      "\20SHUTDOWN"
198 		      "\21LAZYWRITE"
199 		      "\22ADAPMICROFIB"
200 		      "\23BIOSFIB"
201 		      "\24FAST_RESPONSE"
202 		      "\25APIFIB\n");
203 	device_printf(sc->aac_dev, "  Command       %d\n", fib->Header.Command);
204 	device_printf(sc->aac_dev, "  StructType    %d\n",
205 		      fib->Header.StructType);
206 	device_printf(sc->aac_dev, "  Flags         0x%x\n", fib->Header.Flags);
207 	device_printf(sc->aac_dev, "  Size          %d\n", fib->Header.Size);
208 	device_printf(sc->aac_dev, "  SenderSize    %d\n",
209 		      fib->Header.SenderSize);
210 	device_printf(sc->aac_dev, "  SenderAddress 0x%x\n",
211 		      fib->Header.SenderFibAddress);
212 	device_printf(sc->aac_dev, "  RcvrAddress   0x%x\n",
213 		      fib->Header.ReceiverFibAddress);
214 	device_printf(sc->aac_dev, "  SenderData    0x%x\n",
215 		      fib->Header.SenderData);
216 	switch(fib->Header.Command) {
217 	case ContainerCommand:
218 	{
219 		struct aac_blockread *br;
220 		struct aac_blockwrite *bw;
221 		struct aac_sg_table *sg;
222 		int i;
223 
224 		br = (struct aac_blockread*)fib->data;
225 		bw = (struct aac_blockwrite*)fib->data;
226 		sg = NULL;
227 
228 		if (br->Command == VM_CtBlockRead) {
229 			device_printf(sc->aac_dev,
230 				      "  BlockRead: container %d  0x%x/%d\n",
231 				      br->ContainerId, br->BlockNumber,
232 				      br->ByteCount);
233 			sg = &br->SgMap;
234 		}
235 		if (bw->Command == VM_CtBlockWrite) {
236 			device_printf(sc->aac_dev,
237 				      "  BlockWrite: container %d  0x%x/%d "
238 				      "(%s)\n", bw->ContainerId,
239 				      bw->BlockNumber, bw->ByteCount,
240 				      bw->Stable == CSTABLE ? "stable" :
241 				      "unstable");
242 			sg = &bw->SgMap;
243 		}
244 		if (sg != NULL) {
245 			device_printf(sc->aac_dev,
246 				      "  %d s/g entries\n", sg->SgCount);
247 			for (i = 0; i < sg->SgCount; i++)
248 				device_printf(sc->aac_dev, "  0x%08x/%d\n",
249 					      sg->SgEntry[i].SgAddress,
250 					      sg->SgEntry[i].SgByteCount);
251 		}
252 		break;
253 	}
254 	default:
255 		device_printf(sc->aac_dev, "   %16D\n", fib->data, " ");
256 		device_printf(sc->aac_dev, "   %16D\n", fib->data + 16, " ");
257 		break;
258 	}
259 }
260 
261 /*
262  * Describe an AIF we have received.
263  */
264 void
265 aac_print_aif(struct aac_softc *sc, struct aac_aif_command *aif)
266 {
267 	switch(aif->command) {
268 	case AifCmdEventNotify:
269 		device_printf(sc->aac_dev, "EventNotify(%d)\n", aif->seqNumber);
270 		switch(aif->data.EN.type) {
271 		case AifEnGeneric:		/* Generic notification */
272 			device_printf(sc->aac_dev, "(Generic) %.*s\n",
273 				  (int)sizeof(aif->data.EN.data.EG),
274 				  aif->data.EN.data.EG.text);
275 			break;
276 		case AifEnTaskComplete:		/* Task has completed */
277 			device_printf(sc->aac_dev, "(TaskComplete)\n");
278 			break;
279 		case AifEnConfigChange:		/* Adapter configuration change
280 						 * occurred */
281 			device_printf(sc->aac_dev, "(ConfigChange)\n");
282 			break;
283 		case AifEnContainerChange:	/* Adapter specific container
284 						 * configuration change */
285 			device_printf(sc->aac_dev, "(ContainerChange) "
286 				      "container %d,%d\n",
287 				      aif->data.EN.data.ECC.container[0],
288 				      aif->data.EN.data.ECC.container[1]);
289 			break;
290 		case AifEnDeviceFailure:	/* SCSI device failed */
291 			device_printf(sc->aac_dev, "(DeviceFailure) "
292 				      "handle %d\n",
293 				      aif->data.EN.data.EDF.deviceHandle);
294 			break;
295 		case AifEnMirrorFailover:	/* Mirror failover started */
296 			device_printf(sc->aac_dev, "(MirrorFailover) "
297 				      "container %d failed, "
298 				      "migrating from slice %d to %d\n",
299 				      aif->data.EN.data.EMF.container,
300 				      aif->data.EN.data.EMF.failedSlice,
301 				      aif->data.EN.data.EMF.creatingSlice);
302 			break;
303 		case AifEnContainerEvent:	/* Significant container
304 						 * event */
305 			device_printf(sc->aac_dev, "(ContainerEvent) "
306 				      "container %d event "
307 				      "%d\n", aif->data.EN.data.ECE.container,
308 				      aif->data.EN.data.ECE.eventType);
309 			break;
310 		case AifEnFileSystemChange:	/* File system changed */
311 			device_printf(sc->aac_dev, "(FileSystemChange)\n");
312 			break;
313 		case AifEnConfigPause:		/* Container pause event */
314 			device_printf(sc->aac_dev, "(ConfigPause)\n");
315 			break;
316 		case AifEnConfigResume:		/* Container resume event */
317 			device_printf(sc->aac_dev, "(ConfigResume)\n");
318 			break;
319 		case AifEnFailoverChange:	/* Failover space assignment
320 						 * changed */
321 			device_printf(sc->aac_dev, "(FailoverChange)\n");
322 			break;
323 		case AifEnRAID5RebuildDone:	/* RAID5 rebuild finished */
324 			device_printf(sc->aac_dev, "(RAID5RebuildDone)\n");
325 			break;
326 		case AifEnEnclosureManagement:	/* Enclosure management event */
327 			device_printf(sc->aac_dev, "(EnclosureManagement) "
328 				      "EMPID %d unit %d "
329 				      "event %d\n", aif->data.EN.data.EEE.empID,
330 				      aif->data.EN.data.EEE.unitID,
331 				      aif->data.EN.data.EEE.eventType);
332 			break;
333 		case AifEnBatteryEvent:		/* Significant NV battery
334 						 * event */
335 			device_printf(sc->aac_dev, "(BatteryEvent) %d "
336 				      "(state was %d, is %d\n",
337 				      aif->data.EN.data.EBE.transition_type,
338 				      aif->data.EN.data.EBE.current_state,
339 				      aif->data.EN.data.EBE.prior_state);
340 			break;
341 		case AifEnAddContainer:		/* A new container was
342 						 * created. */
343 			device_printf(sc->aac_dev, "(AddContainer)\n");
344 			break;
345 		case AifEnDeleteContainer:	/* A container was deleted. */
346 			device_printf(sc->aac_dev, "(DeleteContainer)\n");
347 			break;
348 		case AifEnBatteryNeedsRecond:	/* The battery needs
349 						 * reconditioning */
350 			device_printf(sc->aac_dev, "(BatteryNeedsRecond)\n");
351 			break;
352 		case AifEnClusterEvent:		/* Some cluster event */
353 			device_printf(sc->aac_dev, "(ClusterEvent) event %d\n",
354 				      aif->data.EN.data.ECLE.eventType);
355 			break;
356 		case AifEnDiskSetEvent:		/* A disk set event occurred. */
357 			device_printf(sc->aac_dev, "(DiskSetEvent) event %d "
358 				      "diskset %jd creator %jd\n",
359 				      aif->data.EN.data.EDS.eventType,
360 				      (intmax_t)aif->data.EN.data.EDS.DsNum,
361 				      (intmax_t)aif->data.EN.data.EDS.CreatorId);
362 			break;
363 		case AifDenMorphComplete: 	/* A morph operation
364 						 * completed */
365 			device_printf(sc->aac_dev, "(MorphComplete)\n");
366 			break;
367 		case AifDenVolumeExtendComplete: /* A volume expand operation
368 						  * completed */
369 			device_printf(sc->aac_dev, "(VolumeExtendComplete)\n");
370 			break;
371 		default:
372 			device_printf(sc->aac_dev, "(%d)\n", aif->data.EN.type);
373 			break;
374 		}
375 		break;
376 	case AifCmdJobProgress:
377 	{
378 		char	*status;
379 		switch(aif->data.PR[0].status) {
380 		case AifJobStsSuccess:
381 			status = "success"; break;
382 		case AifJobStsFinished:
383 			status = "finished"; break;
384 		case AifJobStsAborted:
385 			status = "aborted"; break;
386 		case AifJobStsFailed:
387 			status = "failed"; break;
388 		case AifJobStsSuspended:
389 			status = "suspended"; break;
390 		case AifJobStsRunning:
391 			status = "running"; break;
392 		default:
393 			status = "unknown status"; break;
394 		}
395 
396 		device_printf(sc->aac_dev, "JobProgress (%d) - %s (%d, %d)\n",
397 			      aif->seqNumber, status,
398 			      aif->data.PR[0].currentTick,
399 			      aif->data.PR[0].finalTick);
400 		switch(aif->data.PR[0].jd.type) {
401 		case AifJobScsiZero:		/* SCSI dev clear operation */
402 			device_printf(sc->aac_dev, "(ScsiZero) handle %d\n",
403 				      aif->data.PR[0].jd.client.scsi_dh);
404 			break;
405 		case AifJobScsiVerify:		/* SCSI device Verify operation
406 						 * NO REPAIR */
407 			device_printf(sc->aac_dev, "(ScsiVerify) handle %d\n",
408 				      aif->data.PR[0].jd.client.scsi_dh);
409 			break;
410 		case AifJobScsiExercise:	/* SCSI device Exercise
411 						 * operation */
412 			device_printf(sc->aac_dev, "(ScsiExercise) handle %d\n",
413 				      aif->data.PR[0].jd.client.scsi_dh);
414 			break;
415 		case AifJobScsiVerifyRepair:	/* SCSI device Verify operation
416 						 * WITH repair */
417 			device_printf(sc->aac_dev,
418 				      "(ScsiVerifyRepair) handle %d\n",
419 				      aif->data.PR[0].jd.client.scsi_dh);
420 			break;
421 		case AifJobCtrZero:		/* Container clear operation */
422 			device_printf(sc->aac_dev,
423 				      "(ContainerZero) container %d\n",
424 				      aif->data.PR[0].jd.client.container.src);
425 			break;
426 		case AifJobCtrCopy:		/* Container copy operation */
427 			device_printf(sc->aac_dev,
428 				      "(ContainerCopy) container %d to %d\n",
429 				      aif->data.PR[0].jd.client.container.src,
430 				      aif->data.PR[0].jd.client.container.dst);
431 			break;
432 		case AifJobCtrCreateMirror:	/* Container Create Mirror
433 						 * operation */
434 			device_printf(sc->aac_dev,
435 				      "(ContainerCreateMirror) container %d\n",
436 				      aif->data.PR[0].jd.client.container.src);
437 				      /* XXX two containers? */
438 			break;
439 		case AifJobCtrMergeMirror:	/* Container Merge Mirror
440 						 * operation */
441 			device_printf(sc->aac_dev,
442 				      "(ContainerMergeMirror) container %d\n",
443 				      aif->data.PR[0].jd.client.container.src);
444 				      /* XXX two containers? */
445 			break;
446 		case AifJobCtrScrubMirror:	/* Container Scrub Mirror
447 						 * operation */
448 			device_printf(sc->aac_dev,
449 				      "(ContainerScrubMirror) container %d\n",
450 				      aif->data.PR[0].jd.client.container.src);
451 			break;
452 		case AifJobCtrRebuildRaid5:	/* Container Rebuild Raid5
453 						 * operation */
454 			device_printf(sc->aac_dev,
455 				      "(ContainerRebuildRaid5) container %d\n",
456 				      aif->data.PR[0].jd.client.container.src);
457 			break;
458 		case AifJobCtrScrubRaid5:	/* Container Scrub Raid5
459 						 * operation */
460 			device_printf(sc->aac_dev,
461 				      "(ContainerScrubRaid5) container %d\n",
462 				      aif->data.PR[0].jd.client.container.src);
463 			break;
464 		case AifJobCtrMorph:		/* Container morph operation */
465 			device_printf(sc->aac_dev,
466 				      "(ContainerMorph) container %d\n",
467 				      aif->data.PR[0].jd.client.container.src);
468 				      /* XXX two containers? */
469 			break;
470 		case AifJobCtrPartCopy:		/* Container Partition copy
471 						 * operation */
472 			device_printf(sc->aac_dev,
473 				      "(ContainerPartCopy) container %d to "
474 				      "%d\n",
475 				      aif->data.PR[0].jd.client.container.src,
476 				      aif->data.PR[0].jd.client.container.dst);
477 			break;
478 		case AifJobCtrRebuildMirror:	/* Container Rebuild Mirror
479 						 * operation */
480 			device_printf(sc->aac_dev,
481 				      "(ContainerRebuildMirror) container "
482 				      "%d\n",
483 				      aif->data.PR[0].jd.client.container.src);
484 			break;
485 		case AifJobCtrCrazyCache:	/* crazy cache */
486 			device_printf(sc->aac_dev,
487 				      "(ContainerCrazyCache) container %d\n",
488 				      aif->data.PR[0].jd.client.container.src);
489 				      /* XXX two containers? */
490 			break;
491 		case AifJobFsCreate:		/* File System Create
492 						 * operation */
493 			device_printf(sc->aac_dev, "(FsCreate)\n");
494 			break;
495 		case AifJobFsVerify:		/* File System Verify
496 						 * operation */
497 			device_printf(sc->aac_dev, "(FsVerivy)\n");
498 			break;
499 		case AifJobFsExtend:		/* File System Extend
500 						 * operation */
501 			device_printf(sc->aac_dev, "(FsExtend)\n");
502 			break;
503 		case AifJobApiFormatNTFS:	/* Format a drive to NTFS */
504 			device_printf(sc->aac_dev, "(FormatNTFS)\n");
505 			break;
506 		case AifJobApiFormatFAT:	/* Format a drive to FAT */
507 			device_printf(sc->aac_dev, "(FormatFAT)\n");
508 			break;
509 		case AifJobApiUpdateSnapshot:	/* update the read/write half
510 						 * of a snapshot */
511 			device_printf(sc->aac_dev, "(UpdateSnapshot)\n");
512 			break;
513 		case AifJobApiFormatFAT32:	/* Format a drive to FAT32 */
514 			device_printf(sc->aac_dev, "(FormatFAT32)\n");
515 			break;
516 		case AifJobCtlContinuousCtrVerify: /* Adapter operation */
517 			device_printf(sc->aac_dev, "(ContinuousCtrVerify)\n");
518 			break;
519 		default:
520 			device_printf(sc->aac_dev, "(%d)\n",
521 				      aif->data.PR[0].jd.type);
522 			break;
523 		}
524 		break;
525 	}
526 	case AifCmdAPIReport:
527 		device_printf(sc->aac_dev, "APIReport (%d)\n", aif->seqNumber);
528 		break;
529 	case AifCmdDriverNotify:
530 		device_printf(sc->aac_dev, "DriverNotify (%d)\n",
531 			      aif->seqNumber);
532 		break;
533 	default:
534 		device_printf(sc->aac_dev, "AIF %d (%d)\n", aif->command,
535 			      aif->seqNumber);
536 		break;
537 	}
538 }
539 #endif /* AAC_DEBUG */
540