2 * Copyright (c) 2006 IronPort Systems
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * $FreeBSD: src/sys/dev/mfi/mfi_debug.c,v 1.3 2006/10/16 04:18:38 scottl Exp $
27 * FreeBSD projects/head_mfi/ r228320
34 #include <sys/param.h>
35 #include <sys/systm.h>
36 #include <sys/kernel.h>
41 #include <sys/malloc.h>
42 #include <sys/taskqueue.h>
48 #include <dev/raid/mfi/mfireg.h>
49 #include <dev/raid/mfi/mfi_ioctl.h>
50 #include <dev/raid/mfi/mfivar.h>
53 mfi_print_frame_flags(device_t dev
, uint32_t flags
)
55 device_printf(dev
, "flags=%pb%i\n",
66 mfi_print_sgl(struct mfi_frame_header
*hdr
, union mfi_sgl
*sgl
, int count
)
70 kprintf("SG List:\n");
71 for (i
= 0; i
< count
; i
++) {
72 if (hdr
->flags
& MFI_FRAME_IEEE_SGL
) {
73 kprintf("0x%lx:%06d ", (u_long
)sgl
->sg_skinny
[i
].addr
,
74 sgl
->sg_skinny
[i
].len
);
80 } else if (hdr
->flags
& MFI_FRAME_SGL64
) {
81 kprintf("0x%lx:%06d ", (u_long
)sgl
->sg64
[i
].addr
,
89 kprintf("0x%x:%06d ", sgl
->sg32
[i
].addr
,
104 mfi_print_ldio(struct mfi_softc
*sc
, device_t dev
, struct mfi_command
*cm
)
106 struct mfi_io_frame
*io
;
107 struct mfi_frame_header
*hdr
;
109 io
= &cm
->cm_frame
->io
;
112 device_printf(dev
, "cmd=%s target_id=%d sg_count=%d data_len=%d "
113 "lba=%d\n", (hdr
->cmd
== MFI_CMD_LD_READ
) ? "LD_READ":"LD_WRITE",
114 hdr
->target_id
, hdr
->sg_count
, hdr
->data_len
, io
->lba_lo
);
115 mfi_print_frame_flags(dev
, hdr
->flags
);
116 mfi_print_sgl(hdr
, &io
->sgl
, hdr
->sg_count
);
121 mfi_print_dcmd(struct mfi_softc
*sc
, device_t dev
, struct mfi_command
*cm
)
123 struct mfi_dcmd_frame
*dcmd
;
124 struct mfi_frame_header
*hdr
;
127 dcmd
= &cm
->cm_frame
->dcmd
;
130 switch (dcmd
->opcode
) {
131 case MFI_DCMD_CTRL_GETINFO
:
132 opcode
= "CTRL_GETINFO";
134 case MFI_DCMD_CTRL_FLUSHCACHE
:
135 opcode
= "CTRL_FLUSHCACHE";
137 case MFI_DCMD_CTRL_SHUTDOWN
:
138 opcode
= "CTRL_SHUTDOWN";
140 case MFI_DCMD_CTRL_EVENT_GETINFO
:
141 opcode
= "EVENT_GETINFO";
143 case MFI_DCMD_CTRL_EVENT_GET
:
144 opcode
= "EVENT_GET";
146 case MFI_DCMD_CTRL_EVENT_WAIT
:
147 opcode
= "EVENT_WAIT";
149 case MFI_DCMD_LD_GET_LIST
:
150 opcode
= "LD_GET_LIST";
152 case MFI_DCMD_LD_GET_INFO
:
153 opcode
= "LD_GET_INFO";
155 case MFI_DCMD_LD_GET_PROP
:
156 opcode
= "LD_GET_PROP";
158 case MFI_DCMD_LD_SET_PROP
:
159 opcode
= "LD_SET_PROP";
161 case MFI_DCMD_CLUSTER
:
164 case MFI_DCMD_CLUSTER_RESET_ALL
:
165 opcode
= "CLUSTER_RESET_ALL";
167 case MFI_DCMD_CLUSTER_RESET_LD
:
168 opcode
= "CLUSTER_RESET_LD";
175 device_printf(dev
, "cmd=MFI_CMD_DCMD opcode=%s data_len=%d\n",
176 opcode
, hdr
->data_len
);
177 mfi_print_frame_flags(dev
, hdr
->flags
);
178 mfi_print_sgl(hdr
, &dcmd
->sgl
, hdr
->sg_count
);
183 mfi_print_generic_frame(struct mfi_softc
*sc
, struct mfi_command
*cm
)
185 hexdump(cm
->cm_frame
, cm
->cm_total_frame_size
, NULL
, HD_OMIT_CHARS
);
189 mfi_print_cmd(struct mfi_command
*cm
)
192 struct mfi_softc
*sc
;
197 device_printf(dev
, "cm=%p index=%d total_frame_size=%d "
198 "extra_frames=%d\n", cm
, cm
->cm_index
, cm
->cm_total_frame_size
,
199 cm
->cm_extra_frames
);
200 device_printf(dev
, "flags=%pb%i\n",
209 "\10Q_BUSY", cm
->cm_flags
);
211 switch (cm
->cm_frame
->header
.cmd
) {
213 mfi_print_dcmd(sc
, dev
, cm
);
215 case MFI_CMD_LD_READ
:
216 case MFI_CMD_LD_WRITE
:
217 mfi_print_ldio(sc
, dev
, cm
);
220 mfi_print_generic_frame(sc
, cm
);
228 mfi_dump_cmds(struct mfi_softc
*sc
)
232 for (i
= 0; i
< sc
->mfi_total_cmds
; i
++)
233 mfi_print_generic_frame(sc
, &sc
->mfi_commands
[i
]);
237 mfi_validate_sg(struct mfi_softc
*sc
, struct mfi_command
*cm
,
238 const char *function
, int line
)
240 struct mfi_frame_header
*hdr
;
242 uint32_t count
= 0, data_len
;
244 hdr
= &cm
->cm_frame
->header
;
246 for (i
= 0; i
< hdr
->sg_count
; i
++) {
247 if (hdr
->flags
& MFI_FRAME_IEEE_SGL
)
248 count
+= cm
->cm_sg
->sg_skinny
[i
].len
;
249 else if (hdr
->flags
& MFI_FRAME_SGL64
)
250 count
+= cm
->cm_sg
->sg64
[i
].len
;
252 count
+= cm
->cm_sg
->sg32
[i
].len
;
257 data_len
= hdr
->data_len
;
259 case MFI_CMD_LD_READ
:
260 case MFI_CMD_LD_WRITE
:
261 data_len
= data_len
* 512;
263 if (count
!= data_len
) {
264 device_printf(sc
->mfi_dev
,
265 "%s %d COMMAND %p S/G count bad %d %d %d 0x%jx\n",
266 function
, line
, cm
, count
, data_len
, cm
->cm_len
,
267 (intmax_t)pmap_kextract((vm_offset_t
)cm
->cm_data
));