xref: /freebsd/sys/dev/aac/aac_debug.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause
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 /*
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 int	aac_debug_enable = 0;
54 void	aac_printstate0(void);
55 
56 /*
57  * Dump the command queue indices
58  */
59 void
aac_print_queues(struct aac_softc * sc)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
aac_printstate0(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 	case AAC_HWIF_NARK:
138 		device_printf(sc->aac_dev, "IDBR 0x%08x  IIMR 0x%08x  "
139 		    "IISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_IDBR),
140 		    AAC_MEM0_GETREG4(sc, AAC_RX_IIMR), AAC_MEM0_GETREG4(sc, AAC_RX_IISR));
141 		device_printf(sc->aac_dev, "ODBR 0x%08x  OIMR 0x%08x  "
142 		    "OISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_ODBR),
143 		    AAC_MEM0_GETREG4(sc, AAC_RX_OIMR), AAC_MEM0_GETREG4(sc, AAC_RX_OISR));
144 		AAC_MEM0_SETREG4(sc, AAC_RX_OIMR, 0/*~(AAC_DB_COMMAND_READY |
145 			    AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)*/);
146 		device_printf(sc->aac_dev, "ODBR 0x%08x  OIMR 0x%08x  "
147 		    "OISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_ODBR),
148 		    AAC_MEM0_GETREG4(sc, AAC_RX_OIMR), AAC_MEM0_GETREG4(sc, AAC_RX_OISR));
149 		break;
150 	case AAC_HWIF_STRONGARM:
151 		/* XXX implement */
152 		break;
153 	}
154 }
155 
156 /*
157  * Panic in a slightly informative fashion
158  */
159 void
aac_panic(struct aac_softc * sc,char * reason)160 aac_panic(struct aac_softc *sc, char *reason)
161 {
162 	aac_print_queues(sc);
163 	panic("%s", reason);
164 }
165 
166 /*
167  * Print a FIB
168  */
169 void
aac_print_fib(struct aac_softc * sc,struct aac_fib * fib,const char * caller)170 aac_print_fib(struct aac_softc *sc, struct aac_fib *fib, const char *caller)
171 {
172 	if (fib == NULL) {
173 		device_printf(sc->aac_dev,
174 			      "aac_print_fib called with NULL fib\n");
175 		return;
176 	}
177 	device_printf(sc->aac_dev, "%s: FIB @ %p\n", caller, fib);
178 	device_printf(sc->aac_dev, "  XferState %b\n", fib->Header.XferState,
179 		      "\20"
180 		      "\1HOSTOWNED"
181 		      "\2ADAPTEROWNED"
182 		      "\3INITIALISED"
183 		      "\4EMPTY"
184 		      "\5FROMPOOL"
185 		      "\6FROMHOST"
186 		      "\7FROMADAP"
187 		      "\10REXPECTED"
188 		      "\11RNOTEXPECTED"
189 		      "\12DONEADAP"
190 		      "\13DONEHOST"
191 		      "\14HIGH"
192 		      "\15NORM"
193 		      "\16ASYNC"
194 		      "\17PAGEFILEIO"
195 		      "\20SHUTDOWN"
196 		      "\21LAZYWRITE"
197 		      "\22ADAPMICROFIB"
198 		      "\23BIOSFIB"
199 		      "\24FAST_RESPONSE"
200 		      "\25APIFIB\n");
201 	device_printf(sc->aac_dev, "  Command       %d\n", fib->Header.Command);
202 	device_printf(sc->aac_dev, "  StructType    %d\n",
203 		      fib->Header.StructType);
204 	device_printf(sc->aac_dev, "  Flags         0x%x\n", fib->Header.Flags);
205 	device_printf(sc->aac_dev, "  Size          %d\n", fib->Header.Size);
206 	device_printf(sc->aac_dev, "  SenderSize    %d\n",
207 		      fib->Header.SenderSize);
208 	device_printf(sc->aac_dev, "  SenderAddress 0x%x\n",
209 		      fib->Header.SenderFibAddress);
210 	device_printf(sc->aac_dev, "  RcvrAddress   0x%x\n",
211 		      fib->Header.ReceiverFibAddress);
212 	device_printf(sc->aac_dev, "  SenderData    0x%x\n",
213 		      fib->Header.SenderData);
214 	switch(fib->Header.Command) {
215 	case ContainerCommand:
216 	{
217 		struct aac_blockread *br;
218 		struct aac_blockwrite *bw;
219 		struct aac_sg_table *sg;
220 		int i;
221 
222 		br = (struct aac_blockread*)fib->data;
223 		bw = (struct aac_blockwrite*)fib->data;
224 		sg = NULL;
225 
226 		if (br->Command == VM_CtBlockRead) {
227 			device_printf(sc->aac_dev,
228 				      "  BlockRead: container %d  0x%x/%d\n",
229 				      br->ContainerId, br->BlockNumber,
230 				      br->ByteCount);
231 			sg = &br->SgMap;
232 		}
233 		if (bw->Command == VM_CtBlockWrite) {
234 			device_printf(sc->aac_dev,
235 				      "  BlockWrite: container %d  0x%x/%d "
236 				      "(%s)\n", bw->ContainerId,
237 				      bw->BlockNumber, bw->ByteCount,
238 				      bw->Stable == CSTABLE ? "stable" :
239 				      "unstable");
240 			sg = &bw->SgMap;
241 		}
242 		if (sg != NULL) {
243 			device_printf(sc->aac_dev,
244 				      "  %d s/g entries\n", sg->SgCount);
245 			for (i = 0; i < sg->SgCount; i++)
246 				device_printf(sc->aac_dev, "  0x%08x/%d\n",
247 					      sg->SgEntry[i].SgAddress,
248 					      sg->SgEntry[i].SgByteCount);
249 		}
250 		break;
251 	}
252 	default:
253 		device_printf(sc->aac_dev, "   %16D\n", fib->data, " ");
254 		device_printf(sc->aac_dev, "   %16D\n", fib->data + 16, " ");
255 		break;
256 	}
257 }
258 
259 /*
260  * Describe an AIF we have received.
261  */
262 void
aac_print_aif(struct aac_softc * sc,struct aac_aif_command * aif)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 occurred. */
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