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