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