1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2004-2008 LSI Corporation. 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * 6*4882a593Smuzhiyun * Name: mpi_sas.h 7*4882a593Smuzhiyun * Title: MPI Serial Attached SCSI structures and definitions 8*4882a593Smuzhiyun * Creation Date: August 19, 2004 9*4882a593Smuzhiyun * 10*4882a593Smuzhiyun * mpi_sas.h Version: 01.05.05 11*4882a593Smuzhiyun * 12*4882a593Smuzhiyun * Version History 13*4882a593Smuzhiyun * --------------- 14*4882a593Smuzhiyun * 15*4882a593Smuzhiyun * Date Version Description 16*4882a593Smuzhiyun * -------- -------- ------------------------------------------------------ 17*4882a593Smuzhiyun * 08-19-04 01.05.01 Original release. 18*4882a593Smuzhiyun * 08-30-05 01.05.02 Added DeviceInfo bit for SEP. 19*4882a593Smuzhiyun * Added PrimFlags and Primitive field to SAS IO Unit 20*4882a593Smuzhiyun * Control request, and added a new operation code. 21*4882a593Smuzhiyun * 03-27-06 01.05.03 Added Force Full Discovery, Transmit Port Select Signal, 22*4882a593Smuzhiyun * and Remove Device operations to SAS IO Unit Control. 23*4882a593Smuzhiyun * Added DevHandle field to SAS IO Unit Control request and 24*4882a593Smuzhiyun * reply. 25*4882a593Smuzhiyun * 10-11-06 01.05.04 Fixed the name of a define for Operation field of SAS IO 26*4882a593Smuzhiyun * Unit Control request. 27*4882a593Smuzhiyun * 01-15-08 01.05.05 Added support for MPI_SAS_OP_SET_IOC_PARAMETER, 28*4882a593Smuzhiyun * including adding IOCParameter and IOCParameter value 29*4882a593Smuzhiyun * fields to SAS IO Unit Control Request. 30*4882a593Smuzhiyun * Added MPI_SAS_DEVICE_INFO_PRODUCT_SPECIFIC define. 31*4882a593Smuzhiyun * -------------------------------------------------------------------------- 32*4882a593Smuzhiyun */ 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #ifndef MPI_SAS_H 35*4882a593Smuzhiyun #define MPI_SAS_H 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun /* 39*4882a593Smuzhiyun * Values for SASStatus. 40*4882a593Smuzhiyun */ 41*4882a593Smuzhiyun #define MPI_SASSTATUS_SUCCESS (0x00) 42*4882a593Smuzhiyun #define MPI_SASSTATUS_UNKNOWN_ERROR (0x01) 43*4882a593Smuzhiyun #define MPI_SASSTATUS_INVALID_FRAME (0x02) 44*4882a593Smuzhiyun #define MPI_SASSTATUS_UTC_BAD_DEST (0x03) 45*4882a593Smuzhiyun #define MPI_SASSTATUS_UTC_BREAK_RECEIVED (0x04) 46*4882a593Smuzhiyun #define MPI_SASSTATUS_UTC_CONNECT_RATE_NOT_SUPPORTED (0x05) 47*4882a593Smuzhiyun #define MPI_SASSTATUS_UTC_PORT_LAYER_REQUEST (0x06) 48*4882a593Smuzhiyun #define MPI_SASSTATUS_UTC_PROTOCOL_NOT_SUPPORTED (0x07) 49*4882a593Smuzhiyun #define MPI_SASSTATUS_UTC_STP_RESOURCES_BUSY (0x08) 50*4882a593Smuzhiyun #define MPI_SASSTATUS_UTC_WRONG_DESTINATION (0x09) 51*4882a593Smuzhiyun #define MPI_SASSTATUS_SHORT_INFORMATION_UNIT (0x0A) 52*4882a593Smuzhiyun #define MPI_SASSTATUS_LONG_INFORMATION_UNIT (0x0B) 53*4882a593Smuzhiyun #define MPI_SASSTATUS_XFER_RDY_INCORRECT_WRITE_DATA (0x0C) 54*4882a593Smuzhiyun #define MPI_SASSTATUS_XFER_RDY_REQUEST_OFFSET_ERROR (0x0D) 55*4882a593Smuzhiyun #define MPI_SASSTATUS_XFER_RDY_NOT_EXPECTED (0x0E) 56*4882a593Smuzhiyun #define MPI_SASSTATUS_DATA_INCORRECT_DATA_LENGTH (0x0F) 57*4882a593Smuzhiyun #define MPI_SASSTATUS_DATA_TOO_MUCH_READ_DATA (0x10) 58*4882a593Smuzhiyun #define MPI_SASSTATUS_DATA_OFFSET_ERROR (0x11) 59*4882a593Smuzhiyun #define MPI_SASSTATUS_SDSF_NAK_RECEIVED (0x12) 60*4882a593Smuzhiyun #define MPI_SASSTATUS_SDSF_CONNECTION_FAILED (0x13) 61*4882a593Smuzhiyun #define MPI_SASSTATUS_INITIATOR_RESPONSE_TIMEOUT (0x14) 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun /* 65*4882a593Smuzhiyun * Values for the SAS DeviceInfo field used in SAS Device Status Change Event 66*4882a593Smuzhiyun * data and SAS IO Unit Configuration pages. 67*4882a593Smuzhiyun */ 68*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_PRODUCT_SPECIFIC (0xF0000000) 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_SEP (0x00004000) 71*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_ATAPI_DEVICE (0x00002000) 72*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_LSI_DEVICE (0x00001000) 73*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_DIRECT_ATTACH (0x00000800) 74*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_SSP_TARGET (0x00000400) 75*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_STP_TARGET (0x00000200) 76*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_SMP_TARGET (0x00000100) 77*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_SATA_DEVICE (0x00000080) 78*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_SSP_INITIATOR (0x00000040) 79*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_STP_INITIATOR (0x00000020) 80*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_SMP_INITIATOR (0x00000010) 81*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_SATA_HOST (0x00000008) 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_MASK_DEVICE_TYPE (0x00000007) 84*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_NO_DEVICE (0x00000000) 85*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_END_DEVICE (0x00000001) 86*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_EDGE_EXPANDER (0x00000002) 87*4882a593Smuzhiyun #define MPI_SAS_DEVICE_INFO_FANOUT_EXPANDER (0x00000003) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun /***************************************************************************** 92*4882a593Smuzhiyun * 93*4882a593Smuzhiyun * S e r i a l A t t a c h e d S C S I M e s s a g e s 94*4882a593Smuzhiyun * 95*4882a593Smuzhiyun *****************************************************************************/ 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun /****************************************************************************/ 98*4882a593Smuzhiyun /* Serial Management Protocol Passthrough Request */ 99*4882a593Smuzhiyun /****************************************************************************/ 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun typedef struct _MSG_SMP_PASSTHROUGH_REQUEST 102*4882a593Smuzhiyun { 103*4882a593Smuzhiyun U8 PassthroughFlags; /* 00h */ 104*4882a593Smuzhiyun U8 PhysicalPort; /* 01h */ 105*4882a593Smuzhiyun U8 ChainOffset; /* 02h */ 106*4882a593Smuzhiyun U8 Function; /* 03h */ 107*4882a593Smuzhiyun U16 RequestDataLength; /* 04h */ 108*4882a593Smuzhiyun U8 ConnectionRate; /* 06h */ 109*4882a593Smuzhiyun U8 MsgFlags; /* 07h */ 110*4882a593Smuzhiyun U32 MsgContext; /* 08h */ 111*4882a593Smuzhiyun U32 Reserved1; /* 0Ch */ 112*4882a593Smuzhiyun U64 SASAddress; /* 10h */ 113*4882a593Smuzhiyun U32 Reserved2; /* 18h */ 114*4882a593Smuzhiyun U32 Reserved3; /* 1Ch */ 115*4882a593Smuzhiyun SGE_SIMPLE_UNION SGL; /* 20h */ 116*4882a593Smuzhiyun } MSG_SMP_PASSTHROUGH_REQUEST, MPI_POINTER PTR_MSG_SMP_PASSTHROUGH_REQUEST, 117*4882a593Smuzhiyun SmpPassthroughRequest_t, MPI_POINTER pSmpPassthroughRequest_t; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* values for PassthroughFlags field */ 120*4882a593Smuzhiyun #define MPI_SMP_PT_REQ_PT_FLAGS_IMMEDIATE (0x80) 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun /* values for ConnectionRate field */ 123*4882a593Smuzhiyun #define MPI_SMP_PT_REQ_CONNECT_RATE_NEGOTIATED (0x00) 124*4882a593Smuzhiyun #define MPI_SMP_PT_REQ_CONNECT_RATE_1_5 (0x08) 125*4882a593Smuzhiyun #define MPI_SMP_PT_REQ_CONNECT_RATE_3_0 (0x09) 126*4882a593Smuzhiyun 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun /* Serial Management Protocol Passthrough Reply */ 129*4882a593Smuzhiyun typedef struct _MSG_SMP_PASSTHROUGH_REPLY 130*4882a593Smuzhiyun { 131*4882a593Smuzhiyun U8 PassthroughFlags; /* 00h */ 132*4882a593Smuzhiyun U8 PhysicalPort; /* 01h */ 133*4882a593Smuzhiyun U8 MsgLength; /* 02h */ 134*4882a593Smuzhiyun U8 Function; /* 03h */ 135*4882a593Smuzhiyun U16 ResponseDataLength; /* 04h */ 136*4882a593Smuzhiyun U8 Reserved1; /* 06h */ 137*4882a593Smuzhiyun U8 MsgFlags; /* 07h */ 138*4882a593Smuzhiyun U32 MsgContext; /* 08h */ 139*4882a593Smuzhiyun U8 Reserved2; /* 0Ch */ 140*4882a593Smuzhiyun U8 SASStatus; /* 0Dh */ 141*4882a593Smuzhiyun U16 IOCStatus; /* 0Eh */ 142*4882a593Smuzhiyun U32 IOCLogInfo; /* 10h */ 143*4882a593Smuzhiyun U32 Reserved3; /* 14h */ 144*4882a593Smuzhiyun U8 ResponseData[4]; /* 18h */ 145*4882a593Smuzhiyun } MSG_SMP_PASSTHROUGH_REPLY, MPI_POINTER PTR_MSG_SMP_PASSTHROUGH_REPLY, 146*4882a593Smuzhiyun SmpPassthroughReply_t, MPI_POINTER pSmpPassthroughReply_t; 147*4882a593Smuzhiyun 148*4882a593Smuzhiyun #define MPI_SMP_PT_REPLY_PT_FLAGS_IMMEDIATE (0x80) 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun 151*4882a593Smuzhiyun /****************************************************************************/ 152*4882a593Smuzhiyun /* SATA Passthrough Request */ 153*4882a593Smuzhiyun /****************************************************************************/ 154*4882a593Smuzhiyun 155*4882a593Smuzhiyun typedef struct _MSG_SATA_PASSTHROUGH_REQUEST 156*4882a593Smuzhiyun { 157*4882a593Smuzhiyun U8 TargetID; /* 00h */ 158*4882a593Smuzhiyun U8 Bus; /* 01h */ 159*4882a593Smuzhiyun U8 ChainOffset; /* 02h */ 160*4882a593Smuzhiyun U8 Function; /* 03h */ 161*4882a593Smuzhiyun U16 PassthroughFlags; /* 04h */ 162*4882a593Smuzhiyun U8 ConnectionRate; /* 06h */ 163*4882a593Smuzhiyun U8 MsgFlags; /* 07h */ 164*4882a593Smuzhiyun U32 MsgContext; /* 08h */ 165*4882a593Smuzhiyun U32 Reserved1; /* 0Ch */ 166*4882a593Smuzhiyun U32 Reserved2; /* 10h */ 167*4882a593Smuzhiyun U32 Reserved3; /* 14h */ 168*4882a593Smuzhiyun U32 DataLength; /* 18h */ 169*4882a593Smuzhiyun U8 CommandFIS[20]; /* 1Ch */ 170*4882a593Smuzhiyun SGE_SIMPLE_UNION SGL; /* 30h */ 171*4882a593Smuzhiyun } MSG_SATA_PASSTHROUGH_REQUEST, MPI_POINTER PTR_MSG_SATA_PASSTHROUGH_REQUEST, 172*4882a593Smuzhiyun SataPassthroughRequest_t, MPI_POINTER pSataPassthroughRequest_t; 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun /* values for PassthroughFlags field */ 175*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_RESET_DEVICE (0x0200) 176*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_EXECUTE_DIAG (0x0100) 177*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_DMA_QUEUED (0x0080) 178*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_PACKET_COMMAND (0x0040) 179*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_DMA (0x0020) 180*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_PIO (0x0010) 181*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_UNSPECIFIED_VU (0x0004) 182*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_WRITE (0x0002) 183*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_PT_FLAGS_READ (0x0001) 184*4882a593Smuzhiyun 185*4882a593Smuzhiyun /* values for ConnectionRate field */ 186*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_CONNECT_RATE_NEGOTIATED (0x00) 187*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_CONNECT_RATE_1_5 (0x08) 188*4882a593Smuzhiyun #define MPI_SATA_PT_REQ_CONNECT_RATE_3_0 (0x09) 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun 191*4882a593Smuzhiyun /* SATA Passthrough Reply */ 192*4882a593Smuzhiyun typedef struct _MSG_SATA_PASSTHROUGH_REPLY 193*4882a593Smuzhiyun { 194*4882a593Smuzhiyun U8 TargetID; /* 00h */ 195*4882a593Smuzhiyun U8 Bus; /* 01h */ 196*4882a593Smuzhiyun U8 MsgLength; /* 02h */ 197*4882a593Smuzhiyun U8 Function; /* 03h */ 198*4882a593Smuzhiyun U16 PassthroughFlags; /* 04h */ 199*4882a593Smuzhiyun U8 Reserved1; /* 06h */ 200*4882a593Smuzhiyun U8 MsgFlags; /* 07h */ 201*4882a593Smuzhiyun U32 MsgContext; /* 08h */ 202*4882a593Smuzhiyun U8 Reserved2; /* 0Ch */ 203*4882a593Smuzhiyun U8 SASStatus; /* 0Dh */ 204*4882a593Smuzhiyun U16 IOCStatus; /* 0Eh */ 205*4882a593Smuzhiyun U32 IOCLogInfo; /* 10h */ 206*4882a593Smuzhiyun U8 StatusFIS[20]; /* 14h */ 207*4882a593Smuzhiyun U32 StatusControlRegisters; /* 28h */ 208*4882a593Smuzhiyun U32 TransferCount; /* 2Ch */ 209*4882a593Smuzhiyun } MSG_SATA_PASSTHROUGH_REPLY, MPI_POINTER PTR_MSG_SATA_PASSTHROUGH_REPLY, 210*4882a593Smuzhiyun SataPassthroughReply_t, MPI_POINTER pSataPassthroughReply_t; 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun /****************************************************************************/ 216*4882a593Smuzhiyun /* SAS IO Unit Control Request */ 217*4882a593Smuzhiyun /****************************************************************************/ 218*4882a593Smuzhiyun 219*4882a593Smuzhiyun typedef struct _MSG_SAS_IOUNIT_CONTROL_REQUEST 220*4882a593Smuzhiyun { 221*4882a593Smuzhiyun U8 Operation; /* 00h */ 222*4882a593Smuzhiyun U8 Reserved1; /* 01h */ 223*4882a593Smuzhiyun U8 ChainOffset; /* 02h */ 224*4882a593Smuzhiyun U8 Function; /* 03h */ 225*4882a593Smuzhiyun U16 DevHandle; /* 04h */ 226*4882a593Smuzhiyun U8 IOCParameter; /* 06h */ 227*4882a593Smuzhiyun U8 MsgFlags; /* 07h */ 228*4882a593Smuzhiyun U32 MsgContext; /* 08h */ 229*4882a593Smuzhiyun U8 TargetID; /* 0Ch */ 230*4882a593Smuzhiyun U8 Bus; /* 0Dh */ 231*4882a593Smuzhiyun U8 PhyNum; /* 0Eh */ 232*4882a593Smuzhiyun U8 PrimFlags; /* 0Fh */ 233*4882a593Smuzhiyun U32 Primitive; /* 10h */ 234*4882a593Smuzhiyun U64 SASAddress; /* 14h */ 235*4882a593Smuzhiyun U32 IOCParameterValue; /* 1Ch */ 236*4882a593Smuzhiyun } MSG_SAS_IOUNIT_CONTROL_REQUEST, MPI_POINTER PTR_MSG_SAS_IOUNIT_CONTROL_REQUEST, 237*4882a593Smuzhiyun SasIoUnitControlRequest_t, MPI_POINTER pSasIoUnitControlRequest_t; 238*4882a593Smuzhiyun 239*4882a593Smuzhiyun /* values for the Operation field */ 240*4882a593Smuzhiyun #define MPI_SAS_OP_CLEAR_NOT_PRESENT (0x01) 241*4882a593Smuzhiyun #define MPI_SAS_OP_CLEAR_ALL_PERSISTENT (0x02) 242*4882a593Smuzhiyun #define MPI_SAS_OP_PHY_LINK_RESET (0x06) 243*4882a593Smuzhiyun #define MPI_SAS_OP_PHY_HARD_RESET (0x07) 244*4882a593Smuzhiyun #define MPI_SAS_OP_PHY_CLEAR_ERROR_LOG (0x08) 245*4882a593Smuzhiyun #define MPI_SAS_OP_MAP_CURRENT (0x09) 246*4882a593Smuzhiyun #define MPI_SAS_OP_SEND_PRIMITIVE (0x0A) 247*4882a593Smuzhiyun #define MPI_SAS_OP_FORCE_FULL_DISCOVERY (0x0B) 248*4882a593Smuzhiyun #define MPI_SAS_OP_TRANSMIT_PORT_SELECT_SIGNAL (0x0C) 249*4882a593Smuzhiyun #define MPI_SAS_OP_TRANSMIT_REMOVE_DEVICE (0x0D) /* obsolete name */ 250*4882a593Smuzhiyun #define MPI_SAS_OP_REMOVE_DEVICE (0x0D) 251*4882a593Smuzhiyun #define MPI_SAS_OP_SET_IOC_PARAMETER (0x0E) 252*4882a593Smuzhiyun #define MPI_SAS_OP_PRODUCT_SPECIFIC_MIN (0x80) 253*4882a593Smuzhiyun 254*4882a593Smuzhiyun /* values for the PrimFlags field */ 255*4882a593Smuzhiyun #define MPI_SAS_PRIMFLAGS_SINGLE (0x08) 256*4882a593Smuzhiyun #define MPI_SAS_PRIMFLAGS_TRIPLE (0x02) 257*4882a593Smuzhiyun #define MPI_SAS_PRIMFLAGS_REDUNDANT (0x01) 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun /* SAS IO Unit Control Reply */ 261*4882a593Smuzhiyun typedef struct _MSG_SAS_IOUNIT_CONTROL_REPLY 262*4882a593Smuzhiyun { 263*4882a593Smuzhiyun U8 Operation; /* 00h */ 264*4882a593Smuzhiyun U8 Reserved1; /* 01h */ 265*4882a593Smuzhiyun U8 MsgLength; /* 02h */ 266*4882a593Smuzhiyun U8 Function; /* 03h */ 267*4882a593Smuzhiyun U16 DevHandle; /* 04h */ 268*4882a593Smuzhiyun U8 IOCParameter; /* 06h */ 269*4882a593Smuzhiyun U8 MsgFlags; /* 07h */ 270*4882a593Smuzhiyun U32 MsgContext; /* 08h */ 271*4882a593Smuzhiyun U16 Reserved4; /* 0Ch */ 272*4882a593Smuzhiyun U16 IOCStatus; /* 0Eh */ 273*4882a593Smuzhiyun U32 IOCLogInfo; /* 10h */ 274*4882a593Smuzhiyun } MSG_SAS_IOUNIT_CONTROL_REPLY, MPI_POINTER PTR_MSG_SAS_IOUNIT_CONTROL_REPLY, 275*4882a593Smuzhiyun SasIoUnitControlReply_t, MPI_POINTER pSasIoUnitControlReply_t; 276*4882a593Smuzhiyun 277*4882a593Smuzhiyun #endif 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun 280