1212420Sken/*- 2212420Sken * Copyright (c) 2009 Yahoo! Inc. 3212420Sken * All rights reserved. 4212420Sken * 5212420Sken * Redistribution and use in source and binary forms, with or without 6212420Sken * modification, are permitted provided that the following conditions 7212420Sken * are met: 8212420Sken * 1. Redistributions of source code must retain the above copyright 9212420Sken * notice, this list of conditions and the following disclaimer. 10212420Sken * 2. Redistributions in binary form must reproduce the above copyright 11212420Sken * notice, this list of conditions and the following disclaimer in the 12212420Sken * documentation and/or other materials provided with the distribution. 13212420Sken * 14212420Sken * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15212420Sken * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16212420Sken * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17212420Sken * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18212420Sken * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19212420Sken * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20212420Sken * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21212420Sken * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22212420Sken * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23212420Sken * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24212420Sken * SUCH DAMAGE. 25212420Sken */ 26212420Sken 27212420Sken#include <sys/cdefs.h> 28212420Sken__FBSDID("$FreeBSD: stable/10/sys/dev/mps/mps_table.c 322661 2017-08-18 15:38:08Z ken $"); 29212420Sken 30212420Sken/* Debugging tables for MPT2 */ 31212420Sken 32230592Sken/* TODO Move headers to mpsvar */ 33212420Sken#include <sys/types.h> 34212420Sken#include <sys/param.h> 35212420Sken#include <sys/systm.h> 36212420Sken#include <sys/kernel.h> 37212420Sken#include <sys/selinfo.h> 38212420Sken#include <sys/module.h> 39212420Sken#include <sys/bus.h> 40212420Sken#include <sys/conf.h> 41212420Sken#include <sys/bio.h> 42212420Sken#include <sys/malloc.h> 43212420Sken#include <sys/uio.h> 44212420Sken#include <sys/sysctl.h> 45230592Sken#include <sys/queue.h> 46230592Sken#include <sys/kthread.h> 47230592Sken#include <sys/taskqueue.h> 48212420Sken 49212420Sken#include <machine/bus.h> 50212420Sken#include <machine/resource.h> 51212420Sken#include <sys/rman.h> 52212420Sken 53212420Sken#include <cam/scsi/scsi_all.h> 54212420Sken 55212420Sken#include <dev/mps/mpi/mpi2_type.h> 56212420Sken#include <dev/mps/mpi/mpi2.h> 57212420Sken#include <dev/mps/mpi/mpi2_ioc.h> 58212420Sken#include <dev/mps/mpi/mpi2_cnfg.h> 59212420Sken#include <dev/mps/mpi/mpi2_init.h> 60230592Sken#include <dev/mps/mpi/mpi2_tool.h> 61230592Sken#include <dev/mps/mps_ioctl.h> 62212420Sken#include <dev/mps/mpsvar.h> 63212420Sken#include <dev/mps/mps_table.h> 64212420Sken 65212420Skenchar * 66212420Skenmps_describe_table(struct mps_table_lookup *table, u_int code) 67212420Sken{ 68212420Sken int i; 69212420Sken 70212420Sken for (i = 0; table[i].string != NULL; i++) { 71212420Sken if (table[i].code == code) 72212420Sken return(table[i].string); 73212420Sken } 74212420Sken return(table[i+1].string); 75212420Sken} 76212420Sken 77212420Skenstruct mps_table_lookup mps_event_names[] = { 78212420Sken {"LogData", 0x01}, 79212420Sken {"StateChange", 0x02}, 80212420Sken {"HardResetReceived", 0x05}, 81212420Sken {"EventChange", 0x0a}, 82212420Sken {"TaskSetFull", 0x0e}, 83212420Sken {"SasDeviceStatusChange", 0x0f}, 84212420Sken {"IrOperationStatus", 0x14}, 85212420Sken {"SasDiscovery", 0x16}, 86212420Sken {"SasBroadcastPrimitive", 0x17}, 87212420Sken {"SasInitDeviceStatusChange", 0x18}, 88212420Sken {"SasInitTableOverflow", 0x19}, 89212420Sken {"SasTopologyChangeList", 0x1c}, 90212420Sken {"SasEnclDeviceStatusChange", 0x1d}, 91212420Sken {"IrVolume", 0x1e}, 92212420Sken {"IrPhysicalDisk", 0x1f}, 93212420Sken {"IrConfigurationChangeList", 0x20}, 94212420Sken {"LogEntryAdded", 0x21}, 95212420Sken {"SasPhyCounter", 0x22}, 96212420Sken {"GpioInterrupt", 0x23}, 97212420Sken {"HbdPhyEvent", 0x24}, 98212420Sken {NULL, 0}, 99212420Sken {"Unknown Event", 0} 100212420Sken}; 101212420Sken 102212420Skenstruct mps_table_lookup mps_phystatus_names[] = { 103212420Sken {"NewTargetAdded", 0x01}, 104212420Sken {"TargetGone", 0x02}, 105212420Sken {"PHYLinkStatusChange", 0x03}, 106212420Sken {"PHYLinkStatusUnchanged", 0x04}, 107212420Sken {"TargetMissing", 0x05}, 108212420Sken {NULL, 0}, 109212420Sken {"Unknown Status", 0} 110212420Sken}; 111212420Sken 112212420Skenstruct mps_table_lookup mps_linkrate_names[] = { 113212420Sken {"PHY disabled", 0x01}, 114212420Sken {"Speed Negotiation Failed", 0x02}, 115212420Sken {"SATA OOB Complete", 0x03}, 116212420Sken {"SATA Port Selector", 0x04}, 117212420Sken {"SMP Reset in Progress", 0x05}, 118212420Sken {"1.5Gbps", 0x08}, 119212420Sken {"3.0Gbps", 0x09}, 120212420Sken {"6.0Gbps", 0x0a}, 121212420Sken {NULL, 0}, 122212420Sken {"LinkRate Unknown", 0x00} 123212420Sken}; 124212420Sken 125212420Skenstruct mps_table_lookup mps_sasdev0_devtype[] = { 126212420Sken {"End Device", 0x01}, 127212420Sken {"Edge Expander", 0x02}, 128212420Sken {"Fanout Expander", 0x03}, 129212420Sken {NULL, 0}, 130212420Sken {"No Device", 0x00} 131212420Sken}; 132212420Sken 133212420Skenstruct mps_table_lookup mps_phyinfo_reason_names[] = { 134212420Sken {"Power On", 0x01}, 135212420Sken {"Hard Reset", 0x02}, 136212420Sken {"SMP Phy Control Link Reset", 0x03}, 137212420Sken {"Loss DWORD Sync", 0x04}, 138212420Sken {"Multiplex Sequence", 0x05}, 139212420Sken {"I-T Nexus Loss Timer", 0x06}, 140212420Sken {"Break Timeout Timer", 0x07}, 141212420Sken {"PHY Test Function", 0x08}, 142212420Sken {NULL, 0}, 143212420Sken {"Unknown Reason", 0x00} 144212420Sken}; 145212420Sken 146212420Skenstruct mps_table_lookup mps_whoinit_names[] = { 147212420Sken {"System BIOS", 0x01}, 148212420Sken {"ROM BIOS", 0x02}, 149212420Sken {"PCI Peer", 0x03}, 150212420Sken {"Host Driver", 0x04}, 151212420Sken {"Manufacturing", 0x05}, 152212420Sken {NULL, 0}, 153212420Sken {"Not Initialized", 0x00} 154212420Sken}; 155212420Sken 156212420Skenstruct mps_table_lookup mps_sasdisc_reason[] = { 157212420Sken {"Discovery Started", 0x01}, 158212420Sken {"Discovery Complete", 0x02}, 159212420Sken {NULL, 0}, 160212420Sken {"Unknown", 0x00} 161212420Sken}; 162212420Sken 163212420Skenstruct mps_table_lookup mps_sastopo_exp[] = { 164212420Sken {"Added", 0x01}, 165212420Sken {"Not Responding", 0x02}, 166212420Sken {"Responding", 0x03}, 167212420Sken {"Delay Not Responding", 0x04}, 168212420Sken {NULL, 0}, 169212420Sken {"Unknown", 0x00} 170212420Sken}; 171212420Sken 172212420Skenstruct mps_table_lookup mps_sasdev_reason[] = { 173212420Sken {"SMART Data", 0x05}, 174212420Sken {"Unsupported", 0x07}, 175212420Sken {"Internal Device Reset", 0x08}, 176212420Sken {"Task Abort Internal", 0x09}, 177212420Sken {"Abort Task Set Internal", 0x0a}, 178212420Sken {"Clear Task Set Internal", 0x0b}, 179212420Sken {"Query Task Internal", 0x0c}, 180212420Sken {"Async Notification", 0x0d}, 181212420Sken {"Cmp Internal Device Reset", 0x0e}, 182212420Sken {"Cmp Task Abort Internal", 0x0f}, 183212420Sken {"Sata Init Failure", 0x10}, 184212420Sken {NULL, 0}, 185212420Sken {"Unknown", 0x00} 186212420Sken}; 187212420Sken 188212420Skenvoid 189212420Skenmps_describe_devinfo(uint32_t devinfo, char *string, int len) 190212420Sken{ 191212420Sken snprintf(string, len, "%b,%s", devinfo, 192212420Sken "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit" 193212420Sken "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct" 194212420Sken "\15LsiDev" "\16AtapiDev" "\17SepDev", 195212420Sken mps_describe_table(mps_sasdev0_devtype, devinfo & 0x03)); 196212420Sken} 197212420Sken 198212420Skenvoid 199322661Skenmps_print_iocfacts(struct mps_softc *sc, MPI2_IOC_FACTS_REPLY *facts) 200212420Sken{ 201212420Sken 202212420Sken MPS_PRINTFIELD_START(sc, "IOCFacts"); 203212420Sken MPS_PRINTFIELD(sc, facts, MsgVersion, 0x%x); 204212420Sken MPS_PRINTFIELD(sc, facts, HeaderVersion, 0x%x); 205212420Sken MPS_PRINTFIELD(sc, facts, IOCNumber, %d); 206212420Sken MPS_PRINTFIELD(sc, facts, IOCExceptions, 0x%x); 207212420Sken MPS_PRINTFIELD(sc, facts, MaxChainDepth, %d); 208319436Sslm mps_print_field(sc, "WhoInit: %s\n", 209212420Sken mps_describe_table(mps_whoinit_names, facts->WhoInit)); 210212420Sken MPS_PRINTFIELD(sc, facts, NumberOfPorts, %d); 211319436Sslm MPS_PRINTFIELD(sc, facts, MaxMSIxVectors, %d); 212212420Sken MPS_PRINTFIELD(sc, facts, RequestCredit, %d); 213212420Sken MPS_PRINTFIELD(sc, facts, ProductID, 0x%x); 214319436Sslm mps_print_field(sc, "IOCCapabilities: %b\n", 215212420Sken facts->IOCCapabilities, "\20" "\3ScsiTaskFull" "\4DiagTrace" 216212420Sken "\5SnapBuf" "\6ExtBuf" "\7EEDP" "\10BiDirTarg" "\11Multicast" 217212420Sken "\14TransRetry" "\15IR" "\16EventReplay" "\17RaidAccel" 218212420Sken "\20MSIXIndex" "\21HostDisc"); 219319436Sslm mps_print_field(sc, "FWVersion= %d-%d-%d-%d\n", 220212420Sken facts->FWVersion.Struct.Major, 221212420Sken facts->FWVersion.Struct.Minor, 222212420Sken facts->FWVersion.Struct.Unit, 223212420Sken facts->FWVersion.Struct.Dev); 224212420Sken MPS_PRINTFIELD(sc, facts, IOCRequestFrameSize, %d); 225212420Sken MPS_PRINTFIELD(sc, facts, MaxInitiators, %d); 226212420Sken MPS_PRINTFIELD(sc, facts, MaxTargets, %d); 227212420Sken MPS_PRINTFIELD(sc, facts, MaxSasExpanders, %d); 228212420Sken MPS_PRINTFIELD(sc, facts, MaxEnclosures, %d); 229319436Sslm mps_print_field(sc, "ProtocolFlags: %b\n", 230212420Sken facts->ProtocolFlags, "\20" "\1ScsiTarg" "\2ScsiInit"); 231212420Sken MPS_PRINTFIELD(sc, facts, HighPriorityCredit, %d); 232212420Sken MPS_PRINTFIELD(sc, facts, MaxReplyDescriptorPostQueueDepth, %d); 233212420Sken MPS_PRINTFIELD(sc, facts, ReplyFrameSize, %d); 234212420Sken MPS_PRINTFIELD(sc, facts, MaxVolumes, %d); 235212420Sken MPS_PRINTFIELD(sc, facts, MaxDevHandle, %d); 236212420Sken MPS_PRINTFIELD(sc, facts, MaxPersistentEntries, %d); 237212420Sken} 238212420Sken 239212420Skenvoid 240322661Skenmps_print_portfacts(struct mps_softc *sc, MPI2_PORT_FACTS_REPLY *facts) 241212420Sken{ 242212420Sken 243212420Sken MPS_PRINTFIELD_START(sc, "PortFacts"); 244212420Sken MPS_PRINTFIELD(sc, facts, PortNumber, %d); 245212420Sken MPS_PRINTFIELD(sc, facts, PortType, 0x%x); 246212420Sken MPS_PRINTFIELD(sc, facts, MaxPostedCmdBuffers, %d); 247212420Sken} 248212420Sken 249212420Skenvoid 250322661Skenmps_print_evt_generic(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event) 251212420Sken{ 252212420Sken 253319436Sslm MPS_PRINTFIELD_START(sc, "EventReply"); 254319436Sslm MPS_PRINTFIELD(sc, event, EventDataLength, %d); 255319436Sslm MPS_PRINTFIELD(sc, event, AckRequired, %d); 256319436Sslm mps_print_field(sc, "Event: %s (0x%x)\n", 257212420Sken mps_describe_table(mps_event_names, event->Event), event->Event); 258319436Sslm MPS_PRINTFIELD(sc, event, EventContext, 0x%x); 259212420Sken} 260212420Sken 261212420Skenvoid 262322661Skenmps_print_sasdev0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_DEV_0 *buf) 263212420Sken{ 264212420Sken MPS_PRINTFIELD_START(sc, "SAS Device Page 0"); 265212420Sken MPS_PRINTFIELD(sc, buf, Slot, %d); 266212420Sken MPS_PRINTFIELD(sc, buf, EnclosureHandle, 0x%x); 267319436Sslm mps_print_field(sc, "SASAddress: 0x%jx\n", 268212420Sken mps_to_u64(&buf->SASAddress)); 269212420Sken MPS_PRINTFIELD(sc, buf, ParentDevHandle, 0x%x); 270212420Sken MPS_PRINTFIELD(sc, buf, PhyNum, %d); 271212420Sken MPS_PRINTFIELD(sc, buf, AccessStatus, 0x%x); 272212420Sken MPS_PRINTFIELD(sc, buf, DevHandle, 0x%x); 273212420Sken MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, 0x%x); 274212420Sken MPS_PRINTFIELD(sc, buf, ZoneGroup, %d); 275319436Sslm mps_print_field(sc, "DeviceInfo: %b,%s\n", buf->DeviceInfo, 276212420Sken "\20" "\4SataHost" "\5SmpInit" "\6StpInit" "\7SspInit" 277212420Sken "\10SataDev" "\11SmpTarg" "\12StpTarg" "\13SspTarg" "\14Direct" 278212420Sken "\15LsiDev" "\16AtapiDev" "\17SepDev", 279212420Sken mps_describe_table(mps_sasdev0_devtype, buf->DeviceInfo & 0x03)); 280212420Sken MPS_PRINTFIELD(sc, buf, Flags, 0x%x); 281212420Sken MPS_PRINTFIELD(sc, buf, PhysicalPort, %d); 282212420Sken MPS_PRINTFIELD(sc, buf, MaxPortConnections, %d); 283319436Sslm mps_print_field(sc, "DeviceName: 0x%jx\n", 284212420Sken mps_to_u64(&buf->DeviceName)); 285212420Sken MPS_PRINTFIELD(sc, buf, PortGroups, %d); 286212420Sken MPS_PRINTFIELD(sc, buf, DmaGroup, %d); 287212420Sken MPS_PRINTFIELD(sc, buf, ControlGroup, %d); 288212420Sken} 289212420Sken 290212420Skenvoid 291322661Skenmps_print_evt_sas(struct mps_softc *sc, MPI2_EVENT_NOTIFICATION_REPLY *event) 292212420Sken{ 293212420Sken 294322661Sken mps_print_evt_generic(sc, event); 295212420Sken 296212420Sken switch(event->Event) { 297212420Sken case MPI2_EVENT_SAS_DISCOVERY: 298212420Sken { 299212420Sken MPI2_EVENT_DATA_SAS_DISCOVERY *data; 300212420Sken 301212420Sken data = (MPI2_EVENT_DATA_SAS_DISCOVERY *)&event->EventData; 302319436Sslm mps_print_field(sc, "Flags: %b\n", data->Flags, 303212420Sken "\20" "\1InProgress" "\2DeviceChange"); 304319436Sslm mps_print_field(sc, "ReasonCode: %s\n", 305212420Sken mps_describe_table(mps_sasdisc_reason, data->ReasonCode)); 306319436Sslm MPS_PRINTFIELD(sc, data, PhysicalPort, %d); 307319436Sslm mps_print_field(sc, "DiscoveryStatus: %b\n", 308212420Sken data->DiscoveryStatus, "\20" 309212420Sken "\1Loop" "\2UnaddressableDev" "\3DupSasAddr" "\5SmpTimeout" 310212420Sken "\6ExpRouteFull" "\7RouteIndexError" "\10SmpFailed" 311212420Sken "\11SmpCrcError" "\12SubSubLink" "\13TableTableLink" 312212420Sken "\14UnsupDevice" "\15TableSubLink" "\16MultiDomain" 313212420Sken "\17MultiSub" "\20MultiSubSub" "\34DownstreamInit" 314212420Sken "\35MaxPhys" "\36MaxTargs" "\37MaxExpanders" 315212420Sken "\40MaxEnclosures"); 316212420Sken break; 317212420Sken } 318212420Sken case MPI2_EVENT_SAS_TOPOLOGY_CHANGE_LIST: 319212420Sken { 320212420Sken MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *data; 321212420Sken MPI2_EVENT_SAS_TOPO_PHY_ENTRY *phy; 322212420Sken int i, phynum; 323212420Sken 324212420Sken data = (MPI2_EVENT_DATA_SAS_TOPOLOGY_CHANGE_LIST *) 325212420Sken &event->EventData; 326319436Sslm MPS_PRINTFIELD(sc, data, EnclosureHandle, 0x%x); 327319436Sslm MPS_PRINTFIELD(sc, data, ExpanderDevHandle, 0x%x); 328319436Sslm MPS_PRINTFIELD(sc, data, NumPhys, %d); 329319436Sslm MPS_PRINTFIELD(sc, data, NumEntries, %d); 330319436Sslm MPS_PRINTFIELD(sc, data, StartPhyNum, %d); 331319436Sslm mps_print_field(sc, "ExpStatus: %s (0x%x)\n", 332212420Sken mps_describe_table(mps_sastopo_exp, data->ExpStatus), 333212420Sken data->ExpStatus); 334319436Sslm MPS_PRINTFIELD(sc, data, PhysicalPort, %d); 335212420Sken for (i = 0; i < data->NumEntries; i++) { 336212420Sken phy = &data->PHY[i]; 337212420Sken phynum = data->StartPhyNum + i; 338319436Sslm mps_print_field(sc, 339212420Sken "PHY[%d].AttachedDevHandle: 0x%04x\n", phynum, 340212420Sken phy->AttachedDevHandle); 341319436Sslm mps_print_field(sc, 342212420Sken "PHY[%d].LinkRate: %s (0x%x)\n", phynum, 343212420Sken mps_describe_table(mps_linkrate_names, 344212420Sken (phy->LinkRate >> 4) & 0xf), phy->LinkRate); 345319436Sslm mps_print_field(sc, "PHY[%d].PhyStatus: %s\n", 346212420Sken phynum, mps_describe_table(mps_phystatus_names, 347212420Sken phy->PhyStatus)); 348212420Sken } 349212420Sken break; 350212420Sken } 351212420Sken case MPI2_EVENT_SAS_ENCL_DEVICE_STATUS_CHANGE: 352212420Sken { 353212420Sken MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *data; 354212420Sken 355212420Sken data = (MPI2_EVENT_DATA_SAS_ENCL_DEV_STATUS_CHANGE *) 356212420Sken &event->EventData; 357319436Sslm MPS_PRINTFIELD(sc, data, EnclosureHandle, 0x%x); 358319436Sslm mps_print_field(sc, "ReasonCode: %s\n", 359212420Sken mps_describe_table(mps_sastopo_exp, data->ReasonCode)); 360319436Sslm MPS_PRINTFIELD(sc, data, PhysicalPort, %d); 361319436Sslm MPS_PRINTFIELD(sc, data, NumSlots, %d); 362319436Sslm MPS_PRINTFIELD(sc, data, StartSlot, %d); 363319436Sslm MPS_PRINTFIELD(sc, data, PhyBits, 0x%x); 364212420Sken break; 365212420Sken } 366212420Sken case MPI2_EVENT_SAS_DEVICE_STATUS_CHANGE: 367212420Sken { 368212420Sken MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *data; 369212420Sken 370212420Sken data = (MPI2_EVENT_DATA_SAS_DEVICE_STATUS_CHANGE *) 371212420Sken &event->EventData; 372319436Sslm MPS_PRINTFIELD(sc, data, TaskTag, 0x%x); 373319436Sslm mps_print_field(sc, "ReasonCode: %s\n", 374212420Sken mps_describe_table(mps_sasdev_reason, data->ReasonCode)); 375319436Sslm MPS_PRINTFIELD(sc, data, ASC, 0x%x); 376319436Sslm MPS_PRINTFIELD(sc, data, ASCQ, 0x%x); 377319436Sslm MPS_PRINTFIELD(sc, data, DevHandle, 0x%x); 378319436Sslm mps_print_field(sc, "SASAddress: 0x%jx\n", 379212420Sken mps_to_u64(&data->SASAddress)); 380212420Sken } 381212420Sken default: 382212420Sken break; 383212420Sken } 384212420Sken} 385212420Sken 386212420Skenvoid 387322661Skenmps_print_expander1(struct mps_softc *sc, MPI2_CONFIG_PAGE_EXPANDER_1 *buf) 388212420Sken{ 389212420Sken MPS_PRINTFIELD_START(sc, "SAS Expander Page 1 #%d", buf->Phy); 390212420Sken MPS_PRINTFIELD(sc, buf, PhysicalPort, %d); 391212420Sken MPS_PRINTFIELD(sc, buf, NumPhys, %d); 392212420Sken MPS_PRINTFIELD(sc, buf, Phy, %d); 393212420Sken MPS_PRINTFIELD(sc, buf, NumTableEntriesProgrammed, %d); 394319436Sslm mps_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n", 395212420Sken mps_describe_table(mps_linkrate_names, 396212420Sken (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate); 397319436Sslm mps_print_field(sc, "HwLinkRate: %s (0x%x)\n", 398212420Sken mps_describe_table(mps_linkrate_names, 399212420Sken (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate); 400212420Sken MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x); 401319436Sslm mps_print_field(sc, "PhyInfo Reason: %s (0x%x)\n", 402212420Sken mps_describe_table(mps_phyinfo_reason_names, 403212420Sken (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo); 404319436Sslm mps_print_field(sc, "AttachedDeviceInfo: %b,%s\n", 405212420Sken buf->AttachedDeviceInfo, "\20" "\4SATAhost" "\5SMPinit" "\6STPinit" 406212420Sken "\7SSPinit" "\10SATAdev" "\11SMPtarg" "\12STPtarg" "\13SSPtarg" 407212420Sken "\14Direct" "\15LSIdev" "\16ATAPIdev" "\17SEPdev", 408212420Sken mps_describe_table(mps_sasdev0_devtype, 409212420Sken buf->AttachedDeviceInfo & 0x03)); 410212420Sken MPS_PRINTFIELD(sc, buf, ExpanderDevHandle, 0x%04x); 411212420Sken MPS_PRINTFIELD(sc, buf, ChangeCount, %d); 412319436Sslm mps_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n", 413212420Sken mps_describe_table(mps_linkrate_names, 414212420Sken buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate); 415212420Sken MPS_PRINTFIELD(sc, buf, PhyIdentifier, %d); 416212420Sken MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d); 417212420Sken MPS_PRINTFIELD(sc, buf, DiscoveryInfo, 0x%x); 418212420Sken MPS_PRINTFIELD(sc, buf, AttachedPhyInfo, 0x%x); 419319436Sslm mps_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n", 420212420Sken mps_describe_table(mps_phyinfo_reason_names, 421212420Sken buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo); 422212420Sken MPS_PRINTFIELD(sc, buf, ZoneGroup, %d); 423212420Sken MPS_PRINTFIELD(sc, buf, SelfConfigStatus, 0x%x); 424212420Sken} 425212420Sken 426212420Skenvoid 427322661Skenmps_print_sasphy0(struct mps_softc *sc, MPI2_CONFIG_PAGE_SAS_PHY_0 *buf) 428212420Sken{ 429212420Sken MPS_PRINTFIELD_START(sc, "SAS PHY Page 0"); 430212420Sken MPS_PRINTFIELD(sc, buf, OwnerDevHandle, 0x%04x); 431212420Sken MPS_PRINTFIELD(sc, buf, AttachedDevHandle, 0x%04x); 432212420Sken MPS_PRINTFIELD(sc, buf, AttachedPhyIdentifier, %d); 433319436Sslm mps_print_field(sc, "AttachedPhyInfo Reason: %s (0x%x)\n", 434212420Sken mps_describe_table(mps_phyinfo_reason_names, 435212420Sken buf->AttachedPhyInfo & 0xf), buf->AttachedPhyInfo); 436319436Sslm mps_print_field(sc, "ProgrammedLinkRate: %s (0x%x)\n", 437212420Sken mps_describe_table(mps_linkrate_names, 438212420Sken (buf->ProgrammedLinkRate >> 4) & 0xf), buf->ProgrammedLinkRate); 439319436Sslm mps_print_field(sc, "HwLinkRate: %s (0x%x)\n", 440212420Sken mps_describe_table(mps_linkrate_names, 441212420Sken (buf->HwLinkRate >> 4) & 0xf), buf->HwLinkRate); 442212420Sken MPS_PRINTFIELD(sc, buf, ChangeCount, %d); 443212420Sken MPS_PRINTFIELD(sc, buf, Flags, 0x%x); 444319436Sslm mps_print_field(sc, "PhyInfo Reason: %s (0x%x)\n", 445212420Sken mps_describe_table(mps_phyinfo_reason_names, 446212420Sken (buf->PhyInfo >> 16) & 0xf), buf->PhyInfo); 447319436Sslm mps_print_field(sc, "NegotiatedLinkRate: %s (0x%x)\n", 448212420Sken mps_describe_table(mps_linkrate_names, 449212420Sken buf->NegotiatedLinkRate & 0xf), buf->NegotiatedLinkRate); 450212420Sken} 451212420Sken 452212420Skenvoid 453212420Skenmps_print_sgl(struct mps_softc *sc, struct mps_command *cm, int offset) 454212420Sken{ 455212420Sken MPI2_SGE_SIMPLE64 *sge; 456212420Sken MPI2_SGE_CHAIN32 *sgc; 457212420Sken MPI2_REQUEST_HEADER *req; 458212420Sken struct mps_chain *chain = NULL; 459212420Sken char *frame; 460212420Sken u_int i = 0, flags; 461212420Sken 462212420Sken req = (MPI2_REQUEST_HEADER *)cm->cm_req; 463212420Sken frame = (char *)cm->cm_req; 464212420Sken sge = (MPI2_SGE_SIMPLE64 *)&frame[offset * 4]; 465212420Sken printf("SGL for command %p\n", cm); 466212420Sken 467238974Smav hexdump(frame, 128, NULL, 0); 468212420Sken while (frame != NULL) { 469238974Smav flags = le32toh(sge->FlagsLength) >> MPI2_SGE_FLAGS_SHIFT; 470238974Smav printf("seg%d flags=0x%02x len=0x%06x addr=0x%016jx\n", 471238974Smav i, flags, le32toh(sge->FlagsLength) & 0xffffff, 472238974Smav mps_to_u64(&sge->Address)); 473212420Sken if (flags & (MPI2_SGE_FLAGS_END_OF_LIST | 474212420Sken MPI2_SGE_FLAGS_END_OF_BUFFER)) 475212420Sken break; 476212420Sken sge++; 477212420Sken i++; 478212420Sken if (flags & MPI2_SGE_FLAGS_LAST_ELEMENT) { 479212420Sken sgc = (MPI2_SGE_CHAIN32 *)sge; 480212420Sken printf("chain flags=0x%x len=0x%x Offset=0x%x " 481238974Smav "Address=0x%x\n", sgc->Flags, le16toh(sgc->Length), 482238974Smav sgc->NextChainOffset, le32toh(sgc->Address)); 483212420Sken if (chain == NULL) 484212420Sken chain = TAILQ_FIRST(&cm->cm_chain_list); 485212420Sken else 486212420Sken chain = TAILQ_NEXT(chain, chain_link); 487212420Sken frame = (char *)chain->chain; 488212420Sken sge = (MPI2_SGE_SIMPLE64 *)frame; 489212420Sken hexdump(frame, 128, NULL, 0); 490212420Sken } 491212420Sken } 492212420Sken} 493212420Sken 494212420Skenvoid 495212420Skenmps_print_scsiio_cmd(struct mps_softc *sc, struct mps_command *cm) 496212420Sken{ 497212420Sken MPI2_SCSI_IO_REQUEST *req; 498212420Sken 499212420Sken req = (MPI2_SCSI_IO_REQUEST *)cm->cm_req; 500212420Sken mps_print_sgl(sc, cm, req->SGLOffset0); 501212420Sken} 502212420Sken 503