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