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