Deleted Added
full compact
aac_debug.c (87183) aac_debug.c (89112)
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 *
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 $
29 * $FreeBSD: head/sys/dev/aac/aac_debug.c 89112 2002-01-09 03:32:40Z msmith $
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
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);
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 }
156}
157
158/*
159 * simulate an interrupt for controller 0
160 */
161void
162aac_intr0(void)
163{
164 struct aac_softc *sc;
165
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);
166 sc = devclass_get_softc(devclass_find("aac"), 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 */
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 */