xref: /dflybsd-src/sys/dev/raid/mpr/mpr_table.c (revision fd501800cafe382e0751b7be1342c553b3335543)
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