xref: /dragonfly/sys/dev/raid/aac/aac_debug.c (revision 984263bc)
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: src/sys/dev/aac/aac_debug.c,v 1.2.2.5 2003/01/11 18:39:39 scottl Exp $
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 	if (fib == NULL) {
188 		device_printf(sc->aac_dev,
189 			      "aac_print_fib called with NULL fib\n");
190 		return;
191 	}
192 	device_printf(sc->aac_dev, "%s: FIB @ %p\n", caller, fib);
193 	device_printf(sc->aac_dev, "  XferState %b\n", fib->Header.XferState,
194 		      "\20"
195 		      "\1HOSTOWNED"
196 		      "\2ADAPTEROWNED"
197 		      "\3INITIALISED"
198 		      "\4EMPTY"
199 		      "\5FROMPOOL"
200 		      "\6FROMHOST"
201 		      "\7FROMADAP"
202 		      "\10REXPECTED"
203 		      "\11RNOTEXPECTED"
204 		      "\12DONEADAP"
205 		      "\13DONEHOST"
206 		      "\14HIGH"
207 		      "\15NORM"
208 		      "\16ASYNC"
209 		      "\17PAGEFILEIO"
210 		      "\20SHUTDOWN"
211 		      "\21LAZYWRITE"
212 		      "\22ADAPMICROFIB"
213 		      "\23BIOSFIB"
214 		      "\24FAST_RESPONSE"
215 		      "\25APIFIB\n");
216 	device_printf(sc->aac_dev, "  Command       %d\n", fib->Header.Command);
217 	device_printf(sc->aac_dev, "  StructType    %d\n",
218 		      fib->Header.StructType);
219 	device_printf(sc->aac_dev, "  Flags         0x%x\n", fib->Header.Flags);
220 	device_printf(sc->aac_dev, "  Size          %d\n", fib->Header.Size);
221 	device_printf(sc->aac_dev, "  SenderSize    %d\n",
222 		      fib->Header.SenderSize);
223 	device_printf(sc->aac_dev, "  SenderAddress 0x%x\n",
224 		      fib->Header.SenderFibAddress);
225 	device_printf(sc->aac_dev, "  RcvrAddress   0x%x\n",
226 		      fib->Header.ReceiverFibAddress);
227 	device_printf(sc->aac_dev, "  SenderData    0x%x\n",
228 		      fib->Header.SenderData);
229 	switch(fib->Header.Command) {
230 	case ContainerCommand:
231 	{
232 		struct aac_blockread *br;
233 		struct aac_blockwrite *bw;
234 		struct aac_sg_table *sg;
235 		int i;
236 
237 		br = (struct aac_blockread*)fib->data;
238 		bw = (struct aac_blockwrite*)fib->data;
239 		sg = NULL;
240 
241 		if (br->Command == VM_CtBlockRead) {
242 			device_printf(sc->aac_dev,
243 				      "  BlockRead: container %d  0x%x/%d\n",
244 				      br->ContainerId, br->BlockNumber,
245 				      br->ByteCount);
246 			sg = &br->SgMap;
247 		}
248 		if (bw->Command == VM_CtBlockWrite) {
249 			device_printf(sc->aac_dev,
250 				      "  BlockWrite: container %d  0x%x/%d "
251 				      "(%s)\n", bw->ContainerId,
252 				      bw->BlockNumber, bw->ByteCount,
253 				      bw->Stable == CSTABLE ? "stable" :
254 				      "unstable");
255 			sg = &bw->SgMap;
256 		}
257 		if (sg != NULL) {
258 			device_printf(sc->aac_dev,
259 				      "  %d s/g entries\n", sg->SgCount);
260 			for (i = 0; i < sg->SgCount; i++)
261 				device_printf(sc->aac_dev, "  0x%08x/%d\n",
262 					      sg->SgEntry[i].SgAddress,
263 					      sg->SgEntry[i].SgByteCount);
264 		}
265 		break;
266 	}
267 	default:
268 		device_printf(sc->aac_dev, "   %16D\n", fib->data, " ");
269 		device_printf(sc->aac_dev, "   %16D\n", fib->data + 16, " ");
270 		break;
271 	}
272 }
273 
274 /*
275  * Describe an AIF we have received.
276  */
277 void
278 aac_print_aif(struct aac_softc *sc, struct aac_aif_command *aif)
279 {
280 	switch(aif->command) {
281 	case AifCmdEventNotify:
282 		device_printf(sc->aac_dev, "EventNotify(%d)\n", aif->seqNumber);
283 		switch(aif->data.EN.type) {
284 		case AifEnGeneric:		/* Generic notification */
285 			device_printf(sc->aac_dev, "(Generic) %.*s\n",
286 				  (int)sizeof(aif->data.EN.data.EG),
287 				  aif->data.EN.data.EG.text);
288 			break;
289 		case AifEnTaskComplete:		/* Task has completed */
290 			device_printf(sc->aac_dev, "(TaskComplete)\n");
291 			break;
292 		case AifEnConfigChange:		/* Adapter configuration change
293 						 * occurred */
294 			device_printf(sc->aac_dev, "(ConfigChange)\n");
295 			break;
296 		case AifEnContainerChange:	/* Adapter specific container
297 						 * configuration change */
298 			device_printf(sc->aac_dev, "(ContainerChange) "
299 				      "container %d,%d\n",
300 				      aif->data.EN.data.ECC.container[0],
301 				      aif->data.EN.data.ECC.container[1]);
302 			break;
303 		case AifEnDeviceFailure:	/* SCSI device failed */
304 			device_printf(sc->aac_dev, "(DeviceFailure) "
305 				      "handle %d\n",
306 				      aif->data.EN.data.EDF.deviceHandle);
307 			break;
308 		case AifEnMirrorFailover:	/* Mirror failover started */
309 			device_printf(sc->aac_dev, "(MirrorFailover) "
310 				      "container %d failed, "
311 				      "migrating from slice %d to %d\n",
312 				      aif->data.EN.data.EMF.container,
313 				      aif->data.EN.data.EMF.failedSlice,
314 				      aif->data.EN.data.EMF.creatingSlice);
315 			break;
316 		case AifEnContainerEvent:	/* Significant container
317 						 * event */
318 			device_printf(sc->aac_dev, "(ContainerEvent) "
319 				      "container %d event "
320 				      "%d\n", aif->data.EN.data.ECE.container,
321 				      aif->data.EN.data.ECE.eventType);
322 			break;
323 		case AifEnFileSystemChange:	/* File system changed */
324 			device_printf(sc->aac_dev, "(FileSystemChange)\n");
325 			break;
326 		case AifEnConfigPause:		/* Container pause event */
327 			device_printf(sc->aac_dev, "(ConfigPause)\n");
328 			break;
329 		case AifEnConfigResume:		/* Container resume event */
330 			device_printf(sc->aac_dev, "(ConfigResume)\n");
331 			break;
332 		case AifEnFailoverChange:	/* Failover space assignment
333 						 * changed */
334 			device_printf(sc->aac_dev, "(FailoverChange)\n");
335 			break;
336 		case AifEnRAID5RebuildDone:	/* RAID5 rebuild finished */
337 			device_printf(sc->aac_dev, "(RAID5RebuildDone)\n");
338 			break;
339 		case AifEnEnclosureManagement:	/* Enclosure management event */
340 			device_printf(sc->aac_dev, "(EnclosureManagement) "
341 				      "EMPID %d unit %d "
342 				      "event %d\n", aif->data.EN.data.EEE.empID,
343 				      aif->data.EN.data.EEE.unitID,
344 				      aif->data.EN.data.EEE.eventType);
345 			break;
346 		case AifEnBatteryEvent:		/* Significant NV battery
347 						 * event */
348 			device_printf(sc->aac_dev, "(BatteryEvent) %d "
349 				      "(state was %d, is %d\n",
350 				      aif->data.EN.data.EBE.transition_type,
351 				      aif->data.EN.data.EBE.current_state,
352 				      aif->data.EN.data.EBE.prior_state);
353 			break;
354 		case AifEnAddContainer:		/* A new container was
355 						 * created. */
356 			device_printf(sc->aac_dev, "(AddContainer)\n");
357 			break;
358 		case AifEnDeleteContainer:	/* A container was deleted. */
359 			device_printf(sc->aac_dev, "(DeleteContainer)\n");
360 			break;
361 		case AifEnBatteryNeedsRecond:	/* The battery needs
362 						 * reconditioning */
363 			device_printf(sc->aac_dev, "(BatteryNeedsRecond)\n");
364 			break;
365 		case AifEnClusterEvent:		/* Some cluster event */
366 			device_printf(sc->aac_dev, "(ClusterEvent) event %d\n",
367 				      aif->data.EN.data.ECLE.eventType);
368 			break;
369 		case AifEnDiskSetEvent:		/* A disk set event occured. */
370 			device_printf(sc->aac_dev, "(DiskSetEvent) event %d "
371 				      "diskset %lld creator %lld\n",
372 				      aif->data.EN.data.EDS.eventType,
373 				      aif->data.EN.data.EDS.DsNum,
374 				      aif->data.EN.data.EDS.CreatorId);
375 			break;
376 		case AifDenMorphComplete: 	/* A morph operation
377 						 * completed */
378 			device_printf(sc->aac_dev, "(MorphComplete)\n");
379 			break;
380 		case AifDenVolumeExtendComplete: /* A volume expand operation
381 						  * completed */
382 			device_printf(sc->aac_dev, "(VolumeExtendComplete)\n");
383 			break;
384 		default:
385 			device_printf(sc->aac_dev, "(%d)\n", aif->data.EN.type);
386 			break;
387 		}
388 		break;
389 	case AifCmdJobProgress:
390 	{
391 		char	*status;
392 		switch(aif->data.PR[0].status) {
393 		case AifJobStsSuccess:
394 			status = "success"; break;
395 		case AifJobStsFinished:
396 			status = "finished"; break;
397 		case AifJobStsAborted:
398 			status = "aborted"; break;
399 		case AifJobStsFailed:
400 			status = "failed"; break;
401 		case AifJobStsSuspended:
402 			status = "suspended"; break;
403 		case AifJobStsRunning:
404 			status = "running"; break;
405 		default:
406 			status = "unknown status"; break;
407 		}
408 
409 		device_printf(sc->aac_dev, "JobProgress (%d) - %s (%d, %d)\n",
410 			      aif->seqNumber, status,
411 			      aif->data.PR[0].currentTick,
412 			      aif->data.PR[0].finalTick);
413 		switch(aif->data.PR[0].jd.type) {
414 		case AifJobScsiZero:		/* SCSI dev clear operation */
415 			device_printf(sc->aac_dev, "(ScsiZero) handle %d\n",
416 				      aif->data.PR[0].jd.client.scsi_dh);
417 			break;
418 		case AifJobScsiVerify:		/* SCSI device Verify operation
419 						 * NO REPAIR */
420 			device_printf(sc->aac_dev, "(ScsiVerify) handle %d\n",
421 				      aif->data.PR[0].jd.client.scsi_dh);
422 			break;
423 		case AifJobScsiExercise:	/* SCSI device Exercise
424 						 * operation */
425 			device_printf(sc->aac_dev, "(ScsiExercise) handle %d\n",
426 				      aif->data.PR[0].jd.client.scsi_dh);
427 			break;
428 		case AifJobScsiVerifyRepair:	/* SCSI device Verify operation
429 						 * WITH repair */
430 			device_printf(sc->aac_dev,
431 				      "(ScsiVerifyRepair) handle %d\n",
432 				      aif->data.PR[0].jd.client.scsi_dh);
433 			break;
434 		case AifJobCtrZero:		/* Container clear operation */
435 			device_printf(sc->aac_dev,
436 				      "(ConatainerZero) container %d\n",
437 				      aif->data.PR[0].jd.client.container.src);
438 			break;
439 		case AifJobCtrCopy:		/* Container copy operation */
440 			device_printf(sc->aac_dev,
441 				      "(ConatainerCopy) container %d to %d\n",
442 				      aif->data.PR[0].jd.client.container.src,
443 				      aif->data.PR[0].jd.client.container.dst);
444 			break;
445 		case AifJobCtrCreateMirror:	/* Container Create Mirror
446 						 * operation */
447 			device_printf(sc->aac_dev,
448 				      "(ConatainerCreateMirror) container %d\n",
449 				      aif->data.PR[0].jd.client.container.src);
450 				      /* XXX two containers? */
451 			break;
452 		case AifJobCtrMergeMirror:	/* Container Merge Mirror
453 						 * operation */
454 			device_printf(sc->aac_dev,
455 				      "(ConatainerMergeMirror) container %d\n",
456 				      aif->data.PR[0].jd.client.container.src);
457 				      /* XXX two containers? */
458 			break;
459 		case AifJobCtrScrubMirror:	/* Container Scrub Mirror
460 						 * operation */
461 			device_printf(sc->aac_dev,
462 				      "(ConatainerScrubMirror) container %d\n",
463 				      aif->data.PR[0].jd.client.container.src);
464 			break;
465 		case AifJobCtrRebuildRaid5:	/* Container Rebuild Raid5
466 						 * operation */
467 			device_printf(sc->aac_dev,
468 				      "(ConatainerRebuildRaid5) container %d\n",
469 				      aif->data.PR[0].jd.client.container.src);
470 			break;
471 		case AifJobCtrScrubRaid5:	/* Container Scrub Raid5
472 						 * operation */
473 			device_printf(sc->aac_dev,
474 				      "(ConatainerScrubRaid5) container %d\n",
475 				      aif->data.PR[0].jd.client.container.src);
476 			break;
477 		case AifJobCtrMorph:		/* Container morph operation */
478 			device_printf(sc->aac_dev,
479 				      "(ConatainerMorph) container %d\n",
480 				      aif->data.PR[0].jd.client.container.src);
481 				      /* XXX two containers? */
482 			break;
483 		case AifJobCtrPartCopy:		/* Container Partition copy
484 						 * operation */
485 			device_printf(sc->aac_dev,
486 				      "(ConatainerPartCopy) container %d to "
487 				      "%d\n",
488 				      aif->data.PR[0].jd.client.container.src,
489 				      aif->data.PR[0].jd.client.container.dst);
490 			break;
491 		case AifJobCtrRebuildMirror:	/* Container Rebuild Mirror
492 						 * operation */
493 			device_printf(sc->aac_dev,
494 				      "(ConatainerRebuildMirror) container "
495 				      "%d\n",
496 				      aif->data.PR[0].jd.client.container.src);
497 			break;
498 		case AifJobCtrCrazyCache:	/* crazy cache */
499 			device_printf(sc->aac_dev,
500 				      "(ConatainerCrazyCache) container %d\n",
501 				      aif->data.PR[0].jd.client.container.src);
502 				      /* XXX two containers? */
503 			break;
504 		case AifJobFsCreate:		/* File System Create
505 						 * operation */
506 			device_printf(sc->aac_dev, "(FsCreate)\n");
507 			break;
508 		case AifJobFsVerify:		/* File System Verify
509 						 * operation */
510 			device_printf(sc->aac_dev, "(FsVerivy)\n");
511 			break;
512 		case AifJobFsExtend:		/* File System Extend
513 						 * operation */
514 			device_printf(sc->aac_dev, "(FsExtend)\n");
515 			break;
516 		case AifJobApiFormatNTFS:	/* Format a drive to NTFS */
517 			device_printf(sc->aac_dev, "(FormatNTFS)\n");
518 			break;
519 		case AifJobApiFormatFAT:	/* Format a drive to FAT */
520 			device_printf(sc->aac_dev, "(FormatFAT)\n");
521 			break;
522 		case AifJobApiUpdateSnapshot:	/* update the read/write half
523 						 * of a snapshot */
524 			device_printf(sc->aac_dev, "(UpdateSnapshot)\n");
525 			break;
526 		case AifJobApiFormatFAT32:	/* Format a drive to FAT32 */
527 			device_printf(sc->aac_dev, "(FormatFAT32)\n");
528 			break;
529 		case AifJobCtlContinuousCtrVerify: /* Adapter operation */
530 			device_printf(sc->aac_dev, "(ContinuousCtrVerify)\n");
531 			break;
532 		default:
533 			device_printf(sc->aac_dev, "(%d)\n",
534 				      aif->data.PR[0].jd.type);
535 			break;
536 		}
537 		break;
538 	}
539 	case AifCmdAPIReport:
540 		device_printf(sc->aac_dev, "APIReport (%d)\n", aif->seqNumber);
541 		break;
542 	case AifCmdDriverNotify:
543 		device_printf(sc->aac_dev, "DriverNotify (%d)\n",
544 			      aif->seqNumber);
545 		break;
546 	default:
547 		device_printf(sc->aac_dev, "AIF %d (%d)\n", aif->command,
548 			      aif->seqNumber);
549 		break;
550 	}
551 }
552 #endif /* AAC_DEBUG */
553