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