xref: /freebsd/sys/dev/mps/mps_table.c (revision 685dc743dc3b5645e34836464128e1c0558b404b)
1d3c7b9a0SKenneth D. Merry /*-
2*4d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
3718cf2ccSPedro F. Giffuni  *
4d3c7b9a0SKenneth D. Merry  * Copyright (c) 2009 Yahoo! Inc.
5d3c7b9a0SKenneth D. Merry  * All rights reserved.
6d3c7b9a0SKenneth D. Merry  *
7d3c7b9a0SKenneth D. Merry  * Redistribution and use in source and binary forms, with or without
8d3c7b9a0SKenneth D. Merry  * modification, are permitted provided that the following conditions
9d3c7b9a0SKenneth D. Merry  * are met:
10d3c7b9a0SKenneth D. Merry  * 1. Redistributions of source code must retain the above copyright
11d3c7b9a0SKenneth D. Merry  *    notice, this list of conditions and the following disclaimer.
12d3c7b9a0SKenneth D. Merry  * 2. Redistributions in binary form must reproduce the above copyright
13d3c7b9a0SKenneth D. Merry  *    notice, this list of conditions and the following disclaimer in the
14d3c7b9a0SKenneth D. Merry  *    documentation and/or other materials provided with the distribution.
15d3c7b9a0SKenneth D. Merry  *
16d3c7b9a0SKenneth D. Merry  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17d3c7b9a0SKenneth D. Merry  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18d3c7b9a0SKenneth D. Merry  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19d3c7b9a0SKenneth D. Merry  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20d3c7b9a0SKenneth D. Merry  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21d3c7b9a0SKenneth D. Merry  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22d3c7b9a0SKenneth D. Merry  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23d3c7b9a0SKenneth D. Merry  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24d3c7b9a0SKenneth D. Merry  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25d3c7b9a0SKenneth D. Merry  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26d3c7b9a0SKenneth D. Merry  * SUCH DAMAGE.
27d3c7b9a0SKenneth D. Merry  */
28d3c7b9a0SKenneth D. Merry 
29d3c7b9a0SKenneth D. Merry #include <sys/cdefs.h>
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 *
mps_describe_table(struct mps_table_lookup * table,u_int code)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 
1882bf620cbSScott Long struct mps_table_lookup mps_iocstatus_string[] = {
1892bf620cbSScott Long 	{"success",			MPI2_IOCSTATUS_SUCCESS},
1902bf620cbSScott Long 	{"invalid function",		MPI2_IOCSTATUS_INVALID_FUNCTION},
1912bf620cbSScott Long 	{"scsi recovered error",	MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR},
1922bf620cbSScott Long 	{"scsi invalid dev handle",	MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE},
1932bf620cbSScott Long 	{"scsi device not there",	MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE},
1942bf620cbSScott Long 	{"scsi data overrun",		MPI2_IOCSTATUS_SCSI_DATA_OVERRUN},
1952bf620cbSScott Long 	{"scsi data underrun",		MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN},
1962bf620cbSScott Long 	{"scsi io data error",		MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR},
1972bf620cbSScott Long 	{"scsi protocol error",		MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR},
1982bf620cbSScott Long 	{"scsi task terminated",	MPI2_IOCSTATUS_SCSI_TASK_TERMINATED},
1992bf620cbSScott Long 	{"scsi residual mismatch",	MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH},
2002bf620cbSScott Long 	{"scsi task mgmt failed",	MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED},
2012bf620cbSScott Long 	{"scsi ioc terminated",		MPI2_IOCSTATUS_SCSI_IOC_TERMINATED},
2022bf620cbSScott Long 	{"scsi ext terminated",		MPI2_IOCSTATUS_SCSI_EXT_TERMINATED},
2032bf620cbSScott Long 	{"eedp guard error",		MPI2_IOCSTATUS_EEDP_GUARD_ERROR},
2042bf620cbSScott Long 	{"eedp ref tag error",		MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR},
2052bf620cbSScott Long 	{"eedp app tag error",		MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR},
2062bf620cbSScott Long 	{NULL, 0},
2072bf620cbSScott Long 	{"unknown",			0x00}
2082bf620cbSScott Long };
2092bf620cbSScott Long 
2102bf620cbSScott Long struct mps_table_lookup mps_scsi_status_string[] = {
2112bf620cbSScott Long 	{"good",			MPI2_SCSI_STATUS_GOOD},
2122bf620cbSScott Long 	{"check condition",		MPI2_SCSI_STATUS_CHECK_CONDITION},
2132bf620cbSScott Long 	{"condition met",		MPI2_SCSI_STATUS_CONDITION_MET},
2142bf620cbSScott Long 	{"busy",			MPI2_SCSI_STATUS_BUSY},
2152bf620cbSScott Long 	{"intermediate",		MPI2_SCSI_STATUS_INTERMEDIATE},
2162bf620cbSScott Long 	{"intermediate condmet",	MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET},
2172bf620cbSScott Long 	{"reservation conflict",	MPI2_SCSI_STATUS_RESERVATION_CONFLICT},
2182bf620cbSScott Long 	{"command terminated",		MPI2_SCSI_STATUS_COMMAND_TERMINATED},
2192bf620cbSScott Long 	{"task set full",		MPI2_SCSI_STATUS_TASK_SET_FULL},
2202bf620cbSScott Long 	{"aca active",			MPI2_SCSI_STATUS_ACA_ACTIVE},
2212bf620cbSScott Long 	{"task aborted",		MPI2_SCSI_STATUS_TASK_ABORTED},
2222bf620cbSScott Long 	{NULL, 0},
2232bf620cbSScott Long 	{"unknown",			0x00}
2242bf620cbSScott Long };
2252bf620cbSScott Long 
2262bf620cbSScott Long struct mps_table_lookup mps_scsi_taskmgmt_string[] = {
2272bf620cbSScott Long 	{"task mgmt request completed",	MPI2_SCSITASKMGMT_RSP_TM_COMPLETE},
2282bf620cbSScott Long 	{"invalid frame",		MPI2_SCSITASKMGMT_RSP_INVALID_FRAME},
2292bf620cbSScott Long 	{"task mgmt request not supp",	MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED},
2302bf620cbSScott Long 	{"task mgmt request failed",	MPI2_SCSITASKMGMT_RSP_TM_FAILED},
2312bf620cbSScott Long 	{"task mgmt request_succeeded",	MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED},
2322bf620cbSScott Long 	{"invalid lun",			MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN},
2332bf620cbSScott Long 	{"overlapped tag attempt",	0xA},
2342bf620cbSScott Long 	{"task queued on IOC",		MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC},
2352bf620cbSScott Long 	{NULL, 0},
2362bf620cbSScott Long 	{"unknown",			0x00}
2372bf620cbSScott Long };
2382bf620cbSScott Long 
239d3c7b9a0SKenneth D. Merry void
mps_describe_devinfo(uint32_t devinfo,char * string,int len)240d3c7b9a0SKenneth D. Merry mps_describe_devinfo(uint32_t devinfo, char *string, int len)
241d3c7b9a0SKenneth D. Merry {
242d3c7b9a0SKenneth D. Merry 	snprintf(string, len, "%b,%s", devinfo,
243d3c7b9a0SKenneth D. Merry 	    "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
244d3c7b9a0SKenneth D. Merry 	    "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
245d3c7b9a0SKenneth D. Merry 	    "\15LsiDev" "\16AtapiDev" "\17SepDev",
246d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_sasdev0_devtype, devinfo & 0x03));
247d3c7b9a0SKenneth D. Merry }
248d3c7b9a0SKenneth D. Merry 
249d3c7b9a0SKenneth D. Merry void
mps_print_iocfacts(struct mps_softc * sc,MPI2_IOC_FACTS_REPLY * facts)250055e2653SScott Long mps_print_iocfacts(struct mps_softc *sc, MPI2_IOC_FACTS_REPLY *facts)
251d3c7b9a0SKenneth D. Merry {
252d3c7b9a0SKenneth D. Merry 
253d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "IOCFacts");
254d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MsgVersion, 0x%x);
255d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, HeaderVersion, 0x%x);
256d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, IOCNumber, %d);
257d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, IOCExceptions, 0x%x);
258d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxChainDepth, %d);
259c11c484fSScott Long 	mps_print_field(sc, "WhoInit: %s\n",
260d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_whoinit_names, facts->WhoInit));
261d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, NumberOfPorts, %d);
26294e4e732SScott Long 	MPS_PRINTFIELD(sc, facts, MaxMSIxVectors, %d);
263d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, RequestCredit, %d);
264d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, ProductID, 0x%x);
265c11c484fSScott Long 	mps_print_field(sc, "IOCCapabilities: %b\n",
266d3c7b9a0SKenneth D. Merry 	    facts->IOCCapabilities, "\20" "\3ScsiTaskFull" "\4DiagTrace"
267d3c7b9a0SKenneth D. Merry 	    "\5SnapBuf" "\6ExtBuf" "\7EEDP" "\10BiDirTarg" "\11Multicast"
268d3c7b9a0SKenneth D. Merry 	    "\14TransRetry" "\15IR" "\16EventReplay" "\17RaidAccel"
269d3c7b9a0SKenneth D. Merry 	    "\20MSIXIndex" "\21HostDisc");
270c11c484fSScott Long 	mps_print_field(sc, "FWVersion= %d-%d-%d-%d\n",
271d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Major,
272d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Minor,
273d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Unit,
274d3c7b9a0SKenneth D. Merry 	    facts->FWVersion.Struct.Dev);
275d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, IOCRequestFrameSize, %d);
276d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxInitiators, %d);
277d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxTargets, %d);
278d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxSasExpanders, %d);
279d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxEnclosures, %d);
280c11c484fSScott Long 	mps_print_field(sc, "ProtocolFlags: %b\n",
281d3c7b9a0SKenneth D. Merry 	    facts->ProtocolFlags, "\20" "\1ScsiTarg" "\2ScsiInit");
282d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, HighPriorityCredit, %d);
283d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxReplyDescriptorPostQueueDepth, %d);
284d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, ReplyFrameSize, %d);
285d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxVolumes, %d);
286d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxDevHandle, %d);
287d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxPersistentEntries, %d);
288d3c7b9a0SKenneth D. Merry }
289d3c7b9a0SKenneth D. Merry 
290d3c7b9a0SKenneth D. Merry void
mps_print_portfacts(struct mps_softc * sc,MPI2_PORT_FACTS_REPLY * facts)291055e2653SScott Long mps_print_portfacts(struct mps_softc *sc, MPI2_PORT_FACTS_REPLY *facts)
292d3c7b9a0SKenneth D. Merry {
293d3c7b9a0SKenneth D. Merry 
294d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "PortFacts");
295d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, PortNumber, %d);
296d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, PortType, 0x%x);
297d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, facts, MaxPostedCmdBuffers, %d);
298d3c7b9a0SKenneth D. Merry }
299d3c7b9a0SKenneth D. Merry 
300d3c7b9a0SKenneth D. Merry void
mps_print_evt_generic(struct mps_softc * sc,MPI2_EVENT_NOTIFICATION_REPLY * event)301055e2653SScott Long mps_print_evt_generic(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
302d3c7b9a0SKenneth D. Merry {
303d3c7b9a0SKenneth D. Merry 
304c11c484fSScott Long 	MPS_PRINTFIELD_START(sc, "EventReply");
305c11c484fSScott Long 	MPS_PRINTFIELD(sc, event, EventDataLength, %d);
306c11c484fSScott Long 	MPS_PRINTFIELD(sc, event, AckRequired, %d);
307c11c484fSScott Long 	mps_print_field(sc, "Event: %s (0x%x)\n",
308d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_event_names, event->Event), event->Event);
309c11c484fSScott Long 	MPS_PRINTFIELD(sc, event, EventContext, 0x%x);
310d3c7b9a0SKenneth D. Merry }
311d3c7b9a0SKenneth D. Merry 
312d3c7b9a0SKenneth D. Merry void
mps_print_sasdev0(struct mps_softc * sc,MPI2_CONFIG_PAGE_SAS_DEV_0 * buf)313055e2653SScott Long mps_print_sasdev0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf)
314d3c7b9a0SKenneth D. Merry {
315d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "SAS Device Page 0");
316d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Slot, %d);
317d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, EnclosureHandle, 0x%x);
318c11c484fSScott Long 	mps_print_field(sc, "SASAddress: 0x%jx\n",
319d3c7b9a0SKenneth D. Merry 	    mps_to_u64(&buf->SASAddress));
320d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ParentDevHandle, 0x%x);
321d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhyNum, %d);
322d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AccessStatus, 0x%x);
323d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, DevHandle, 0x%x);
324d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, 0x%x);
325d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ZoneGroup, %d);
326c11c484fSScott Long 	mps_print_field(sc, "DeviceInfo: %b,%s\n", buf->DeviceInfo,
327d3c7b9a0SKenneth D. Merry 	    "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit"
328d3c7b9a0SKenneth D. Merry 	    "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct"
329d3c7b9a0SKenneth D. Merry 	    "\15LsiDev" "\16AtapiDev" "\17SepDev",
330d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_sasdev0_devtype, buf->DeviceInfo & 0x03));
331d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Flags, 0x%x);
332d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhysicalPort, %d);
333d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, MaxPortConnections, %d);
334c11c484fSScott Long 	mps_print_field(sc, "DeviceName: 0x%jx\n",
335d3c7b9a0SKenneth D. Merry 	    mps_to_u64(&buf->DeviceName));
336d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PortGroups, %d);
337d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, DmaGroup, %d);
338d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ControlGroup, %d);
339d3c7b9a0SKenneth D. Merry }
340d3c7b9a0SKenneth D. Merry 
341d3c7b9a0SKenneth D. Merry void
mps_print_evt_sas(struct mps_softc * sc,MPI2_EVENT_NOTIFICATION_REPLY * event)342055e2653SScott Long mps_print_evt_sas(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event)
343d3c7b9a0SKenneth D. Merry {
344d3c7b9a0SKenneth D. Merry 
345055e2653SScott Long 	mps_print_evt_generic(sc, event);
346d3c7b9a0SKenneth D. Merry 
347d3c7b9a0SKenneth D. Merry 	switch(event->Event) {
348d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_DISCOVERY:
349d3c7b9a0SKenneth D. Merry 	{
350d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_DISCOVERY *data;
351d3c7b9a0SKenneth D. Merry 
352d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)&event->EventData;
353c11c484fSScott Long 		mps_print_field(sc, "Flags: %b\n", data->Flags,
354d3c7b9a0SKenneth D. Merry 		    "\20" "\1InProgress" "\2DeviceChange");
355c11c484fSScott Long 		mps_print_field(sc, "ReasonCode: %s\n",
356d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sasdisc_reason, data->ReasonCode));
357c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, PhysicalPort, %d);
358c11c484fSScott Long 		mps_print_field(sc, "DiscoveryStatus: %b\n",
359d3c7b9a0SKenneth D. Merry 		    data->DiscoveryStatus,  "\20"
360d3c7b9a0SKenneth D. Merry 		    "\1Loop" "\2UnaddressableDev" "\3DupSasAddr" "\5SmpTimeout"
361d3c7b9a0SKenneth D. Merry 		    "\6ExpRouteFull" "\7RouteIndexError" "\10SmpFailed"
362d3c7b9a0SKenneth D. Merry 		    "\11SmpCrcError" "\12SubSubLink" "\13TableTableLink"
363d3c7b9a0SKenneth D. Merry 		    "\14UnsupDevice" "\15TableSubLink" "\16MultiDomain"
364d3c7b9a0SKenneth D. Merry 		    "\17MultiSub" "\20MultiSubSub" "\34DownstreamInit"
365d3c7b9a0SKenneth D. Merry 		    "\35MaxPhys" "\36MaxTargs" "\37MaxExpanders"
366d3c7b9a0SKenneth D. Merry 		    "\40MaxEnclosures");
367d3c7b9a0SKenneth D. Merry 		break;
368d3c7b9a0SKenneth D. Merry 	}
369d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST:
370d3c7b9a0SKenneth D. Merry 	{
371d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *data;
372d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_SAS_TOPO_PHY_ENTRY *phy;
373d3c7b9a0SKenneth D. Merry 		int i, phynum;
374d3c7b9a0SKenneth D. Merry 
375d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *)
376d3c7b9a0SKenneth D. Merry 		    &event->EventData;
377c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, EnclosureHandle, 0x%x);
378c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, ExpanderDevHandle, 0x%x);
379c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, NumPhys, %d);
380c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, NumEntries, %d);
381c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, StartPhyNum, %d);
382c11c484fSScott Long 		mps_print_field(sc, "ExpStatus: %s (0x%x)\n",
383d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sastopo_exp, data->ExpStatus),
384d3c7b9a0SKenneth D. Merry 		    data->ExpStatus);
385c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, PhysicalPort, %d);
386d3c7b9a0SKenneth D. Merry 		for (i = 0; i < data->NumEntries; i++) {
387d3c7b9a0SKenneth D. Merry 			phy = &data->PHY[i];
388d3c7b9a0SKenneth D. Merry 			phynum = data->StartPhyNum + i;
389c11c484fSScott Long 			mps_print_field(sc,
390d3c7b9a0SKenneth D. Merry 			    "PHY[%d].AttachedDevHandle: 0x%04x\n", phynum,
391d3c7b9a0SKenneth D. Merry 			    phy->AttachedDevHandle);
392c11c484fSScott Long 			mps_print_field(sc,
393d3c7b9a0SKenneth D. Merry 			    "PHY[%d].LinkRate: %s (0x%x)\n", phynum,
394d3c7b9a0SKenneth D. Merry 			    mps_describe_table(mps_linkrate_names,
395d3c7b9a0SKenneth D. Merry 			    (phy->LinkRate >> 4) & 0xf), phy->LinkRate);
396c11c484fSScott Long 			mps_print_field(sc, "PHY[%d].PhyStatus: %s\n",
397d3c7b9a0SKenneth D. Merry 			    phynum, mps_describe_table(mps_phystatus_names,
398d3c7b9a0SKenneth D. Merry 			    phy->PhyStatus));
399d3c7b9a0SKenneth D. Merry 		}
400d3c7b9a0SKenneth D. Merry 		break;
401d3c7b9a0SKenneth D. Merry 	}
402d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE:
403d3c7b9a0SKenneth D. Merry 	{
404d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *data;
405d3c7b9a0SKenneth D. Merry 
406d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *)
407d3c7b9a0SKenneth D. Merry 		    &event->EventData;
408c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, EnclosureHandle, 0x%x);
409c11c484fSScott Long 		mps_print_field(sc, "ReasonCode: %s\n",
410d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sastopo_exp, data->ReasonCode));
411c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, PhysicalPort, %d);
412c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, NumSlots, %d);
413c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, StartSlot, %d);
414c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, PhyBits, 0x%x);
415d3c7b9a0SKenneth D. Merry 		break;
416d3c7b9a0SKenneth D. Merry 	}
417d3c7b9a0SKenneth D. Merry 	case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE:
418d3c7b9a0SKenneth D. Merry 	{
419d3c7b9a0SKenneth D. Merry 		MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *data;
420d3c7b9a0SKenneth D. Merry 
421d3c7b9a0SKenneth D. Merry 		data = (MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *)
422d3c7b9a0SKenneth D. Merry 		    &event->EventData;
423c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, TaskTag, 0x%x);
424c11c484fSScott Long 		mps_print_field(sc, "ReasonCode: %s\n",
425d3c7b9a0SKenneth D. Merry 		    mps_describe_table(mps_sasdev_reason, data->ReasonCode));
426c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, ASC, 0x%x);
427c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, ASCQ, 0x%x);
428c11c484fSScott Long 		MPS_PRINTFIELD(sc, data, DevHandle, 0x%x);
429c11c484fSScott Long 		mps_print_field(sc, "SASAddress: 0x%jx\n",
430d3c7b9a0SKenneth D. Merry 		    mps_to_u64(&data->SASAddress));
431aa24a04aSScott Long 		break;
432d3c7b9a0SKenneth D. Merry 	}
4338d8b4489SScott Long 	case MPI2_EVENT_SAS_BROADCAST_PRIMITIVE:
4348d8b4489SScott Long 	{
4358d8b4489SScott Long 		MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE *data;
4368d8b4489SScott Long 
4378d8b4489SScott Long 		data = (MPI2_EVENT_DATA_SAS_BROADCAST_PRIMITIVE *)&event->EventData;
4388d8b4489SScott Long 		MPS_PRINTFIELD(sc, data, PhyNum, %d);
4398d8b4489SScott Long 		MPS_PRINTFIELD(sc, data, Port, %d);
4408d8b4489SScott Long 		MPS_PRINTFIELD(sc, data, PortWidth, %d);
4418d8b4489SScott Long 		MPS_PRINTFIELD(sc, data, Primitive, 0x%x);
442aa24a04aSScott Long 		break;
4438d8b4489SScott Long 	}
444d3c7b9a0SKenneth D. Merry 	default:
445d3c7b9a0SKenneth D. Merry 		break;
446d3c7b9a0SKenneth D. Merry 	}
447d3c7b9a0SKenneth D. Merry }
448d3c7b9a0SKenneth D. Merry 
449d3c7b9a0SKenneth D. Merry void
mps_print_expander1(struct mps_softc * sc,MPI2_CONFIG_PAGE_EXPANDER_1 * buf)450055e2653SScott Long mps_print_expander1(struct mps_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf)
451d3c7b9a0SKenneth D. Merry {
452d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "SAS Expander Page 1 #%d", buf->Phy);
453d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhysicalPort, %d);
454d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, NumPhys, %d);
455d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Phy, %d);
456d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, NumTableEntriesProgrammed, %d);
457c11c484fSScott Long 	mps_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n",
458d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
459d3c7b9a0SKenneth D. Merry 	    (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
460c11c484fSScott Long 	mps_print_field(sc, "HwLinkRate: %s (0x%x)\n",
461d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
462d3c7b9a0SKenneth D. Merry 	    (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
463d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
464c11c484fSScott Long 	mps_print_field(sc, "PhyInfo Reason: %s (0x%x)\n",
465d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
466d3c7b9a0SKenneth D. Merry 	    (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
467c11c484fSScott Long 	mps_print_field(sc, "AttachedDeviceInfo: %b,%s\n",
468d3c7b9a0SKenneth D. Merry 	    buf->AttachedDeviceInfo, "\20" "\4SATAhost" "\5SMPinit" "\6STPinit"
469d3c7b9a0SKenneth D. Merry 	    "\7SSPinit" "\10SATAdev" "\11SMPtarg" "\12STPtarg" "\13SSPtarg"
470d3c7b9a0SKenneth D. Merry 	    "\14Direct" "\15LSIdev" "\16ATAPIdev" "\17SEPdev",
471d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_sasdev0_devtype,
472d3c7b9a0SKenneth D. Merry 	    buf->AttachedDeviceInfo & 0x03));
473d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ExpanderDevHandle, 0x%04x);
474d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ChangeCount, %d);
475c11c484fSScott Long 	mps_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n",
476d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
477d3c7b9a0SKenneth D. Merry 	    buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
478d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, PhyIdentifier, %d);
479d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
480d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, DiscoveryInfo, 0x%x);
481d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyInfo, 0x%x);
482c11c484fSScott Long 	mps_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n",
483d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
484d3c7b9a0SKenneth D. Merry 	    buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
485d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ZoneGroup, %d);
486d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, SelfConfigStatus, 0x%x);
487d3c7b9a0SKenneth D. Merry }
488d3c7b9a0SKenneth D. Merry 
489d3c7b9a0SKenneth D. Merry void
mps_print_sasphy0(struct mps_softc * sc,MPI2_CONFIG_PAGE_SAS_PHY_0 * buf)490055e2653SScott Long mps_print_sasphy0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_PHY_0 *buf)
491d3c7b9a0SKenneth D. Merry {
492d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD_START(sc, "SAS PHY Page 0");
493d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, OwnerDevHandle, 0x%04x);
494d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x);
495d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d);
496c11c484fSScott Long 	mps_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n",
497d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
498d3c7b9a0SKenneth D. Merry 	    buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo);
499c11c484fSScott Long 	mps_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n",
500d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
501d3c7b9a0SKenneth D. Merry 	    (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate);
502c11c484fSScott Long 	mps_print_field(sc, "HwLinkRate: %s (0x%x)\n",
503d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
504d3c7b9a0SKenneth D. Merry 	    (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate);
505d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, ChangeCount, %d);
506d3c7b9a0SKenneth D. Merry 	MPS_PRINTFIELD(sc, buf, Flags, 0x%x);
507c11c484fSScott Long 	mps_print_field(sc, "PhyInfo Reason: %s (0x%x)\n",
508d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_phyinfo_reason_names,
509d3c7b9a0SKenneth D. Merry 	    (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo);
510c11c484fSScott Long 	mps_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n",
511d3c7b9a0SKenneth D. Merry 	    mps_describe_table(mps_linkrate_names,
512d3c7b9a0SKenneth D. Merry 	    buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate);
513d3c7b9a0SKenneth D. Merry }
514d3c7b9a0SKenneth D. Merry 
515d3c7b9a0SKenneth D. Merry void
mps_print_sgl(struct mps_softc * sc,struct mps_command * cm,int offset)516d3c7b9a0SKenneth D. Merry mps_print_sgl(struct mps_softc *sc, struct mps_command *cm, int offset)
517d3c7b9a0SKenneth D. Merry {
518d3c7b9a0SKenneth D. Merry 	MPI2_SGE_SIMPLE64 *sge;
519d3c7b9a0SKenneth D. Merry 	MPI2_SGE_CHAIN32 *sgc;
520d3c7b9a0SKenneth D. Merry 	struct mps_chain *chain = NULL;
521d3c7b9a0SKenneth D. Merry 	char *frame;
522d3c7b9a0SKenneth D. Merry 	u_int i = 0, flags;
523d3c7b9a0SKenneth D. Merry 
524d3c7b9a0SKenneth D. Merry 	frame = (char *)cm->cm_req;
525d3c7b9a0SKenneth D. Merry 	sge = (MPI2_SGE_SIMPLE64 *)&frame[offset * 4];
526d3c7b9a0SKenneth D. Merry 	printf("SGL for command %p\n", cm);
527d3c7b9a0SKenneth D. Merry 
52861c49b4dSAlexander Motin 	hexdump(frame, 128, NULL, 0);
529d3c7b9a0SKenneth D. Merry 	while (frame != NULL) {
53061c49b4dSAlexander Motin 		flags = le32toh(sge->FlagsLength) >> MPI2_SGE_FLAGS_SHIFT;
53161c49b4dSAlexander Motin 		printf("seg%d flags=0x%02x len=0x%06x addr=0x%016jx\n",
53261c49b4dSAlexander Motin 		    i, flags, le32toh(sge->FlagsLength) & 0xffffff,
53361c49b4dSAlexander Motin 		    mps_to_u64(&sge->Address));
534d3c7b9a0SKenneth D. Merry 		if (flags & (MPI2_SGE_FLAGS_END_OF_LIST |
535d3c7b9a0SKenneth D. Merry 		    MPI2_SGE_FLAGS_END_OF_BUFFER))
536d3c7b9a0SKenneth D. Merry 			break;
537d3c7b9a0SKenneth D. Merry 		sge++;
538d3c7b9a0SKenneth D. Merry 		i++;
539d3c7b9a0SKenneth D. Merry 		if (flags & MPI2_SGE_FLAGS_LAST_ELEMENT) {
540d3c7b9a0SKenneth D. Merry 			sgc = (MPI2_SGE_CHAIN32 *)sge;
541d3c7b9a0SKenneth D. Merry 			printf("chain flags=0x%x len=0x%x Offset=0x%x "
54261c49b4dSAlexander Motin 			    "Address=0x%x\n", sgc->Flags, le16toh(sgc->Length),
54361c49b4dSAlexander Motin 			    sgc->NextChainOffset, le32toh(sgc->Address));
544d3c7b9a0SKenneth D. Merry 			if (chain == NULL)
545d3c7b9a0SKenneth D. Merry 				chain = TAILQ_FIRST(&cm->cm_chain_list);
546d3c7b9a0SKenneth D. Merry 			else
547d3c7b9a0SKenneth D. Merry 				chain = TAILQ_NEXT(chain, chain_link);
548d3c7b9a0SKenneth D. Merry 			frame = (char *)chain->chain;
549d3c7b9a0SKenneth D. Merry 			sge = (MPI2_SGE_SIMPLE64 *)frame;
550d3c7b9a0SKenneth D. Merry 			hexdump(frame, 128, NULL, 0);
551d3c7b9a0SKenneth D. Merry 		}
552d3c7b9a0SKenneth D. Merry 	}
553d3c7b9a0SKenneth D. Merry }
554d3c7b9a0SKenneth D. Merry 
555d3c7b9a0SKenneth D. Merry void
mps_print_scsiio_cmd(struct mps_softc * sc,struct mps_command * cm)556d3c7b9a0SKenneth D. Merry mps_print_scsiio_cmd(struct mps_softc *sc, struct mps_command *cm)
557d3c7b9a0SKenneth D. Merry {
558d3c7b9a0SKenneth D. Merry 	MPI2_SCSI_IO_REQUEST *req;
559d3c7b9a0SKenneth D. Merry 
560d3c7b9a0SKenneth D. Merry 	req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req;
561d3c7b9a0SKenneth D. Merry 	mps_print_sgl(sc, cm, req->SGLOffset0);
562d3c7b9a0SKenneth D. Merry }
563