xref: /freebsd/sys/dev/mps/mps_table.c (revision 94e4e732af501c7b6031fc0887e06753a0d2592a)
1d3c7b9a0SKenneth D. Merry /*-
2d3c7b9a0SKenneth D. Merry  * Copyright (c) 2009 Yahoo! Inc.
3d3c7b9a0SKenneth D. Merry  * All rights reserved.
4d3c7b9a0SKenneth D. Merry  *
5d3c7b9a0SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
6d3c7b9a0SKenneth D. Merry  * modification, are permitted provided that the following conditions
7d3c7b9a0SKenneth D. Merry  * are met:
8d3c7b9a0SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright
9d3c7b9a0SKenneth D. Merry  *    notice, this list of conditions and the following disclaimer.
10d3c7b9a0SKenneth D. Merry  * 2. Redistributions in binary form must reproduce the above copyright
11d3c7b9a0SKenneth D. Merry  *    notice, this list of conditions and the following disclaimer in the
12d3c7b9a0SKenneth D. Merry  *    documentation and/or other materials provided with the distribution.
13d3c7b9a0SKenneth D. Merry  *
14d3c7b9a0SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15d3c7b9a0SKenneth D. Merry  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16d3c7b9a0SKenneth D. Merry  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17d3c7b9a0SKenneth D. Merry  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18d3c7b9a0SKenneth D. Merry  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19d3c7b9a0SKenneth D. Merry  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20d3c7b9a0SKenneth D. Merry  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21d3c7b9a0SKenneth D. Merry  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22d3c7b9a0SKenneth D. Merry  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23d3c7b9a0SKenneth D. Merry  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24d3c7b9a0SKenneth D. Merry  * SUCH DAMAGE.
25d3c7b9a0SKenneth D. Merry  */
26d3c7b9a0SKenneth D. Merry 
27d3c7b9a0SKenneth D. Merry #include <sys/cdefs.h>
28d3c7b9a0SKenneth D. Merry __FBSDID("$FreeBSD$");
29d3c7b9a0SKenneth D. Merry 
30d3c7b9a0SKenneth D. Merry /* Debugging tables for MPT2 */
31d3c7b9a0SKenneth D. Merry 
32d043c564SKenneth D. Merry /* TODO Move headers to mpsvar */
33d3c7b9a0SKenneth D. Merry #include <sys/types.h>
34d3c7b9a0SKenneth D. Merry #include <sys/param.h>
35d3c7b9a0SKenneth D. Merry #include <sys/systm.h>
36d3c7b9a0SKenneth D. Merry #include <sys/kernel.h>
37d3c7b9a0SKenneth D. Merry #include <sys/selinfo.h>
38d3c7b9a0SKenneth D. Merry #include <sys/module.h>
39d3c7b9a0SKenneth D. Merry #include <sys/bus.h>
40d3c7b9a0SKenneth D. Merry #include <sys/conf.h>
41d3c7b9a0SKenneth D. Merry #include <sys/bio.h>
42d3c7b9a0SKenneth D. Merry #include <sys/malloc.h>
43d3c7b9a0SKenneth D. Merry #include <sys/uio.h>
44d3c7b9a0SKenneth D. Merry #include <sys/sysctl.h>
45d043c564SKenneth D. Merry #include <sys/queue.h>
46d043c564SKenneth D. Merry #include <sys/kthread.h>
47d043c564SKenneth D. Merry #include <sys/taskqueue.h>
48d3c7b9a0SKenneth D. Merry 
49d3c7b9a0SKenneth D. Merry #include <machine/bus.h>
50d3c7b9a0SKenneth D. Merry #include <machine/resource.h>
51d3c7b9a0SKenneth D. Merry #include <sys/rman.h>
52d3c7b9a0SKenneth D. Merry 
53d3c7b9a0SKenneth D. Merry #include <cam/scsi/scsi_all.h>
54d3c7b9a0SKenneth D. Merry 
55d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_type.h>
56d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2.h>
57d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_ioc.h>
58d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_cnfg.h>
59d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_init.h>
60d043c564SKenneth D. Merry #include <dev/mps/mpi/mpi2_tool.h>
61d043c564SKenneth D. Merry #include <dev/mps/mps_ioctl.h>
62d3c7b9a0SKenneth D. Merry #include <dev/mps/mpsvar.h>
63d3c7b9a0SKenneth D. Merry #include <dev/mps/mps_table.h>
64d3c7b9a0SKenneth D. Merry 
65d3c7b9a0SKenneth D. Merry char *
66d3c7b9a0SKenneth D. Merry mps_describe_table(struct mps_table_lookup *table, u_int code)
67d3c7b9a0SKenneth D. Merry {
68d3c7b9a0SKenneth D. Merry 	int i;
69d3c7b9a0SKenneth D. Merry 
70d3c7b9a0SKenneth D. Merry 	for (i = 0; table[i].string != NULL; i++) {
71d3c7b9a0SKenneth D. Merry 		if (table[i].code == code)
72d3c7b9a0SKenneth D. Merry 			return(table[i].string);
73d3c7b9a0SKenneth D. Merry 	}
74d3c7b9a0SKenneth D. Merry 	return(table[i+1].string);
75d3c7b9a0SKenneth D. Merry }
76d3c7b9a0SKenneth D. Merry 
77d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_event_names[] = {
78d3c7b9a0SKenneth D. Merry 	{"LogData",			0x01},
79d3c7b9a0SKenneth D. Merry 	{"StateChange",			0x02},
80d3c7b9a0SKenneth D. Merry 	{"HardResetReceived",		0x05},
81d3c7b9a0SKenneth D. Merry 	{"EventChange",			0x0a},
82d3c7b9a0SKenneth D. Merry 	{"TaskSetFull",			0x0e},
83d3c7b9a0SKenneth D. Merry 	{"SasDeviceStatusChange",	0x0f},
84d3c7b9a0SKenneth D. Merry 	{"IrOperationStatus",		0x14},
85d3c7b9a0SKenneth D. Merry 	{"SasDiscovery",		0x16},
86d3c7b9a0SKenneth D. Merry 	{"SasBroadcastPrimitive",	0x17},
87d3c7b9a0SKenneth D. Merry 	{"SasInitDeviceStatusChange",	0x18},
88d3c7b9a0SKenneth D. Merry 	{"SasInitTableOverflow",	0x19},
89d3c7b9a0SKenneth D. Merry 	{"SasTopologyChangeList",	0x1c},
90d3c7b9a0SKenneth D. Merry 	{"SasEnclDeviceStatusChange",	0x1d},
91d3c7b9a0SKenneth D. Merry 	{"IrVolume",			0x1e},
92d3c7b9a0SKenneth D. Merry 	{"IrPhysicalDisk",		0x1f},
93d3c7b9a0SKenneth D. Merry 	{"IrConfigurationChangeList",	0x20},
94d3c7b9a0SKenneth D. Merry 	{"LogEntryAdded",		0x21},
95d3c7b9a0SKenneth D. Merry 	{"SasPhyCounter",		0x22},
96d3c7b9a0SKenneth D. Merry 	{"GpioInterrupt",		0x23},
97d3c7b9a0SKenneth D. Merry 	{"HbdPhyEvent",			0x24},
98d3c7b9a0SKenneth D. Merry 	{NULL, 0},
99d3c7b9a0SKenneth D. Merry 	{"Unknown Event", 0}
100d3c7b9a0SKenneth D. Merry };
101d3c7b9a0SKenneth D. Merry 
102d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_phystatus_names[] = {
103d3c7b9a0SKenneth D. Merry 	{"NewTargetAdded",		0x01},
104d3c7b9a0SKenneth D. Merry 	{"TargetGone",			0x02},
105d3c7b9a0SKenneth D. Merry 	{"PHYLinkStatusChange",		0x03},
106d3c7b9a0SKenneth D. Merry 	{"PHYLinkStatusUnchanged",	0x04},
107d3c7b9a0SKenneth D. Merry 	{"TargetMissing",		0x05},
108d3c7b9a0SKenneth D. Merry 	{NULL, 0},
109d3c7b9a0SKenneth D. Merry 	{"Unknown Status", 0}
110d3c7b9a0SKenneth D. Merry };
111d3c7b9a0SKenneth D. Merry 
112d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_linkrate_names[] = {
113d3c7b9a0SKenneth D. Merry 	{"PHY disabled",		0x01},
114d3c7b9a0SKenneth D. Merry 	{"Speed Negotiation Failed",	0x02},
115d3c7b9a0SKenneth D. Merry 	{"SATA OOB Complete",		0x03},
116d3c7b9a0SKenneth D. Merry 	{"SATA Port Selector",		0x04},
117d3c7b9a0SKenneth D. Merry 	{"SMP Reset in Progress",	0x05},
118d3c7b9a0SKenneth D. Merry 	{"1.5Gbps",			0x08},
119d3c7b9a0SKenneth D. Merry 	{"3.0Gbps",			0x09},
120d3c7b9a0SKenneth D. Merry 	{"6.0Gbps",			0x0a},
121d3c7b9a0SKenneth D. Merry 	{NULL, 0},
122d3c7b9a0SKenneth D. Merry 	{"LinkRate Unknown",		0x00}
123d3c7b9a0SKenneth D. Merry };
124d3c7b9a0SKenneth D. Merry 
125d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sasdev0_devtype[] = {
126d3c7b9a0SKenneth D. Merry 	{"End Device",			0x01},
127d3c7b9a0SKenneth D. Merry 	{"Edge Expander",		0x02},
128d3c7b9a0SKenneth D. Merry 	{"Fanout Expander",		0x03},
129d3c7b9a0SKenneth D. Merry 	{NULL, 0},
130d3c7b9a0SKenneth D. Merry 	{"No Device",			0x00}
131d3c7b9a0SKenneth D. Merry };
132d3c7b9a0SKenneth D. Merry 
133d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_phyinfo_reason_names[] = {
134d3c7b9a0SKenneth D. Merry 	{"Power On",			0x01},
135d3c7b9a0SKenneth D. Merry 	{"Hard Reset",			0x02},
136d3c7b9a0SKenneth D. Merry 	{"SMP Phy Control Link Reset",	0x03},
137d3c7b9a0SKenneth D. Merry 	{"Loss DWORD Sync",		0x04},
138d3c7b9a0SKenneth D. Merry 	{"Multiplex Sequence",		0x05},
139d3c7b9a0SKenneth D. Merry 	{"I-T Nexus Loss Timer",	0x06},
140d3c7b9a0SKenneth D. Merry 	{"Break Timeout Timer",		0x07},
141d3c7b9a0SKenneth D. Merry 	{"PHY Test Function",		0x08},
142d3c7b9a0SKenneth D. Merry 	{NULL, 0},
143d3c7b9a0SKenneth D. Merry 	{"Unknown Reason",		0x00}
144d3c7b9a0SKenneth D. Merry };
145d3c7b9a0SKenneth D. Merry 
146d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_whoinit_names[] = {
147d3c7b9a0SKenneth D. Merry 	{"System BIOS",			0x01},
148d3c7b9a0SKenneth D. Merry 	{"ROM BIOS",			0x02},
149d3c7b9a0SKenneth D. Merry 	{"PCI Peer",			0x03},
150d3c7b9a0SKenneth D. Merry 	{"Host Driver",			0x04},
151d3c7b9a0SKenneth D. Merry 	{"Manufacturing",		0x05},
152d3c7b9a0SKenneth D. Merry 	{NULL, 0},
153d3c7b9a0SKenneth D. Merry 	{"Not Initialized",		0x00}
154d3c7b9a0SKenneth D. Merry };
155d3c7b9a0SKenneth D. Merry 
156d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sasdisc_reason[] = {
157d3c7b9a0SKenneth D. Merry 	{"Discovery Started",		0x01},
158d3c7b9a0SKenneth D. Merry 	{"Discovery Complete",		0x02},
159d3c7b9a0SKenneth D. Merry 	{NULL, 0},
160d3c7b9a0SKenneth D. Merry 	{"Unknown",			0x00}
161d3c7b9a0SKenneth D. Merry };
162d3c7b9a0SKenneth D. Merry 
163d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sastopo_exp[] = {
164d3c7b9a0SKenneth D. Merry 	{"Added",			0x01},
165d3c7b9a0SKenneth D. Merry 	{"Not Responding",		0x02},
166d3c7b9a0SKenneth D. Merry 	{"Responding",			0x03},
167d3c7b9a0SKenneth D. Merry 	{"Delay Not Responding",	0x04},
168d3c7b9a0SKenneth D. Merry 	{NULL, 0},
169d3c7b9a0SKenneth D. Merry 	{"Unknown",			0x00}
170d3c7b9a0SKenneth D. Merry };
171d3c7b9a0SKenneth D. Merry 
172d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sasdev_reason[] = {
173d3c7b9a0SKenneth D. Merry 	{"SMART Data",			0x05},
174d3c7b9a0SKenneth D. Merry 	{"Unsupported",			0x07},
175d3c7b9a0SKenneth D. Merry 	{"Internal Device Reset",	0x08},
176d3c7b9a0SKenneth D. Merry 	{"Task Abort Internal",		0x09},
177d3c7b9a0SKenneth D. Merry 	{"Abort Task Set Internal",	0x0a},
178d3c7b9a0SKenneth D. Merry 	{"Clear Task Set Internal",	0x0b},
179d3c7b9a0SKenneth D. Merry 	{"Query Task Internal",		0x0c},
180d3c7b9a0SKenneth D. Merry 	{"Async Notification",		0x0d},
181d3c7b9a0SKenneth D. Merry 	{"Cmp Internal Device Reset",	0x0e},
182d3c7b9a0SKenneth D. Merry 	{"Cmp Task Abort Internal",	0x0f},
183d3c7b9a0SKenneth D. Merry 	{"Sata Init Failure",		0x10},
184d3c7b9a0SKenneth D. Merry 	{NULL, 0},
185d3c7b9a0SKenneth D. Merry 	{"Unknown",			0x00}
186d3c7b9a0SKenneth D. Merry };
187d3c7b9a0SKenneth D. Merry 
188d3c7b9a0SKenneth D. Merry void
189d3c7b9a0SKenneth D. Merry mps_describe_devinfo(uint32_t devinfo, char *string, int len)
190d3c7b9a0SKenneth D. Merry {
191d3c7b9a0SKenneth D. Merry 	snprintf(string, len, "%b,%s", devinfo,
192d3c7b9a0SKenneth D. Merry 	    "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
193d3c7b9a0SKenneth D. Merry 	    "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
194d3c7b9a0SKenneth D. Merry 	    "\15LsiDev" "\16AtapiDev" "\17SepDev",
195d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_sasdev0_devtype, devinfo & 0x03));
196d3c7b9a0SKenneth D. Merry }
197d3c7b9a0SKenneth D. Merry 
198d3c7b9a0SKenneth D. Merry void
199d3c7b9a0SKenneth D. Merry mps_print_iocfacts(struct mps_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
200d3c7b9a0SKenneth D. Merry {
201d3c7b9a0SKenneth D. Merry 
202d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "IOCFacts");
203d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MsgVersion, 0x%x);
204d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, HeaderVersion, 0x%x);
205d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, IOCNumber, %d);
206d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, IOCExceptions, 0x%x);
207d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxChainDepth, %d);
2081610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "WhoInit: %s\n",
209d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_whoinit_names, facts->WhoInit));
210d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, NumberOfPorts, %d);
211*94e4e732SScott Long 	MPS_PRINTFIELD(sc, facts, MaxMSIxVectors, %d);
212d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, RequestCredit, %d);
213d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, ProductID, 0x%x);
2141610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "IOCCapabilities: %b\n",
215d3c7b9a0SKenneth D. Merry 	    facts->IOCCapabilities, "\20" "\3ScsiTaskFull" "\4DiagTrace"
216d3c7b9a0SKenneth D. Merry 	    "\5SnapBuf" "\6ExtBuf" "\7EEDP" "\10BiDirTarg" "\11Multicast"
217d3c7b9a0SKenneth D. Merry 	    "\14TransRetry" "\15IR" "\16EventReplay" "\17RaidAccel"
218d3c7b9a0SKenneth D. Merry 	    "\20MSIXIndex" "\21HostDisc");
2191610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "FWVersion= %d-%d-%d-%d\n",
220d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Major,
221d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Minor,
222d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Unit,
223d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Dev);
224d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, IOCRequestFrameSize, %d);
225d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxInitiators, %d);
226d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxTargets, %d);
227d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxSasExpanders, %d);
228d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxEnclosures, %d);
2291610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "ProtocolFlags: %b\n",
230d3c7b9a0SKenneth D. Merry 	    facts->ProtocolFlags, "\20" "\1ScsiTarg" "\2ScsiInit");
231d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, HighPriorityCredit, %d);
232d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxReplyDescriptorPostQueueDepth, %d);
233d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, ReplyFrameSize, %d);
234d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxVolumes, %d);
235d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxDevHandle, %d);
236d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxPersistentEntries, %d);
237d3c7b9a0SKenneth D. Merry }
238d3c7b9a0SKenneth D. Merry 
239d3c7b9a0SKenneth D. Merry void
240d3c7b9a0SKenneth D. Merry mps_print_portfacts(struct mps_softc *sc, MPI2_PORT_FACTS_REPLY *facts)
241d3c7b9a0SKenneth D. Merry {
242d3c7b9a0SKenneth D. Merry 
243d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "PortFacts");
244d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, PortNumber, %d);
245d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, PortType, 0x%x);
246d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxPostedCmdBuffers, %d);
247d3c7b9a0SKenneth D. Merry }
248d3c7b9a0SKenneth D. Merry 
249d3c7b9a0SKenneth D. Merry void
250d3c7b9a0SKenneth D. Merry mps_print_event(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
251d3c7b9a0SKenneth D. Merry {
252d3c7b9a0SKenneth D. Merry 
253d3c7b9a0SKenneth D. Merry 	MPS_EVENTFIELD_START(sc, "EventReply");
254d3c7b9a0SKenneth D. Merry 	MPS_EVENTFIELD(sc, event, EventDataLength, %d);
255d3c7b9a0SKenneth D. Merry 	MPS_EVENTFIELD(sc, event, AckRequired, %d);
256d3c7b9a0SKenneth D. Merry 	mps_dprint_field(sc, MPS_EVENT, "Event: %s (0x%x)\n",
257d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_event_names, event->Event), event->Event);
258d3c7b9a0SKenneth D. Merry 	MPS_EVENTFIELD(sc, event, EventContext, 0x%x);
259d3c7b9a0SKenneth D. Merry }
260d3c7b9a0SKenneth D. Merry 
261d3c7b9a0SKenneth D. Merry void
262d3c7b9a0SKenneth D. Merry mps_print_sasdev0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf)
263d3c7b9a0SKenneth D. Merry {
264d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "SAS Device Page 0");
265d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Slot, %d);
266d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, EnclosureHandle, 0x%x);
2671610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "SASAddress: 0x%jx\n",
268d3c7b9a0SKenneth D. Merry 	    mps_to_u64(&buf->SASAddress));
269d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ParentDevHandle, 0x%x);
270d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhyNum, %d);
271d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AccessStatus, 0x%x);
272d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, DevHandle, 0x%x);
273d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, 0x%x);
274d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ZoneGroup, %d);
2751610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "DeviceInfo: %b,%s\n", buf->DeviceInfo,
276d3c7b9a0SKenneth D. Merry 	    "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
277d3c7b9a0SKenneth D. Merry 	    "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
278d3c7b9a0SKenneth D. Merry 	    "\15LsiDev" "\16AtapiDev" "\17SepDev",
279d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_sasdev0_devtype, buf->DeviceInfo & 0x03));
280d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Flags, 0x%x);
281d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhysicalPort, %d);
282d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, MaxPortConnections, %d);
2831610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "DeviceName: 0x%jx\n",
284d3c7b9a0SKenneth D. Merry 	    mps_to_u64(&buf->DeviceName));
285d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PortGroups, %d);
286d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, DmaGroup, %d);
287d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ControlGroup, %d);
288d3c7b9a0SKenneth D. Merry }
289d3c7b9a0SKenneth D. Merry 
290d3c7b9a0SKenneth D. Merry void
291d3c7b9a0SKenneth D. Merry mps_print_evt_sas(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
292d3c7b9a0SKenneth D. Merry {
293d3c7b9a0SKenneth D. Merry 
294d3c7b9a0SKenneth D. Merry 	mps_print_event(sc, event);
295d3c7b9a0SKenneth D. Merry 
296d3c7b9a0SKenneth D. Merry 	switch(event->Event) {
297d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_DISCOVERY:
298d3c7b9a0SKenneth D. Merry 	{
299d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_DISCOVERY *data;
300d3c7b9a0SKenneth D. Merry 
301d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)&event->EventData;
302d3c7b9a0SKenneth D. Merry 		mps_dprint_field(sc, MPS_EVENT, "Flags: %b\n", data->Flags,
303d3c7b9a0SKenneth D. Merry 		    "\20" "\1InProgress" "\2DeviceChange");
304d3c7b9a0SKenneth D. Merry 		mps_dprint_field(sc, MPS_EVENT, "ReasonCode: %s\n",
305d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sasdisc_reason, data->ReasonCode));
306d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, PhysicalPort, %d);
307d3c7b9a0SKenneth D. Merry 		mps_dprint_field(sc, MPS_EVENT, "DiscoveryStatus: %b\n",
308d3c7b9a0SKenneth D. Merry 		    data->DiscoveryStatus,  "\20"
309d3c7b9a0SKenneth D. Merry 		    "\1Loop" "\2UnaddressableDev" "\3DupSasAddr" "\5SmpTimeout"
310d3c7b9a0SKenneth D. Merry 		    "\6ExpRouteFull" "\7RouteIndexError" "\10SmpFailed"
311d3c7b9a0SKenneth D. Merry 		    "\11SmpCrcError" "\12SubSubLink" "\13TableTableLink"
312d3c7b9a0SKenneth D. Merry 		    "\14UnsupDevice" "\15TableSubLink" "\16MultiDomain"
313d3c7b9a0SKenneth D. Merry 		    "\17MultiSub" "\20MultiSubSub" "\34DownstreamInit"
314d3c7b9a0SKenneth D. Merry 		    "\35MaxPhys" "\36MaxTargs" "\37MaxExpanders"
315d3c7b9a0SKenneth D. Merry 		    "\40MaxEnclosures");
316d3c7b9a0SKenneth D. Merry 		break;
317d3c7b9a0SKenneth D. Merry 	}
318d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
319d3c7b9a0SKenneth D. Merry 	{
320d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *data;
321d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_SAS_TOPO_PHY_ENTRY *phy;
322d3c7b9a0SKenneth D. Merry 		int i, phynum;
323d3c7b9a0SKenneth D. Merry 
324d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *)
325d3c7b9a0SKenneth D. Merry 		    &event->EventData;
326d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, EnclosureHandle, 0x%x);
327d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, ExpanderDevHandle, 0x%x);
328d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, NumPhys, %d);
329d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, NumEntries, %d);
330d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, StartPhyNum, %d);
331d3c7b9a0SKenneth D. Merry 		mps_dprint_field(sc, MPS_EVENT, "ExpStatus: %s (0x%x)\n",
332d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sastopo_exp, data->ExpStatus),
333d3c7b9a0SKenneth D. Merry 		    data->ExpStatus);
334d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, PhysicalPort, %d);
335d3c7b9a0SKenneth D. Merry 		for (i = 0; i < data->NumEntries; i++) {
336d3c7b9a0SKenneth D. Merry 			phy = &data->PHY[i];
337d3c7b9a0SKenneth D. Merry 			phynum = data->StartPhyNum + i;
338d3c7b9a0SKenneth D. Merry 			mps_dprint_field(sc, MPS_EVENT,
339d3c7b9a0SKenneth D. Merry 			    "PHY[%d].AttachedDevHandle: 0x%04x\n", phynum,
340d3c7b9a0SKenneth D. Merry 			    phy->AttachedDevHandle);
341d3c7b9a0SKenneth D. Merry 			mps_dprint_field(sc, MPS_EVENT,
342d3c7b9a0SKenneth D. Merry 			    "PHY[%d].LinkRate: %s (0x%x)\n", phynum,
343d3c7b9a0SKenneth D. Merry 			    mps_describe_table(mps_linkrate_names,
344d3c7b9a0SKenneth D. Merry 			    (phy->LinkRate >> 4) & 0xf), phy->LinkRate);
345d3c7b9a0SKenneth D. Merry 			mps_dprint_field(sc,MPS_EVENT,"PHY[%d].PhyStatus: %s\n",
346d3c7b9a0SKenneth D. Merry 			    phynum, mps_describe_table(mps_phystatus_names,
347d3c7b9a0SKenneth D. Merry 			    phy->PhyStatus));
348d3c7b9a0SKenneth D. Merry 		}
349d3c7b9a0SKenneth D. Merry 		break;
350d3c7b9a0SKenneth D. Merry 	}
351d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
352d3c7b9a0SKenneth D. Merry 	{
353d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *data;
354d3c7b9a0SKenneth D. Merry 
355d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *)
356d3c7b9a0SKenneth D. Merry 		    &event->EventData;
357d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, EnclosureHandle, 0x%x);
358d3c7b9a0SKenneth D. Merry 		mps_dprint_field(sc, MPS_EVENT, "ReasonCode: %s\n",
359d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sastopo_exp, data->ReasonCode));
360d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, PhysicalPort, %d);
361d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, NumSlots, %d);
362d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, StartSlot, %d);
363d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, PhyBits, 0x%x);
364d3c7b9a0SKenneth D. Merry 		break;
365d3c7b9a0SKenneth D. Merry 	}
366d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
367d3c7b9a0SKenneth D. Merry 	{
368d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *data;
369d3c7b9a0SKenneth D. Merry 
370d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)
371d3c7b9a0SKenneth D. Merry 		    &event->EventData;
372d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, TaskTag, 0x%x);
373d3c7b9a0SKenneth D. Merry 		mps_dprint_field(sc, MPS_EVENT, "ReasonCode: %s\n",
374d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sasdev_reason, data->ReasonCode));
375d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, ASC, 0x%x);
376d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, ASCQ, 0x%x);
377d3c7b9a0SKenneth D. Merry 		MPS_EVENTFIELD(sc, data, DevHandle, 0x%x);
378d3c7b9a0SKenneth D. Merry 		mps_dprint_field(sc, MPS_EVENT, "SASAddress: 0x%jx\n",
379d3c7b9a0SKenneth D. Merry 		    mps_to_u64(&data->SASAddress));
380d3c7b9a0SKenneth D. Merry 	}
381d3c7b9a0SKenneth D. Merry 	default:
382d3c7b9a0SKenneth D. Merry 		break;
383d3c7b9a0SKenneth D. Merry 	}
384d3c7b9a0SKenneth D. Merry }
385d3c7b9a0SKenneth D. Merry 
386d3c7b9a0SKenneth D. Merry void
387d3c7b9a0SKenneth D. Merry mps_print_expander1(struct mps_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf)
388d3c7b9a0SKenneth D. Merry {
389d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "SAS Expander Page 1 #%d", buf->Phy);
390d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhysicalPort, %d);
391d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, NumPhys, %d);
392d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Phy, %d);
393d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, NumTableEntriesProgrammed, %d);
3941610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "ProgrammedLinkRate: %s (0x%x)\n",
395d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
396d3c7b9a0SKenneth D. Merry 	    (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
3971610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "HwLinkRate: %s (0x%x)\n",
398d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
399d3c7b9a0SKenneth D. Merry 	    (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
400d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
4011610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "PhyInfo Reason: %s (0x%x)\n",
402d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
403d3c7b9a0SKenneth D. Merry 	    (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
4041610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "AttachedDeviceInfo: %b,%s\n",
405d3c7b9a0SKenneth D. Merry 	    buf->AttachedDeviceInfo, "\20" "\4SATAhost" "\5SMPinit" "\6STPinit"
406d3c7b9a0SKenneth D. Merry 	    "\7SSPinit" "\10SATAdev" "\11SMPtarg" "\12STPtarg" "\13SSPtarg"
407d3c7b9a0SKenneth D. Merry 	    "\14Direct" "\15LSIdev" "\16ATAPIdev" "\17SEPdev",
408d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_sasdev0_devtype,
409d3c7b9a0SKenneth D. Merry 	    buf->AttachedDeviceInfo & 0x03));
410d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ExpanderDevHandle, 0x%04x);
411d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ChangeCount, %d);
4121610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "NegotiatedLinkRate: %s (0x%x)\n",
413d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
414d3c7b9a0SKenneth D. Merry 	    buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
415d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhyIdentifier, %d);
416d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
417d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, DiscoveryInfo, 0x%x);
418d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyInfo, 0x%x);
4191610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "AttachedPhyInfo Reason: %s (0x%x)\n",
420d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
421d3c7b9a0SKenneth D. Merry 	    buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
422d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ZoneGroup, %d);
423d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, SelfConfigStatus, 0x%x);
424d3c7b9a0SKenneth D. Merry }
425d3c7b9a0SKenneth D. Merry 
426d3c7b9a0SKenneth D. Merry void
427d3c7b9a0SKenneth D. Merry mps_print_sasphy0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_PHY_0 *buf)
428d3c7b9a0SKenneth D. Merry {
429d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "SAS PHY Page 0");
430d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, OwnerDevHandle, 0x%04x);
431d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
432d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
4331610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "AttachedPhyInfo Reason: %s (0x%x)\n",
434d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
435d3c7b9a0SKenneth D. Merry 	    buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
4361610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "ProgrammedLinkRate: %s (0x%x)\n",
437d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
438d3c7b9a0SKenneth D. Merry 	    (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
4391610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "HwLinkRate: %s (0x%x)\n",
440d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
441d3c7b9a0SKenneth D. Merry 	    (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
442d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ChangeCount, %d);
443d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Flags, 0x%x);
4441610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "PhyInfo Reason: %s (0x%x)\n",
445d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
446d3c7b9a0SKenneth D. Merry 	    (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
4471610f95cSScott Long 	mps_dprint_field(sc, MPS_XINFO, "NegotiatedLinkRate: %s (0x%x)\n",
448d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
449d3c7b9a0SKenneth D. Merry 	    buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
450d3c7b9a0SKenneth D. Merry }
451d3c7b9a0SKenneth D. Merry 
452d3c7b9a0SKenneth D. Merry void
453d3c7b9a0SKenneth D. Merry mps_print_sgl(struct mps_softc *sc, struct mps_command *cm, int offset)
454d3c7b9a0SKenneth D. Merry {
455d3c7b9a0SKenneth D. Merry 	MPI2_SGE_SIMPLE64 *sge;
456d3c7b9a0SKenneth D. Merry 	MPI2_SGE_CHAIN32 *sgc;
457d3c7b9a0SKenneth D. Merry 	MPI2_REQUEST_HEADER *req;
458d3c7b9a0SKenneth D. Merry 	struct mps_chain *chain = NULL;
459d3c7b9a0SKenneth D. Merry 	char *frame;
460d3c7b9a0SKenneth D. Merry 	u_int i = 0, flags;
461d3c7b9a0SKenneth D. Merry 
462d3c7b9a0SKenneth D. Merry 	req = (MPI2_REQUEST_HEADER *)cm->cm_req;
463d3c7b9a0SKenneth D. Merry 	frame = (char *)cm->cm_req;
464d3c7b9a0SKenneth D. Merry 	sge = (MPI2_SGE_SIMPLE64 *)&frame[offset * 4];
465d3c7b9a0SKenneth D. Merry 	printf("SGL for command %p\n", cm);
466d3c7b9a0SKenneth D. Merry 
46761c49b4dSAlexander Motin 	hexdump(frame, 128, NULL, 0);
468d3c7b9a0SKenneth D. Merry 	while (frame != NULL) {
46961c49b4dSAlexander Motin 		flags = le32toh(sge->FlagsLength) >> MPI2_SGE_FLAGS_SHIFT;
47061c49b4dSAlexander Motin 		printf("seg%d flags=0x%02x len=0x%06x addr=0x%016jx\n",
47161c49b4dSAlexander Motin 		    i, flags, le32toh(sge->FlagsLength) & 0xffffff,
47261c49b4dSAlexander Motin 		    mps_to_u64(&sge->Address));
473d3c7b9a0SKenneth D. Merry 		if (flags & (MPI2_SGE_FLAGS_END_OF_LIST |
474d3c7b9a0SKenneth D. Merry 		    MPI2_SGE_FLAGS_END_OF_BUFFER))
475d3c7b9a0SKenneth D. Merry 			break;
476d3c7b9a0SKenneth D. Merry 		sge++;
477d3c7b9a0SKenneth D. Merry 		i++;
478d3c7b9a0SKenneth D. Merry 		if (flags & MPI2_SGE_FLAGS_LAST_ELEMENT) {
479d3c7b9a0SKenneth D. Merry 			sgc = (MPI2_SGE_CHAIN32 *)sge;
480d3c7b9a0SKenneth D. Merry 			printf("chain flags=0x%x len=0x%x Offset=0x%x "
48161c49b4dSAlexander Motin 			    "Address=0x%x\n", sgc->Flags, le16toh(sgc->Length),
48261c49b4dSAlexander Motin 			    sgc->NextChainOffset, le32toh(sgc->Address));
483d3c7b9a0SKenneth D. Merry 			if (chain == NULL)
484d3c7b9a0SKenneth D. Merry 				chain = TAILQ_FIRST(&cm->cm_chain_list);
485d3c7b9a0SKenneth D. Merry 			else
486d3c7b9a0SKenneth D. Merry 				chain = TAILQ_NEXT(chain, chain_link);
487d3c7b9a0SKenneth D. Merry 			frame = (char *)chain->chain;
488d3c7b9a0SKenneth D. Merry 			sge = (MPI2_SGE_SIMPLE64 *)frame;
489d3c7b9a0SKenneth D. Merry 			hexdump(frame, 128, NULL, 0);
490d3c7b9a0SKenneth D. Merry 		}
491d3c7b9a0SKenneth D. Merry 	}
492d3c7b9a0SKenneth D. Merry }
493d3c7b9a0SKenneth D. Merry 
494d3c7b9a0SKenneth D. Merry void
495d3c7b9a0SKenneth D. Merry mps_print_scsiio_cmd(struct mps_softc *sc, struct mps_command *cm)
496d3c7b9a0SKenneth D. Merry {
497d3c7b9a0SKenneth D. Merry 	MPI2_SCSI_IO_REQUEST *req;
498d3c7b9a0SKenneth D. Merry 
499d3c7b9a0SKenneth D. Merry 	req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req;
500d3c7b9a0SKenneth D. Merry 	mps_print_sgl(sc, cm, req->SGLOffset0);
501d3c7b9a0SKenneth D. Merry }
502d3c7b9a0SKenneth D. Merry 
503