aac_debug.c revision 112939
1214152Sed/*-
2214152Sed * Copyright (c) 2000 Michael Smith
3214152Sed * Copyright (c) 2001 Scott Long
4214152Sed * Copyright (c) 2000 BSDi
5222656Sed * Copyright (c) 2001 Adaptec, Inc.
6222656Sed * All rights reserved.
7214152Sed *
8214152Sed * Redistribution and use in source and binary forms, with or without
9214152Sed * modification, are permitted provided that the following conditions
10214152Sed * are met:
11214152Sed * 1. Redistributions of source code must retain the above copyright
12214152Sed *    notice, this list of conditions and the following disclaimer.
13214152Sed * 2. Redistributions in binary form must reproduce the above copyright
14214152Sed *    notice, this list of conditions and the following disclaimer in the
15214152Sed *    documentation and/or other materials provided with the distribution.
16214152Sed *
17214152Sed * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18229135Sed * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19214152Sed * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20214152Sed * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21214152Sed * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22214152Sed * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23214152Sed * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24214152Sed * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25214152Sed * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26214152Sed * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27214152Sed * SUCH DAMAGE.
28214152Sed *
29214152Sed *	$FreeBSD: head/sys/dev/aac/aac_debug.c 112939 2003-04-01 12:35:17Z phk $
30214152Sed */
31214152Sed
32229135Sed/*
33214152Sed * Debugging support.
34214152Sed */
35229135Sed#include "opt_aac.h"
36214152Sed
37229135Sed#include <sys/param.h>
38229135Sed#include <sys/systm.h>
39229135Sed#include <sys/kernel.h>
40229135Sed#include <sys/conf.h>
41229135Sed
42229135Sed#include <dev/aac/aac_compat.h>
43214152Sed#include <sys/bus.h>
44214152Sed#include <sys/disk.h>
45229135Sed
46214152Sed#include <machine/resource.h>
47229135Sed#include <machine/bus.h>
48229135Sed
49229135Sed#include <dev/aac/aacreg.h>
50229135Sed#include <dev/aac/aac_ioctl.h>
51229135Sed#include <dev/aac/aacvar.h>
52229135Sed
53214152Sed#ifdef AAC_DEBUG
54214152Sedvoid	aac_printstate0(void);
55229135Sedvoid	aac_intr0(void);
56229135Sed
57214152Sed/*
58229135Sed * Dump the command queue indices
59229135Sed */
60229135Sedvoid
61229135Sedaac_print_queues(struct aac_softc *sc)
62229135Sed{
63229135Sed	device_printf(sc->aac_dev, "FIB queue header at %p  queues at %p\n",
64229135Sed	    &sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][0],
65229135Sed	    &sc->aac_queues->qt_HostNormCmdQueue[0]);
66214152Sed	device_printf(sc->aac_dev, "HOST_NORM_CMD  %d/%d (%d)\n",
67214152Sed	    sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
68214152Sed				      AAC_PRODUCER_INDEX],
69214152Sed	    sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
70229135Sed				      AAC_CONSUMER_INDEX],
71229135Sed	    AAC_HOST_NORM_CMD_ENTRIES);
72214152Sed	device_printf(sc->aac_dev, "HOST_HIGH_CMD  %d/%d (%d)\n",
73214152Sed	    sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
74214152Sed				      AAC_PRODUCER_INDEX],
75214152Sed	    sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
76214152Sed				      AAC_CONSUMER_INDEX],
77214152Sed	    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 */
131void
132aac_printstate0(void)
133{
134	struct aac_softc *sc;
135
136	sc = devclass_get_softc(devclass_find("aac"), 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		break;
156	}
157}
158
159/*
160 * simulate an interrupt for controller 0
161 */
162void
163aac_intr0(void)
164{
165	struct aac_softc *sc;
166
167	sc = devclass_get_softc(devclass_find("aac"), 0);
168
169	aac_intr(sc);
170}
171
172/*
173 * Panic in a slightly informative fashion
174 */
175void
176aac_panic(struct aac_softc *sc, char *reason)
177{
178	aac_print_queues(sc);
179	panic(reason);
180}
181
182/*
183 * Print a FIB
184 */
185void
186aac_print_fib(struct aac_softc *sc, struct aac_fib *fib, const 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 */
278void
279aac_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