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.2.2.5 2003/01/11 18:39:39 scottl Exp $
30 * $DragonFly: src/sys/dev/raid/aac/aac_debug.c,v 1.3 2003/08/07 21:17:07 dillon Exp $
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/kernel.h>
42 #include "aac_compat.h"
44 #include <sys/devicestat.h>
47 #include <machine/resource.h>
48 #include <machine/bus.h>
51 #include "aac_ioctl.h"
55 void aac_printstate0(void);
59 * Dump the command queue indices
62 aac_print_queues(struct aac_softc *sc)
64 device_printf(sc->aac_dev, "FIB queue header at %p queues at %p\n",
65 &sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][0],
66 &sc->aac_queues->qt_HostNormCmdQueue[0]);
67 device_printf(sc->aac_dev, "HOST_NORM_CMD %d/%d (%d)\n",
68 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
70 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
72 AAC_HOST_NORM_CMD_ENTRIES);
73 device_printf(sc->aac_dev, "HOST_HIGH_CMD %d/%d (%d)\n",
74 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
76 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
78 AAC_HOST_HIGH_CMD_ENTRIES);
79 device_printf(sc->aac_dev, "ADAP_NORM_CMD %d/%d (%d)\n",
80 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
82 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
84 AAC_ADAP_NORM_CMD_ENTRIES);
85 device_printf(sc->aac_dev, "ADAP_HIGH_CMD %d/%d (%d)\n",
86 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
88 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
90 AAC_ADAP_HIGH_CMD_ENTRIES);
91 device_printf(sc->aac_dev, "HOST_NORM_RESP %d/%d (%d)\n",
92 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
94 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
96 AAC_HOST_NORM_RESP_ENTRIES);
97 device_printf(sc->aac_dev, "HOST_HIGH_RESP %d/%d (%d)\n",
98 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
100 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
102 AAC_HOST_HIGH_RESP_ENTRIES);
103 device_printf(sc->aac_dev, "ADAP_NORM_RESP %d/%d (%d)\n",
104 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
106 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
108 AAC_ADAP_NORM_RESP_ENTRIES);
109 device_printf(sc->aac_dev, "ADAP_HIGH_RESP %d/%d (%d)\n",
110 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
112 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
114 AAC_ADAP_HIGH_RESP_ENTRIES);
115 device_printf(sc->aac_dev, "AACQ_FREE %d/%d\n",
116 sc->aac_qstat[AACQ_FREE].q_length, sc->aac_qstat[AACQ_FREE].q_max);
117 device_printf(sc->aac_dev, "AACQ_BIO %d/%d\n",
118 sc->aac_qstat[AACQ_BIO].q_length, sc->aac_qstat[AACQ_BIO].q_max);
119 device_printf(sc->aac_dev, "AACQ_READY %d/%d\n",
120 sc->aac_qstat[AACQ_READY].q_length,
121 sc->aac_qstat[AACQ_READY].q_max);
122 device_printf(sc->aac_dev, "AACQ_BUSY %d/%d\n",
123 sc->aac_qstat[AACQ_BUSY].q_length, sc->aac_qstat[AACQ_BUSY].q_max);
124 device_printf(sc->aac_dev, "AACQ_COMPLETE %d/%d\n",
125 sc->aac_qstat[AACQ_COMPLETE].q_length,
126 sc->aac_qstat[AACQ_COMPLETE].q_max);
130 * Print the command queue states for controller 0 (callable from DDB)
133 aac_printstate0(void)
135 struct aac_softc *sc;
137 sc = devclass_get_softc(aac_devclass, 0);
139 aac_print_queues(sc);
140 switch (sc->aac_hwif) {
141 case AAC_HWIF_I960RX:
142 device_printf(sc->aac_dev, "IDBR 0x%08x IIMR 0x%08x "
143 "IISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_IDBR),
144 AAC_GETREG4(sc, AAC_RX_IIMR), AAC_GETREG4(sc, AAC_RX_IISR));
145 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x "
146 "OISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_ODBR),
147 AAC_GETREG4(sc, AAC_RX_OIMR), AAC_GETREG4(sc, AAC_RX_OISR));
148 AAC_SETREG4(sc, AAC_RX_OIMR, 0/*~(AAC_DB_COMMAND_READY |
149 AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)*/);
150 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x "
151 "OISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_ODBR),
152 AAC_GETREG4(sc, AAC_RX_OIMR), AAC_GETREG4(sc, AAC_RX_OISR));
154 case AAC_HWIF_STRONGARM:
160 * simulate an interrupt for controller 0
165 struct aac_softc *sc;
167 sc = devclass_get_softc(aac_devclass, 0);
173 * Panic in a slightly informative fashion
176 aac_panic(struct aac_softc *sc, char *reason)
178 aac_print_queues(sc);
186 aac_print_fib(struct aac_softc *sc, struct aac_fib *fib, char *caller)
189 device_printf(sc->aac_dev,
190 "aac_print_fib called with NULL fib\n");
193 device_printf(sc->aac_dev, "%s: FIB @ %p\n", caller, fib);
194 device_printf(sc->aac_dev, " XferState %b\n", fib->Header.XferState,
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:
233 struct aac_blockread *br;
234 struct aac_blockwrite *bw;
235 struct aac_sg_table *sg;
238 br = (struct aac_blockread*)fib->data;
239 bw = (struct aac_blockwrite*)fib->data;
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,
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" :
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);
269 device_printf(sc->aac_dev, " %16D\n", fib->data, " ");
270 device_printf(sc->aac_dev, " %16D\n", fib->data + 16, " ");
276 * Describe an AIF we have received.
279 aac_print_aif(struct aac_softc *sc, struct aac_aif_command *aif)
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);
290 case AifEnTaskComplete: /* Task has completed */
291 device_printf(sc->aac_dev, "(TaskComplete)\n");
293 case AifEnConfigChange: /* Adapter configuration change
295 device_printf(sc->aac_dev, "(ConfigChange)\n");
297 case AifEnContainerChange: /* Adapter specific container
298 * configuration change */
299 device_printf(sc->aac_dev, "(ContainerChange) "
301 aif->data.EN.data.ECC.container[0],
302 aif->data.EN.data.ECC.container[1]);
304 case AifEnDeviceFailure: /* SCSI device failed */
305 device_printf(sc->aac_dev, "(DeviceFailure) "
307 aif->data.EN.data.EDF.deviceHandle);
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);
317 case AifEnContainerEvent: /* Significant container
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);
324 case AifEnFileSystemChange: /* File system changed */
325 device_printf(sc->aac_dev, "(FileSystemChange)\n");
327 case AifEnConfigPause: /* Container pause event */
328 device_printf(sc->aac_dev, "(ConfigPause)\n");
330 case AifEnConfigResume: /* Container resume event */
331 device_printf(sc->aac_dev, "(ConfigResume)\n");
333 case AifEnFailoverChange: /* Failover space assignment
335 device_printf(sc->aac_dev, "(FailoverChange)\n");
337 case AifEnRAID5RebuildDone: /* RAID5 rebuild finished */
338 device_printf(sc->aac_dev, "(RAID5RebuildDone)\n");
340 case AifEnEnclosureManagement: /* Enclosure management event */
341 device_printf(sc->aac_dev, "(EnclosureManagement) "
343 "event %d\n", aif->data.EN.data.EEE.empID,
344 aif->data.EN.data.EEE.unitID,
345 aif->data.EN.data.EEE.eventType);
347 case AifEnBatteryEvent: /* Significant NV battery
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);
355 case AifEnAddContainer: /* A new container was
357 device_printf(sc->aac_dev, "(AddContainer)\n");
359 case AifEnDeleteContainer: /* A container was deleted. */
360 device_printf(sc->aac_dev, "(DeleteContainer)\n");
362 case AifEnBatteryNeedsRecond: /* The battery needs
364 device_printf(sc->aac_dev, "(BatteryNeedsRecond)\n");
366 case AifEnClusterEvent: /* Some cluster event */
367 device_printf(sc->aac_dev, "(ClusterEvent) event %d\n",
368 aif->data.EN.data.ECLE.eventType);
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);
377 case AifDenMorphComplete: /* A morph operation
379 device_printf(sc->aac_dev, "(MorphComplete)\n");
381 case AifDenVolumeExtendComplete: /* A volume expand operation
383 device_printf(sc->aac_dev, "(VolumeExtendComplete)\n");
386 device_printf(sc->aac_dev, "(%d)\n", aif->data.EN.type);
390 case AifCmdJobProgress:
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;
407 status = "unknown status"; break;
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);
419 case AifJobScsiVerify: /* SCSI device Verify operation
421 device_printf(sc->aac_dev, "(ScsiVerify) handle %d\n",
422 aif->data.PR[0].jd.client.scsi_dh);
424 case AifJobScsiExercise: /* SCSI device Exercise
426 device_printf(sc->aac_dev, "(ScsiExercise) handle %d\n",
427 aif->data.PR[0].jd.client.scsi_dh);
429 case AifJobScsiVerifyRepair: /* SCSI device Verify operation
431 device_printf(sc->aac_dev,
432 "(ScsiVerifyRepair) handle %d\n",
433 aif->data.PR[0].jd.client.scsi_dh);
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);
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);
446 case AifJobCtrCreateMirror: /* Container Create Mirror
448 device_printf(sc->aac_dev,
449 "(ConatainerCreateMirror) container %d\n",
450 aif->data.PR[0].jd.client.container.src);
451 /* XXX two containers? */
453 case AifJobCtrMergeMirror: /* Container Merge Mirror
455 device_printf(sc->aac_dev,
456 "(ConatainerMergeMirror) container %d\n",
457 aif->data.PR[0].jd.client.container.src);
458 /* XXX two containers? */
460 case AifJobCtrScrubMirror: /* Container Scrub Mirror
462 device_printf(sc->aac_dev,
463 "(ConatainerScrubMirror) container %d\n",
464 aif->data.PR[0].jd.client.container.src);
466 case AifJobCtrRebuildRaid5: /* Container Rebuild Raid5
468 device_printf(sc->aac_dev,
469 "(ConatainerRebuildRaid5) container %d\n",
470 aif->data.PR[0].jd.client.container.src);
472 case AifJobCtrScrubRaid5: /* Container Scrub Raid5
474 device_printf(sc->aac_dev,
475 "(ConatainerScrubRaid5) container %d\n",
476 aif->data.PR[0].jd.client.container.src);
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? */
484 case AifJobCtrPartCopy: /* Container Partition copy
486 device_printf(sc->aac_dev,
487 "(ConatainerPartCopy) container %d to "
489 aif->data.PR[0].jd.client.container.src,
490 aif->data.PR[0].jd.client.container.dst);
492 case AifJobCtrRebuildMirror: /* Container Rebuild Mirror
494 device_printf(sc->aac_dev,
495 "(ConatainerRebuildMirror) container "
497 aif->data.PR[0].jd.client.container.src);
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? */
505 case AifJobFsCreate: /* File System Create
507 device_printf(sc->aac_dev, "(FsCreate)\n");
509 case AifJobFsVerify: /* File System Verify
511 device_printf(sc->aac_dev, "(FsVerivy)\n");
513 case AifJobFsExtend: /* File System Extend
515 device_printf(sc->aac_dev, "(FsExtend)\n");
517 case AifJobApiFormatNTFS: /* Format a drive to NTFS */
518 device_printf(sc->aac_dev, "(FormatNTFS)\n");
520 case AifJobApiFormatFAT: /* Format a drive to FAT */
521 device_printf(sc->aac_dev, "(FormatFAT)\n");
523 case AifJobApiUpdateSnapshot: /* update the read/write half
525 device_printf(sc->aac_dev, "(UpdateSnapshot)\n");
527 case AifJobApiFormatFAT32: /* Format a drive to FAT32 */
528 device_printf(sc->aac_dev, "(FormatFAT32)\n");
530 case AifJobCtlContinuousCtrVerify: /* Adapter operation */
531 device_printf(sc->aac_dev, "(ContinuousCtrVerify)\n");
534 device_printf(sc->aac_dev, "(%d)\n",
535 aif->data.PR[0].jd.type);
540 case AifCmdAPIReport:
541 device_printf(sc->aac_dev, "APIReport (%d)\n", aif->seqNumber);
543 case AifCmdDriverNotify:
544 device_printf(sc->aac_dev, "DriverNotify (%d)\n",
548 device_printf(sc->aac_dev, "AIF %d (%d)\n", aif->command,
553 #endif /* AAC_DEBUG */