1*fd501800SSascha Wildner /*-
2*fd501800SSascha Wildner * Copyright (c) 2009 Yahoo! Inc.
3*fd501800SSascha Wildner * All rights reserved.
4*fd501800SSascha Wildner *
5*fd501800SSascha Wildner * Redistribution and use in source and binary forms, with or without
6*fd501800SSascha Wildner * modification, are permitted provided that the following conditions
7*fd501800SSascha Wildner * are met:
8*fd501800SSascha Wildner * 1. Redistributions of source code must retain the above copyright
9*fd501800SSascha Wildner * notice, this list of conditions and the following disclaimer.
10*fd501800SSascha Wildner * 2. Redistributions in binary form must reproduce the above copyright
11*fd501800SSascha Wildner * notice, this list of conditions and the following disclaimer in the
12*fd501800SSascha Wildner * documentation and/or other materials provided with the distribution.
13*fd501800SSascha Wildner *
14*fd501800SSascha Wildner * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15*fd501800SSascha Wildner * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16*fd501800SSascha Wildner * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17*fd501800SSascha Wildner * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18*fd501800SSascha Wildner * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19*fd501800SSascha Wildner * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20*fd501800SSascha Wildner * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21*fd501800SSascha Wildner * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22*fd501800SSascha Wildner * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23*fd501800SSascha Wildner * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24*fd501800SSascha Wildner * SUCH DAMAGE.
25*fd501800SSascha Wildner *
26*fd501800SSascha Wildner * $FreeBSD: head/sys/dev/mpr/mpr_table.c 323380 2017-09-09 22:02:36Z scottl $
27*fd501800SSascha Wildner */
28*fd501800SSascha Wildner
29*fd501800SSascha Wildner /* Debugging tables for MPT2 */
30*fd501800SSascha Wildner
31*fd501800SSascha Wildner /* TODO Move headers to mprvar */
32*fd501800SSascha Wildner #include <sys/types.h>
33*fd501800SSascha Wildner #include <sys/param.h>
34*fd501800SSascha Wildner #include <sys/systm.h>
35*fd501800SSascha Wildner #include <sys/kernel.h>
36*fd501800SSascha Wildner #include <sys/module.h>
37*fd501800SSascha Wildner #include <sys/bus.h>
38*fd501800SSascha Wildner #include <sys/conf.h>
39*fd501800SSascha Wildner #include <sys/bio.h>
40*fd501800SSascha Wildner #include <sys/malloc.h>
41*fd501800SSascha Wildner #include <sys/uio.h>
42*fd501800SSascha Wildner #include <sys/sysctl.h>
43*fd501800SSascha Wildner #include <sys/queue.h>
44*fd501800SSascha Wildner #include <sys/kthread.h>
45*fd501800SSascha Wildner #include <sys/taskqueue.h>
46*fd501800SSascha Wildner #include <sys/eventhandler.h>
47*fd501800SSascha Wildner
48*fd501800SSascha Wildner #include <sys/rman.h>
49*fd501800SSascha Wildner
50*fd501800SSascha Wildner #include <bus/cam/scsi/scsi_all.h>
51*fd501800SSascha Wildner
52*fd501800SSascha Wildner #include <dev/raid/mpr/mpi/mpi2_type.h>
53*fd501800SSascha Wildner #include <dev/raid/mpr/mpi/mpi2.h>
54*fd501800SSascha Wildner #include <dev/raid/mpr/mpi/mpi2_ioc.h>
55*fd501800SSascha Wildner #include <dev/raid/mpr/mpi/mpi2_cnfg.h>
56*fd501800SSascha Wildner #include <dev/raid/mpr/mpi/mpi2_init.h>
57*fd501800SSascha Wildner #include <dev/raid/mpr/mpi/mpi2_tool.h>
58*fd501800SSascha Wildner #include <dev/raid/mpr/mpi/mpi2_pci.h>
59*fd501800SSascha Wildner #include <dev/raid/mpr/mpr_ioctl.h>
60*fd501800SSascha Wildner #include <dev/raid/mpr/mprvar.h>
61*fd501800SSascha Wildner #include <dev/raid/mpr/mpr_table.h>
62*fd501800SSascha Wildner
63*fd501800SSascha Wildner char *
mpr_describe_table(struct mpr_table_lookup * table,u_int code)64*fd501800SSascha Wildner mpr_describe_table(struct mpr_table_lookup *table, u_int code)
65*fd501800SSascha Wildner {
66*fd501800SSascha Wildner int i;
67*fd501800SSascha Wildner
68*fd501800SSascha Wildner for (i = 0; table[i].string != NULL; i++) {
69*fd501800SSascha Wildner if (table[i].code == code)
70*fd501800SSascha Wildner return(table[i].string);
71*fd501800SSascha Wildner }
72*fd501800SSascha Wildner return(table[i+1].string);
73*fd501800SSascha Wildner }
74*fd501800SSascha Wildner
75*fd501800SSascha Wildner //SLM-Add new PCIe info to all of these tables
76*fd501800SSascha Wildner struct mpr_table_lookup mpr_event_names[] = {
77*fd501800SSascha Wildner {"LogData", 0x01},
78*fd501800SSascha Wildner {"StateChange", 0x02},
79*fd501800SSascha Wildner {"HardResetReceived", 0x05},
80*fd501800SSascha Wildner {"EventChange", 0x0a},
81*fd501800SSascha Wildner {"TaskSetFull", 0x0e},
82*fd501800SSascha Wildner {"SasDeviceStatusChange", 0x0f},
83*fd501800SSascha Wildner {"IrOperationStatus", 0x14},
84*fd501800SSascha Wildner {"SasDiscovery", 0x16},
85*fd501800SSascha Wildner {"SasBroadcastPrimitive", 0x17},
86*fd501800SSascha Wildner {"SasInitDeviceStatusChange", 0x18},
87*fd501800SSascha Wildner {"SasInitTableOverflow", 0x19},
88*fd501800SSascha Wildner {"SasTopologyChangeList", 0x1c},
89*fd501800SSascha Wildner {"SasEnclDeviceStatusChange", 0x1d},
90*fd501800SSascha Wildner {"IrVolume", 0x1e},
91*fd501800SSascha Wildner {"IrPhysicalDisk", 0x1f},
92*fd501800SSascha Wildner {"IrConfigurationChangeList", 0x20},
93*fd501800SSascha Wildner {"LogEntryAdded", 0x21},
94*fd501800SSascha Wildner {"SasPhyCounter", 0x22},
95*fd501800SSascha Wildner {"GpioInterrupt", 0x23},
96*fd501800SSascha Wildner {"HbdPhyEvent", 0x24},
97*fd501800SSascha Wildner {"SasQuiesce", 0x25},
98*fd501800SSascha Wildner {"SasNotifyPrimitive", 0x26},
99*fd501800SSascha Wildner {"TempThreshold", 0x27},
100*fd501800SSascha Wildner {"HostMessage", 0x28},
101*fd501800SSascha Wildner {"PowerPerformanceChange", 0x29},
102*fd501800SSascha Wildner {"PCIeDeviceStatusChange", 0x30},
103*fd501800SSascha Wildner {"PCIeEnumeration", 0x31},
104*fd501800SSascha Wildner {"PCIeTopologyChangeList", 0x32},
105*fd501800SSascha Wildner {"PCIeLinkCounter", 0x33},
106*fd501800SSascha Wildner {"CableEvent", 0x34},
107*fd501800SSascha Wildner {NULL, 0},
108*fd501800SSascha Wildner {"Unknown Event", 0}
109*fd501800SSascha Wildner };
110*fd501800SSascha Wildner
111*fd501800SSascha Wildner struct mpr_table_lookup mpr_phystatus_names[] = {
112*fd501800SSascha Wildner {"NewTargetAdded", 0x01},
113*fd501800SSascha Wildner {"TargetGone", 0x02},
114*fd501800SSascha Wildner {"PHYLinkStatusChange", 0x03},
115*fd501800SSascha Wildner {"PHYLinkStatusUnchanged", 0x04},
116*fd501800SSascha Wildner {"TargetMissing", 0x05},
117*fd501800SSascha Wildner {NULL, 0},
118*fd501800SSascha Wildner {"Unknown Status", 0}
119*fd501800SSascha Wildner };
120*fd501800SSascha Wildner
121*fd501800SSascha Wildner struct mpr_table_lookup mpr_linkrate_names[] = {
122*fd501800SSascha Wildner {"PHY disabled", 0x01},
123*fd501800SSascha Wildner {"Speed Negotiation Failed", 0x02},
124*fd501800SSascha Wildner {"SATA OOB Complete", 0x03},
125*fd501800SSascha Wildner {"SATA Port Selector", 0x04},
126*fd501800SSascha Wildner {"SMP Reset in Progress", 0x05},
127*fd501800SSascha Wildner {"1.5Gbps", 0x08},
128*fd501800SSascha Wildner {"3.0Gbps", 0x09},
129*fd501800SSascha Wildner {"6.0Gbps", 0x0a},
130*fd501800SSascha Wildner {"12.0Gbps", 0x0b},
131*fd501800SSascha Wildner {NULL, 0},
132*fd501800SSascha Wildner {"LinkRate Unknown", 0x00}
133*fd501800SSascha Wildner };
134*fd501800SSascha Wildner
135*fd501800SSascha Wildner struct mpr_table_lookup mpr_sasdev0_devtype[] = {
136*fd501800SSascha Wildner {"End Device", 0x01},
137*fd501800SSascha Wildner {"Edge Expander", 0x02},
138*fd501800SSascha Wildner {"Fanout Expander", 0x03},
139*fd501800SSascha Wildner {NULL, 0},
140*fd501800SSascha Wildner {"No Device", 0x00}
141*fd501800SSascha Wildner };
142*fd501800SSascha Wildner
143*fd501800SSascha Wildner struct mpr_table_lookup mpr_phyinfo_reason_names[] = {
144*fd501800SSascha Wildner {"Power On", 0x01},
145*fd501800SSascha Wildner {"Hard Reset", 0x02},
146*fd501800SSascha Wildner {"SMP Phy Control Link Reset", 0x03},
147*fd501800SSascha Wildner {"Loss DWORD Sync", 0x04},
148*fd501800SSascha Wildner {"Multiplex Sequence", 0x05},
149*fd501800SSascha Wildner {"I-T Nexus Loss Timer", 0x06},
150*fd501800SSascha Wildner {"Break Timeout Timer", 0x07},
151*fd501800SSascha Wildner {"PHY Test Function", 0x08},
152*fd501800SSascha Wildner {NULL, 0},
153*fd501800SSascha Wildner {"Unknown Reason", 0x00}
154*fd501800SSascha Wildner };
155*fd501800SSascha Wildner
156*fd501800SSascha Wildner struct mpr_table_lookup mpr_whoinit_names[] = {
157*fd501800SSascha Wildner {"System BIOS", 0x01},
158*fd501800SSascha Wildner {"ROM BIOS", 0x02},
159*fd501800SSascha Wildner {"PCI Peer", 0x03},
160*fd501800SSascha Wildner {"Host Driver", 0x04},
161*fd501800SSascha Wildner {"Manufacturing", 0x05},
162*fd501800SSascha Wildner {NULL, 0},
163*fd501800SSascha Wildner {"Not Initialized", 0x00}
164*fd501800SSascha Wildner };
165*fd501800SSascha Wildner
166*fd501800SSascha Wildner struct mpr_table_lookup mpr_sasdisc_reason[] = {
167*fd501800SSascha Wildner {"Discovery Started", 0x01},
168*fd501800SSascha Wildner {"Discovery Complete", 0x02},
169*fd501800SSascha Wildner {NULL, 0},
170*fd501800SSascha Wildner {"Unknown", 0x00}
171*fd501800SSascha Wildner };
172*fd501800SSascha Wildner
173*fd501800SSascha Wildner struct mpr_table_lookup mpr_sastopo_exp[] = {
174*fd501800SSascha Wildner {"Added", 0x01},
175*fd501800SSascha Wildner {"Not Responding", 0x02},
176*fd501800SSascha Wildner {"Responding", 0x03},
177*fd501800SSascha Wildner {"Delay Not Responding", 0x04},
178*fd501800SSascha Wildner {NULL, 0},
179*fd501800SSascha Wildner {"Unknown", 0x00}
180*fd501800SSascha Wildner };
181*fd501800SSascha Wildner
182*fd501800SSascha Wildner struct mpr_table_lookup mpr_sasdev_reason[] = {
183*fd501800SSascha Wildner {"SMART Data", 0x05},
184*fd501800SSascha Wildner {"Unsupported", 0x07},
185*fd501800SSascha Wildner {"Internal Device Reset", 0x08},
186*fd501800SSascha Wildner {"Task Abort Internal", 0x09},
187*fd501800SSascha Wildner {"Abort Task Set Internal", 0x0a},
188*fd501800SSascha Wildner {"Clear Task Set Internal", 0x0b},
189*fd501800SSascha Wildner {"Query Task Internal", 0x0c},
190*fd501800SSascha Wildner {"Async Notification", 0x0d},
191*fd501800SSascha Wildner {"Cmp Internal Device Reset", 0x0e},
192*fd501800SSascha Wildner {"Cmp Task Abort Internal", 0x0f},
193*fd501800SSascha Wildner {"Sata Init Failure", 0x10},
194*fd501800SSascha Wildner {NULL, 0},
195*fd501800SSascha Wildner {"Unknown", 0x00}
196*fd501800SSascha Wildner };
197*fd501800SSascha Wildner
198*fd501800SSascha Wildner struct mpr_table_lookup mpr_pcie_linkrate_names[] = {
199*fd501800SSascha Wildner {"Port disabled", 0x01},
200*fd501800SSascha Wildner {"2.5GT/sec", 0x02},
201*fd501800SSascha Wildner {"5.0GT/sec", 0x03},
202*fd501800SSascha Wildner {"8.0GT/sec", 0x04},
203*fd501800SSascha Wildner {"16.0GT/sec", 0x05},
204*fd501800SSascha Wildner {NULL, 0},
205*fd501800SSascha Wildner {"LinkRate Unknown", 0x00}
206*fd501800SSascha Wildner };
207*fd501800SSascha Wildner
208*fd501800SSascha Wildner struct mpr_table_lookup mpr_iocstatus_string[] = {
209*fd501800SSascha Wildner {"success", MPI2_IOCSTATUS_SUCCESS},
210*fd501800SSascha Wildner {"invalid function", MPI2_IOCSTATUS_INVALID_FUNCTION},
211*fd501800SSascha Wildner {"scsi recovered error", MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR},
212*fd501800SSascha Wildner {"scsi invalid dev handle", MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE},
213*fd501800SSascha Wildner {"scsi device not there", MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE},
214*fd501800SSascha Wildner {"scsi data overrun", MPI2_IOCSTATUS_SCSI_DATA_OVERRUN},
215*fd501800SSascha Wildner {"scsi data underrun", MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN},
216*fd501800SSascha Wildner {"scsi io data error", MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR},
217*fd501800SSascha Wildner {"scsi protocol error", MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR},
218*fd501800SSascha Wildner {"scsi task terminated", MPI2_IOCSTATUS_SCSI_TASK_TERMINATED},
219*fd501800SSascha Wildner {"scsi residual mismatch", MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH},
220*fd501800SSascha Wildner {"scsi task mgmt failed", MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED},
221*fd501800SSascha Wildner {"scsi ioc terminated", MPI2_IOCSTATUS_SCSI_IOC_TERMINATED},
222*fd501800SSascha Wildner {"scsi ext terminated", MPI2_IOCSTATUS_SCSI_EXT_TERMINATED},
223*fd501800SSascha Wildner {"eedp guard error", MPI2_IOCSTATUS_EEDP_GUARD_ERROR},
224*fd501800SSascha Wildner {"eedp ref tag error", MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR},
225*fd501800SSascha Wildner {"eedp app tag error", MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR},
226*fd501800SSascha Wildner {NULL, 0},
227*fd501800SSascha Wildner {"unknown", 0x00}
228*fd501800SSascha Wildner };
229*fd501800SSascha Wildner
230*fd501800SSascha Wildner struct mpr_table_lookup mpr_scsi_status_string[] = {
231*fd501800SSascha Wildner {"good", MPI2_SCSI_STATUS_GOOD},
232*fd501800SSascha Wildner {"check condition", MPI2_SCSI_STATUS_CHECK_CONDITION},
233*fd501800SSascha Wildner {"condition met", MPI2_SCSI_STATUS_CONDITION_MET},
234*fd501800SSascha Wildner {"busy", MPI2_SCSI_STATUS_BUSY},
235*fd501800SSascha Wildner {"intermediate", MPI2_SCSI_STATUS_INTERMEDIATE},
236*fd501800SSascha Wildner {"intermediate condmet", MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET},
237*fd501800SSascha Wildner {"reservation conflict", MPI2_SCSI_STATUS_RESERVATION_CONFLICT},
238*fd501800SSascha Wildner {"command terminated", MPI2_SCSI_STATUS_COMMAND_TERMINATED},
239*fd501800SSascha Wildner {"task set full", MPI2_SCSI_STATUS_TASK_SET_FULL},
240*fd501800SSascha Wildner {"aca active", MPI2_SCSI_STATUS_ACA_ACTIVE},
241*fd501800SSascha Wildner {"task aborted", MPI2_SCSI_STATUS_TASK_ABORTED},
242*fd501800SSascha Wildner {NULL, 0},
243*fd501800SSascha Wildner {"unknown", 0x00}
244*fd501800SSascha Wildner };
245*fd501800SSascha Wildner
246*fd501800SSascha Wildner struct mpr_table_lookup mpr_scsi_taskmgmt_string[] = {
247*fd501800SSascha Wildner {"task mgmt request completed", MPI2_SCSITASKMGMT_RSP_TM_COMPLETE},
248*fd501800SSascha Wildner {"invalid frame", MPI2_SCSITASKMGMT_RSP_INVALID_FRAME},
249*fd501800SSascha Wildner {"task mgmt request not supp", MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED},
250*fd501800SSascha Wildner {"task mgmt request failed", MPI2_SCSITASKMGMT_RSP_TM_FAILED},
251*fd501800SSascha Wildner {"task mgmt request_succeeded", MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED},
252*fd501800SSascha Wildner {"invalid lun", MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN},
253*fd501800SSascha Wildner {"overlapped tag attempt", 0xA},
254*fd501800SSascha Wildner {"task queued on IOC", MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC},
255*fd501800SSascha Wildner {NULL, 0},
256*fd501800SSascha Wildner {"unknown", 0x00}
257*fd501800SSascha Wildner };
258*fd501800SSascha Wildner
259*fd501800SSascha Wildner void
mpr_describe_devinfo(uint32_t devinfo,char * string,int len)260*fd501800SSascha Wildner mpr_describe_devinfo(uint32_t devinfo, char *string, int len)
261*fd501800SSascha Wildner {
262*fd501800SSascha Wildner ksnprintf(string, len, "%pb%i,%s",
263*fd501800SSascha Wildner "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
264*fd501800SSascha Wildner "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
265*fd501800SSascha Wildner "\15LsiDev" "\16AtapiDev" "\17SepDev",
266*fd501800SSascha Wildner devinfo,
267*fd501800SSascha Wildner mpr_describe_table(mpr_sasdev0_devtype, devinfo & 0x03));
268*fd501800SSascha Wildner }
269*fd501800SSascha Wildner
270*fd501800SSascha Wildner void
mpr_print_iocfacts(struct mpr_softc * sc,MPI2_IOC_FACTS_REPLY * facts)271*fd501800SSascha Wildner mpr_print_iocfacts(struct mpr_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
272*fd501800SSascha Wildner {
273*fd501800SSascha Wildner MPR_PRINTFIELD_START(sc, "IOCFacts");
274*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MsgVersion, 0x%x);
275*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, HeaderVersion, 0x%x);
276*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, IOCNumber, %d);
277*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, IOCExceptions, 0x%x);
278*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxChainDepth, %d);
279*fd501800SSascha Wildner mpr_print_field(sc, "WhoInit: %s\n",
280*fd501800SSascha Wildner mpr_describe_table(mpr_whoinit_names, facts->WhoInit));
281*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, NumberOfPorts, %d);
282*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxMSIxVectors, %d);
283*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, RequestCredit, %d);
284*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, ProductID, 0x%x);
285*fd501800SSascha Wildner mpr_print_field(sc, "IOCCapabilities: %pb%i\n",
286*fd501800SSascha Wildner "\20" "\3ScsiTaskFull" "\4DiagTrace"
287*fd501800SSascha Wildner "\5SnapBuf" "\6ExtBuf" "\7EEDP" "\10BiDirTarg" "\11Multicast"
288*fd501800SSascha Wildner "\14TransRetry" "\15IR" "\16EventReplay" "\17RaidAccel"
289*fd501800SSascha Wildner "\20MSIXIndex" "\21HostDisc",
290*fd501800SSascha Wildner facts->IOCCapabilities);
291*fd501800SSascha Wildner mpr_print_field(sc, "FWVersion= %d-%d-%d-%d\n",
292*fd501800SSascha Wildner facts->FWVersion.Struct.Major,
293*fd501800SSascha Wildner facts->FWVersion.Struct.Minor,
294*fd501800SSascha Wildner facts->FWVersion.Struct.Unit,
295*fd501800SSascha Wildner facts->FWVersion.Struct.Dev);
296*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, IOCRequestFrameSize, %d);
297*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxInitiators, %d);
298*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxTargets, %d);
299*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxSasExpanders, %d);
300*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxEnclosures, %d);
301*fd501800SSascha Wildner mpr_print_field(sc, "ProtocolFlags: %pb%i\n",
302*fd501800SSascha Wildner "\20" "\1ScsiTarg" "\2ScsiInit",
303*fd501800SSascha Wildner facts->ProtocolFlags);
304*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, HighPriorityCredit, %d);
305*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxReplyDescriptorPostQueueDepth, %d);
306*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, ReplyFrameSize, %d);
307*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxVolumes, %d);
308*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxDevHandle, %d);
309*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxPersistentEntries, %d);
310*fd501800SSascha Wildner }
311*fd501800SSascha Wildner
312*fd501800SSascha Wildner void
mpr_print_portfacts(struct mpr_softc * sc,MPI2_PORT_FACTS_REPLY * facts)313*fd501800SSascha Wildner mpr_print_portfacts(struct mpr_softc *sc, MPI2_PORT_FACTS_REPLY *facts)
314*fd501800SSascha Wildner {
315*fd501800SSascha Wildner
316*fd501800SSascha Wildner MPR_PRINTFIELD_START(sc, "PortFacts");
317*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, PortNumber, %d);
318*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, PortType, 0x%x);
319*fd501800SSascha Wildner MPR_PRINTFIELD(sc, facts, MaxPostedCmdBuffers, %d);
320*fd501800SSascha Wildner }
321*fd501800SSascha Wildner
322*fd501800SSascha Wildner void
mpr_print_evt_generic(struct mpr_softc * sc,MPI2_EVENT_NOTIFICATION_REPLY * event)323*fd501800SSascha Wildner mpr_print_evt_generic(struct mpr_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
324*fd501800SSascha Wildner {
325*fd501800SSascha Wildner
326*fd501800SSascha Wildner MPR_PRINTFIELD_START(sc, "EventReply");
327*fd501800SSascha Wildner MPR_PRINTFIELD(sc, event, EventDataLength, %d);
328*fd501800SSascha Wildner MPR_PRINTFIELD(sc, event, AckRequired, %d);
329*fd501800SSascha Wildner mpr_print_field(sc, "Event: %s (0x%x)\n",
330*fd501800SSascha Wildner mpr_describe_table(mpr_event_names, event->Event), event->Event);
331*fd501800SSascha Wildner MPR_PRINTFIELD(sc, event, EventContext, 0x%x);
332*fd501800SSascha Wildner }
333*fd501800SSascha Wildner
334*fd501800SSascha Wildner void
mpr_print_sasdev0(struct mpr_softc * sc,MPI2_CONFIG_PAGE_SAS_DEV_0 * buf)335*fd501800SSascha Wildner mpr_print_sasdev0(struct mpr_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf)
336*fd501800SSascha Wildner {
337*fd501800SSascha Wildner MPR_PRINTFIELD_START(sc, "SAS Device Page 0");
338*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, Slot, %d);
339*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, EnclosureHandle, 0x%x);
340*fd501800SSascha Wildner mpr_print_field(sc, "SASAddress: 0x%jx\n",
341*fd501800SSascha Wildner mpr_to_u64(&buf->SASAddress));
342*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, ParentDevHandle, 0x%x);
343*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, PhyNum, %d);
344*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, AccessStatus, 0x%x);
345*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, DevHandle, 0x%x);
346*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, AttachedPhyIdentifier, 0x%x);
347*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, ZoneGroup, %d);
348*fd501800SSascha Wildner mpr_print_field(sc, "DeviceInfo: %pb%i,%s\n",
349*fd501800SSascha Wildner "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
350*fd501800SSascha Wildner "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
351*fd501800SSascha Wildner "\15LsiDev" "\16AtapiDev" "\17SepDev",
352*fd501800SSascha Wildner buf->DeviceInfo,
353*fd501800SSascha Wildner mpr_describe_table(mpr_sasdev0_devtype, buf->DeviceInfo & 0x03));
354*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, Flags, 0x%x);
355*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, PhysicalPort, %d);
356*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, MaxPortConnections, %d);
357*fd501800SSascha Wildner mpr_print_field(sc, "DeviceName: 0x%jx\n",
358*fd501800SSascha Wildner mpr_to_u64(&buf->DeviceName));
359*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, PortGroups, %d);
360*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, DmaGroup, %d);
361*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, ControlGroup, %d);
362*fd501800SSascha Wildner }
363*fd501800SSascha Wildner
364*fd501800SSascha Wildner void
mpr_print_evt_sas(struct mpr_softc * sc,MPI2_EVENT_NOTIFICATION_REPLY * event)365*fd501800SSascha Wildner mpr_print_evt_sas(struct mpr_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
366*fd501800SSascha Wildner {
367*fd501800SSascha Wildner
368*fd501800SSascha Wildner mpr_print_evt_generic(sc, event);
369*fd501800SSascha Wildner
370*fd501800SSascha Wildner switch(event->Event) {
371*fd501800SSascha Wildner case MPI2_EVENT_SAS_DISCOVERY:
372*fd501800SSascha Wildner {
373*fd501800SSascha Wildner MPI2_EVENT_DATA_SAS_DISCOVERY *data;
374*fd501800SSascha Wildner
375*fd501800SSascha Wildner data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)&event->EventData;
376*fd501800SSascha Wildner mpr_print_field(sc, "Flags: %pb%i\n",
377*fd501800SSascha Wildner "\20" "\1InProgress" "\2DeviceChange",
378*fd501800SSascha Wildner data->Flags);
379*fd501800SSascha Wildner mpr_print_field(sc, "ReasonCode: %s\n",
380*fd501800SSascha Wildner mpr_describe_table(mpr_sasdisc_reason, data->ReasonCode));
381*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, PhysicalPort, %d);
382*fd501800SSascha Wildner mpr_print_field(sc, "DiscoveryStatus: %pb%i\n",
383*fd501800SSascha Wildner "\20"
384*fd501800SSascha Wildner "\1Loop" "\2UnaddressableDev" "\3DupSasAddr" "\5SmpTimeout"
385*fd501800SSascha Wildner "\6ExpRouteFull" "\7RouteIndexError" "\10SmpFailed"
386*fd501800SSascha Wildner "\11SmpCrcError" "\12SubSubLink" "\13TableTableLink"
387*fd501800SSascha Wildner "\14UnsupDevice" "\15TableSubLink" "\16MultiDomain"
388*fd501800SSascha Wildner "\17MultiSub" "\20MultiSubSub" "\34DownstreamInit"
389*fd501800SSascha Wildner "\35MaxPhys" "\36MaxTargs" "\37MaxExpanders"
390*fd501800SSascha Wildner "\40MaxEnclosures",
391*fd501800SSascha Wildner data->DiscoveryStatus);
392*fd501800SSascha Wildner break;
393*fd501800SSascha Wildner }
394*fd501800SSascha Wildner //SLM-add for PCIE EVENT too
395*fd501800SSascha Wildner case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
396*fd501800SSascha Wildner {
397*fd501800SSascha Wildner MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *data;
398*fd501800SSascha Wildner MPI2_EVENT_SAS_TOPO_PHY_ENTRY *phy;
399*fd501800SSascha Wildner int i, phynum;
400*fd501800SSascha Wildner
401*fd501800SSascha Wildner data = (MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *)
402*fd501800SSascha Wildner &event->EventData;
403*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, EnclosureHandle, 0x%x);
404*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, ExpanderDevHandle, 0x%x);
405*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, NumPhys, %d);
406*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, NumEntries, %d);
407*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, StartPhyNum, %d);
408*fd501800SSascha Wildner mpr_print_field(sc, "ExpStatus: %s (0x%x)\n",
409*fd501800SSascha Wildner mpr_describe_table(mpr_sastopo_exp, data->ExpStatus),
410*fd501800SSascha Wildner data->ExpStatus);
411*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, PhysicalPort, %d);
412*fd501800SSascha Wildner for (i = 0; i < data->NumEntries; i++) {
413*fd501800SSascha Wildner phy = &data->PHY[i];
414*fd501800SSascha Wildner phynum = data->StartPhyNum + i;
415*fd501800SSascha Wildner mpr_print_field(sc,
416*fd501800SSascha Wildner "PHY[%d].AttachedDevHandle: 0x%04x\n", phynum,
417*fd501800SSascha Wildner phy->AttachedDevHandle);
418*fd501800SSascha Wildner mpr_print_field(sc,
419*fd501800SSascha Wildner "PHY[%d].LinkRate: %s (0x%x)\n", phynum,
420*fd501800SSascha Wildner mpr_describe_table(mpr_linkrate_names,
421*fd501800SSascha Wildner (phy->LinkRate >> 4) & 0xf), phy->LinkRate);
422*fd501800SSascha Wildner mpr_print_field(sc, "PHY[%d].PhyStatus: %s\n",
423*fd501800SSascha Wildner phynum, mpr_describe_table(mpr_phystatus_names,
424*fd501800SSascha Wildner phy->PhyStatus));
425*fd501800SSascha Wildner }
426*fd501800SSascha Wildner break;
427*fd501800SSascha Wildner }
428*fd501800SSascha Wildner case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
429*fd501800SSascha Wildner {
430*fd501800SSascha Wildner MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *data;
431*fd501800SSascha Wildner
432*fd501800SSascha Wildner data = (MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *)
433*fd501800SSascha Wildner &event->EventData;
434*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, EnclosureHandle, 0x%x);
435*fd501800SSascha Wildner mpr_print_field(sc, "ReasonCode: %s\n",
436*fd501800SSascha Wildner mpr_describe_table(mpr_sastopo_exp, data->ReasonCode));
437*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, PhysicalPort, %d);
438*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, NumSlots, %d);
439*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, StartSlot, %d);
440*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, PhyBits, 0x%x);
441*fd501800SSascha Wildner break;
442*fd501800SSascha Wildner }
443*fd501800SSascha Wildner case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
444*fd501800SSascha Wildner {
445*fd501800SSascha Wildner MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *data;
446*fd501800SSascha Wildner
447*fd501800SSascha Wildner data = (MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)
448*fd501800SSascha Wildner &event->EventData;
449*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, TaskTag, 0x%x);
450*fd501800SSascha Wildner mpr_print_field(sc, "ReasonCode: %s\n",
451*fd501800SSascha Wildner mpr_describe_table(mpr_sasdev_reason, data->ReasonCode));
452*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, ASC, 0x%x);
453*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, ASCQ, 0x%x);
454*fd501800SSascha Wildner MPR_PRINTFIELD(sc, data, DevHandle, 0x%x);
455*fd501800SSascha Wildner mpr_print_field(sc, "SASAddress: 0x%jx\n",
456*fd501800SSascha Wildner mpr_to_u64(&data->SASAddress));
457*fd501800SSascha Wildner }
458*fd501800SSascha Wildner default:
459*fd501800SSascha Wildner break;
460*fd501800SSascha Wildner }
461*fd501800SSascha Wildner }
462*fd501800SSascha Wildner
463*fd501800SSascha Wildner void
mpr_print_expander1(struct mpr_softc * sc,MPI2_CONFIG_PAGE_EXPANDER_1 * buf)464*fd501800SSascha Wildner mpr_print_expander1(struct mpr_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf)
465*fd501800SSascha Wildner {
466*fd501800SSascha Wildner MPR_PRINTFIELD_START(sc, "SAS Expander Page 1 #%d", buf->Phy);
467*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, PhysicalPort, %d);
468*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, NumPhys, %d);
469*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, Phy, %d);
470*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, NumTableEntriesProgrammed, %d);
471*fd501800SSascha Wildner mpr_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n",
472*fd501800SSascha Wildner mpr_describe_table(mpr_linkrate_names,
473*fd501800SSascha Wildner (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
474*fd501800SSascha Wildner mpr_print_field(sc, "HwLinkRate: %s (0x%x)\n",
475*fd501800SSascha Wildner mpr_describe_table(mpr_linkrate_names,
476*fd501800SSascha Wildner (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
477*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
478*fd501800SSascha Wildner mpr_print_field(sc, "PhyInfo Reason: %s (0x%x)\n",
479*fd501800SSascha Wildner mpr_describe_table(mpr_phyinfo_reason_names,
480*fd501800SSascha Wildner (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
481*fd501800SSascha Wildner mpr_print_field(sc, "AttachedDeviceInfo: %pb%i,%s\n",
482*fd501800SSascha Wildner "\20" "\4SATAhost" "\5SMPinit" "\6STPinit"
483*fd501800SSascha Wildner "\7SSPinit" "\10SATAdev" "\11SMPtarg" "\12STPtarg" "\13SSPtarg"
484*fd501800SSascha Wildner "\14Direct" "\15LSIdev" "\16ATAPIdev" "\17SEPdev",
485*fd501800SSascha Wildner buf->AttachedDeviceInfo,
486*fd501800SSascha Wildner mpr_describe_table(mpr_sasdev0_devtype,
487*fd501800SSascha Wildner buf->AttachedDeviceInfo & 0x03));
488*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, ExpanderDevHandle, 0x%04x);
489*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, ChangeCount, %d);
490*fd501800SSascha Wildner mpr_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n",
491*fd501800SSascha Wildner mpr_describe_table(mpr_linkrate_names,
492*fd501800SSascha Wildner buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
493*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, PhyIdentifier, %d);
494*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
495*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, DiscoveryInfo, 0x%x);
496*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, AttachedPhyInfo, 0x%x);
497*fd501800SSascha Wildner mpr_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n",
498*fd501800SSascha Wildner mpr_describe_table(mpr_phyinfo_reason_names,
499*fd501800SSascha Wildner buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
500*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, ZoneGroup, %d);
501*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, SelfConfigStatus, 0x%x);
502*fd501800SSascha Wildner }
503*fd501800SSascha Wildner
504*fd501800SSascha Wildner void
mpr_print_sasphy0(struct mpr_softc * sc,MPI2_CONFIG_PAGE_SAS_PHY_0 * buf)505*fd501800SSascha Wildner mpr_print_sasphy0(struct mpr_softc *sc, MPI2_CONFIG_PAGE_SAS_PHY_0 *buf)
506*fd501800SSascha Wildner {
507*fd501800SSascha Wildner MPR_PRINTFIELD_START(sc, "SAS PHY Page 0");
508*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, OwnerDevHandle, 0x%04x);
509*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
510*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
511*fd501800SSascha Wildner mpr_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n",
512*fd501800SSascha Wildner mpr_describe_table(mpr_phyinfo_reason_names,
513*fd501800SSascha Wildner buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
514*fd501800SSascha Wildner mpr_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n",
515*fd501800SSascha Wildner mpr_describe_table(mpr_linkrate_names,
516*fd501800SSascha Wildner (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
517*fd501800SSascha Wildner mpr_print_field(sc, "HwLinkRate: %s (0x%x)\n",
518*fd501800SSascha Wildner mpr_describe_table(mpr_linkrate_names,
519*fd501800SSascha Wildner (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
520*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, ChangeCount, %d);
521*fd501800SSascha Wildner MPR_PRINTFIELD(sc, buf, Flags, 0x%x);
522*fd501800SSascha Wildner mpr_print_field(sc, "PhyInfo Reason: %s (0x%x)\n",
523*fd501800SSascha Wildner mpr_describe_table(mpr_phyinfo_reason_names,
524*fd501800SSascha Wildner (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
525*fd501800SSascha Wildner mpr_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n",
526*fd501800SSascha Wildner mpr_describe_table(mpr_linkrate_names,
527*fd501800SSascha Wildner buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
528*fd501800SSascha Wildner }
529*fd501800SSascha Wildner
530*fd501800SSascha Wildner void
mpr_print_sgl(struct mpr_softc * sc,struct mpr_command * cm,int offset)531*fd501800SSascha Wildner mpr_print_sgl(struct mpr_softc *sc, struct mpr_command *cm, int offset)
532*fd501800SSascha Wildner {
533*fd501800SSascha Wildner MPI2_IEEE_SGE_SIMPLE64 *ieee_sge;
534*fd501800SSascha Wildner MPI25_IEEE_SGE_CHAIN64 *ieee_sgc;
535*fd501800SSascha Wildner MPI2_SGE_SIMPLE64 *sge;
536*fd501800SSascha Wildner MPI2_REQUEST_HEADER *req;
537*fd501800SSascha Wildner struct mpr_chain *chain = NULL;
538*fd501800SSascha Wildner char *frame;
539*fd501800SSascha Wildner u_int i = 0, flags, length;
540*fd501800SSascha Wildner
541*fd501800SSascha Wildner req = (MPI2_REQUEST_HEADER *)cm->cm_req;
542*fd501800SSascha Wildner frame = (char *)cm->cm_req;
543*fd501800SSascha Wildner ieee_sge = (MPI2_IEEE_SGE_SIMPLE64 *)&frame[offset * 4];
544*fd501800SSascha Wildner sge = (MPI2_SGE_SIMPLE64 *)&frame[offset * 4];
545*fd501800SSascha Wildner kprintf("SGL for command %p\n", cm);
546*fd501800SSascha Wildner
547*fd501800SSascha Wildner hexdump(frame, 128, NULL, 0);
548*fd501800SSascha Wildner while ((frame != NULL) && (!(cm->cm_flags & MPR_CM_FLAGS_SGE_SIMPLE))) {
549*fd501800SSascha Wildner flags = ieee_sge->Flags;
550*fd501800SSascha Wildner length = le32toh(ieee_sge->Length);
551*fd501800SSascha Wildner kprintf("IEEE seg%d flags=0x%02x len=0x%08x addr=0x%016jx\n", i,
552*fd501800SSascha Wildner flags, length, mpr_to_u64(&ieee_sge->Address));
553*fd501800SSascha Wildner if (flags & MPI25_IEEE_SGE_FLAGS_END_OF_LIST)
554*fd501800SSascha Wildner break;
555*fd501800SSascha Wildner ieee_sge++;
556*fd501800SSascha Wildner i++;
557*fd501800SSascha Wildner if (flags & MPI2_IEEE_SGE_FLAGS_CHAIN_ELEMENT) {
558*fd501800SSascha Wildner ieee_sgc = (MPI25_IEEE_SGE_CHAIN64 *)ieee_sge;
559*fd501800SSascha Wildner kprintf("IEEE chain flags=0x%x len=0x%x Offset=0x%x "
560*fd501800SSascha Wildner "Address=0x%016jx\n", ieee_sgc->Flags,
561*fd501800SSascha Wildner le32toh(ieee_sgc->Length),
562*fd501800SSascha Wildner ieee_sgc->NextChainOffset,
563*fd501800SSascha Wildner mpr_to_u64(&ieee_sgc->Address));
564*fd501800SSascha Wildner if (chain == NULL)
565*fd501800SSascha Wildner chain = TAILQ_FIRST(&cm->cm_chain_list);
566*fd501800SSascha Wildner else
567*fd501800SSascha Wildner chain = TAILQ_NEXT(chain, chain_link);
568*fd501800SSascha Wildner frame = (char *)chain->chain;
569*fd501800SSascha Wildner ieee_sge = (MPI2_IEEE_SGE_SIMPLE64 *)frame;
570*fd501800SSascha Wildner hexdump(frame, 128, NULL, 0);
571*fd501800SSascha Wildner }
572*fd501800SSascha Wildner }
573*fd501800SSascha Wildner while ((frame != NULL) && (cm->cm_flags & MPR_CM_FLAGS_SGE_SIMPLE)) {
574*fd501800SSascha Wildner flags = le32toh(sge->FlagsLength) >> MPI2_SGE_FLAGS_SHIFT;
575*fd501800SSascha Wildner kprintf("seg%d flags=0x%02x len=0x%06x addr=0x%016jx\n", i,
576*fd501800SSascha Wildner flags, le32toh(sge->FlagsLength) & 0xffffff,
577*fd501800SSascha Wildner mpr_to_u64(&sge->Address));
578*fd501800SSascha Wildner if (flags & (MPI2_SGE_FLAGS_END_OF_LIST |
579*fd501800SSascha Wildner MPI2_SGE_FLAGS_END_OF_BUFFER))
580*fd501800SSascha Wildner break;
581*fd501800SSascha Wildner sge++;
582*fd501800SSascha Wildner i++;
583*fd501800SSascha Wildner }
584*fd501800SSascha Wildner }
585*fd501800SSascha Wildner
586*fd501800SSascha Wildner void
mpr_print_scsiio_cmd(struct mpr_softc * sc,struct mpr_command * cm)587*fd501800SSascha Wildner mpr_print_scsiio_cmd(struct mpr_softc *sc, struct mpr_command *cm)
588*fd501800SSascha Wildner {
589*fd501800SSascha Wildner MPI2_SCSI_IO_REQUEST *req;
590*fd501800SSascha Wildner
591*fd501800SSascha Wildner req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req;
592*fd501800SSascha Wildner mpr_print_sgl(sc, cm, req->SGLOffset0);
593*fd501800SSascha Wildner }
594*fd501800SSascha Wildner
595