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/mutex.h>
42 #include <sys/malloc.h>
43 #include <sys/taskqueue.h>
49 #include <dev/raid/mfi/mfireg.h>
50 #include <dev/raid/mfi/mfi_ioctl.h>
51 #include <dev/raid/mfi/mfivar.h>
54 mfi_print_frame_flags(device_t dev
, uint32_t flags
)
56 device_printf(dev
, "flags=%b\n", flags
,
67 mfi_print_sgl(struct mfi_frame_header
*hdr
, union mfi_sgl
*sgl
, int count
)
71 kprintf("SG List:\n");
72 for (i
= 0; i
< count
; i
++) {
73 if (hdr
->flags
& MFI_FRAME_IEEE_SGL
) {
74 kprintf("0x%lx:%06d ", (u_long
)sgl
->sg_skinny
[i
].addr
,
75 sgl
->sg_skinny
[i
].len
);
81 } else if (hdr
->flags
& MFI_FRAME_SGL64
) {
82 kprintf("0x%lx:%06d ", (u_long
)sgl
->sg64
[i
].addr
,
90 kprintf("0x%x:%06d ", sgl
->sg32
[i
].addr
,
105 mfi_print_ldio(struct mfi_softc
*sc
, device_t dev
, struct mfi_command
*cm
)
107 struct mfi_io_frame
*io
;
108 struct mfi_frame_header
*hdr
;
110 io
= &cm
->cm_frame
->io
;
113 device_printf(dev
, "cmd=%s target_id=%d sg_count=%d data_len=%d "
114 "lba=%d\n", (hdr
->cmd
== MFI_CMD_LD_READ
) ? "LD_READ":"LD_WRITE",
115 hdr
->target_id
, hdr
->sg_count
, hdr
->data_len
, io
->lba_lo
);
116 mfi_print_frame_flags(dev
, hdr
->flags
);
117 mfi_print_sgl(hdr
, &io
->sgl
, hdr
->sg_count
);
122 mfi_print_dcmd(struct mfi_softc
*sc
, device_t dev
, struct mfi_command
*cm
)
124 struct mfi_dcmd_frame
*dcmd
;
125 struct mfi_frame_header
*hdr
;
128 dcmd
= &cm
->cm_frame
->dcmd
;
131 switch (dcmd
->opcode
) {
132 case MFI_DCMD_CTRL_GETINFO
:
133 opcode
= "CTRL_GETINFO";
135 case MFI_DCMD_CTRL_FLUSHCACHE
:
136 opcode
= "CTRL_FLUSHCACHE";
138 case MFI_DCMD_CTRL_SHUTDOWN
:
139 opcode
= "CTRL_SHUTDOWN";
141 case MFI_DCMD_CTRL_EVENT_GETINFO
:
142 opcode
= "EVENT_GETINFO";
144 case MFI_DCMD_CTRL_EVENT_GET
:
145 opcode
= "EVENT_GET";
147 case MFI_DCMD_CTRL_EVENT_WAIT
:
148 opcode
= "EVENT_WAIT";
150 case MFI_DCMD_LD_GET_LIST
:
151 opcode
= "LD_GET_LIST";
153 case MFI_DCMD_LD_GET_INFO
:
154 opcode
= "LD_GET_INFO";
156 case MFI_DCMD_LD_GET_PROP
:
157 opcode
= "LD_GET_PROP";
159 case MFI_DCMD_LD_SET_PROP
:
160 opcode
= "LD_SET_PROP";
162 case MFI_DCMD_CLUSTER
:
165 case MFI_DCMD_CLUSTER_RESET_ALL
:
166 opcode
= "CLUSTER_RESET_ALL";
168 case MFI_DCMD_CLUSTER_RESET_LD
:
169 opcode
= "CLUSTER_RESET_LD";
176 device_printf(dev
, "cmd=MFI_CMD_DCMD opcode=%s data_len=%d\n",
177 opcode
, hdr
->data_len
);
178 mfi_print_frame_flags(dev
, hdr
->flags
);
179 mfi_print_sgl(hdr
, &dcmd
->sgl
, hdr
->sg_count
);
184 mfi_print_generic_frame(struct mfi_softc
*sc
, struct mfi_command
*cm
)
186 hexdump(cm
->cm_frame
, cm
->cm_total_frame_size
, NULL
, HD_OMIT_CHARS
);
190 mfi_print_cmd(struct mfi_command
*cm
)
193 struct mfi_softc
*sc
;
198 device_printf(dev
, "cm=%p index=%d total_frame_size=%d "
199 "extra_frames=%d\n", cm
, cm
->cm_index
, cm
->cm_total_frame_size
,
200 cm
->cm_extra_frames
);
201 device_printf(dev
, "flags=%b\n", cm
->cm_flags
,
212 switch (cm
->cm_frame
->header
.cmd
) {
214 mfi_print_dcmd(sc
, dev
, cm
);
216 case MFI_CMD_LD_READ
:
217 case MFI_CMD_LD_WRITE
:
218 mfi_print_ldio(sc
, dev
, cm
);
221 mfi_print_generic_frame(sc
, cm
);
229 mfi_dump_cmds(struct mfi_softc
*sc
)
233 for (i
= 0; i
< sc
->mfi_total_cmds
; i
++)
234 mfi_print_generic_frame(sc
, &sc
->mfi_commands
[i
]);
238 mfi_validate_sg(struct mfi_softc
*sc
, struct mfi_command
*cm
,
239 const char *function
, int line
)
241 struct mfi_frame_header
*hdr
;
243 uint32_t count
= 0, data_len
;
245 hdr
= &cm
->cm_frame
->header
;
247 for (i
= 0; i
< hdr
->sg_count
; i
++) {
248 if (hdr
->flags
& MFI_FRAME_IEEE_SGL
)
249 count
+= cm
->cm_sg
->sg_skinny
[i
].len
;
250 else if (hdr
->flags
& MFI_FRAME_SGL64
)
251 count
+= cm
->cm_sg
->sg64
[i
].len
;
253 count
+= cm
->cm_sg
->sg32
[i
].len
;
258 data_len
= hdr
->data_len
;
260 case MFI_CMD_LD_READ
:
261 case MFI_CMD_LD_WRITE
:
262 data_len
= data_len
* 512;
264 if (count
!= data_len
) {
265 device_printf(sc
->mfi_dev
,
266 "%s %d COMMAND %p S/G count bad %d %d %d 0x%jx\n",
267 function
, line
, cm
, count
, data_len
, cm
->cm_len
,
268 (intmax_t)pmap_kextract((vm_offset_t
)cm
->cm_data
));