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.8 2008/01/20 03:40:35 pavalos Exp $
38 #include <sys/param.h>
39 #include <sys/systm.h>
40 #include <sys/kernel.h>
43 #include <sys/devicestat.h>
47 #include "aac_ioctl.h"
51 void aac_printstate0(void);
53 static void aac_print_queues(struct aac_softc *sc);
56 * Dump the command queue indices
59 aac_print_queues(struct aac_softc *sc)
61 device_printf(sc->aac_dev, "FIB queue header at %p queues at %p\n",
62 &sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][0],
63 &sc->aac_queues->qt_HostNormCmdQueue[0]);
64 device_printf(sc->aac_dev, "HOST_NORM_CMD %d/%d (%d)\n",
65 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
67 sc->aac_queues->qt_qindex[AAC_HOST_NORM_CMD_QUEUE][
69 AAC_HOST_NORM_CMD_ENTRIES);
70 device_printf(sc->aac_dev, "HOST_HIGH_CMD %d/%d (%d)\n",
71 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
73 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_CMD_QUEUE][
75 AAC_HOST_HIGH_CMD_ENTRIES);
76 device_printf(sc->aac_dev, "ADAP_NORM_CMD %d/%d (%d)\n",
77 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
79 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_CMD_QUEUE][
81 AAC_ADAP_NORM_CMD_ENTRIES);
82 device_printf(sc->aac_dev, "ADAP_HIGH_CMD %d/%d (%d)\n",
83 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
85 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_CMD_QUEUE][
87 AAC_ADAP_HIGH_CMD_ENTRIES);
88 device_printf(sc->aac_dev, "HOST_NORM_RESP %d/%d (%d)\n",
89 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
91 sc->aac_queues->qt_qindex[AAC_HOST_NORM_RESP_QUEUE][
93 AAC_HOST_NORM_RESP_ENTRIES);
94 device_printf(sc->aac_dev, "HOST_HIGH_RESP %d/%d (%d)\n",
95 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
97 sc->aac_queues->qt_qindex[AAC_HOST_HIGH_RESP_QUEUE][
99 AAC_HOST_HIGH_RESP_ENTRIES);
100 device_printf(sc->aac_dev, "ADAP_NORM_RESP %d/%d (%d)\n",
101 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
103 sc->aac_queues->qt_qindex[AAC_ADAP_NORM_RESP_QUEUE][
105 AAC_ADAP_NORM_RESP_ENTRIES);
106 device_printf(sc->aac_dev, "ADAP_HIGH_RESP %d/%d (%d)\n",
107 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
109 sc->aac_queues->qt_qindex[AAC_ADAP_HIGH_RESP_QUEUE][
111 AAC_ADAP_HIGH_RESP_ENTRIES);
112 device_printf(sc->aac_dev, "AACQ_FREE %d/%d\n",
113 sc->aac_qstat[AACQ_FREE].q_length, sc->aac_qstat[AACQ_FREE].q_max);
114 device_printf(sc->aac_dev, "AACQ_BIO %d/%d\n",
115 sc->aac_qstat[AACQ_BIO].q_length, sc->aac_qstat[AACQ_BIO].q_max);
116 device_printf(sc->aac_dev, "AACQ_READY %d/%d\n",
117 sc->aac_qstat[AACQ_READY].q_length,
118 sc->aac_qstat[AACQ_READY].q_max);
119 device_printf(sc->aac_dev, "AACQ_BUSY %d/%d\n",
120 sc->aac_qstat[AACQ_BUSY].q_length, sc->aac_qstat[AACQ_BUSY].q_max);
121 device_printf(sc->aac_dev, "AACQ_COMPLETE %d/%d\n",
122 sc->aac_qstat[AACQ_COMPLETE].q_length,
123 sc->aac_qstat[AACQ_COMPLETE].q_max);
127 * Print the command queue states for controller 0 (callable from DDB)
130 aac_printstate0(void)
132 struct aac_softc *sc;
134 sc = devclass_get_softc(aac_devclass, 0);
136 aac_print_queues(sc);
137 switch (sc->aac_hwif) {
138 case AAC_HWIF_I960RX:
139 device_printf(sc->aac_dev, "IDBR 0x%08x IIMR 0x%08x "
140 "IISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_IDBR),
141 AAC_GETREG4(sc, AAC_RX_IIMR), AAC_GETREG4(sc, AAC_RX_IISR));
142 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x "
143 "OISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_ODBR),
144 AAC_GETREG4(sc, AAC_RX_OIMR), AAC_GETREG4(sc, AAC_RX_OISR));
145 AAC_SETREG4(sc, AAC_RX_OIMR, 0/*~(AAC_DB_COMMAND_READY |
146 AAC_DB_RESPONSE_READY | AAC_DB_PRINTF)*/);
147 device_printf(sc->aac_dev, "ODBR 0x%08x OIMR 0x%08x "
148 "OISR 0x%08x\n", AAC_GETREG4(sc, AAC_RX_ODBR),
149 AAC_GETREG4(sc, AAC_RX_OIMR), AAC_GETREG4(sc, AAC_RX_OISR));
151 case AAC_HWIF_STRONGARM:
161 aac_print_fib(struct aac_softc *sc, struct aac_fib *fib, const char *caller)
164 device_printf(sc->aac_dev,
165 "aac_print_fib called with NULL fib\n");
168 device_printf(sc->aac_dev, "%s: FIB @ %p\n", caller, fib);
169 device_printf(sc->aac_dev, " XferState %b\n", fib->Header.XferState,
192 device_printf(sc->aac_dev, " Command %d\n", fib->Header.Command);
193 device_printf(sc->aac_dev, " StructType %d\n",
194 fib->Header.StructType);
195 device_printf(sc->aac_dev, " Flags 0x%x\n", fib->Header.Flags);
196 device_printf(sc->aac_dev, " Size %d\n", fib->Header.Size);
197 device_printf(sc->aac_dev, " SenderSize %d\n",
198 fib->Header.SenderSize);
199 device_printf(sc->aac_dev, " SenderAddress 0x%x\n",
200 fib->Header.SenderFibAddress);
201 device_printf(sc->aac_dev, " RcvrAddress 0x%x\n",
202 fib->Header.ReceiverFibAddress);
203 device_printf(sc->aac_dev, " SenderData 0x%x\n",
204 fib->Header.SenderData);
205 switch(fib->Header.Command) {
206 case ContainerCommand:
208 struct aac_blockread *br;
209 struct aac_blockwrite *bw;
210 struct aac_sg_table *sg;
213 br = (struct aac_blockread*)fib->data;
214 bw = (struct aac_blockwrite*)fib->data;
217 if (br->Command == VM_CtBlockRead) {
218 device_printf(sc->aac_dev,
219 " BlockRead: container %d 0x%x/%d\n",
220 br->ContainerId, br->BlockNumber,
224 if (bw->Command == VM_CtBlockWrite) {
225 device_printf(sc->aac_dev,
226 " BlockWrite: container %d 0x%x/%d "
227 "(%s)\n", bw->ContainerId,
228 bw->BlockNumber, bw->ByteCount,
229 bw->Stable == CSTABLE ? "stable" :
234 device_printf(sc->aac_dev,
235 " %d s/g entries\n", sg->SgCount);
236 for (i = 0; i < sg->SgCount; i++)
237 device_printf(sc->aac_dev, " 0x%08x/%d\n",
238 sg->SgEntry[i].SgAddress,
239 sg->SgEntry[i].SgByteCount);
244 device_printf(sc->aac_dev, " %16D\n", fib->data, " ");
245 device_printf(sc->aac_dev, " %16D\n", fib->data + 16, " ");
251 * Describe an AIF we have received.
254 aac_print_aif(struct aac_softc *sc, struct aac_aif_command *aif)
256 switch(aif->command) {
257 case AifCmdEventNotify:
258 device_printf(sc->aac_dev, "EventNotify(%d)\n", aif->seqNumber);
259 switch(aif->data.EN.type) {
260 case AifEnGeneric: /* Generic notification */
261 device_printf(sc->aac_dev, "(Generic) %.*s\n",
262 (int)sizeof(aif->data.EN.data.EG),
263 aif->data.EN.data.EG.text);
265 case AifEnTaskComplete: /* Task has completed */
266 device_printf(sc->aac_dev, "(TaskComplete)\n");
268 case AifEnConfigChange: /* Adapter configuration change
270 device_printf(sc->aac_dev, "(ConfigChange)\n");
272 case AifEnContainerChange: /* Adapter specific container
273 * configuration change */
274 device_printf(sc->aac_dev, "(ContainerChange) "
276 aif->data.EN.data.ECC.container[0],
277 aif->data.EN.data.ECC.container[1]);
279 case AifEnDeviceFailure: /* SCSI device failed */
280 device_printf(sc->aac_dev, "(DeviceFailure) "
282 aif->data.EN.data.EDF.deviceHandle);
284 case AifEnMirrorFailover: /* Mirror failover started */
285 device_printf(sc->aac_dev, "(MirrorFailover) "
286 "container %d failed, "
287 "migrating from slice %d to %d\n",
288 aif->data.EN.data.EMF.container,
289 aif->data.EN.data.EMF.failedSlice,
290 aif->data.EN.data.EMF.creatingSlice);
292 case AifEnContainerEvent: /* Significant container
294 device_printf(sc->aac_dev, "(ContainerEvent) "
295 "container %d event "
296 "%d\n", aif->data.EN.data.ECE.container,
297 aif->data.EN.data.ECE.eventType);
299 case AifEnFileSystemChange: /* File system changed */
300 device_printf(sc->aac_dev, "(FileSystemChange)\n");
302 case AifEnConfigPause: /* Container pause event */
303 device_printf(sc->aac_dev, "(ConfigPause)\n");
305 case AifEnConfigResume: /* Container resume event */
306 device_printf(sc->aac_dev, "(ConfigResume)\n");
308 case AifEnFailoverChange: /* Failover space assignment
310 device_printf(sc->aac_dev, "(FailoverChange)\n");
312 case AifEnRAID5RebuildDone: /* RAID5 rebuild finished */
313 device_printf(sc->aac_dev, "(RAID5RebuildDone)\n");
315 case AifEnEnclosureManagement: /* Enclosure management event */
316 device_printf(sc->aac_dev, "(EnclosureManagement) "
318 "event %d\n", aif->data.EN.data.EEE.empID,
319 aif->data.EN.data.EEE.unitID,
320 aif->data.EN.data.EEE.eventType);
322 case AifEnBatteryEvent: /* Significant NV battery
324 device_printf(sc->aac_dev, "(BatteryEvent) %d "
325 "(state was %d, is %d\n",
326 aif->data.EN.data.EBE.transition_type,
327 aif->data.EN.data.EBE.current_state,
328 aif->data.EN.data.EBE.prior_state);
330 case AifEnAddContainer: /* A new container was
332 device_printf(sc->aac_dev, "(AddContainer)\n");
334 case AifEnDeleteContainer: /* A container was deleted. */
335 device_printf(sc->aac_dev, "(DeleteContainer)\n");
337 case AifEnBatteryNeedsRecond: /* The battery needs
339 device_printf(sc->aac_dev, "(BatteryNeedsRecond)\n");
341 case AifEnClusterEvent: /* Some cluster event */
342 device_printf(sc->aac_dev, "(ClusterEvent) event %d\n",
343 aif->data.EN.data.ECLE.eventType);
345 case AifEnDiskSetEvent: /* A disk set event occured. */
346 device_printf(sc->aac_dev, "(DiskSetEvent) event %d "
347 "diskset %jd creator %jd\n",
348 aif->data.EN.data.EDS.eventType,
349 (intmax_t)aif->data.EN.data.EDS.DsNum,
350 (intmax_t)aif->data.EN.data.EDS.CreatorId);
352 case AifDenMorphComplete: /* A morph operation
354 device_printf(sc->aac_dev, "(MorphComplete)\n");
356 case AifDenVolumeExtendComplete: /* A volume expand operation
358 device_printf(sc->aac_dev, "(VolumeExtendComplete)\n");
361 device_printf(sc->aac_dev, "(%d)\n", aif->data.EN.type);
365 case AifCmdJobProgress:
368 switch(aif->data.PR[0].status) {
369 case AifJobStsSuccess:
370 status = "success"; break;
371 case AifJobStsFinished:
372 status = "finished"; break;
373 case AifJobStsAborted:
374 status = "aborted"; break;
375 case AifJobStsFailed:
376 status = "failed"; break;
377 case AifJobStsSuspended:
378 status = "suspended"; break;
379 case AifJobStsRunning:
380 status = "running"; break;
382 status = "unknown status"; break;
385 device_printf(sc->aac_dev, "JobProgress (%d) - %s (%d, %d)\n",
386 aif->seqNumber, status,
387 aif->data.PR[0].currentTick,
388 aif->data.PR[0].finalTick);
389 switch(aif->data.PR[0].jd.type) {
390 case AifJobScsiZero: /* SCSI dev clear operation */
391 device_printf(sc->aac_dev, "(ScsiZero) handle %d\n",
392 aif->data.PR[0].jd.client.scsi_dh);
394 case AifJobScsiVerify: /* SCSI device Verify operation
396 device_printf(sc->aac_dev, "(ScsiVerify) handle %d\n",
397 aif->data.PR[0].jd.client.scsi_dh);
399 case AifJobScsiExercise: /* SCSI device Exercise
401 device_printf(sc->aac_dev, "(ScsiExercise) handle %d\n",
402 aif->data.PR[0].jd.client.scsi_dh);
404 case AifJobScsiVerifyRepair: /* SCSI device Verify operation
406 device_printf(sc->aac_dev,
407 "(ScsiVerifyRepair) handle %d\n",
408 aif->data.PR[0].jd.client.scsi_dh);
410 case AifJobCtrZero: /* Container clear operation */
411 device_printf(sc->aac_dev,
412 "(ContainerZero) container %d\n",
413 aif->data.PR[0].jd.client.container.src);
415 case AifJobCtrCopy: /* Container copy operation */
416 device_printf(sc->aac_dev,
417 "(ContainerCopy) container %d to %d\n",
418 aif->data.PR[0].jd.client.container.src,
419 aif->data.PR[0].jd.client.container.dst);
421 case AifJobCtrCreateMirror: /* Container Create Mirror
423 device_printf(sc->aac_dev,
424 "(ContainerCreateMirror) container %d\n",
425 aif->data.PR[0].jd.client.container.src);
426 /* XXX two containers? */
428 case AifJobCtrMergeMirror: /* Container Merge Mirror
430 device_printf(sc->aac_dev,
431 "(ContainerMergeMirror) container %d\n",
432 aif->data.PR[0].jd.client.container.src);
433 /* XXX two containers? */
435 case AifJobCtrScrubMirror: /* Container Scrub Mirror
437 device_printf(sc->aac_dev,
438 "(ContainerScrubMirror) container %d\n",
439 aif->data.PR[0].jd.client.container.src);
441 case AifJobCtrRebuildRaid5: /* Container Rebuild Raid5
443 device_printf(sc->aac_dev,
444 "(ContainerRebuildRaid5) container %d\n",
445 aif->data.PR[0].jd.client.container.src);
447 case AifJobCtrScrubRaid5: /* Container Scrub Raid5
449 device_printf(sc->aac_dev,
450 "(ContainerScrubRaid5) container %d\n",
451 aif->data.PR[0].jd.client.container.src);
453 case AifJobCtrMorph: /* Container morph operation */
454 device_printf(sc->aac_dev,
455 "(ContainerMorph) container %d\n",
456 aif->data.PR[0].jd.client.container.src);
457 /* XXX two containers? */
459 case AifJobCtrPartCopy: /* Container Partition copy
461 device_printf(sc->aac_dev,
462 "(ContainerPartCopy) container %d to "
464 aif->data.PR[0].jd.client.container.src,
465 aif->data.PR[0].jd.client.container.dst);
467 case AifJobCtrRebuildMirror: /* Container Rebuild Mirror
469 device_printf(sc->aac_dev,
470 "(ContainerRebuildMirror) container "
472 aif->data.PR[0].jd.client.container.src);
474 case AifJobCtrCrazyCache: /* crazy cache */
475 device_printf(sc->aac_dev,
476 "(ContainerCrazyCache) container %d\n",
477 aif->data.PR[0].jd.client.container.src);
478 /* XXX two containers? */
480 case AifJobFsCreate: /* File System Create
482 device_printf(sc->aac_dev, "(FsCreate)\n");
484 case AifJobFsVerify: /* File System Verify
486 device_printf(sc->aac_dev, "(FsVerivy)\n");
488 case AifJobFsExtend: /* File System Extend
490 device_printf(sc->aac_dev, "(FsExtend)\n");
492 case AifJobApiFormatNTFS: /* Format a drive to NTFS */
493 device_printf(sc->aac_dev, "(FormatNTFS)\n");
495 case AifJobApiFormatFAT: /* Format a drive to FAT */
496 device_printf(sc->aac_dev, "(FormatFAT)\n");
498 case AifJobApiUpdateSnapshot: /* update the read/write half
500 device_printf(sc->aac_dev, "(UpdateSnapshot)\n");
502 case AifJobApiFormatFAT32: /* Format a drive to FAT32 */
503 device_printf(sc->aac_dev, "(FormatFAT32)\n");
505 case AifJobCtlContinuousCtrVerify: /* Adapter operation */
506 device_printf(sc->aac_dev, "(ContinuousCtrVerify)\n");
509 device_printf(sc->aac_dev, "(%d)\n",
510 aif->data.PR[0].jd.type);
515 case AifCmdAPIReport:
516 device_printf(sc->aac_dev, "APIReport (%d)\n", aif->seqNumber);
518 case AifCmdDriverNotify:
519 device_printf(sc->aac_dev, "DriverNotify (%d)\n",
523 device_printf(sc->aac_dev, "AIF %d (%d)\n", aif->command,
528 #endif /* AAC_DEBUG */