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