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 */