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