2 * Copyright (c) 2000 Michael Smith
3 * Copyright (c) 2001 Scott Long
4 * Copyright (c) 2000 BSDi
5 * Copyright (c) 2001 Adaptec, Inc.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
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.
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
29 * $FreeBSD: src/sys/dev/aac/aac_debug.c,v 1.26 2010/04/13 00:33:07 emaste Exp $
37 #include <sys/param.h>
38 #include <sys/systm.h>
39 #include <sys/kernel.h>
44 #include <dev/raid/aac/aacreg.h>
45 #include <dev/raid/aac/aac_ioctl.h>
46 #include <dev/raid/aac/aacvar.h>
49 int aac_debug_enable = 0;
50 void aac_printstate0(void);
53 * Dump the command queue indices
56 aac_print_queues(struct aac_softc *sc)
58 device_printf(sc->aac_dev, "FIB queue header at %p queues at %p\n",
59 &sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][0],
60 &sc->aac_queues->qt_HostNormCmdQueue[0]);
61 device_printf(sc->aac_dev, "HOST_NORM_CMD %d/%d (%d)\n",
62 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
64 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
66 AAC_HOST_NORM_CMD_ENTRIES);
67 device_printf(sc->aac_dev, "HOST_HIGH_CMD %d/%d (%d)\n",
68 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
70 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
72 AAC_HOST_HIGH_CMD_ENTRIES);
73 device_printf(sc->aac_dev, "ADAP_NORM_CMD %d/%d (%d)\n",
74 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
76 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
78 AAC_ADAP_NORM_CMD_ENTRIES);
79 device_printf(sc->aac_dev, "ADAP_HIGH_CMD %d/%d (%d)\n",
80 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
82 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
84 AAC_ADAP_HIGH_CMD_ENTRIES);
85 device_printf(sc->aac_dev, "HOST_NORM_RESP %d/%d (%d)\n",
86 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
88 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
90 AAC_HOST_NORM_RESP_ENTRIES);
91 device_printf(sc->aac_dev, "HOST_HIGH_RESP %d/%d (%d)\n",
92 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
94 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
96 AAC_HOST_HIGH_RESP_ENTRIES);
97 device_printf(sc->aac_dev, "ADAP_NORM_RESP %d/%d (%d)\n",
98 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
100 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
102 AAC_ADAP_NORM_RESP_ENTRIES);
103 device_printf(sc->aac_dev, "ADAP_HIGH_RESP %d/%d (%d)\n",
104 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
106 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
108 AAC_ADAP_HIGH_RESP_ENTRIES);
109 device_printf(sc->aac_dev, "AACQ_FREE %d/%d\n",
110 sc->aac_qstat[AACQ_FREE].q_length, sc->aac_qstat[AACQ_FREE].q_max);
111 device_printf(sc->aac_dev, "AACQ_BIO %d/%d\n",
112 sc->aac_qstat[AACQ_BIO].q_length, sc->aac_qstat[AACQ_BIO].q_max);
113 device_printf(sc->aac_dev, "AACQ_READY %d/%d\n",
114 sc->aac_qstat[AACQ_READY].q_length,
115 sc->aac_qstat[AACQ_READY].q_max);
116 device_printf(sc->aac_dev, "AACQ_BUSY %d/%d\n",
117 sc->aac_qstat[AACQ_BUSY].q_length, sc->aac_qstat[AACQ_BUSY].q_max);
121 * Print the command queue states for controller 0 (callable from DDB)
124 aac_printstate0(void)
126 struct aac_softc *sc;
128 sc = devclass_get_softc(devclass_find("aac"), 0);
130 aac_print_queues(sc);
131 switch (sc->aac_hwif) {
132 case AAC_HWIF_I960RX:
134 device_printf(sc->aac_dev, "IDBR 0x%08x IIMR 0x%08x "
135 "IISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_IDBR),
136 AAC_MEM0_GETREG4(sc, AAC_RX_IIMR), AAC_MEM0_GETREG4(sc, AAC_RX_IISR));
137 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x "
138 "OISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_ODBR),
139 AAC_MEM0_GETREG4(sc, AAC_RX_OIMR), AAC_MEM0_GETREG4(sc, AAC_RX_OISR));
140 AAC_MEM0_SETREG4(sc, AAC_RX_OIMR, 0/*~(AAC_DB_COMMAND_READY |
141 AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)*/);
142 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x "
143 "OISR 0x%08x\n", AAC_MEM0_GETREG4(sc, AAC_RX_ODBR),
144 AAC_MEM0_GETREG4(sc, AAC_RX_OIMR), AAC_MEM0_GETREG4(sc, AAC_RX_OISR));
146 case AAC_HWIF_STRONGARM:
153 * Panic in a slightly informative fashion
156 aac_panic(struct aac_softc *sc, char *reason)
158 aac_print_queues(sc);
166 aac_print_fib(struct aac_softc *sc, struct aac_fib *fib, const char *caller)
171 device_printf(sc->aac_dev,
172 "aac_print_fib called with NULL fib\n");
175 device_printf(sc->aac_dev, "%s: FIB @ %p\n", caller, fib);
176 device_printf(sc->aac_dev, " XferState %b\n", fib->Header.XferState,
199 device_printf(sc->aac_dev, " Command %d\n", fib->Header.Command);
200 device_printf(sc->aac_dev, " StructType %d\n",
201 fib->Header.StructType);
202 device_printf(sc->aac_dev, " Flags 0x%x\n", fib->Header.Flags);
203 device_printf(sc->aac_dev, " Size %d\n", fib->Header.Size);
204 device_printf(sc->aac_dev, " SenderSize %d\n",
205 fib->Header.SenderSize);
206 device_printf(sc->aac_dev, " SenderAddress 0x%x\n",
207 fib->Header.SenderFibAddress);
208 device_printf(sc->aac_dev, " RcvrAddress 0x%x\n",
209 fib->Header.ReceiverFibAddress);
210 device_printf(sc->aac_dev, " SenderData 0x%x\n",
211 fib->Header.SenderData);
212 switch(fib->Header.Command) {
213 case ContainerCommand:
215 struct aac_blockread *br;
216 struct aac_blockwrite *bw;
217 struct aac_sg_table *sg;
220 br = (struct aac_blockread*)fib->data;
221 bw = (struct aac_blockwrite*)fib->data;
224 if (br->Command == VM_CtBlockRead) {
225 device_printf(sc->aac_dev,
226 " BlockRead: container %d 0x%x/%d\n",
227 br->ContainerId, br->BlockNumber,
231 if (bw->Command == VM_CtBlockWrite) {
232 device_printf(sc->aac_dev,
233 " BlockWrite: container %d 0x%x/%d "
234 "(%s)\n", bw->ContainerId,
235 bw->BlockNumber, bw->ByteCount,
236 bw->Stable == CSTABLE ? "stable" :
241 device_printf(sc->aac_dev,
242 " %d s/g entries\n", sg->SgCount);
243 for (i = 0; i < sg->SgCount; i++)
244 device_printf(sc->aac_dev, " 0x%08x/%d\n",
245 sg->SgEntry[i].SgAddress,
246 sg->SgEntry[i].SgByteCount);
251 device_printf(sc->aac_dev, " %s\n", hexncpy(fib->data, 16,
253 device_printf(sc->aac_dev, " %s\n", hexncpy(fib->data + 16, 16,
260 * Describe an AIF we have received.
263 aac_print_aif(struct aac_softc *sc, struct aac_aif_command *aif)
265 switch(aif->command) {
266 case AifCmdEventNotify:
267 device_printf(sc->aac_dev, "EventNotify(%d)\n", aif->seqNumber);
268 switch(aif->data.EN.type) {
269 case AifEnGeneric: /* Generic notification */
270 device_printf(sc->aac_dev, "(Generic) %.*s\n",
271 (int)sizeof(aif->data.EN.data.EG),
272 aif->data.EN.data.EG.text);
274 case AifEnTaskComplete: /* Task has completed */
275 device_printf(sc->aac_dev, "(TaskComplete)\n");
277 case AifEnConfigChange: /* Adapter configuration change
279 device_printf(sc->aac_dev, "(ConfigChange)\n");
281 case AifEnContainerChange: /* Adapter specific container
282 * configuration change */
283 device_printf(sc->aac_dev, "(ContainerChange) "
285 aif->data.EN.data.ECC.container[0],
286 aif->data.EN.data.ECC.container[1]);
288 case AifEnDeviceFailure: /* SCSI device failed */
289 device_printf(sc->aac_dev, "(DeviceFailure) "
291 aif->data.EN.data.EDF.deviceHandle);
293 case AifEnMirrorFailover: /* Mirror failover started */
294 device_printf(sc->aac_dev, "(MirrorFailover) "
295 "container %d failed, "
296 "migrating from slice %d to %d\n",
297 aif->data.EN.data.EMF.container,
298 aif->data.EN.data.EMF.failedSlice,
299 aif->data.EN.data.EMF.creatingSlice);
301 case AifEnContainerEvent: /* Significant container
303 device_printf(sc->aac_dev, "(ContainerEvent) "
304 "container %d event "
305 "%d\n", aif->data.EN.data.ECE.container,
306 aif->data.EN.data.ECE.eventType);
308 case AifEnFileSystemChange: /* File system changed */
309 device_printf(sc->aac_dev, "(FileSystemChange)\n");
311 case AifEnConfigPause: /* Container pause event */
312 device_printf(sc->aac_dev, "(ConfigPause)\n");
314 case AifEnConfigResume: /* Container resume event */
315 device_printf(sc->aac_dev, "(ConfigResume)\n");
317 case AifEnFailoverChange: /* Failover space assignment
319 device_printf(sc->aac_dev, "(FailoverChange)\n");
321 case AifEnRAID5RebuildDone: /* RAID5 rebuild finished */
322 device_printf(sc->aac_dev, "(RAID5RebuildDone)\n");
324 case AifEnEnclosureManagement: /* Enclosure management event */
325 device_printf(sc->aac_dev, "(EnclosureManagement) "
327 "event %d\n", aif->data.EN.data.EEE.empID,
328 aif->data.EN.data.EEE.unitID,
329 aif->data.EN.data.EEE.eventType);
331 case AifEnBatteryEvent: /* Significant NV battery
333 device_printf(sc->aac_dev, "(BatteryEvent) %d "
334 "(state was %d, is %d\n",
335 aif->data.EN.data.EBE.transition_type,
336 aif->data.EN.data.EBE.current_state,
337 aif->data.EN.data.EBE.prior_state);
339 case AifEnAddContainer: /* A new container was
341 device_printf(sc->aac_dev, "(AddContainer)\n");
343 case AifEnDeleteContainer: /* A container was deleted. */
344 device_printf(sc->aac_dev, "(DeleteContainer)\n");
346 case AifEnBatteryNeedsRecond: /* The battery needs
348 device_printf(sc->aac_dev, "(BatteryNeedsRecond)\n");
350 case AifEnClusterEvent: /* Some cluster event */
351 device_printf(sc->aac_dev, "(ClusterEvent) event %d\n",
352 aif->data.EN.data.ECLE.eventType);
354 case AifEnDiskSetEvent: /* A disk set event occured. */
355 device_printf(sc->aac_dev, "(DiskSetEvent) event %d "
356 "diskset %jd creator %jd\n",
357 aif->data.EN.data.EDS.eventType,
358 (intmax_t)aif->data.EN.data.EDS.DsNum,
359 (intmax_t)aif->data.EN.data.EDS.CreatorId);
361 case AifDenMorphComplete: /* A morph operation
363 device_printf(sc->aac_dev, "(MorphComplete)\n");
365 case AifDenVolumeExtendComplete: /* A volume expand operation
367 device_printf(sc->aac_dev, "(VolumeExtendComplete)\n");
370 device_printf(sc->aac_dev, "(%d)\n", aif->data.EN.type);
374 case AifCmdJobProgress:
377 switch(aif->data.PR[0].status) {
378 case AifJobStsSuccess:
379 status = "success"; break;
380 case AifJobStsFinished:
381 status = "finished"; break;
382 case AifJobStsAborted:
383 status = "aborted"; break;
384 case AifJobStsFailed:
385 status = "failed"; break;
386 case AifJobStsSuspended:
387 status = "suspended"; break;
388 case AifJobStsRunning:
389 status = "running"; break;
391 status = "unknown status"; break;
394 device_printf(sc->aac_dev, "JobProgress (%d) - %s (%d, %d)\n",
395 aif->seqNumber, status,
396 aif->data.PR[0].currentTick,
397 aif->data.PR[0].finalTick);
398 switch(aif->data.PR[0].jd.type) {
399 case AifJobScsiZero: /* SCSI dev clear operation */
400 device_printf(sc->aac_dev, "(ScsiZero) handle %d\n",
401 aif->data.PR[0].jd.client.scsi_dh);
403 case AifJobScsiVerify: /* SCSI device Verify operation
405 device_printf(sc->aac_dev, "(ScsiVerify) handle %d\n",
406 aif->data.PR[0].jd.client.scsi_dh);
408 case AifJobScsiExercise: /* SCSI device Exercise
410 device_printf(sc->aac_dev, "(ScsiExercise) handle %d\n",
411 aif->data.PR[0].jd.client.scsi_dh);
413 case AifJobScsiVerifyRepair: /* SCSI device Verify operation
415 device_printf(sc->aac_dev,
416 "(ScsiVerifyRepair) handle %d\n",
417 aif->data.PR[0].jd.client.scsi_dh);
419 case AifJobCtrZero: /* Container clear operation */
420 device_printf(sc->aac_dev,
421 "(ContainerZero) container %d\n",
422 aif->data.PR[0].jd.client.container.src);
424 case AifJobCtrCopy: /* Container copy operation */
425 device_printf(sc->aac_dev,
426 "(ContainerCopy) container %d to %d\n",
427 aif->data.PR[0].jd.client.container.src,
428 aif->data.PR[0].jd.client.container.dst);
430 case AifJobCtrCreateMirror: /* Container Create Mirror
432 device_printf(sc->aac_dev,
433 "(ContainerCreateMirror) container %d\n",
434 aif->data.PR[0].jd.client.container.src);
435 /* XXX two containers? */
437 case AifJobCtrMergeMirror: /* Container Merge Mirror
439 device_printf(sc->aac_dev,
440 "(ContainerMergeMirror) container %d\n",
441 aif->data.PR[0].jd.client.container.src);
442 /* XXX two containers? */
444 case AifJobCtrScrubMirror: /* Container Scrub Mirror
446 device_printf(sc->aac_dev,
447 "(ContainerScrubMirror) container %d\n",
448 aif->data.PR[0].jd.client.container.src);
450 case AifJobCtrRebuildRaid5: /* Container Rebuild Raid5
452 device_printf(sc->aac_dev,
453 "(ContainerRebuildRaid5) container %d\n",
454 aif->data.PR[0].jd.client.container.src);
456 case AifJobCtrScrubRaid5: /* Container Scrub Raid5
458 device_printf(sc->aac_dev,
459 "(ContainerScrubRaid5) container %d\n",
460 aif->data.PR[0].jd.client.container.src);
462 case AifJobCtrMorph: /* Container morph operation */
463 device_printf(sc->aac_dev,
464 "(ContainerMorph) container %d\n",
465 aif->data.PR[0].jd.client.container.src);
466 /* XXX two containers? */
468 case AifJobCtrPartCopy: /* Container Partition copy
470 device_printf(sc->aac_dev,
471 "(ContainerPartCopy) container %d to "
473 aif->data.PR[0].jd.client.container.src,
474 aif->data.PR[0].jd.client.container.dst);
476 case AifJobCtrRebuildMirror: /* Container Rebuild Mirror
478 device_printf(sc->aac_dev,
479 "(ContainerRebuildMirror) container "
481 aif->data.PR[0].jd.client.container.src);
483 case AifJobCtrCrazyCache: /* crazy cache */
484 device_printf(sc->aac_dev,
485 "(ContainerCrazyCache) container %d\n",
486 aif->data.PR[0].jd.client.container.src);
487 /* XXX two containers? */
489 case AifJobFsCreate: /* File System Create
491 device_printf(sc->aac_dev, "(FsCreate)\n");
493 case AifJobFsVerify: /* File System Verify
495 device_printf(sc->aac_dev, "(FsVerivy)\n");
497 case AifJobFsExtend: /* File System Extend
499 device_printf(sc->aac_dev, "(FsExtend)\n");
501 case AifJobApiFormatNTFS: /* Format a drive to NTFS */
502 device_printf(sc->aac_dev, "(FormatNTFS)\n");
504 case AifJobApiFormatFAT: /* Format a drive to FAT */
505 device_printf(sc->aac_dev, "(FormatFAT)\n");
507 case AifJobApiUpdateSnapshot: /* update the read/write half
509 device_printf(sc->aac_dev, "(UpdateSnapshot)\n");
511 case AifJobApiFormatFAT32: /* Format a drive to FAT32 */
512 device_printf(sc->aac_dev, "(FormatFAT32)\n");
514 case AifJobCtlContinuousCtrVerify: /* Adapter operation */
515 device_printf(sc->aac_dev, "(ContinuousCtrVerify)\n");
518 device_printf(sc->aac_dev, "(%d)\n",
519 aif->data.PR[0].jd.type);
524 case AifCmdAPIReport:
525 device_printf(sc->aac_dev, "APIReport (%d)\n", aif->seqNumber);
527 case AifCmdDriverNotify:
528 device_printf(sc->aac_dev, "DriverNotify (%d)\n",
532 device_printf(sc->aac_dev, "AIF %d (%d)\n", aif->command,
537 #endif /* AAC_DEBUG */