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