1d3c7b9a0SKenneth D. Merry /*- 2*718cf2ccSPedro F. Giffuni * SPDX-License-Identifier: BSD-2-Clause-FreeBSD 3*718cf2ccSPedro 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 __FBSDID("$FreeBSD$"); 31d3c7b9a0SKenneth D. Merry 32d3c7b9a0SKenneth D. Merry /* Debugging tables for MPT2 */ 33d3c7b9a0SKenneth D. Merry 34d043c564SKenneth D. Merry /* TODO Move headers to mpsvar */ 35d3c7b9a0SKenneth D. Merry #include <sys/types.h> 36d3c7b9a0SKenneth D. Merry #include <sys/param.h> 37d3c7b9a0SKenneth D. Merry #include <sys/systm.h> 38d3c7b9a0SKenneth D. Merry #include <sys/kernel.h> 39d3c7b9a0SKenneth D. Merry #include <sys/selinfo.h> 40d3c7b9a0SKenneth D. Merry #include <sys/module.h> 41d3c7b9a0SKenneth D. Merry #include <sys/bus.h> 42d3c7b9a0SKenneth D. Merry #include <sys/conf.h> 43d3c7b9a0SKenneth D. Merry #include <sys/bio.h> 44d3c7b9a0SKenneth D. Merry #include <sys/malloc.h> 45d3c7b9a0SKenneth D. Merry #include <sys/uio.h> 46d3c7b9a0SKenneth D. Merry #include <sys/sysctl.h> 47d043c564SKenneth D. Merry #include <sys/queue.h> 48d043c564SKenneth D. Merry #include <sys/kthread.h> 49d043c564SKenneth D. Merry #include <sys/taskqueue.h> 50d3c7b9a0SKenneth D. Merry 51d3c7b9a0SKenneth D. Merry #include <machine/bus.h> 52d3c7b9a0SKenneth D. Merry #include <machine/resource.h> 53d3c7b9a0SKenneth D. Merry #include <sys/rman.h> 54d3c7b9a0SKenneth D. Merry 55d3c7b9a0SKenneth D. Merry #include <cam/scsi/scsi_all.h> 56d3c7b9a0SKenneth D. Merry 57d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_type.h> 58d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2.h> 59d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_ioc.h> 60d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_cnfg.h> 61d3c7b9a0SKenneth D. Merry #include <dev/mps/mpi/mpi2_init.h> 62d043c564SKenneth D. Merry #include <dev/mps/mpi/mpi2_tool.h> 63d043c564SKenneth D. Merry #include <dev/mps/mps_ioctl.h> 64d3c7b9a0SKenneth D. Merry #include <dev/mps/mpsvar.h> 65d3c7b9a0SKenneth D. Merry #include <dev/mps/mps_table.h> 66d3c7b9a0SKenneth D. Merry 67d3c7b9a0SKenneth D. Merry char * 68d3c7b9a0SKenneth D. Merry mps_describe_table(struct mps_table_lookup *table, u_int code) 69d3c7b9a0SKenneth D. Merry { 70d3c7b9a0SKenneth D. Merry int i; 71d3c7b9a0SKenneth D. Merry 72d3c7b9a0SKenneth D. Merry for (i = 0; table[i].string != NULL; i++) { 73d3c7b9a0SKenneth D. Merry if (table[i].code == code) 74d3c7b9a0SKenneth D. Merry return(table[i].string); 75d3c7b9a0SKenneth D. Merry } 76d3c7b9a0SKenneth D. Merry return(table[i+1].string); 77d3c7b9a0SKenneth D. Merry } 78d3c7b9a0SKenneth D. Merry 79d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_event_names[] = { 80d3c7b9a0SKenneth D. Merry {"LogData", 0x01}, 81d3c7b9a0SKenneth D. Merry {"StateChange", 0x02}, 82d3c7b9a0SKenneth D. Merry {"HardResetReceived", 0x05}, 83d3c7b9a0SKenneth D. Merry {"EventChange", 0x0a}, 84d3c7b9a0SKenneth D. Merry {"TaskSetFull", 0x0e}, 85d3c7b9a0SKenneth D. Merry {"SasDeviceStatusChange", 0x0f}, 86d3c7b9a0SKenneth D. Merry {"IrOperationStatus", 0x14}, 87d3c7b9a0SKenneth D. Merry {"SasDiscovery", 0x16}, 88d3c7b9a0SKenneth D. Merry {"SasBroadcastPrimitive", 0x17}, 89d3c7b9a0SKenneth D. Merry {"SasInitDeviceStatusChange", 0x18}, 90d3c7b9a0SKenneth D. Merry {"SasInitTableOverflow", 0x19}, 91d3c7b9a0SKenneth D. Merry {"SasTopologyChangeList", 0x1c}, 92d3c7b9a0SKenneth D. Merry {"SasEnclDeviceStatusChange", 0x1d}, 93d3c7b9a0SKenneth D. Merry {"IrVolume", 0x1e}, 94d3c7b9a0SKenneth D. Merry {"IrPhysicalDisk", 0x1f}, 95d3c7b9a0SKenneth D. Merry {"IrConfigurationChangeList", 0x20}, 96d3c7b9a0SKenneth D. Merry {"LogEntryAdded", 0x21}, 97d3c7b9a0SKenneth D. Merry {"SasPhyCounter", 0x22}, 98d3c7b9a0SKenneth D. Merry {"GpioInterrupt", 0x23}, 99d3c7b9a0SKenneth D. Merry {"HbdPhyEvent", 0x24}, 100d3c7b9a0SKenneth D. Merry {NULL, 0}, 101d3c7b9a0SKenneth D. Merry {"Unknown Event", 0} 102d3c7b9a0SKenneth D. Merry }; 103d3c7b9a0SKenneth D. Merry 104d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_phystatus_names[] = { 105d3c7b9a0SKenneth D. Merry {"NewTargetAdded", 0x01}, 106d3c7b9a0SKenneth D. Merry {"TargetGone", 0x02}, 107d3c7b9a0SKenneth D. Merry {"PHYLinkStatusChange", 0x03}, 108d3c7b9a0SKenneth D. Merry {"PHYLinkStatusUnchanged", 0x04}, 109d3c7b9a0SKenneth D. Merry {"TargetMissing", 0x05}, 110d3c7b9a0SKenneth D. Merry {NULL, 0}, 111d3c7b9a0SKenneth D. Merry {"Unknown Status", 0} 112d3c7b9a0SKenneth D. Merry }; 113d3c7b9a0SKenneth D. Merry 114d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_linkrate_names[] = { 115d3c7b9a0SKenneth D. Merry {"PHY disabled", 0x01}, 116d3c7b9a0SKenneth D. Merry {"Speed Negotiation Failed", 0x02}, 117d3c7b9a0SKenneth D. Merry {"SATA OOB Complete", 0x03}, 118d3c7b9a0SKenneth D. Merry {"SATA Port Selector", 0x04}, 119d3c7b9a0SKenneth D. Merry {"SMP Reset in Progress", 0x05}, 120d3c7b9a0SKenneth D. Merry {"1.5Gbps", 0x08}, 121d3c7b9a0SKenneth D. Merry {"3.0Gbps", 0x09}, 122d3c7b9a0SKenneth D. Merry {"6.0Gbps", 0x0a}, 123d3c7b9a0SKenneth D. Merry {NULL, 0}, 124d3c7b9a0SKenneth D. Merry {"LinkRate Unknown", 0x00} 125d3c7b9a0SKenneth D. Merry }; 126d3c7b9a0SKenneth D. Merry 127d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sasdev0_devtype[] = { 128d3c7b9a0SKenneth D. Merry {"End Device", 0x01}, 129d3c7b9a0SKenneth D. Merry {"Edge Expander", 0x02}, 130d3c7b9a0SKenneth D. Merry {"Fanout Expander", 0x03}, 131d3c7b9a0SKenneth D. Merry {NULL, 0}, 132d3c7b9a0SKenneth D. Merry {"No Device", 0x00} 133d3c7b9a0SKenneth D. Merry }; 134d3c7b9a0SKenneth D. Merry 135d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_phyinfo_reason_names[] = { 136d3c7b9a0SKenneth D. Merry {"Power On", 0x01}, 137d3c7b9a0SKenneth D. Merry {"Hard Reset", 0x02}, 138d3c7b9a0SKenneth D. Merry {"SMP Phy Control Link Reset", 0x03}, 139d3c7b9a0SKenneth D. Merry {"Loss DWORD Sync", 0x04}, 140d3c7b9a0SKenneth D. Merry {"Multiplex Sequence", 0x05}, 141d3c7b9a0SKenneth D. Merry {"I-T Nexus Loss Timer", 0x06}, 142d3c7b9a0SKenneth D. Merry {"Break Timeout Timer", 0x07}, 143d3c7b9a0SKenneth D. Merry {"PHY Test Function", 0x08}, 144d3c7b9a0SKenneth D. Merry {NULL, 0}, 145d3c7b9a0SKenneth D. Merry {"Unknown Reason", 0x00} 146d3c7b9a0SKenneth D. Merry }; 147d3c7b9a0SKenneth D. Merry 148d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_whoinit_names[] = { 149d3c7b9a0SKenneth D. Merry {"System BIOS", 0x01}, 150d3c7b9a0SKenneth D. Merry {"ROM BIOS", 0x02}, 151d3c7b9a0SKenneth D. Merry {"PCI Peer", 0x03}, 152d3c7b9a0SKenneth D. Merry {"Host Driver", 0x04}, 153d3c7b9a0SKenneth D. Merry {"Manufacturing", 0x05}, 154d3c7b9a0SKenneth D. Merry {NULL, 0}, 155d3c7b9a0SKenneth D. Merry {"Not Initialized", 0x00} 156d3c7b9a0SKenneth D. Merry }; 157d3c7b9a0SKenneth D. Merry 158d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sasdisc_reason[] = { 159d3c7b9a0SKenneth D. Merry {"Discovery Started", 0x01}, 160d3c7b9a0SKenneth D. Merry {"Discovery Complete", 0x02}, 161d3c7b9a0SKenneth D. Merry {NULL, 0}, 162d3c7b9a0SKenneth D. Merry {"Unknown", 0x00} 163d3c7b9a0SKenneth D. Merry }; 164d3c7b9a0SKenneth D. Merry 165d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sastopo_exp[] = { 166d3c7b9a0SKenneth D. Merry {"Added", 0x01}, 167d3c7b9a0SKenneth D. Merry {"Not Responding", 0x02}, 168d3c7b9a0SKenneth D. Merry {"Responding", 0x03}, 169d3c7b9a0SKenneth D. Merry {"Delay Not Responding", 0x04}, 170d3c7b9a0SKenneth D. Merry {NULL, 0}, 171d3c7b9a0SKenneth D. Merry {"Unknown", 0x00} 172d3c7b9a0SKenneth D. Merry }; 173d3c7b9a0SKenneth D. Merry 174d3c7b9a0SKenneth D. Merry struct mps_table_lookup mps_sasdev_reason[] = { 175d3c7b9a0SKenneth D. Merry {"SMART Data", 0x05}, 176d3c7b9a0SKenneth D. Merry {"Unsupported", 0x07}, 177d3c7b9a0SKenneth D. Merry {"Internal Device Reset", 0x08}, 178d3c7b9a0SKenneth D. Merry {"Task Abort Internal", 0x09}, 179d3c7b9a0SKenneth D. Merry {"Abort Task Set Internal", 0x0a}, 180d3c7b9a0SKenneth D. Merry {"Clear Task Set Internal", 0x0b}, 181d3c7b9a0SKenneth D. Merry {"Query Task Internal", 0x0c}, 182d3c7b9a0SKenneth D. Merry {"Async Notification", 0x0d}, 183d3c7b9a0SKenneth D. Merry {"Cmp Internal Device Reset", 0x0e}, 184d3c7b9a0SKenneth D. Merry {"Cmp Task Abort Internal", 0x0f}, 185d3c7b9a0SKenneth D. Merry {"Sata Init Failure", 0x10}, 186d3c7b9a0SKenneth D. Merry {NULL, 0}, 187d3c7b9a0SKenneth D. Merry {"Unknown", 0x00} 188d3c7b9a0SKenneth D. Merry }; 189d3c7b9a0SKenneth D. Merry 1902bf620cbSScott Long struct mps_table_lookup mps_iocstatus_string[] = { 1912bf620cbSScott Long {"success", MPI2_IOCSTATUS_SUCCESS}, 1922bf620cbSScott Long {"invalid function", MPI2_IOCSTATUS_INVALID_FUNCTION}, 1932bf620cbSScott Long {"scsi recovered error", MPI2_IOCSTATUS_SCSI_RECOVERED_ERROR}, 1942bf620cbSScott Long {"scsi invalid dev handle", MPI2_IOCSTATUS_SCSI_INVALID_DEVHANDLE}, 1952bf620cbSScott Long {"scsi device not there", MPI2_IOCSTATUS_SCSI_DEVICE_NOT_THERE}, 1962bf620cbSScott Long {"scsi data overrun", MPI2_IOCSTATUS_SCSI_DATA_OVERRUN}, 1972bf620cbSScott Long {"scsi data underrun", MPI2_IOCSTATUS_SCSI_DATA_UNDERRUN}, 1982bf620cbSScott Long {"scsi io data error", MPI2_IOCSTATUS_SCSI_IO_DATA_ERROR}, 1992bf620cbSScott Long {"scsi protocol error", MPI2_IOCSTATUS_SCSI_PROTOCOL_ERROR}, 2002bf620cbSScott Long {"scsi task terminated", MPI2_IOCSTATUS_SCSI_TASK_TERMINATED}, 2012bf620cbSScott Long {"scsi residual mismatch", MPI2_IOCSTATUS_SCSI_RESIDUAL_MISMATCH}, 2022bf620cbSScott Long {"scsi task mgmt failed", MPI2_IOCSTATUS_SCSI_TASK_MGMT_FAILED}, 2032bf620cbSScott Long {"scsi ioc terminated", MPI2_IOCSTATUS_SCSI_IOC_TERMINATED}, 2042bf620cbSScott Long {"scsi ext terminated", MPI2_IOCSTATUS_SCSI_EXT_TERMINATED}, 2052bf620cbSScott Long {"eedp guard error", MPI2_IOCSTATUS_EEDP_GUARD_ERROR}, 2062bf620cbSScott Long {"eedp ref tag error", MPI2_IOCSTATUS_EEDP_REF_TAG_ERROR}, 2072bf620cbSScott Long {"eedp app tag error", MPI2_IOCSTATUS_EEDP_APP_TAG_ERROR}, 2082bf620cbSScott Long {NULL, 0}, 2092bf620cbSScott Long {"unknown", 0x00} 2102bf620cbSScott Long }; 2112bf620cbSScott Long 2122bf620cbSScott Long struct mps_table_lookup mps_scsi_status_string[] = { 2132bf620cbSScott Long {"good", MPI2_SCSI_STATUS_GOOD}, 2142bf620cbSScott Long {"check condition", MPI2_SCSI_STATUS_CHECK_CONDITION}, 2152bf620cbSScott Long {"condition met", MPI2_SCSI_STATUS_CONDITION_MET}, 2162bf620cbSScott Long {"busy", MPI2_SCSI_STATUS_BUSY}, 2172bf620cbSScott Long {"intermediate", MPI2_SCSI_STATUS_INTERMEDIATE}, 2182bf620cbSScott Long {"intermediate condmet", MPI2_SCSI_STATUS_INTERMEDIATE_CONDMET}, 2192bf620cbSScott Long {"reservation conflict", MPI2_SCSI_STATUS_RESERVATION_CONFLICT}, 2202bf620cbSScott Long {"command terminated", MPI2_SCSI_STATUS_COMMAND_TERMINATED}, 2212bf620cbSScott Long {"task set full", MPI2_SCSI_STATUS_TASK_SET_FULL}, 2222bf620cbSScott Long {"aca active", MPI2_SCSI_STATUS_ACA_ACTIVE}, 2232bf620cbSScott Long {"task aborted", MPI2_SCSI_STATUS_TASK_ABORTED}, 2242bf620cbSScott Long {NULL, 0}, 2252bf620cbSScott Long {"unknown", 0x00} 2262bf620cbSScott Long }; 2272bf620cbSScott Long 2282bf620cbSScott Long struct mps_table_lookup mps_scsi_taskmgmt_string[] = { 2292bf620cbSScott Long {"task mgmt request completed", MPI2_SCSITASKMGMT_RSP_TM_COMPLETE}, 2302bf620cbSScott Long {"invalid frame", MPI2_SCSITASKMGMT_RSP_INVALID_FRAME}, 2312bf620cbSScott Long {"task mgmt request not supp", MPI2_SCSITASKMGMT_RSP_TM_NOT_SUPPORTED}, 2322bf620cbSScott Long {"task mgmt request failed", MPI2_SCSITASKMGMT_RSP_TM_FAILED}, 2332bf620cbSScott Long {"task mgmt request_succeeded", MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED}, 2342bf620cbSScott Long {"invalid lun", MPI2_SCSITASKMGMT_RSP_TM_INVALID_LUN}, 2352bf620cbSScott Long {"overlapped tag attempt", 0xA}, 2362bf620cbSScott Long {"task queued on IOC", MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC}, 2372bf620cbSScott Long {NULL, 0}, 2382bf620cbSScott Long {"unknown", 0x00} 2392bf620cbSScott Long }; 2402bf620cbSScott Long 241d3c7b9a0SKenneth D. Merry void 242d3c7b9a0SKenneth D. Merry mps_describe_devinfo(uint32_t devinfo, char *string, int len) 243d3c7b9a0SKenneth D. Merry { 244d3c7b9a0SKenneth D. Merry snprintf(string, len, "%b,%s", devinfo, 245d3c7b9a0SKenneth D. Merry "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit" 246d3c7b9a0SKenneth D. Merry "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct" 247d3c7b9a0SKenneth D. Merry "\15LsiDev" "\16AtapiDev" "\17SepDev", 248d3c7b9a0SKenneth D. Merry mps_describe_table(mps_sasdev0_devtype, devinfo & 0x03)); 249d3c7b9a0SKenneth D. Merry } 250d3c7b9a0SKenneth D. Merry 251d3c7b9a0SKenneth D. Merry void 252055e2653SScott Long mps_print_iocfacts(struct mps_softc *sc, MPI2_IOC_FACTS_REPLY *facts) 253d3c7b9a0SKenneth D. Merry { 254d3c7b9a0SKenneth D. Merry 255d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD_START(sc, "IOCFacts"); 256d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MsgVersion, 0x%x); 257d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, HeaderVersion, 0x%x); 258d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, IOCNumber, %d); 259d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, IOCExceptions, 0x%x); 260d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxChainDepth, %d); 261c11c484fSScott Long mps_print_field(sc, "WhoInit: %s\n", 262d3c7b9a0SKenneth D. Merry mps_describe_table(mps_whoinit_names, facts->WhoInit)); 263d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, NumberOfPorts, %d); 26494e4e732SScott Long MPS_PRINTFIELD(sc, facts, MaxMSIxVectors, %d); 265d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, RequestCredit, %d); 266d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, ProductID, 0x%x); 267c11c484fSScott Long mps_print_field(sc, "IOCCapabilities: %b\n", 268d3c7b9a0SKenneth D. Merry facts->IOCCapabilities, "\20" "\3ScsiTaskFull" "\4DiagTrace" 269d3c7b9a0SKenneth D. Merry "\5SnapBuf" "\6ExtBuf" "\7EEDP" "\10BiDirTarg" "\11Multicast" 270d3c7b9a0SKenneth D. Merry "\14TransRetry" "\15IR" "\16EventReplay" "\17RaidAccel" 271d3c7b9a0SKenneth D. Merry "\20MSIXIndex" "\21HostDisc"); 272c11c484fSScott Long mps_print_field(sc, "FWVersion= %d-%d-%d-%d\n", 273d3c7b9a0SKenneth D. Merry facts->FWVersion.Struct.Major, 274d3c7b9a0SKenneth D. Merry facts->FWVersion.Struct.Minor, 275d3c7b9a0SKenneth D. Merry facts->FWVersion.Struct.Unit, 276d3c7b9a0SKenneth D. Merry facts->FWVersion.Struct.Dev); 277d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, IOCRequestFrameSize, %d); 278d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxInitiators, %d); 279d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxTargets, %d); 280d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxSasExpanders, %d); 281d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxEnclosures, %d); 282c11c484fSScott Long mps_print_field(sc, "ProtocolFlags: %b\n", 283d3c7b9a0SKenneth D. Merry facts->ProtocolFlags, "\20" "\1ScsiTarg" "\2ScsiInit"); 284d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, HighPriorityCredit, %d); 285d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxReplyDescriptorPostQueueDepth, %d); 286d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, ReplyFrameSize, %d); 287d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxVolumes, %d); 288d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxDevHandle, %d); 289d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxPersistentEntries, %d); 290d3c7b9a0SKenneth D. Merry } 291d3c7b9a0SKenneth D. Merry 292d3c7b9a0SKenneth D. Merry void 293055e2653SScott Long mps_print_portfacts(struct mps_softc *sc, MPI2_PORT_FACTS_REPLY *facts) 294d3c7b9a0SKenneth D. Merry { 295d3c7b9a0SKenneth D. Merry 296d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD_START(sc, "PortFacts"); 297d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, PortNumber, %d); 298d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, PortType, 0x%x); 299d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, facts, MaxPostedCmdBuffers, %d); 300d3c7b9a0SKenneth D. Merry } 301d3c7b9a0SKenneth D. Merry 302d3c7b9a0SKenneth D. Merry void 303055e2653SScott Long mps_print_evt_generic(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event) 304d3c7b9a0SKenneth D. Merry { 305d3c7b9a0SKenneth D. Merry 306c11c484fSScott Long MPS_PRINTFIELD_START(sc, "EventReply"); 307c11c484fSScott Long MPS_PRINTFIELD(sc, event, EventDataLength, %d); 308c11c484fSScott Long MPS_PRINTFIELD(sc, event, AckRequired, %d); 309c11c484fSScott Long mps_print_field(sc, "Event: %s (0x%x)\n", 310d3c7b9a0SKenneth D. Merry mps_describe_table(mps_event_names, event->Event), event->Event); 311c11c484fSScott Long MPS_PRINTFIELD(sc, event, EventContext, 0x%x); 312d3c7b9a0SKenneth D. Merry } 313d3c7b9a0SKenneth D. Merry 314d3c7b9a0SKenneth D. Merry void 315055e2653SScott Long mps_print_sasdev0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf) 316d3c7b9a0SKenneth D. Merry { 317d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD_START(sc, "SAS Device Page 0"); 318d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, Slot, %d); 319d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, EnclosureHandle, 0x%x); 320c11c484fSScott Long mps_print_field(sc, "SASAddress: 0x%jx\n", 321d3c7b9a0SKenneth D. Merry mps_to_u64(&buf->SASAddress)); 322d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, ParentDevHandle, 0x%x); 323d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, PhyNum, %d); 324d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, AccessStatus, 0x%x); 325d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, DevHandle, 0x%x); 326d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, 0x%x); 327d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, ZoneGroup, %d); 328c11c484fSScott Long mps_print_field(sc, "DeviceInfo: %b,%s\n", buf->DeviceInfo, 329d3c7b9a0SKenneth D. Merry "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit" 330d3c7b9a0SKenneth D. Merry "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct" 331d3c7b9a0SKenneth D. Merry "\15LsiDev" "\16AtapiDev" "\17SepDev", 332d3c7b9a0SKenneth D. Merry mps_describe_table(mps_sasdev0_devtype, buf->DeviceInfo & 0x03)); 333d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, Flags, 0x%x); 334d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, PhysicalPort, %d); 335d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, MaxPortConnections, %d); 336c11c484fSScott Long mps_print_field(sc, "DeviceName: 0x%jx\n", 337d3c7b9a0SKenneth D. Merry mps_to_u64(&buf->DeviceName)); 338d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, PortGroups, %d); 339d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, DmaGroup, %d); 340d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, ControlGroup, %d); 341d3c7b9a0SKenneth D. Merry } 342d3c7b9a0SKenneth D. Merry 343d3c7b9a0SKenneth D. Merry void 344055e2653SScott Long mps_print_evt_sas(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event) 345d3c7b9a0SKenneth D. Merry { 346d3c7b9a0SKenneth D. Merry 347055e2653SScott Long mps_print_evt_generic(sc, event); 348d3c7b9a0SKenneth D. Merry 349d3c7b9a0SKenneth D. Merry switch(event->Event) { 350d3c7b9a0SKenneth D. Merry case MPI2_EVENT_SAS_DISCOVERY: 351d3c7b9a0SKenneth D. Merry { 352d3c7b9a0SKenneth D. Merry MPI2_EVENT_DATA_SAS_DISCOVERY *data; 353d3c7b9a0SKenneth D. Merry 354d3c7b9a0SKenneth D. Merry data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)&event->EventData; 355c11c484fSScott Long mps_print_field(sc, "Flags: %b\n", data->Flags, 356d3c7b9a0SKenneth D. Merry "\20" "\1InProgress" "\2DeviceChange"); 357c11c484fSScott Long mps_print_field(sc, "ReasonCode: %s\n", 358d3c7b9a0SKenneth D. Merry mps_describe_table(mps_sasdisc_reason, data->ReasonCode)); 359c11c484fSScott Long MPS_PRINTFIELD(sc, data, PhysicalPort, %d); 360c11c484fSScott Long mps_print_field(sc, "DiscoveryStatus: %b\n", 361d3c7b9a0SKenneth D. Merry data->DiscoveryStatus, "\20" 362d3c7b9a0SKenneth D. Merry "\1Loop" "\2UnaddressableDev" "\3DupSasAddr" "\5SmpTimeout" 363d3c7b9a0SKenneth D. Merry "\6ExpRouteFull" "\7RouteIndexError" "\10SmpFailed" 364d3c7b9a0SKenneth D. Merry "\11SmpCrcError" "\12SubSubLink" "\13TableTableLink" 365d3c7b9a0SKenneth D. Merry "\14UnsupDevice" "\15TableSubLink" "\16MultiDomain" 366d3c7b9a0SKenneth D. Merry "\17MultiSub" "\20MultiSubSub" "\34DownstreamInit" 367d3c7b9a0SKenneth D. Merry "\35MaxPhys" "\36MaxTargs" "\37MaxExpanders" 368d3c7b9a0SKenneth D. Merry "\40MaxEnclosures"); 369d3c7b9a0SKenneth D. Merry break; 370d3c7b9a0SKenneth D. Merry } 371d3c7b9a0SKenneth D. Merry case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST: 372d3c7b9a0SKenneth D. Merry { 373d3c7b9a0SKenneth D. Merry MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *data; 374d3c7b9a0SKenneth D. Merry MPI2_EVENT_SAS_TOPO_PHY_ENTRY *phy; 375d3c7b9a0SKenneth D. Merry int i, phynum; 376d3c7b9a0SKenneth D. Merry 377d3c7b9a0SKenneth D. Merry data = (MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *) 378d3c7b9a0SKenneth D. Merry &event->EventData; 379c11c484fSScott Long MPS_PRINTFIELD(sc, data, EnclosureHandle, 0x%x); 380c11c484fSScott Long MPS_PRINTFIELD(sc, data, ExpanderDevHandle, 0x%x); 381c11c484fSScott Long MPS_PRINTFIELD(sc, data, NumPhys, %d); 382c11c484fSScott Long MPS_PRINTFIELD(sc, data, NumEntries, %d); 383c11c484fSScott Long MPS_PRINTFIELD(sc, data, StartPhyNum, %d); 384c11c484fSScott Long mps_print_field(sc, "ExpStatus: %s (0x%x)\n", 385d3c7b9a0SKenneth D. Merry mps_describe_table(mps_sastopo_exp, data->ExpStatus), 386d3c7b9a0SKenneth D. Merry data->ExpStatus); 387c11c484fSScott Long MPS_PRINTFIELD(sc, data, PhysicalPort, %d); 388d3c7b9a0SKenneth D. Merry for (i = 0; i < data->NumEntries; i++) { 389d3c7b9a0SKenneth D. Merry phy = &data->PHY[i]; 390d3c7b9a0SKenneth D. Merry phynum = data->StartPhyNum + i; 391c11c484fSScott Long mps_print_field(sc, 392d3c7b9a0SKenneth D. Merry "PHY[%d].AttachedDevHandle: 0x%04x\n", phynum, 393d3c7b9a0SKenneth D. Merry phy->AttachedDevHandle); 394c11c484fSScott Long mps_print_field(sc, 395d3c7b9a0SKenneth D. Merry "PHY[%d].LinkRate: %s (0x%x)\n", phynum, 396d3c7b9a0SKenneth D. Merry mps_describe_table(mps_linkrate_names, 397d3c7b9a0SKenneth D. Merry (phy->LinkRate >> 4) & 0xf), phy->LinkRate); 398c11c484fSScott Long mps_print_field(sc, "PHY[%d].PhyStatus: %s\n", 399d3c7b9a0SKenneth D. Merry phynum, mps_describe_table(mps_phystatus_names, 400d3c7b9a0SKenneth D. Merry phy->PhyStatus)); 401d3c7b9a0SKenneth D. Merry } 402d3c7b9a0SKenneth D. Merry break; 403d3c7b9a0SKenneth D. Merry } 404d3c7b9a0SKenneth D. Merry case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE: 405d3c7b9a0SKenneth D. Merry { 406d3c7b9a0SKenneth D. Merry MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *data; 407d3c7b9a0SKenneth D. Merry 408d3c7b9a0SKenneth D. Merry data = (MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *) 409d3c7b9a0SKenneth D. Merry &event->EventData; 410c11c484fSScott Long MPS_PRINTFIELD(sc, data, EnclosureHandle, 0x%x); 411c11c484fSScott Long mps_print_field(sc, "ReasonCode: %s\n", 412d3c7b9a0SKenneth D. Merry mps_describe_table(mps_sastopo_exp, data->ReasonCode)); 413c11c484fSScott Long MPS_PRINTFIELD(sc, data, PhysicalPort, %d); 414c11c484fSScott Long MPS_PRINTFIELD(sc, data, NumSlots, %d); 415c11c484fSScott Long MPS_PRINTFIELD(sc, data, StartSlot, %d); 416c11c484fSScott Long MPS_PRINTFIELD(sc, data, PhyBits, 0x%x); 417d3c7b9a0SKenneth D. Merry break; 418d3c7b9a0SKenneth D. Merry } 419d3c7b9a0SKenneth D. Merry case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE: 420d3c7b9a0SKenneth D. Merry { 421d3c7b9a0SKenneth D. Merry MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *data; 422d3c7b9a0SKenneth D. Merry 423d3c7b9a0SKenneth D. Merry data = (MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *) 424d3c7b9a0SKenneth D. Merry &event->EventData; 425c11c484fSScott Long MPS_PRINTFIELD(sc, data, TaskTag, 0x%x); 426c11c484fSScott Long mps_print_field(sc, "ReasonCode: %s\n", 427d3c7b9a0SKenneth D. Merry mps_describe_table(mps_sasdev_reason, data->ReasonCode)); 428c11c484fSScott Long MPS_PRINTFIELD(sc, data, ASC, 0x%x); 429c11c484fSScott Long MPS_PRINTFIELD(sc, data, ASCQ, 0x%x); 430c11c484fSScott Long MPS_PRINTFIELD(sc, data, DevHandle, 0x%x); 431c11c484fSScott Long mps_print_field(sc, "SASAddress: 0x%jx\n", 432d3c7b9a0SKenneth D. Merry mps_to_u64(&data->SASAddress)); 433d3c7b9a0SKenneth D. Merry } 434d3c7b9a0SKenneth D. Merry default: 435d3c7b9a0SKenneth D. Merry break; 436d3c7b9a0SKenneth D. Merry } 437d3c7b9a0SKenneth D. Merry } 438d3c7b9a0SKenneth D. Merry 439d3c7b9a0SKenneth D. Merry void 440055e2653SScott Long mps_print_expander1(struct mps_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf) 441d3c7b9a0SKenneth D. Merry { 442d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD_START(sc, "SAS Expander Page 1 #%d", buf->Phy); 443d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, PhysicalPort, %d); 444d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, NumPhys, %d); 445d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, Phy, %d); 446d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, NumTableEntriesProgrammed, %d); 447c11c484fSScott Long mps_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n", 448d3c7b9a0SKenneth D. Merry mps_describe_table(mps_linkrate_names, 449d3c7b9a0SKenneth D. Merry (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate); 450c11c484fSScott Long mps_print_field(sc, "HwLinkRate: %s (0x%x)\n", 451d3c7b9a0SKenneth D. Merry mps_describe_table(mps_linkrate_names, 452d3c7b9a0SKenneth D. Merry (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate); 453d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x); 454c11c484fSScott Long mps_print_field(sc, "PhyInfo Reason: %s (0x%x)\n", 455d3c7b9a0SKenneth D. Merry mps_describe_table(mps_phyinfo_reason_names, 456d3c7b9a0SKenneth D. Merry (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo); 457c11c484fSScott Long mps_print_field(sc, "AttachedDeviceInfo: %b,%s\n", 458d3c7b9a0SKenneth D. Merry buf->AttachedDeviceInfo, "\20" "\4SATAhost" "\5SMPinit" "\6STPinit" 459d3c7b9a0SKenneth D. Merry "\7SSPinit" "\10SATAdev" "\11SMPtarg" "\12STPtarg" "\13SSPtarg" 460d3c7b9a0SKenneth D. Merry "\14Direct" "\15LSIdev" "\16ATAPIdev" "\17SEPdev", 461d3c7b9a0SKenneth D. Merry mps_describe_table(mps_sasdev0_devtype, 462d3c7b9a0SKenneth D. Merry buf->AttachedDeviceInfo & 0x03)); 463d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, ExpanderDevHandle, 0x%04x); 464d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, ChangeCount, %d); 465c11c484fSScott Long mps_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n", 466d3c7b9a0SKenneth D. Merry mps_describe_table(mps_linkrate_names, 467d3c7b9a0SKenneth D. Merry buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate); 468d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, PhyIdentifier, %d); 469d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d); 470d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, DiscoveryInfo, 0x%x); 471d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, AttachedPhyInfo, 0x%x); 472c11c484fSScott Long mps_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n", 473d3c7b9a0SKenneth D. Merry mps_describe_table(mps_phyinfo_reason_names, 474d3c7b9a0SKenneth D. Merry buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo); 475d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, ZoneGroup, %d); 476d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, SelfConfigStatus, 0x%x); 477d3c7b9a0SKenneth D. Merry } 478d3c7b9a0SKenneth D. Merry 479d3c7b9a0SKenneth D. Merry void 480055e2653SScott Long mps_print_sasphy0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_PHY_0 *buf) 481d3c7b9a0SKenneth D. Merry { 482d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD_START(sc, "SAS PHY Page 0"); 483d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, OwnerDevHandle, 0x%04x); 484d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x); 485d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d); 486c11c484fSScott Long mps_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n", 487d3c7b9a0SKenneth D. Merry mps_describe_table(mps_phyinfo_reason_names, 488d3c7b9a0SKenneth D. Merry buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo); 489c11c484fSScott Long mps_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n", 490d3c7b9a0SKenneth D. Merry mps_describe_table(mps_linkrate_names, 491d3c7b9a0SKenneth D. Merry (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate); 492c11c484fSScott Long mps_print_field(sc, "HwLinkRate: %s (0x%x)\n", 493d3c7b9a0SKenneth D. Merry mps_describe_table(mps_linkrate_names, 494d3c7b9a0SKenneth D. Merry (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate); 495d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, ChangeCount, %d); 496d3c7b9a0SKenneth D. Merry MPS_PRINTFIELD(sc, buf, Flags, 0x%x); 497c11c484fSScott Long mps_print_field(sc, "PhyInfo Reason: %s (0x%x)\n", 498d3c7b9a0SKenneth D. Merry mps_describe_table(mps_phyinfo_reason_names, 499d3c7b9a0SKenneth D. Merry (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo); 500c11c484fSScott Long mps_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n", 501d3c7b9a0SKenneth D. Merry mps_describe_table(mps_linkrate_names, 502d3c7b9a0SKenneth D. Merry buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate); 503d3c7b9a0SKenneth D. Merry } 504d3c7b9a0SKenneth D. Merry 505d3c7b9a0SKenneth D. Merry void 506d3c7b9a0SKenneth D. Merry mps_print_sgl(struct mps_softc *sc, struct mps_command *cm, int offset) 507d3c7b9a0SKenneth D. Merry { 508d3c7b9a0SKenneth D. Merry MPI2_SGE_SIMPLE64 *sge; 509d3c7b9a0SKenneth D. Merry MPI2_SGE_CHAIN32 *sgc; 510d3c7b9a0SKenneth D. Merry MPI2_REQUEST_HEADER *req; 511d3c7b9a0SKenneth D. Merry struct mps_chain *chain = NULL; 512d3c7b9a0SKenneth D. Merry char *frame; 513d3c7b9a0SKenneth D. Merry u_int i = 0, flags; 514d3c7b9a0SKenneth D. Merry 515d3c7b9a0SKenneth D. Merry req = (MPI2_REQUEST_HEADER *)cm->cm_req; 516d3c7b9a0SKenneth D. Merry frame = (char *)cm->cm_req; 517d3c7b9a0SKenneth D. Merry sge = (MPI2_SGE_SIMPLE64 *)&frame[offset * 4]; 518d3c7b9a0SKenneth D. Merry printf("SGL for command %p\n", cm); 519d3c7b9a0SKenneth D. Merry 52061c49b4dSAlexander Motin hexdump(frame, 128, NULL, 0); 521d3c7b9a0SKenneth D. Merry while (frame != NULL) { 52261c49b4dSAlexander Motin flags = le32toh(sge->FlagsLength) >> MPI2_SGE_FLAGS_SHIFT; 52361c49b4dSAlexander Motin printf("seg%d flags=0x%02x len=0x%06x addr=0x%016jx\n", 52461c49b4dSAlexander Motin i, flags, le32toh(sge->FlagsLength) & 0xffffff, 52561c49b4dSAlexander Motin mps_to_u64(&sge->Address)); 526d3c7b9a0SKenneth D. Merry if (flags & (MPI2_SGE_FLAGS_END_OF_LIST | 527d3c7b9a0SKenneth D. Merry MPI2_SGE_FLAGS_END_OF_BUFFER)) 528d3c7b9a0SKenneth D. Merry break; 529d3c7b9a0SKenneth D. Merry sge++; 530d3c7b9a0SKenneth D. Merry i++; 531d3c7b9a0SKenneth D. Merry if (flags & MPI2_SGE_FLAGS_LAST_ELEMENT) { 532d3c7b9a0SKenneth D. Merry sgc = (MPI2_SGE_CHAIN32 *)sge; 533d3c7b9a0SKenneth D. Merry printf("chain flags=0x%x len=0x%x Offset=0x%x " 53461c49b4dSAlexander Motin "Address=0x%x\n", sgc->Flags, le16toh(sgc->Length), 53561c49b4dSAlexander Motin sgc->NextChainOffset, le32toh(sgc->Address)); 536d3c7b9a0SKenneth D. Merry if (chain == NULL) 537d3c7b9a0SKenneth D. Merry chain = TAILQ_FIRST(&cm->cm_chain_list); 538d3c7b9a0SKenneth D. Merry else 539d3c7b9a0SKenneth D. Merry chain = TAILQ_NEXT(chain, chain_link); 540d3c7b9a0SKenneth D. Merry frame = (char *)chain->chain; 541d3c7b9a0SKenneth D. Merry sge = (MPI2_SGE_SIMPLE64 *)frame; 542d3c7b9a0SKenneth D. Merry hexdump(frame, 128, NULL, 0); 543d3c7b9a0SKenneth D. Merry } 544d3c7b9a0SKenneth D. Merry } 545d3c7b9a0SKenneth D. Merry } 546d3c7b9a0SKenneth D. Merry 547d3c7b9a0SKenneth D. Merry void 548d3c7b9a0SKenneth D. Merry mps_print_scsiio_cmd(struct mps_softc *sc, struct mps_command *cm) 549d3c7b9a0SKenneth D. Merry { 550d3c7b9a0SKenneth D. Merry MPI2_SCSI_IO_REQUEST *req; 551d3c7b9a0SKenneth D. Merry 552d3c7b9a0SKenneth D. Merry req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req; 553d3c7b9a0SKenneth D. Merry mps_print_sgl(sc, cm, req->SGLOffset0); 554d3c7b9a0SKenneth D. Merry } 555d3c7b9a0SKenneth D. Merry 556