1*4e1bc9a0SAchim Leubner /******************************************************************************* 2*4e1bc9a0SAchim Leubner ** 3*4e1bc9a0SAchim Leubner * Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 4*4e1bc9a0SAchim Leubner * 5*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided 6*4e1bc9a0SAchim Leubner *that the following conditions are met: 7*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 8*4e1bc9a0SAchim Leubner *following disclaimer. 9*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice, 10*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided 11*4e1bc9a0SAchim Leubner *with the distribution. 12*4e1bc9a0SAchim Leubner * 13*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 14*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 15*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 16*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 17*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 18*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 19*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 20*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 21*4e1bc9a0SAchim Leubner ** 22*4e1bc9a0SAchim Leubner * 23*4e1bc9a0SAchim Leubner ********************************************************************************/ 24*4e1bc9a0SAchim Leubner #ifndef __DMDEFS_H__ 25*4e1bc9a0SAchim Leubner #define __DMDEFS_H__ 26*4e1bc9a0SAchim Leubner 27*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/ossa.h> 28*4e1bc9a0SAchim Leubner 29*4e1bc9a0SAchim Leubner #define DIRECT_SMP 30*4e1bc9a0SAchim Leubner //#undef DIRECT_SMP 31*4e1bc9a0SAchim Leubner 32*4e1bc9a0SAchim Leubner /* the index for memory requirement, must be continious */ 33*4e1bc9a0SAchim Leubner #define DM_ROOT_MEM_INDEX 0 /**< the index of dm root memory */ 34*4e1bc9a0SAchim Leubner #define DM_PORT_MEM_INDEX 1 /**< the index of port context memory */ 35*4e1bc9a0SAchim Leubner #define DM_DEVICE_MEM_INDEX 2 /**< the index of Device descriptors memory */ 36*4e1bc9a0SAchim Leubner #define DM_EXPANDER_MEM_INDEX 3 /**< the index of Expander device descriptors memory */ 37*4e1bc9a0SAchim Leubner #define DM_SMP_MEM_INDEX 4 /**< the index of SMP command descriptors memory */ 38*4e1bc9a0SAchim Leubner #define DM_INDIRECT_SMP_MEM_INDEX 5 /**< the index of Indirect SMP command descriptors memory */ 39*4e1bc9a0SAchim Leubner 40*4e1bc9a0SAchim Leubner 41*4e1bc9a0SAchim Leubner 42*4e1bc9a0SAchim Leubner #define DM_MAX_NUM_PHYS 16 43*4e1bc9a0SAchim Leubner #define DM_MAX_EXPANDER_PHYS 256 44*4e1bc9a0SAchim Leubner #define DM_MAX_DEV 2048 45*4e1bc9a0SAchim Leubner #define DM_MAX_EXPANDER_DEV 32 46*4e1bc9a0SAchim Leubner #define DM_MAX_PORT_CONTEXT 16 47*4e1bc9a0SAchim Leubner #define DM_MAX_SMP 32 48*4e1bc9a0SAchim Leubner #define DM_MAX_INDIRECT_SMP DM_MAX_SMP 49*4e1bc9a0SAchim Leubner 50*4e1bc9a0SAchim Leubner #define DM_USECS_PER_TICK 1000000 /**< defines the heart beat of the LL layer 10ms */ 51*4e1bc9a0SAchim Leubner 52*4e1bc9a0SAchim Leubner /* 53*4e1bc9a0SAchim Leubner * FIS type 54*4e1bc9a0SAchim Leubner */ 55*4e1bc9a0SAchim Leubner #define PIO_SETUP_DEV_TO_HOST_FIS 0x5F 56*4e1bc9a0SAchim Leubner #define REG_DEV_TO_HOST_FIS 0x34 57*4e1bc9a0SAchim Leubner #define SET_DEV_BITS_FIS 0xA1 58*4e1bc9a0SAchim Leubner 59*4e1bc9a0SAchim Leubner #define DEFAULT_KEY_BUFFER_SIZE 64 60*4e1bc9a0SAchim Leubner 61*4e1bc9a0SAchim Leubner enum dm_locks_e 62*4e1bc9a0SAchim Leubner { 63*4e1bc9a0SAchim Leubner DM_PORT_LOCK = 0, 64*4e1bc9a0SAchim Leubner DM_DEVICE_LOCK, 65*4e1bc9a0SAchim Leubner DM_EXPANDER_LOCK, 66*4e1bc9a0SAchim Leubner DM_TIMER_LOCK, 67*4e1bc9a0SAchim Leubner DM_SMP_LOCK, 68*4e1bc9a0SAchim Leubner DM_MAX_LOCKS 69*4e1bc9a0SAchim Leubner }; 70*4e1bc9a0SAchim Leubner /* default SMP timeout: 0xFFFF is the Maximum Allowed */ 71*4e1bc9a0SAchim Leubner #define DEFAULT_SMP_TIMEOUT 0xFFFF 72*4e1bc9a0SAchim Leubner 73*4e1bc9a0SAchim Leubner /* SMP direct payload size limit: IOMB direct payload size = 48 */ 74*4e1bc9a0SAchim Leubner #define SMP_DIRECT_PAYLOAD_LIMIT 44 75*4e1bc9a0SAchim Leubner 76*4e1bc9a0SAchim Leubner #define SMP_INDIRECT_PAYLOAD 512 77*4e1bc9a0SAchim Leubner 78*4e1bc9a0SAchim Leubner /* SMP maximum payload size allowed by SAS spec withtout CRC 4 bytes */ 79*4e1bc9a0SAchim Leubner #define SMP_MAXIMUM_PAYLOAD 1024 80*4e1bc9a0SAchim Leubner 81*4e1bc9a0SAchim Leubner /*! \def MIN(a,b) 82*4e1bc9a0SAchim Leubner * \brief MIN macro 83*4e1bc9a0SAchim Leubner * 84*4e1bc9a0SAchim Leubner * use to find MIN of two values 85*4e1bc9a0SAchim Leubner */ 86*4e1bc9a0SAchim Leubner #ifndef MIN 87*4e1bc9a0SAchim Leubner #define MIN(a,b) ((a) < (b) ? (a) : (b)) 88*4e1bc9a0SAchim Leubner #endif 89*4e1bc9a0SAchim Leubner 90*4e1bc9a0SAchim Leubner /*! \def MAX(a,b) 91*4e1bc9a0SAchim Leubner * \brief MAX macro 92*4e1bc9a0SAchim Leubner * 93*4e1bc9a0SAchim Leubner * use to find MAX of two values 94*4e1bc9a0SAchim Leubner */ 95*4e1bc9a0SAchim Leubner #ifndef MAX 96*4e1bc9a0SAchim Leubner #define MAX(a,b) ((a) < (b) ? (b) : (a)) 97*4e1bc9a0SAchim Leubner #endif 98*4e1bc9a0SAchim Leubner 99*4e1bc9a0SAchim Leubner #ifndef agNULL 100*4e1bc9a0SAchim Leubner #define agNULL ((void *)0) 101*4e1bc9a0SAchim Leubner #endif 102*4e1bc9a0SAchim Leubner 103*4e1bc9a0SAchim Leubner /* for debugging print */ 104*4e1bc9a0SAchim Leubner #if defined(DM_DEBUG) 105*4e1bc9a0SAchim Leubner 106*4e1bc9a0SAchim Leubner /* 107*4e1bc9a0SAchim Leubner * for debugging purposes. 108*4e1bc9a0SAchim Leubner */ 109*4e1bc9a0SAchim Leubner extern bit32 gDMDebugLevel; 110*4e1bc9a0SAchim Leubner 111*4e1bc9a0SAchim Leubner #define DM_DBG0(format) tddmLogDebugString(gDMDebugLevel, 0, format) 112*4e1bc9a0SAchim Leubner #define DM_DBG1(format) tddmLogDebugString(gDMDebugLevel, 1, format) 113*4e1bc9a0SAchim Leubner #define DM_DBG2(format) tddmLogDebugString(gDMDebugLevel, 2, format) 114*4e1bc9a0SAchim Leubner #define DM_DBG3(format) tddmLogDebugString(gDMDebugLevel, 3, format) 115*4e1bc9a0SAchim Leubner #define DM_DBG4(format) tddmLogDebugString(gDMDebugLevel, 4, format) 116*4e1bc9a0SAchim Leubner #define DM_DBG5(format) tddmLogDebugString(gDMDebugLevel, 5, format) 117*4e1bc9a0SAchim Leubner #define DM_DBG6(format) tddmLogDebugString(gDMDebugLevel, 6, format) 118*4e1bc9a0SAchim Leubner 119*4e1bc9a0SAchim Leubner 120*4e1bc9a0SAchim Leubner #else 121*4e1bc9a0SAchim Leubner 122*4e1bc9a0SAchim Leubner #define DM_DBG0(format) 123*4e1bc9a0SAchim Leubner #define DM_DBG1(format) 124*4e1bc9a0SAchim Leubner #define DM_DBG2(format) 125*4e1bc9a0SAchim Leubner #define DM_DBG3(format) 126*4e1bc9a0SAchim Leubner #define DM_DBG4(format) 127*4e1bc9a0SAchim Leubner #define DM_DBG5(format) 128*4e1bc9a0SAchim Leubner #define DM_DBG6(format) 129*4e1bc9a0SAchim Leubner 130*4e1bc9a0SAchim Leubner #endif /* DM_DEBUG */ 131*4e1bc9a0SAchim Leubner 132*4e1bc9a0SAchim Leubner //#define DM_ASSERT OS_ASSERT 133*4e1bc9a0SAchim Leubner //#define tddmLogDebugString TIDEBUG_MSG 134*4e1bc9a0SAchim Leubner 135*4e1bc9a0SAchim Leubner /* discovery related state */ 136*4e1bc9a0SAchim Leubner #define DM_DSTATE_NOT_STARTED 0 137*4e1bc9a0SAchim Leubner #define DM_DSTATE_STARTED 1 138*4e1bc9a0SAchim Leubner #define DM_DSTATE_COMPLETED 2 139*4e1bc9a0SAchim Leubner #define DM_DSTATE_COMPLETED_WITH_FAILURE 3 140*4e1bc9a0SAchim Leubner 141*4e1bc9a0SAchim Leubner /* SAS/SATA discovery status */ 142*4e1bc9a0SAchim Leubner #define DISCOVERY_NOT_START 0 /**< status indicates discovery not started */ 143*4e1bc9a0SAchim Leubner #define DISCOVERY_UP_STREAM 1 /**< status indicates discover upstream */ 144*4e1bc9a0SAchim Leubner #define DISCOVERY_DOWN_STREAM 2 /**< status indicates discover downstream */ 145*4e1bc9a0SAchim Leubner #define DISCOVERY_CONFIG_ROUTING 3 /**< status indicates discovery config routing table */ 146*4e1bc9a0SAchim Leubner #define DISCOVERY_SAS_DONE 4 /**< status indicates discovery done */ 147*4e1bc9a0SAchim Leubner #define DISCOVERY_REPORT_PHY_SATA 5 /**< status indicates discovery report phy sata */ 148*4e1bc9a0SAchim Leubner 149*4e1bc9a0SAchim Leubner /* SMP function */ 150*4e1bc9a0SAchim Leubner #define SMP_REPORT_GENERAL 0x00 151*4e1bc9a0SAchim Leubner #define SMP_REPORT_MANUFACTURE_INFORMATION 0x01 152*4e1bc9a0SAchim Leubner #define SMP_READ_GPIO_REGISTER 0x02 153*4e1bc9a0SAchim Leubner #define SMP_DISCOVER 0x10 154*4e1bc9a0SAchim Leubner #define SMP_REPORT_PHY_ERROR_LOG 0x11 155*4e1bc9a0SAchim Leubner #define SMP_REPORT_PHY_SATA 0x12 156*4e1bc9a0SAchim Leubner #define SMP_REPORT_ROUTING_INFORMATION 0x13 157*4e1bc9a0SAchim Leubner #define SMP_WRITE_GPIO_REGISTER 0x82 158*4e1bc9a0SAchim Leubner #define SMP_CONFIGURE_ROUTING_INFORMATION 0x90 159*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL 0x91 160*4e1bc9a0SAchim Leubner #define SMP_PHY_TEST_FUNCTION 0x92 161*4e1bc9a0SAchim Leubner #define SMP_PMC_SPECIFIC 0xC0 162*4e1bc9a0SAchim Leubner #define SMP_DISCOVER_LIST 0x20 163*4e1bc9a0SAchim Leubner 164*4e1bc9a0SAchim Leubner 165*4e1bc9a0SAchim Leubner /* SMP function results */ 166*4e1bc9a0SAchim Leubner #define SMP_FUNCTION_ACCEPTED 0x00 167*4e1bc9a0SAchim Leubner #define UNKNOWN_SMP_FUNCTION 0x01 168*4e1bc9a0SAchim Leubner #define SMP_FUNCTION_FAILED 0x02 169*4e1bc9a0SAchim Leubner #define INVALID_REQUEST_FRAME_LENGTH 0x03 170*4e1bc9a0SAchim Leubner #define INVALID_EXPANDER_CHANGE_COUNT 0x04 171*4e1bc9a0SAchim Leubner #define SMP_FN_BUSY 0x05 172*4e1bc9a0SAchim Leubner #define INCOMPLETE_DESCRIPTOR_LIST 0x06 173*4e1bc9a0SAchim Leubner #define PHY_DOES_NOT_EXIST 0x10 174*4e1bc9a0SAchim Leubner #define INDEX_DOES_NOT_EXIST 0x11 175*4e1bc9a0SAchim Leubner #define PHY_DOES_NOT_SUPPORT_SATA 0x12 176*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_OPERATION 0x13 177*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_TEST_FUNCTION 0x14 178*4e1bc9a0SAchim Leubner #define PHY_TEST_FUNCTION_IN_PROGRESS 0x15 179*4e1bc9a0SAchim Leubner #define PHY_VACANT 0x16 180*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_EVENT_SOURCE 0x17 181*4e1bc9a0SAchim Leubner #define UNKNOWN_DESCRIPTOT_TYPE 0x18 182*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_FILETER 0x19 183*4e1bc9a0SAchim Leubner #define AFFILIATION_VIOLATION 0x1A 184*4e1bc9a0SAchim Leubner #define SMP_ZONE_VIOLATION 0x20 185*4e1bc9a0SAchim Leubner #define NO_MANAGEMENT_ACCESS_RIGHTS 0x21 186*4e1bc9a0SAchim Leubner #define UNKNOWN_ENABLE_DISABLE_ZONING_VALUE 0x22 187*4e1bc9a0SAchim Leubner #define ZONE_LOCK_VIOLATION 0x23 188*4e1bc9a0SAchim Leubner #define NOT_ACTIVATED 0x24 189*4e1bc9a0SAchim Leubner #define ZONE_GROUP_OUT_OF_RANGE 0x25 190*4e1bc9a0SAchim Leubner #define NO_PHYSICAL_PRESENCE 0x26 191*4e1bc9a0SAchim Leubner #define SAVING_NOT_SUPPORTED 0x27 192*4e1bc9a0SAchim Leubner #define SOURCE_ZONE_GROUP_DOES_NOT_EXIST 0x28 193*4e1bc9a0SAchim Leubner #define DISABLED_PASSWORD_NOT_SUPPORTED 0x29 194*4e1bc9a0SAchim Leubner 195*4e1bc9a0SAchim Leubner /* SMP PHY CONTROL OPERATION */ 196*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_NOP 0x00 197*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_LINK_RESET 0x01 198*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_HARD_RESET 0x02 199*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_DISABLE 0x03 200*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_ERROR_LOG 0x05 201*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_AFFILIATION 0x06 202*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL 0x07 203*4e1bc9a0SAchim Leubner 204*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPC 0x80010000 205*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_ADAPSPC 0x80810000 206*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCv 0x80080000 207*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCve 0x80090000 208*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCvplus 0x80180000 209*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCveplus 0x80190000 210*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_ADAPvplus 0x80880000 211*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_ADAPveplus 0x80890000 212*4e1bc9a0SAchim Leubner 213*4e1bc9a0SAchim Leubner #define DMIsSPC(agr) (DM_VEN_DEV_SPC == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */ 214*4e1bc9a0SAchim Leubner #define DMIsSPCADAP(agr) (DM_VEN_DEV_SPC == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */ 215*4e1bc9a0SAchim Leubner #define DMIsSPCv(agr) (DM_VEN_DEV_SPCv == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv */ 216*4e1bc9a0SAchim Leubner #define DMIsSPCve(agr) (DM_VEN_DEV_SPCve == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve */ 217*4e1bc9a0SAchim Leubner #define DMIsSPCvplus(agr) (DM_VEN_DEV_SPCvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */ 218*4e1bc9a0SAchim Leubner #define DMIsSPCveplus(agr) (DM_VEN_DEV_SPCveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */ 219*4e1bc9a0SAchim Leubner #define DMIsSPCADAPvplus(agr) (DM_VEN_DEV_ADAPvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */ 220*4e1bc9a0SAchim Leubner #define DMIsSPCADAPveplus(agr) (DM_VEN_DEV_ADAPveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */ 221*4e1bc9a0SAchim Leubner 222*4e1bc9a0SAchim Leubner /**************************************************************** 223*4e1bc9a0SAchim Leubner * SAS 1.1 Spec 224*4e1bc9a0SAchim Leubner ****************************************************************/ 225*4e1bc9a0SAchim Leubner /* SMP header definition */ 226*4e1bc9a0SAchim Leubner typedef struct dmSMPFrameHeader_s 227*4e1bc9a0SAchim Leubner { 228*4e1bc9a0SAchim Leubner bit8 smpFrameType; /* The first byte of SMP frame represents the SMP FRAME TYPE */ 229*4e1bc9a0SAchim Leubner bit8 smpFunction; /* The second byte of the SMP frame represents the SMP FUNCTION */ 230*4e1bc9a0SAchim Leubner bit8 smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */ 231*4e1bc9a0SAchim Leubner bit8 smpReserved; /* reserved */ 232*4e1bc9a0SAchim Leubner } dmSMPFrameHeader_t; 233*4e1bc9a0SAchim Leubner 234*4e1bc9a0SAchim Leubner /**************************************************************** 235*4e1bc9a0SAchim Leubner * report general request 236*4e1bc9a0SAchim Leubner ****************************************************************/ 237*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS 238*4e1bc9a0SAchim Leubner typedef struct smpReqReportGeneral_s 239*4e1bc9a0SAchim Leubner { 240*4e1bc9a0SAchim Leubner /* nothing. some compiler disallowed structure with no member */ 241*4e1bc9a0SAchim Leubner } smpReqReportGeneral_t; 242*4e1bc9a0SAchim Leubner #endif 243*4e1bc9a0SAchim Leubner 244*4e1bc9a0SAchim Leubner /**************************************************************** 245*4e1bc9a0SAchim Leubner * report general response 246*4e1bc9a0SAchim Leubner ****************************************************************/ 247*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_CONFIGURING_BIT 0x2 248*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_CONFIGURABLE_BIT 0x1 249*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_LONG_RESPONSE_BIT 0x80 250*4e1bc9a0SAchim Leubner 251*4e1bc9a0SAchim Leubner typedef struct smpRespReportGeneral_s 252*4e1bc9a0SAchim Leubner { 253*4e1bc9a0SAchim Leubner bit8 expanderChangeCount16[2]; 254*4e1bc9a0SAchim Leubner bit8 expanderRouteIndexes16[2]; 255*4e1bc9a0SAchim Leubner bit8 reserved1; /* byte 9; has LONG Response for SAS 2 at bit 8 */ 256*4e1bc9a0SAchim Leubner bit8 numOfPhys; 257*4e1bc9a0SAchim Leubner bit8 configuring_configurable; 258*4e1bc9a0SAchim Leubner /* B7-2 : reserved */ 259*4e1bc9a0SAchim Leubner /* B1 : configuring */ 260*4e1bc9a0SAchim Leubner /* B0 : configurable */ 261*4e1bc9a0SAchim Leubner bit8 reserved4[17]; 262*4e1bc9a0SAchim Leubner } smpRespReportGeneral_t; 263*4e1bc9a0SAchim Leubner 264*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_IS_CONFIGURING(pResp) \ 265*4e1bc9a0SAchim Leubner (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURING_BIT) == \ 266*4e1bc9a0SAchim Leubner REPORT_GENERAL_CONFIGURING_BIT) 267*4e1bc9a0SAchim Leubner 268*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_IS_CONFIGURABLE(pResp) \ 269*4e1bc9a0SAchim Leubner (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURABLE_BIT) == \ 270*4e1bc9a0SAchim Leubner REPORT_GENERAL_CONFIGURABLE_BIT) 271*4e1bc9a0SAchim Leubner 272*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \ 273*4e1bc9a0SAchim Leubner DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16)) 274*4e1bc9a0SAchim Leubner 275*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_IS_LONG_RESPONSE(pResp) \ 276*4e1bc9a0SAchim Leubner (((pResp)->reserved1 & REPORT_GENERAL_LONG_RESPONSE_BIT) == \ 277*4e1bc9a0SAchim Leubner REPORT_GENERAL_LONG_RESPONSE_BIT) 278*4e1bc9a0SAchim Leubner 279*4e1bc9a0SAchim Leubner /**************************************************************** 280*4e1bc9a0SAchim Leubner * report manufacturer info response 281*4e1bc9a0SAchim Leubner ****************************************************************/ 282*4e1bc9a0SAchim Leubner typedef struct smpRespReportManufactureInfo_s 283*4e1bc9a0SAchim Leubner { 284*4e1bc9a0SAchim Leubner bit8 reserved1[8]; 285*4e1bc9a0SAchim Leubner bit8 vendorIdentification[8]; 286*4e1bc9a0SAchim Leubner bit8 productIdentification[16]; 287*4e1bc9a0SAchim Leubner bit8 productRevisionLevel[4]; 288*4e1bc9a0SAchim Leubner bit8 vendorSpecific[20]; 289*4e1bc9a0SAchim Leubner } smpRespReportManufactureInfo_t; 290*4e1bc9a0SAchim Leubner 291*4e1bc9a0SAchim Leubner /**************************************************************** 292*4e1bc9a0SAchim Leubner * discover request 293*4e1bc9a0SAchim Leubner ****************************************************************/ 294*4e1bc9a0SAchim Leubner typedef struct smpReqDiscover_s 295*4e1bc9a0SAchim Leubner { 296*4e1bc9a0SAchim Leubner bit32 reserved1; 297*4e1bc9a0SAchim Leubner bit8 reserved2; 298*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 299*4e1bc9a0SAchim Leubner bit8 ignored; 300*4e1bc9a0SAchim Leubner bit8 reserved3; 301*4e1bc9a0SAchim Leubner } smpReqDiscover_t; 302*4e1bc9a0SAchim Leubner 303*4e1bc9a0SAchim Leubner /**************************************************************** 304*4e1bc9a0SAchim Leubner * discover response 305*4e1bc9a0SAchim Leubner ****************************************************************/ 306*4e1bc9a0SAchim Leubner typedef struct smpRespDiscover_s 307*4e1bc9a0SAchim Leubner { 308*4e1bc9a0SAchim Leubner bit8 reserved1[4]; 309*4e1bc9a0SAchim Leubner bit8 reserved2; 310*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 311*4e1bc9a0SAchim Leubner bit8 reserved3[2]; 312*4e1bc9a0SAchim Leubner bit8 attachedDeviceType; /* byte 12 */ 313*4e1bc9a0SAchim Leubner /* B7 : reserved */ 314*4e1bc9a0SAchim Leubner /* B6-4 : attachedDeviceType */ 315*4e1bc9a0SAchim Leubner /* B3-0 : reserved */ 316*4e1bc9a0SAchim Leubner bit8 negotiatedPhyLinkRate; /* byte 11 */ 317*4e1bc9a0SAchim Leubner /* B7-4 : reserved */ 318*4e1bc9a0SAchim Leubner /* B3-0 : negotiatedPhyLinkRate */ 319*4e1bc9a0SAchim Leubner bit8 attached_Ssp_Stp_Smp_Sata_Initiator; /* byte 14 */ 320*4e1bc9a0SAchim Leubner /* B7-4 : reserved */ 321*4e1bc9a0SAchim Leubner /* B3 : attachedSspInitiator */ 322*4e1bc9a0SAchim Leubner /* B2 : attachedStpInitiator */ 323*4e1bc9a0SAchim Leubner /* B1 : attachedSmpInitiator */ 324*4e1bc9a0SAchim Leubner /* B0 : attachedSataHost */ 325*4e1bc9a0SAchim Leubner bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target; /* byte 15 */ 326*4e1bc9a0SAchim Leubner /* B7 : attachedSataPortSelector */ 327*4e1bc9a0SAchim Leubner /* B6-4 : reserved */ 328*4e1bc9a0SAchim Leubner /* B3 : attachedSspTarget */ 329*4e1bc9a0SAchim Leubner /* B2 : attachedStpTarget */ 330*4e1bc9a0SAchim Leubner /* B1 : attachedSmpTarget */ 331*4e1bc9a0SAchim Leubner /* B0 : attachedSatadevice */ 332*4e1bc9a0SAchim Leubner bit8 sasAddressHi[4]; 333*4e1bc9a0SAchim Leubner bit8 sasAddressLo[4]; 334*4e1bc9a0SAchim Leubner bit8 attachedSasAddressHi[4]; 335*4e1bc9a0SAchim Leubner bit8 attachedSasAddressLo[4]; 336*4e1bc9a0SAchim Leubner bit8 attachedPhyIdentifier; 337*4e1bc9a0SAchim Leubner bit8 reserved9[7]; 338*4e1bc9a0SAchim Leubner bit8 programmedAndHardware_MinPhyLinkRate; 339*4e1bc9a0SAchim Leubner /* B7-4 : programmedMinPhyLinkRate */ 340*4e1bc9a0SAchim Leubner /* B3-0 : hardwareMinPhyLinkRate */ 341*4e1bc9a0SAchim Leubner bit8 programmedAndHardware_MaxPhyLinkRate; 342*4e1bc9a0SAchim Leubner /* B7-4 : programmedMaxPhyLinkRate */ 343*4e1bc9a0SAchim Leubner /* B3-0 : hardwareMaxPhyLinkRate */ 344*4e1bc9a0SAchim Leubner bit8 phyChangeCount; 345*4e1bc9a0SAchim Leubner bit8 virtualPhy_partialPathwayTimeout; /* byte 43 */ 346*4e1bc9a0SAchim Leubner /* B7 : virtualPhy*/ 347*4e1bc9a0SAchim Leubner /* B6-4 : reserved */ 348*4e1bc9a0SAchim Leubner /* B3-0 : partialPathwayTimeout */ 349*4e1bc9a0SAchim Leubner bit8 routingAttribute; 350*4e1bc9a0SAchim Leubner /* B7-4 : reserved */ 351*4e1bc9a0SAchim Leubner /* B3-0 : routingAttribute */ 352*4e1bc9a0SAchim Leubner bit8 reserved13[5]; 353*4e1bc9a0SAchim Leubner bit8 vendorSpecific[2]; 354*4e1bc9a0SAchim Leubner } smpRespDiscover_t; 355*4e1bc9a0SAchim Leubner 356*4e1bc9a0SAchim Leubner #define DISCRSP_SSP_BIT 0x08 357*4e1bc9a0SAchim Leubner #define DISCRSP_STP_BIT 0x04 358*4e1bc9a0SAchim Leubner #define DISCRSP_SMP_BIT 0x02 359*4e1bc9a0SAchim Leubner #define DISCRSP_SATA_BIT 0x01 360*4e1bc9a0SAchim Leubner 361*4e1bc9a0SAchim Leubner #define DISCRSP_SATA_PS_BIT 0x80 362*4e1bc9a0SAchim Leubner 363*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \ 364*4e1bc9a0SAchim Leubner (((pResp)->attachedDeviceType & 0x70) >> 4) 365*4e1bc9a0SAchim Leubner #define DISCRSP_GET_LINKRATE(pResp) \ 366*4e1bc9a0SAchim Leubner ((pResp)->negotiatedPhyLinkRate & 0x0F) 367*4e1bc9a0SAchim Leubner 368*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SSP_INITIATOR(pResp) \ 369*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT) 370*4e1bc9a0SAchim Leubner #define DISCRSP_IS_STP_INITIATOR(pResp) \ 371*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT) 372*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SMP_INITIATOR(pResp) \ 373*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT) 374*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SATA_HOST(pResp) \ 375*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT) 376*4e1bc9a0SAchim Leubner 377*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SSP_TARGET(pResp) \ 378*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT) 379*4e1bc9a0SAchim Leubner #define DISCRSP_IS_STP_TARGET(pResp) \ 380*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT) 381*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SMP_TARGET(pResp) \ 382*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT) 383*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SATA_DEVICE(pResp) \ 384*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT) 385*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SATA_PORTSELECTOR(pResp) \ 386*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT) 387*4e1bc9a0SAchim Leubner 388*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */ 389*4e1bc9a0SAchim Leubner #define DISCRSP_GET_SAS_ADDRESSHI(pResp) \ 390*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi) 391*4e1bc9a0SAchim Leubner #define DISCRSP_GET_SAS_ADDRESSLO(pResp) \ 392*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo) 393*4e1bc9a0SAchim Leubner 394*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */ 395*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \ 396*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi) 397*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \ 398*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo) 399*4e1bc9a0SAchim Leubner 400*4e1bc9a0SAchim Leubner #define DISCRSP_VIRTUALPHY_BIT 0x80 401*4e1bc9a0SAchim Leubner #define DISCRSP_IS_VIRTUALPHY(pResp) \ 402*4e1bc9a0SAchim Leubner (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT) 403*4e1bc9a0SAchim Leubner 404*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ROUTINGATTRIB(pResp) \ 405*4e1bc9a0SAchim Leubner ((pResp)->routingAttribute & 0x0F) 406*4e1bc9a0SAchim Leubner 407*4e1bc9a0SAchim Leubner /**************************************************************** 408*4e1bc9a0SAchim Leubner * report route table request 409*4e1bc9a0SAchim Leubner ****************************************************************/ 410*4e1bc9a0SAchim Leubner typedef struct smpReqReportRouteTable_s 411*4e1bc9a0SAchim Leubner { 412*4e1bc9a0SAchim Leubner bit8 reserved1[2]; 413*4e1bc9a0SAchim Leubner bit8 expanderRouteIndex16[20]; 414*4e1bc9a0SAchim Leubner bit8 reserved2; 415*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 416*4e1bc9a0SAchim Leubner bit8 reserved3[2]; 417*4e1bc9a0SAchim Leubner } smpReqReportRouteTable_t; 418*4e1bc9a0SAchim Leubner 419*4e1bc9a0SAchim Leubner /**************************************************************** 420*4e1bc9a0SAchim Leubner * report route response 421*4e1bc9a0SAchim Leubner ****************************************************************/ 422*4e1bc9a0SAchim Leubner typedef struct smpRespReportRouteTable_s 423*4e1bc9a0SAchim Leubner { 424*4e1bc9a0SAchim Leubner bit8 reserved1[2]; 425*4e1bc9a0SAchim Leubner bit8 expanderRouteIndex16[2]; 426*4e1bc9a0SAchim Leubner bit8 reserved2; 427*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 428*4e1bc9a0SAchim Leubner bit8 reserved3[2]; 429*4e1bc9a0SAchim Leubner bit8 disabled; 430*4e1bc9a0SAchim Leubner /* B7 : expander route entry disabled */ 431*4e1bc9a0SAchim Leubner /* B6-0 : reserved */ 432*4e1bc9a0SAchim Leubner bit8 reserved5[3]; 433*4e1bc9a0SAchim Leubner bit8 routedSasAddressHi32[4]; 434*4e1bc9a0SAchim Leubner bit8 routedSasAddressLo32[4]; 435*4e1bc9a0SAchim Leubner bit8 reserved6[16]; 436*4e1bc9a0SAchim Leubner } smpRespReportRouteTable_t; 437*4e1bc9a0SAchim Leubner 438*4e1bc9a0SAchim Leubner /**************************************************************** 439*4e1bc9a0SAchim Leubner * configure route information request 440*4e1bc9a0SAchim Leubner ****************************************************************/ 441*4e1bc9a0SAchim Leubner typedef struct smpReqConfigureRouteInformation_s 442*4e1bc9a0SAchim Leubner { 443*4e1bc9a0SAchim Leubner bit8 reserved1[2]; 444*4e1bc9a0SAchim Leubner bit8 expanderRouteIndex[2]; 445*4e1bc9a0SAchim Leubner bit8 reserved2; 446*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 447*4e1bc9a0SAchim Leubner bit8 reserved3[2]; 448*4e1bc9a0SAchim Leubner bit8 disabledBit_reserved4; 449*4e1bc9a0SAchim Leubner bit8 reserved5[3]; 450*4e1bc9a0SAchim Leubner bit8 routedSasAddressHi[4]; 451*4e1bc9a0SAchim Leubner bit8 routedSasAddressLo[4]; 452*4e1bc9a0SAchim Leubner bit8 reserved6[16]; 453*4e1bc9a0SAchim Leubner } smpReqConfigureRouteInformation_t; 454*4e1bc9a0SAchim Leubner 455*4e1bc9a0SAchim Leubner /**************************************************************** 456*4e1bc9a0SAchim Leubner * configure route response 457*4e1bc9a0SAchim Leubner ****************************************************************/ 458*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS 459*4e1bc9a0SAchim Leubner typedef struct smpRespConfigureRouteInformation_s 460*4e1bc9a0SAchim Leubner { 461*4e1bc9a0SAchim Leubner /* nothing. some compiler disallowed structure with no member */ 462*4e1bc9a0SAchim Leubner } smpRespConfigureRouteInformation_t; 463*4e1bc9a0SAchim Leubner #endif 464*4e1bc9a0SAchim Leubner 465*4e1bc9a0SAchim Leubner /**************************************************************** 466*4e1bc9a0SAchim Leubner * report Phy Sata request 467*4e1bc9a0SAchim Leubner ****************************************************************/ 468*4e1bc9a0SAchim Leubner typedef struct smpReqReportPhySata_s 469*4e1bc9a0SAchim Leubner { 470*4e1bc9a0SAchim Leubner bit8 reserved1[4]; 471*4e1bc9a0SAchim Leubner bit8 reserved2; 472*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 473*4e1bc9a0SAchim Leubner bit8 reserved3[2]; 474*4e1bc9a0SAchim Leubner } smpReqReportPhySata_t; 475*4e1bc9a0SAchim Leubner 476*4e1bc9a0SAchim Leubner /**************************************************************** 477*4e1bc9a0SAchim Leubner * report Phy Sata response 478*4e1bc9a0SAchim Leubner ****************************************************************/ 479*4e1bc9a0SAchim Leubner typedef struct smpRespReportPhySata_s 480*4e1bc9a0SAchim Leubner { 481*4e1bc9a0SAchim Leubner bit8 reserved1[4]; 482*4e1bc9a0SAchim Leubner bit8 reserved2; 483*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 484*4e1bc9a0SAchim Leubner bit8 reserved3; 485*4e1bc9a0SAchim Leubner bit8 affiliations_sup_valid; 486*4e1bc9a0SAchim Leubner /* b7-2 : reserved */ 487*4e1bc9a0SAchim Leubner /* b1 : Affiliations supported */ 488*4e1bc9a0SAchim Leubner /* b0 : Affiliation valid */ 489*4e1bc9a0SAchim Leubner bit8 reserved5[4]; 490*4e1bc9a0SAchim Leubner bit8 stpSasAddressHi[4]; 491*4e1bc9a0SAchim Leubner bit8 stpSasAddressLo[4]; 492*4e1bc9a0SAchim Leubner bit8 regDevToHostFis[20]; 493*4e1bc9a0SAchim Leubner bit8 reserved6[4]; 494*4e1bc9a0SAchim Leubner bit8 affiliatedStpInitiatorSasAddressHi[4]; 495*4e1bc9a0SAchim Leubner bit8 affiliatedStpInitiatorSasAddressLo[4]; 496*4e1bc9a0SAchim Leubner } smpRespReportPhySata_t; 497*4e1bc9a0SAchim Leubner 498*4e1bc9a0SAchim Leubner 499*4e1bc9a0SAchim Leubner /**************************************************************** 500*4e1bc9a0SAchim Leubner * Phy Control request 501*4e1bc9a0SAchim Leubner ****************************************************************/ 502*4e1bc9a0SAchim Leubner typedef struct smpReqPhyControl_s 503*4e1bc9a0SAchim Leubner { 504*4e1bc9a0SAchim Leubner bit8 reserved1[4]; 505*4e1bc9a0SAchim Leubner bit8 reserved2; 506*4e1bc9a0SAchim Leubner bit8 phyIdentifier; 507*4e1bc9a0SAchim Leubner bit8 phyOperation; 508*4e1bc9a0SAchim Leubner bit8 updatePartialPathwayTOValue; 509*4e1bc9a0SAchim Leubner /* b7-1 : reserved */ 510*4e1bc9a0SAchim Leubner /* b0 : update partial pathway timeout value */ 511*4e1bc9a0SAchim Leubner bit8 reserved3[20]; 512*4e1bc9a0SAchim Leubner bit8 programmedMinPhysicalLinkRate; 513*4e1bc9a0SAchim Leubner /* b7-4 : programmed Minimum Physical Link Rate*/ 514*4e1bc9a0SAchim Leubner /* b3-0 : reserved */ 515*4e1bc9a0SAchim Leubner bit8 programmedMaxPhysicalLinkRate; 516*4e1bc9a0SAchim Leubner /* b7-4 : programmed Maximum Physical Link Rate*/ 517*4e1bc9a0SAchim Leubner /* b3-0 : reserved */ 518*4e1bc9a0SAchim Leubner bit8 reserved4[2]; 519*4e1bc9a0SAchim Leubner bit8 partialPathwayTOValue; 520*4e1bc9a0SAchim Leubner /* b7-4 : reserved */ 521*4e1bc9a0SAchim Leubner /* b3-0 : partial Pathway TO Value */ 522*4e1bc9a0SAchim Leubner bit8 reserved5[3]; 523*4e1bc9a0SAchim Leubner } smpReqPhyControl_t; 524*4e1bc9a0SAchim Leubner 525*4e1bc9a0SAchim Leubner /**************************************************************** 526*4e1bc9a0SAchim Leubner * Phy Control response 527*4e1bc9a0SAchim Leubner ****************************************************************/ 528*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS 529*4e1bc9a0SAchim Leubner typedef struct smpRespPhyControl_s 530*4e1bc9a0SAchim Leubner { 531*4e1bc9a0SAchim Leubner /* nothing. some compiler disallowed structure with no member */ 532*4e1bc9a0SAchim Leubner } smpRespPhyControl_t; 533*4e1bc9a0SAchim Leubner #endif 534*4e1bc9a0SAchim Leubner 535*4e1bc9a0SAchim Leubner 536*4e1bc9a0SAchim Leubner /**************************************************************** 537*4e1bc9a0SAchim Leubner * SAS 2 Rev 14c Spec 538*4e1bc9a0SAchim Leubner ****************************************************************/ 539*4e1bc9a0SAchim Leubner /* SMP header definition */ 540*4e1bc9a0SAchim Leubner typedef struct tdssSMPFrameHeader2_s 541*4e1bc9a0SAchim Leubner { 542*4e1bc9a0SAchim Leubner bit8 smpFrameType; /* The first byte of SMP frame represents the SMP FRAME TYPE */ 543*4e1bc9a0SAchim Leubner bit8 smpFunction; /* The second byte of the SMP frame represents the SMP FUNCTION */ 544*4e1bc9a0SAchim Leubner bit8 smpAllocLenFuncResult; /* The third byte of SMP frame represents ALLOCATED RESPONSE LENGTH of SMP request or FUNCTION RESULT of the SMP response. */ 545*4e1bc9a0SAchim Leubner bit8 smpReqResLen; /* The third byte of SMP frame represents REQUEST LENGTH of SMP request or RESPONSE LENGTH of the SMP response. */ 546*4e1bc9a0SAchim Leubner } tdssSMPFrameHeader2_t; 547*4e1bc9a0SAchim Leubner 548*4e1bc9a0SAchim Leubner /**************************************************************** 549*4e1bc9a0SAchim Leubner * report general request 550*4e1bc9a0SAchim Leubner ****************************************************************/ 551*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS 552*4e1bc9a0SAchim Leubner typedef struct smpReqReportGeneral2_s 553*4e1bc9a0SAchim Leubner { 554*4e1bc9a0SAchim Leubner /* nothing. some compiler disallowed structure with no member */ 555*4e1bc9a0SAchim Leubner } smpReqReportGeneral2_t; 556*4e1bc9a0SAchim Leubner #endif 557*4e1bc9a0SAchim Leubner 558*4e1bc9a0SAchim Leubner /**************************************************************** 559*4e1bc9a0SAchim Leubner * report general response 560*4e1bc9a0SAchim Leubner ****************************************************************/ 561*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT 0x80 562*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_CONFIGURES_OTHERS_BIT 0x04 563*4e1bc9a0SAchim Leubner 564*4e1bc9a0SAchim Leubner typedef struct smpRespReportGeneral2_s 565*4e1bc9a0SAchim Leubner { 566*4e1bc9a0SAchim Leubner bit8 expanderChangeCount16[2]; /* byte 4-5 */ 567*4e1bc9a0SAchim Leubner bit8 expanderRouteIndexes16[2]; /* byte 6-7 */ 568*4e1bc9a0SAchim Leubner bit8 LongResponse; /* byte 8 */ 569*4e1bc9a0SAchim Leubner /* B7: LongResponse */ 570*4e1bc9a0SAchim Leubner /* B6-0: Reserved */ 571*4e1bc9a0SAchim Leubner bit8 numOfPhys; /* byte 9 */ 572*4e1bc9a0SAchim Leubner bit8 byte10; 573*4e1bc9a0SAchim Leubner /* B7 : TABLE TO TABLE SUPPORTED */ 574*4e1bc9a0SAchim Leubner /* B6 : ZONE CONFIGURING */ 575*4e1bc9a0SAchim Leubner /* B5 : SELF CONFIGURING */ 576*4e1bc9a0SAchim Leubner /* B4 : STP CONTINUE AWT */ 577*4e1bc9a0SAchim Leubner /* B3 : OPEN REJECT RETRY SUPPORTED */ 578*4e1bc9a0SAchim Leubner /* B2 : CONFIGURES OTHERS */ 579*4e1bc9a0SAchim Leubner /* B1 : CONFIGURING */ 580*4e1bc9a0SAchim Leubner /* B0 : EXTERNALLY CONFIGURABLE ROUTE TABLE */ 581*4e1bc9a0SAchim Leubner bit8 reserved1; /* byte11 */ 582*4e1bc9a0SAchim Leubner bit8 EnclosureLogicalID[8]; 583*4e1bc9a0SAchim Leubner bit8 reserved2[8]; /* upto byte27; Spec 1.1 */ 584*4e1bc9a0SAchim Leubner bit8 reserved3[2]; 585*4e1bc9a0SAchim Leubner bit8 STPBusInactivityTimeLimit[2]; 586*4e1bc9a0SAchim Leubner bit8 STPMaxConnectTimeLimit[2]; /* byte33 */ 587*4e1bc9a0SAchim Leubner bit8 STPSMPI_TNexusLossTime[2]; /* byte35 */ 588*4e1bc9a0SAchim Leubner bit8 byte36; 589*4e1bc9a0SAchim Leubner /* B7-6 : NUMBER OF ZONE GROUPS */ 590*4e1bc9a0SAchim Leubner /* B5 : RESERVED */ 591*4e1bc9a0SAchim Leubner /* B4 : ZONE LOCKED */ 592*4e1bc9a0SAchim Leubner /* B3 : PHYSICAL PRESENCE SUPPORTED */ 593*4e1bc9a0SAchim Leubner /* B2 : PHYSICAL PRESENCE ASSERTED */ 594*4e1bc9a0SAchim Leubner /* B1 : ZONING SUPPORTED */ 595*4e1bc9a0SAchim Leubner /* B0 : ZONING ENABLED */ 596*4e1bc9a0SAchim Leubner bit8 byte37; 597*4e1bc9a0SAchim Leubner /* B7-5 : RESERVED */ 598*4e1bc9a0SAchim Leubner /* B4 : SAVING */ 599*4e1bc9a0SAchim Leubner /* B3 : SAVING ZONE MANAGER PASSWORD SUPPORTED */ 600*4e1bc9a0SAchim Leubner /* B2 : SAVING ZONE PHY INFORMATION SUPPORTED */ 601*4e1bc9a0SAchim Leubner /* B1 : SAVING ZONE PERMISSION TABLE SUPPORTED */ 602*4e1bc9a0SAchim Leubner /* B0 : SAVING ZONING ENABLED SUPPORTED */ 603*4e1bc9a0SAchim Leubner bit8 MaxNumOfRoutedSASAddr[2]; /* byte39 */ 604*4e1bc9a0SAchim Leubner bit8 ActiveZoneManagerSASAddr[8]; /* byte47 */ 605*4e1bc9a0SAchim Leubner bit8 ZoneLockInactivityTimeLimit[2]; /* byte49 */ 606*4e1bc9a0SAchim Leubner bit8 reserved4[2]; 607*4e1bc9a0SAchim Leubner bit8 reserved5; /* byte52 */ 608*4e1bc9a0SAchim Leubner bit8 FirstEnclosureConnectorElementIdx; /* byte53 */ 609*4e1bc9a0SAchim Leubner bit8 NumOfEnclosureConnectorElementIdxs; /* byte54 */ 610*4e1bc9a0SAchim Leubner bit8 reserved6; /* byte55 */ 611*4e1bc9a0SAchim Leubner bit8 ReducedFunctionality; 612*4e1bc9a0SAchim Leubner /* B7: ReducedFunctionality */ 613*4e1bc9a0SAchim Leubner /* B6-0: Reserved */ 614*4e1bc9a0SAchim Leubner bit8 TimeToReducedFunctionality; 615*4e1bc9a0SAchim Leubner bit8 InitialTimeToReducedFunctionality; 616*4e1bc9a0SAchim Leubner bit8 MaxReducedFunctionalityTime; /* byte59 */ 617*4e1bc9a0SAchim Leubner bit8 LastSelfConfigurationStatusDescIdx[2]; 618*4e1bc9a0SAchim Leubner bit8 MaxNumOfStoredSelfConfigurationStatusDesc[2]; 619*4e1bc9a0SAchim Leubner bit8 LastPhyEventListDescIdx[2]; 620*4e1bc9a0SAchim Leubner bit8 MaxNumbOfStoredPhyEventListDesc[2]; /* byte67 */ 621*4e1bc9a0SAchim Leubner bit8 STPRejectToOpenLimit[2]; /* byte69 */ 622*4e1bc9a0SAchim Leubner bit8 reserved7[2]; /* byte71 */ 623*4e1bc9a0SAchim Leubner 624*4e1bc9a0SAchim Leubner } smpRespReportGeneral2_t; 625*4e1bc9a0SAchim Leubner 626*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \ 627*4e1bc9a0SAchim Leubner DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16)) 628*4e1bc9a0SAchim Leubner 629*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_CONFIGURING(pResp) \ 630*4e1bc9a0SAchim Leubner (((pResp)->byte10 & REPORT_GENERAL_CONFIGURING_BIT) == \ 631*4e1bc9a0SAchim Leubner REPORT_GENERAL_CONFIGURING_BIT) 632*4e1bc9a0SAchim Leubner 633*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_CONFIGURABLE(pResp) \ 634*4e1bc9a0SAchim Leubner (((pResp)->byte10 & REPORT_GENERAL_CONFIGURABLE_BIT) == \ 635*4e1bc9a0SAchim Leubner REPORT_GENERAL_CONFIGURABLE_BIT) 636*4e1bc9a0SAchim Leubner 637*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_TABLE_TO_TABLE_SUPPORTED(pResp) \ 638*4e1bc9a0SAchim Leubner (((pResp)->byte10 & REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT) == \ 639*4e1bc9a0SAchim Leubner REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT) 640*4e1bc9a0SAchim Leubner 641*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_CONFIGURES_OTHERS(pResp) \ 642*4e1bc9a0SAchim Leubner (((pResp)->byte10 & REPORT_GENERAL_CONFIGURES_OTHERS_BIT) == \ 643*4e1bc9a0SAchim Leubner REPORT_GENERAL_CONFIGURES_OTHERS_BIT) 644*4e1bc9a0SAchim Leubner 645*4e1bc9a0SAchim Leubner /**************************************************************** 646*4e1bc9a0SAchim Leubner * report manufacturer info request 647*4e1bc9a0SAchim Leubner ****************************************************************/ 648*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS 649*4e1bc9a0SAchim Leubner typedef struct smpReqReportManufactureInfo2_s 650*4e1bc9a0SAchim Leubner { 651*4e1bc9a0SAchim Leubner /* nothing. some compiler disallowed structure with no member */ 652*4e1bc9a0SAchim Leubner } smpReqReportManufactureInfo2_t; 653*4e1bc9a0SAchim Leubner #endif 654*4e1bc9a0SAchim Leubner 655*4e1bc9a0SAchim Leubner /**************************************************************** 656*4e1bc9a0SAchim Leubner * report manufacturer info response 657*4e1bc9a0SAchim Leubner ****************************************************************/ 658*4e1bc9a0SAchim Leubner typedef struct smpRespReportManufactureInfo2_s 659*4e1bc9a0SAchim Leubner { 660*4e1bc9a0SAchim Leubner bit16 ExpanderChangeCount; /* byte 4-5 */ 661*4e1bc9a0SAchim Leubner bit8 reserved1[2]; /* byte 6-7 */ 662*4e1bc9a0SAchim Leubner bit8 SAS11Format; /* byte 8 */ 663*4e1bc9a0SAchim Leubner /* B7-1 : RESERVED */ 664*4e1bc9a0SAchim Leubner /* B0 : SAS-1.1 Format */ 665*4e1bc9a0SAchim Leubner bit8 reserved2[3]; /* byte 9-11 */ 666*4e1bc9a0SAchim Leubner bit8 vendorIdentification[8]; /* byte 12-19 */ 667*4e1bc9a0SAchim Leubner bit8 productIdentification[16]; /* byte 20-35 */ 668*4e1bc9a0SAchim Leubner bit8 productRevisionLevel[4]; /* byte 36-39 */ 669*4e1bc9a0SAchim Leubner bit8 componentVendorID[8]; /* byte 40-47 */ 670*4e1bc9a0SAchim Leubner bit8 componentID[2]; /* byte 48-49 */ 671*4e1bc9a0SAchim Leubner bit8 componentRevisionLevel; /* byte 50 */ 672*4e1bc9a0SAchim Leubner bit8 reserved3; /* byte 51 */ 673*4e1bc9a0SAchim Leubner bit8 vendorSpecific[8]; /* byte 52-59 */ 674*4e1bc9a0SAchim Leubner } smpRespReportManufactureInfo2_t; 675*4e1bc9a0SAchim Leubner 676*4e1bc9a0SAchim Leubner /**************************************************************** 677*4e1bc9a0SAchim Leubner * discover request 678*4e1bc9a0SAchim Leubner ****************************************************************/ 679*4e1bc9a0SAchim Leubner typedef struct smpReqDiscover2_s 680*4e1bc9a0SAchim Leubner { 681*4e1bc9a0SAchim Leubner bit32 reserved1; /* byte 4 - 7 */ 682*4e1bc9a0SAchim Leubner bit8 IgnoreZoneGroup; /* byte 8 */ 683*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 684*4e1bc9a0SAchim Leubner bit16 reserved2; /* byte 10 - 11*/ 685*4e1bc9a0SAchim Leubner } smpReqDiscover2_t; 686*4e1bc9a0SAchim Leubner 687*4e1bc9a0SAchim Leubner /**************************************************************** 688*4e1bc9a0SAchim Leubner * discover response 689*4e1bc9a0SAchim Leubner ****************************************************************/ 690*4e1bc9a0SAchim Leubner typedef struct smpRespDiscover2_s 691*4e1bc9a0SAchim Leubner { 692*4e1bc9a0SAchim Leubner bit16 ExpanderChangeCount; /* byte 4 - 5 */ 693*4e1bc9a0SAchim Leubner bit8 reserved1[3]; /* byte 6 - 8 */ 694*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 695*4e1bc9a0SAchim Leubner bit8 reserved2[2]; /* byte 10 - 11 */ 696*4e1bc9a0SAchim Leubner bit8 attachedDeviceTypeReason; /* byte 12 */ 697*4e1bc9a0SAchim Leubner /* B7 : RESERVED */ 698*4e1bc9a0SAchim Leubner /* B6-4 : Attached Device Type */ 699*4e1bc9a0SAchim Leubner /* B3-0 : Attached Reason */ 700*4e1bc9a0SAchim Leubner bit8 NegotiatedLogicalLinkRate; /* byte 13 */ 701*4e1bc9a0SAchim Leubner /* B7-4 : RESERVED */ 702*4e1bc9a0SAchim Leubner /* B3-0 : Negotiated Logical Link Rate */ 703*4e1bc9a0SAchim Leubner bit8 attached_Ssp_Stp_Smp_Sata_Initiator; /* byte 14 */ 704*4e1bc9a0SAchim Leubner /* B7-4 : reserved */ 705*4e1bc9a0SAchim Leubner /* B3 : attached SSP Initiator */ 706*4e1bc9a0SAchim Leubner /* B2 : attached STP Initiator */ 707*4e1bc9a0SAchim Leubner /* B1 : attached SMP Initiator */ 708*4e1bc9a0SAchim Leubner /* B0 : attached SATA Host */ 709*4e1bc9a0SAchim Leubner bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target; /* byte 15 */ 710*4e1bc9a0SAchim Leubner /* B7 : attached SATA Port Selector */ 711*4e1bc9a0SAchim Leubner /* B6-4 : reserved */ 712*4e1bc9a0SAchim Leubner /* B3 : attached SSP Target */ 713*4e1bc9a0SAchim Leubner /* B2 : attached STP Target */ 714*4e1bc9a0SAchim Leubner /* B1 : attached SMP Target */ 715*4e1bc9a0SAchim Leubner /* B0 : attached SATA device */ 716*4e1bc9a0SAchim Leubner bit8 sasAddressHi[4]; /* byte 16 - 19 */ 717*4e1bc9a0SAchim Leubner bit8 sasAddressLo[4]; /* byte 20 - 23 */ 718*4e1bc9a0SAchim Leubner bit8 attachedSasAddressHi[4]; /* byte 24 - 27 */ 719*4e1bc9a0SAchim Leubner bit8 attachedSasAddressLo[4]; /* byte 28 - 31 */ 720*4e1bc9a0SAchim Leubner bit8 attachedPhyIdentifier; /* byte 32 */ 721*4e1bc9a0SAchim Leubner bit8 byte33; /* byte 33 */ 722*4e1bc9a0SAchim Leubner /* B7-3 : reserved */ 723*4e1bc9a0SAchim Leubner /* B2 : attached Inside ZPSDS Persistent */ 724*4e1bc9a0SAchim Leubner /* B1 : attached Requested Inside ZPSDS */ 725*4e1bc9a0SAchim Leubner /* B0 : attached Break Reply Capable */ 726*4e1bc9a0SAchim Leubner bit8 reserved3[6]; /* byte 34 - 39; for indentify address frame related fields */ 727*4e1bc9a0SAchim Leubner bit8 programmedAndHardware_MinPhyLinkRate; /* byte 40 */ 728*4e1bc9a0SAchim Leubner /* B7-4 : programmedMinPhyLinkRate */ 729*4e1bc9a0SAchim Leubner /* B3-0 : hardwareMinPhyLinkRate */ 730*4e1bc9a0SAchim Leubner bit8 programmedAndHardware_MaxPhyLinkRate; /* byte 41 */ 731*4e1bc9a0SAchim Leubner /* B7-4 : programmedMaxPhyLinkRate */ 732*4e1bc9a0SAchim Leubner /* B3-0 : hardwareMaxPhyLinkRate */ 733*4e1bc9a0SAchim Leubner bit8 phyChangeCount; /* byte 42 */ 734*4e1bc9a0SAchim Leubner bit8 virtualPhy_partialPathwayTimeout; /* byte 43 */ 735*4e1bc9a0SAchim Leubner /* B7 : virtualPhy*/ 736*4e1bc9a0SAchim Leubner /* B6-4 : reserved */ 737*4e1bc9a0SAchim Leubner /* B3-0 : partialPathwayTimeout */ 738*4e1bc9a0SAchim Leubner bit8 routingAttribute; /* byte 44 */ 739*4e1bc9a0SAchim Leubner /* B7-4 : reserved */ 740*4e1bc9a0SAchim Leubner /* B3-0 : routingAttribute */ 741*4e1bc9a0SAchim Leubner bit8 ConnectorType; /* byte 45 */ 742*4e1bc9a0SAchim Leubner /* B7 : reserved */ 743*4e1bc9a0SAchim Leubner /* B6-0 : Connector Type */ 744*4e1bc9a0SAchim Leubner bit8 ConnectorElementIndex; /* byte 46 */ 745*4e1bc9a0SAchim Leubner bit8 ConnectorPhysicalLink; /* byte 47 */ 746*4e1bc9a0SAchim Leubner bit8 reserved4[2]; /* byte 48 - 49 */ 747*4e1bc9a0SAchim Leubner bit8 vendorSpecific[2]; /* byte 50 - 51*/ 748*4e1bc9a0SAchim Leubner bit8 AttachedDeviceName[8]; /* byte 52 - 59*/ 749*4e1bc9a0SAchim Leubner bit8 byte60; /* byte 60 */ 750*4e1bc9a0SAchim Leubner /* B7 : reserved */ 751*4e1bc9a0SAchim Leubner /* B6 : Requested Inside ZPSDS Changed By Expander */ 752*4e1bc9a0SAchim Leubner /* B5 : Inside ZPSDS Persistent */ 753*4e1bc9a0SAchim Leubner /* B4 : Requested Inside ZPSDS */ 754*4e1bc9a0SAchim Leubner /* B3 : reserved */ 755*4e1bc9a0SAchim Leubner /* B2 : Zone Group Persistent */ 756*4e1bc9a0SAchim Leubner /* B1 : Inside ZPSDS */ 757*4e1bc9a0SAchim Leubner /* B0 : Zoning Enabled */ 758*4e1bc9a0SAchim Leubner bit8 reserved5[2]; /* byte 61 - 62; zoning-related fields */ 759*4e1bc9a0SAchim Leubner bit8 ZoneGroup; /* byte 63 */ 760*4e1bc9a0SAchim Leubner bit8 SelfCongfiguringStatus; /* byte 64 */ 761*4e1bc9a0SAchim Leubner bit8 SelfCongfigurationLevelsCompleted; /* byte 65 */ 762*4e1bc9a0SAchim Leubner bit8 reserved6[2]; /* byte 66 - 67; self configuration related fields */ 763*4e1bc9a0SAchim Leubner bit8 SelfConfigurationSASAddressHi[4]; /* byte 68 - 71 */ 764*4e1bc9a0SAchim Leubner bit8 SelfConfigurationSASAddressLo[4]; /* byte 72 - 75 */ 765*4e1bc9a0SAchim Leubner bit8 ProgrammedphyCapabilities[4]; /* byte 76 - 79 */ 766*4e1bc9a0SAchim Leubner bit8 CurrentphyCapabilities[4]; /* byte 80 - 83 */ 767*4e1bc9a0SAchim Leubner bit8 AttachedphyCapabilities[4]; /* byte 84 - 87 */ 768*4e1bc9a0SAchim Leubner bit8 reserved7[6]; /* byte 88 - 93 */ 769*4e1bc9a0SAchim Leubner bit8 ReasonNegotiatedPhysicalLinkRate; /* byte 94 */ 770*4e1bc9a0SAchim Leubner bit8 NegotiatedSSCHWMuxingSupported; /* byte 95 */ 771*4e1bc9a0SAchim Leubner /* B7-2 : reserved */ 772*4e1bc9a0SAchim Leubner /* B1 : Negotiated SSC */ 773*4e1bc9a0SAchim Leubner /* B0 : HW Muxing Supported */ 774*4e1bc9a0SAchim Leubner bit8 byte96; /* byte 96 */ 775*4e1bc9a0SAchim Leubner /* B7-6 : reserved */ 776*4e1bc9a0SAchim Leubner /* B5 : Default Inside ZPSDS Persistent */ 777*4e1bc9a0SAchim Leubner /* B4 : Default Requested Inside ZPSDS */ 778*4e1bc9a0SAchim Leubner /* B3 : reserved */ 779*4e1bc9a0SAchim Leubner /* B2 : Default Zone Group Persistent */ 780*4e1bc9a0SAchim Leubner /* B1 : reserved */ 781*4e1bc9a0SAchim Leubner /* B0 : Default Zoning Enabled */ 782*4e1bc9a0SAchim Leubner bit8 reserved8; /* byte 97 */ 783*4e1bc9a0SAchim Leubner bit8 reserved9; /* byte 98 */ 784*4e1bc9a0SAchim Leubner bit8 DefaultZoneGroup; /* byte 99 */ 785*4e1bc9a0SAchim Leubner bit8 byte100; /* byte 100 */ 786*4e1bc9a0SAchim Leubner /* B7-6 : reserved */ 787*4e1bc9a0SAchim Leubner /* B5 : Saved Inside ZPSDS Persistent */ 788*4e1bc9a0SAchim Leubner /* B4 : Saved Requested Inside ZPSDS */ 789*4e1bc9a0SAchim Leubner /* B3 : reserved */ 790*4e1bc9a0SAchim Leubner /* B2 : Saved Zone Group Persistent */ 791*4e1bc9a0SAchim Leubner /* B1 : reserved */ 792*4e1bc9a0SAchim Leubner /* B0 : Saved Zoning Enabled */ 793*4e1bc9a0SAchim Leubner bit8 reserved10; /* byte 101 */ 794*4e1bc9a0SAchim Leubner bit8 reserved11; /* byte 102 */ 795*4e1bc9a0SAchim Leubner bit8 SavedZoneGroup; /* byte 103 */ 796*4e1bc9a0SAchim Leubner bit8 byte104; /* byte 104 */ 797*4e1bc9a0SAchim Leubner /* B7-6 : reserved */ 798*4e1bc9a0SAchim Leubner /* B5 : Shadow Inside ZPSDS Persistent */ 799*4e1bc9a0SAchim Leubner /* B4 : Shadow Requested Inside ZPSDS */ 800*4e1bc9a0SAchim Leubner /* B3 : reserved */ 801*4e1bc9a0SAchim Leubner /* B2 : Shadow Zone Group Persistent */ 802*4e1bc9a0SAchim Leubner /* B1-0 : reserved */ 803*4e1bc9a0SAchim Leubner bit8 reserved12; /* byte 105 */ 804*4e1bc9a0SAchim Leubner bit8 reserved13; /* byte 106 */ 805*4e1bc9a0SAchim Leubner bit8 ShadowZoneGroup; /* byte 107 */ 806*4e1bc9a0SAchim Leubner bit8 DeviceSlotNumber; /* byte 108 */ 807*4e1bc9a0SAchim Leubner bit8 GroupNumber; /* byte 109 */ 808*4e1bc9a0SAchim Leubner bit16 PathToEnclosure; /* byte 110 - 111 */ 809*4e1bc9a0SAchim Leubner 810*4e1bc9a0SAchim Leubner } smpRespDiscover2_t; 811*4e1bc9a0SAchim Leubner 812*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SSP_BIT 0x08 813*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_STP_BIT 0x04 814*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SMP_BIT 0x02 815*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SATA_BIT 0x01 816*4e1bc9a0SAchim Leubner 817*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SATA_PS_BIT 0x80 818*4e1bc9a0SAchim Leubner 819*4e1bc9a0SAchim Leubner #define SAS2_MUXING_SUPPORTED 0x01 820*4e1bc9a0SAchim Leubner 821*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \ 822*4e1bc9a0SAchim Leubner (((pResp)->attachedDeviceTypeReason & 0x70) >> 4) 823*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_LINKRATE(pResp) \ 824*4e1bc9a0SAchim Leubner ((pResp)->ReasonNegotiatedPhysicalLinkRate & 0x0F) 825*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_LOGICAL_LINKRATE(pResp) \ 826*4e1bc9a0SAchim Leubner ((pResp)->NegotiatedLogicalLinkRate & 0x0F) 827*4e1bc9a0SAchim Leubner 828*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SSP_INITIATOR(pResp) \ 829*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT) 830*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_STP_INITIATOR(pResp) \ 831*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT) 832*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SMP_INITIATOR(pResp) \ 833*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT) 834*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SATA_HOST(pResp) \ 835*4e1bc9a0SAchim Leubner (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT) 836*4e1bc9a0SAchim Leubner 837*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SSP_TARGET(pResp) \ 838*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT) 839*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_STP_TARGET(pResp) \ 840*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT) 841*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SMP_TARGET(pResp) \ 842*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT) 843*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SATA_DEVICE(pResp) \ 844*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT) 845*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SATA_PORTSELECTOR(pResp) \ 846*4e1bc9a0SAchim Leubner (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT) 847*4e1bc9a0SAchim Leubner 848*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_SAS_ADDRESSHI(pResp) \ 849*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi) 850*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_SAS_ADDRESSLO(pResp) \ 851*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo) 852*4e1bc9a0SAchim Leubner 853*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \ 854*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi) 855*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \ 856*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo) 857*4e1bc9a0SAchim Leubner 858*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_VIRTUALPHY_BIT 0x80 859*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_VIRTUALPHY(pResp) \ 860*4e1bc9a0SAchim Leubner (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT) 861*4e1bc9a0SAchim Leubner 862*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ROUTINGATTRIB(pResp) \ 863*4e1bc9a0SAchim Leubner ((pResp)->routingAttribute & 0x0F) 864*4e1bc9a0SAchim Leubner 865*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_MUXING_SUPPORTED(pResp) \ 866*4e1bc9a0SAchim Leubner (((pResp)->NegotiatedSSCHWMuxingSupported & SAS2_MUXING_SUPPORTED) == SAS2_MUXING_SUPPORTED) 867*4e1bc9a0SAchim Leubner 868*4e1bc9a0SAchim Leubner /**************************************************************** 869*4e1bc9a0SAchim Leubner * discover list request 870*4e1bc9a0SAchim Leubner ****************************************************************/ 871*4e1bc9a0SAchim Leubner typedef struct smpReqDiscoverList2_s 872*4e1bc9a0SAchim Leubner { 873*4e1bc9a0SAchim Leubner bit32 reserved1; /* byte 4 - 7 */ 874*4e1bc9a0SAchim Leubner bit8 StartingPhyID; /* byte 8 */ 875*4e1bc9a0SAchim Leubner bit8 MaxNumDiscoverDesc; /* byte 9 */ 876*4e1bc9a0SAchim Leubner bit8 byte10; /* byte 10 */ 877*4e1bc9a0SAchim Leubner /* B7 : Ignore Zone Group */ 878*4e1bc9a0SAchim Leubner /* B6-4 : Reserved */ 879*4e1bc9a0SAchim Leubner /* B3-0 : Phy Filter */ 880*4e1bc9a0SAchim Leubner bit8 byte11; /* byte 11 */ 881*4e1bc9a0SAchim Leubner /* B7-4 : Reserved */ 882*4e1bc9a0SAchim Leubner /* B6-4 : Descriptor Type */ 883*4e1bc9a0SAchim Leubner bit32 reserved2; /* byte 12 - 15 */ 884*4e1bc9a0SAchim Leubner bit8 VendorSpecific[12]; /* byte 16 - 27 */ 885*4e1bc9a0SAchim Leubner } smpReqDiscoverList2_t; 886*4e1bc9a0SAchim Leubner 887*4e1bc9a0SAchim Leubner 888*4e1bc9a0SAchim Leubner 889*4e1bc9a0SAchim Leubner /**************************************************************** 890*4e1bc9a0SAchim Leubner * discover list response 891*4e1bc9a0SAchim Leubner ****************************************************************/ 892*4e1bc9a0SAchim Leubner typedef struct smpRespDiscoverList2_s 893*4e1bc9a0SAchim Leubner { 894*4e1bc9a0SAchim Leubner bit16 ExpanderChangeCount; /* byte 4 - 5 */ 895*4e1bc9a0SAchim Leubner bit16 reserved1; /* byte 6 - 7 */ 896*4e1bc9a0SAchim Leubner bit8 StartingPhyID; /* byte 8 */ 897*4e1bc9a0SAchim Leubner bit8 MaxNumDiscoverDesc; /* byte 9 */ 898*4e1bc9a0SAchim Leubner bit8 byte10; /* byte 10 */ 899*4e1bc9a0SAchim Leubner /* B7-4 : Reserved */ 900*4e1bc9a0SAchim Leubner /* B3-0 : Phy Filter */ 901*4e1bc9a0SAchim Leubner bit8 byte11; /* byte 11 */ 902*4e1bc9a0SAchim Leubner /* B7-4 : Reserved */ 903*4e1bc9a0SAchim Leubner /* B6-4 : Descriptor Type */ 904*4e1bc9a0SAchim Leubner bit8 DescLen; /* byte 12 */ 905*4e1bc9a0SAchim Leubner bit8 reserved2; /* byte 13 */ 906*4e1bc9a0SAchim Leubner bit16 reserved3; /* byte 14 - 15 */ 907*4e1bc9a0SAchim Leubner bit8 byte16; /* byte 16 */ 908*4e1bc9a0SAchim Leubner /* B7 : Zoning Supported */ 909*4e1bc9a0SAchim Leubner /* B6 : Zoning Enabled */ 910*4e1bc9a0SAchim Leubner /* B5-4 : Reserved */ 911*4e1bc9a0SAchim Leubner /* B3 : Self Configuring */ 912*4e1bc9a0SAchim Leubner /* B2 : Zone Configuring */ 913*4e1bc9a0SAchim Leubner /* B1 : Configuring */ 914*4e1bc9a0SAchim Leubner /* B0 : Externally Configurable Route Table */ 915*4e1bc9a0SAchim Leubner bit8 reserved4; /* byte 17 */ 916*4e1bc9a0SAchim Leubner bit16 LastDescIdx; /* byte 18 - 19 */ 917*4e1bc9a0SAchim Leubner bit16 LastPhyDescIdx; /* byte 20 - 21 */ 918*4e1bc9a0SAchim Leubner bit8 reserved5[10]; /* byte 22 - 31 */ 919*4e1bc9a0SAchim Leubner bit8 VendorSpecific[16]; /* byte 32 - 47 */ 920*4e1bc9a0SAchim Leubner } smpRespDiscoverList2_t; 921*4e1bc9a0SAchim Leubner 922*4e1bc9a0SAchim Leubner 923*4e1bc9a0SAchim Leubner 924*4e1bc9a0SAchim Leubner /**************************************************************** 925*4e1bc9a0SAchim Leubner * report route table request 926*4e1bc9a0SAchim Leubner ****************************************************************/ 927*4e1bc9a0SAchim Leubner typedef struct smpReqReportRouteTable2_s 928*4e1bc9a0SAchim Leubner { 929*4e1bc9a0SAchim Leubner bit8 reserved1[2]; /* byte 4 - 5 */ 930*4e1bc9a0SAchim Leubner bit8 expanderRouteIndex16[20]; /* byte 6- 7 */ 931*4e1bc9a0SAchim Leubner bit8 reserved2; /* byte 8 */ 932*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 933*4e1bc9a0SAchim Leubner bit8 reserved3[2]; /* byte 10 -11 */ 934*4e1bc9a0SAchim Leubner } smpReqReportRouteTable2_t; 935*4e1bc9a0SAchim Leubner 936*4e1bc9a0SAchim Leubner /**************************************************************** 937*4e1bc9a0SAchim Leubner * report route response 938*4e1bc9a0SAchim Leubner ****************************************************************/ 939*4e1bc9a0SAchim Leubner typedef struct smpRespReportRouteTable2_s 940*4e1bc9a0SAchim Leubner { 941*4e1bc9a0SAchim Leubner bit16 expanderChangeCount; /* byte 4 - 5 */ 942*4e1bc9a0SAchim Leubner bit16 expanderRouteIndex; /* byte 6 - 7 */ 943*4e1bc9a0SAchim Leubner bit8 reserved1; /* byte 8 */ 944*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 945*4e1bc9a0SAchim Leubner bit8 reserved2[2]; /* byte 10 - 11 */ 946*4e1bc9a0SAchim Leubner bit8 disabledBit_reserved3; /* byte 12 */ 947*4e1bc9a0SAchim Leubner /* B7 : Expander Route Entry Disabled */ 948*4e1bc9a0SAchim Leubner /* B6-0 : reserved */ 949*4e1bc9a0SAchim Leubner bit8 reserved4[3]; /* byte 13-15 */ 950*4e1bc9a0SAchim Leubner bit8 routedSasAddressHi[4]; /* byte 16-19 */ 951*4e1bc9a0SAchim Leubner bit8 routedSasAddressLo[4]; /* byte 20-23 */ 952*4e1bc9a0SAchim Leubner bit8 reserved5[16]; /* byte 24-39 */ 953*4e1bc9a0SAchim Leubner } smpRespReportRouteTable2_t; 954*4e1bc9a0SAchim Leubner 955*4e1bc9a0SAchim Leubner /**************************************************************** 956*4e1bc9a0SAchim Leubner * configure route information request 957*4e1bc9a0SAchim Leubner ****************************************************************/ 958*4e1bc9a0SAchim Leubner typedef struct smpReqConfigureRouteInformation2_s 959*4e1bc9a0SAchim Leubner { 960*4e1bc9a0SAchim Leubner bit16 expectedExpanderChangeCount; /* byte 4-5 */ 961*4e1bc9a0SAchim Leubner bit16 expanderRouteIndex; /* byte 6-7 */ 962*4e1bc9a0SAchim Leubner bit8 reserved1; /* byte 8 */ 963*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 964*4e1bc9a0SAchim Leubner bit8 reserved2[2]; /* byte 10-11 */ 965*4e1bc9a0SAchim Leubner bit8 disabledBit_reserved3; /* byte 12 */ 966*4e1bc9a0SAchim Leubner /* B7 : Expander Route Entry Disabled */ 967*4e1bc9a0SAchim Leubner /* B6-0 : reserved */ 968*4e1bc9a0SAchim Leubner bit8 reserved4[3]; /* byte 13-15 */ 969*4e1bc9a0SAchim Leubner bit8 routedSasAddressHi[4]; /* byte 16-19 */ 970*4e1bc9a0SAchim Leubner bit8 routedSasAddressLo[4]; /* byte 20-23 */ 971*4e1bc9a0SAchim Leubner bit8 reserved5[16]; /* byte 24-39 */ 972*4e1bc9a0SAchim Leubner } smpReqConfigureRouteInformation2_t; 973*4e1bc9a0SAchim Leubner 974*4e1bc9a0SAchim Leubner /**************************************************************** 975*4e1bc9a0SAchim Leubner * configure route response 976*4e1bc9a0SAchim Leubner ****************************************************************/ 977*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS 978*4e1bc9a0SAchim Leubner typedef struct smpRespConfigureRouteInformation2_s 979*4e1bc9a0SAchim Leubner { 980*4e1bc9a0SAchim Leubner /* nothing. some compiler disallowed structure with no member */ 981*4e1bc9a0SAchim Leubner } smpRespConfigureRouteInformation2_t; 982*4e1bc9a0SAchim Leubner #endif 983*4e1bc9a0SAchim Leubner 984*4e1bc9a0SAchim Leubner /**************************************************************** 985*4e1bc9a0SAchim Leubner * report Phy Sata request 986*4e1bc9a0SAchim Leubner ****************************************************************/ 987*4e1bc9a0SAchim Leubner typedef struct smpReqReportPhySata2_s 988*4e1bc9a0SAchim Leubner { 989*4e1bc9a0SAchim Leubner bit8 reserved1[5]; /* byte 4-8 */ 990*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 991*4e1bc9a0SAchim Leubner bit8 AffiliationContext; /* byte 10 */ 992*4e1bc9a0SAchim Leubner bit8 reserved2; /* byte 11 */ 993*4e1bc9a0SAchim Leubner } smpReqReportPhySata2_t; 994*4e1bc9a0SAchim Leubner 995*4e1bc9a0SAchim Leubner /**************************************************************** 996*4e1bc9a0SAchim Leubner * report Phy Sata response 997*4e1bc9a0SAchim Leubner ****************************************************************/ 998*4e1bc9a0SAchim Leubner typedef struct smpRespReportPhySata2_s 999*4e1bc9a0SAchim Leubner { 1000*4e1bc9a0SAchim Leubner bit16 expanderChangeCount; /* byte 4-5 */ 1001*4e1bc9a0SAchim Leubner bit8 reserved1[3]; /* byte 6-8 */ 1002*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 1003*4e1bc9a0SAchim Leubner bit8 reserved2; /* byte 10 */ 1004*4e1bc9a0SAchim Leubner bit8 byte11; /* byte 11 */ 1005*4e1bc9a0SAchim Leubner /* b7-3 : reserved */ 1006*4e1bc9a0SAchim Leubner /* b2 : STP I_T Nexus Loss Occurred */ 1007*4e1bc9a0SAchim Leubner /* b1 : Affiliations supported */ 1008*4e1bc9a0SAchim Leubner /* b0 : Affiliation valid */ 1009*4e1bc9a0SAchim Leubner bit8 reserved3[4]; /* byte 12-15 */ 1010*4e1bc9a0SAchim Leubner bit8 stpSasAddressHi[4]; /* byte 16-19 */ 1011*4e1bc9a0SAchim Leubner bit8 stpSasAddressLo[4]; /* byte 20-23 */ 1012*4e1bc9a0SAchim Leubner bit8 regDevToHostFis[20]; /* byte 24-43 */ 1013*4e1bc9a0SAchim Leubner bit8 reserved4[4]; /* byte 44-47 */ 1014*4e1bc9a0SAchim Leubner bit8 affiliatedStpInitiatorSasAddressHi[4]; /* byte 48-51 */ 1015*4e1bc9a0SAchim Leubner bit8 affiliatedStpInitiatorSasAddressLo[4]; /* byte 52-55 */ 1016*4e1bc9a0SAchim Leubner bit8 STPITNexusLossSASAddressHi[4]; /* byte 56-59 */ 1017*4e1bc9a0SAchim Leubner bit8 STPITNexusLossSASAddressLo[4]; /* byte 60-63 */ 1018*4e1bc9a0SAchim Leubner bit8 reserved5; /* byte 64 */ 1019*4e1bc9a0SAchim Leubner bit8 AffiliationContext; /* byte 65 */ 1020*4e1bc9a0SAchim Leubner bit8 CurrentAffiliationContexts; /* byte 66 */ 1021*4e1bc9a0SAchim Leubner bit8 MaxAffiliationContexts; /* byte 67 */ 1022*4e1bc9a0SAchim Leubner 1023*4e1bc9a0SAchim Leubner } smpRespReportPhySata2_t; 1024*4e1bc9a0SAchim Leubner 1025*4e1bc9a0SAchim Leubner /**************************************************************** 1026*4e1bc9a0SAchim Leubner * Phy Control request 1027*4e1bc9a0SAchim Leubner ****************************************************************/ 1028*4e1bc9a0SAchim Leubner typedef struct smpReqPhyControl2_s 1029*4e1bc9a0SAchim Leubner { 1030*4e1bc9a0SAchim Leubner bit16 expectedExpanderChangeCount; /* byte 4-5 */ 1031*4e1bc9a0SAchim Leubner bit8 reserved1[3]; /* byte 6-8 */ 1032*4e1bc9a0SAchim Leubner bit8 phyIdentifier; /* byte 9 */ 1033*4e1bc9a0SAchim Leubner bit8 phyOperation; /* byte 10 */ 1034*4e1bc9a0SAchim Leubner bit8 updatePartialPathwayTOValue; /* byte 11 */ 1035*4e1bc9a0SAchim Leubner /* b7-1 : reserved */ 1036*4e1bc9a0SAchim Leubner /* b0 : update partial pathway timeout value */ 1037*4e1bc9a0SAchim Leubner bit8 reserved2[12]; /* byte 12-23 */ 1038*4e1bc9a0SAchim Leubner bit8 AttachedDeviceName[8]; /* byte 24-31 */ 1039*4e1bc9a0SAchim Leubner bit8 programmedMinPhysicalLinkRate; /* byte 32 */ 1040*4e1bc9a0SAchim Leubner /* b7-4 : programmed Minimum Physical Link Rate*/ 1041*4e1bc9a0SAchim Leubner /* b3-0 : reserved */ 1042*4e1bc9a0SAchim Leubner bit8 programmedMaxPhysicalLinkRate; /* byte 33 */ 1043*4e1bc9a0SAchim Leubner /* b7-4 : programmed Maximum Physical Link Rate*/ 1044*4e1bc9a0SAchim Leubner /* b3-0 : reserved */ 1045*4e1bc9a0SAchim Leubner bit8 reserved3[2]; /* byte 34-35 */ 1046*4e1bc9a0SAchim Leubner bit8 partialPathwayTOValue; /* byte 36 */ 1047*4e1bc9a0SAchim Leubner /* b7-4 : reserved */ 1048*4e1bc9a0SAchim Leubner /* b3-0 : partial Pathway TO Value */ 1049*4e1bc9a0SAchim Leubner bit8 reserved4[3]; /* byte 37-39 */ 1050*4e1bc9a0SAchim Leubner 1051*4e1bc9a0SAchim Leubner } smpReqPhyControl2_t; 1052*4e1bc9a0SAchim Leubner 1053*4e1bc9a0SAchim Leubner /**************************************************************** 1054*4e1bc9a0SAchim Leubner * Phy Control response 1055*4e1bc9a0SAchim Leubner ****************************************************************/ 1056*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS 1057*4e1bc9a0SAchim Leubner typedef struct smpRespPhyControl2_s 1058*4e1bc9a0SAchim Leubner { 1059*4e1bc9a0SAchim Leubner /* nothing. some compiler disallowed structure with no member */ 1060*4e1bc9a0SAchim Leubner } smpRespPhyControl2_t; 1061*4e1bc9a0SAchim Leubner #endif 1062*4e1bc9a0SAchim Leubner 1063*4e1bc9a0SAchim Leubner #define SMP_REQUEST 0x40 1064*4e1bc9a0SAchim Leubner #define SMP_RESPONSE 0x41 1065*4e1bc9a0SAchim Leubner 1066*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */ 1067*4e1bc9a0SAchim Leubner #define DM_GET_SAS_ADDRESSLO(sasAddressLo) \ 1068*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo) 1069*4e1bc9a0SAchim Leubner 1070*4e1bc9a0SAchim Leubner #define DM_GET_SAS_ADDRESSHI(sasAddressHi) \ 1071*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi) 1072*4e1bc9a0SAchim Leubner 1073*4e1bc9a0SAchim Leubner 1074*4e1bc9a0SAchim Leubner #define DM_GET_LINK_RATE(input) (input & 0x0F) 1075*4e1bc9a0SAchim Leubner 1076*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_1_5G 0x08 1077*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_3_0G 0x09 1078*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_6_0G 0x0A 1079*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_12_0G 0x0B 1080*4e1bc9a0SAchim Leubner 1081*4e1bc9a0SAchim Leubner #define DISCOVERY_CONFIGURING_TIMER_VALUE (3 * 1000 * 1000) /* 3 seconds */ 1082*4e1bc9a0SAchim Leubner #define DISCOVERY_RETRIES 3 1083*4e1bc9a0SAchim Leubner #define CONFIGURE_ROUTE_TIMER_VALUE (1 * 1000 * 1000) /* 1 seconds */ 1084*4e1bc9a0SAchim Leubner #define DEVICE_REGISTRATION_TIMER_VALUE (2 * 1000 * 1000) /* 2 seconds */ 1085*4e1bc9a0SAchim Leubner #define SMP_RETRIES 5 1086*4e1bc9a0SAchim Leubner #define SMP_BUSY_TIMER_VALUE (1 * 1000 * 1000) /* 1 second */ 1087*4e1bc9a0SAchim Leubner #define SMP_BUSY_RETRIES 5 1088*4e1bc9a0SAchim Leubner #define SATA_ID_DEVICE_DATA_TIMER_VALUE (3 * 1000 * 1000) /* 3 second */ 1089*4e1bc9a0SAchim Leubner #define SATA_ID_DEVICE_DATA_RETRIES 3 1090*4e1bc9a0SAchim Leubner #define BC_TIMER_VALUE (5 * 1000 * 1000) /* 5 second */ 1091*4e1bc9a0SAchim Leubner #define SMP_TIMER_VALUE (30 * 1000 * 1000) /* 30 second */ 1092*4e1bc9a0SAchim Leubner 1093*4e1bc9a0SAchim Leubner #define STP_DEVICE_TYPE 0 /* SATA behind expander 00*/ 1094*4e1bc9a0SAchim Leubner #define SAS_DEVICE_TYPE 1 /* SSP or SMP 01 */ 1095*4e1bc9a0SAchim Leubner #define SATA_DEVICE_TYPE 2 /* direct SATA 10 */ 1096*4e1bc9a0SAchim Leubner #define ATAPI_DEVICE_FLAG 0x200000 /* ATAPI device flag*/ 1097*4e1bc9a0SAchim Leubner 1098*4e1bc9a0SAchim Leubner 1099*4e1bc9a0SAchim Leubner /* ATA device type */ 1100*4e1bc9a0SAchim Leubner #define SATA_ATA_DEVICE 0x01 /**< ATA ATA device type */ 1101*4e1bc9a0SAchim Leubner #define SATA_ATAPI_DEVICE 0x02 /**< ATA ATAPI device type */ 1102*4e1bc9a0SAchim Leubner #define SATA_PM_DEVICE 0x03 /**< ATA PM device type */ 1103*4e1bc9a0SAchim Leubner #define SATA_SEMB_DEVICE 0x04 /**< ATA SEMB device type */ 1104*4e1bc9a0SAchim Leubner #define SATA_SEMB_WO_SEP_DEVICE 0x05 /**< ATA SEMB without SEP device type */ 1105*4e1bc9a0SAchim Leubner #define UNKNOWN_DEVICE 0xFF 1106*4e1bc9a0SAchim Leubner 1107*4e1bc9a0SAchim Leubner 1108*4e1bc9a0SAchim Leubner /* SAS device type definition. SAS spec(r.7) p206 */ 1109*4e1bc9a0SAchim Leubner #define SAS_NO_DEVICE 0 1110*4e1bc9a0SAchim Leubner #define SAS_END_DEVICE 1 1111*4e1bc9a0SAchim Leubner #define SAS_EDGE_EXPANDER_DEVICE 2 1112*4e1bc9a0SAchim Leubner #define SAS_FANOUT_EXPANDER_DEVICE 3 1113*4e1bc9a0SAchim Leubner 1114*4e1bc9a0SAchim Leubner /* routing attributes */ 1115*4e1bc9a0SAchim Leubner #define SAS_ROUTING_DIRECT 0x00 1116*4e1bc9a0SAchim Leubner #define SAS_ROUTING_SUBTRACTIVE 0x01 1117*4e1bc9a0SAchim Leubner #define SAS_ROUTING_TABLE 0x02 1118*4e1bc9a0SAchim Leubner 1119*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_1_5G 0x08 1120*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_3_0G 0x09 1121*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_6_0G 0x0A 1122*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_12_0G 0x0B 1123*4e1bc9a0SAchim Leubner 1124*4e1bc9a0SAchim Leubner #define IT_NEXUS_TIMEOUT 0x7D0 /* 2000 ms; old value was 0xFFFF */ 1125*4e1bc9a0SAchim Leubner 1126*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */ 1127*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \ 1128*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo) 1129*4e1bc9a0SAchim Leubner 1130*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \ 1131*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi) 1132*4e1bc9a0SAchim Leubner 1133*4e1bc9a0SAchim Leubner /* this macro is based on SAS spec, not sTSDK 0xC0 */ 1134*4e1bc9a0SAchim Leubner #define DEVINFO_GET_DEVICETTYPE(devInfo) \ 1135*4e1bc9a0SAchim Leubner (((devInfo)->devType_S_Rate & 0xC0) >> 6) 1136*4e1bc9a0SAchim Leubner 1137*4e1bc9a0SAchim Leubner #define DEVINFO_GET_LINKRATE(devInfo) \ 1138*4e1bc9a0SAchim Leubner ((devInfo)->devType_S_Rate & 0x0F) 1139*4e1bc9a0SAchim Leubner 1140*4e1bc9a0SAchim Leubner /**< target device type */ 1141*4e1bc9a0SAchim Leubner #define DM_DEFAULT_DEVICE 0 1142*4e1bc9a0SAchim Leubner #define DM_SAS_DEVICE 1 1143*4e1bc9a0SAchim Leubner #define DM_SATA_DEVICE 2 1144*4e1bc9a0SAchim Leubner 1145*4e1bc9a0SAchim Leubner #define DEVICE_SSP_BIT 0x8 /* SSP Initiator port */ 1146*4e1bc9a0SAchim Leubner #define DEVICE_STP_BIT 0x4 /* STP Initiator port */ 1147*4e1bc9a0SAchim Leubner #define DEVICE_SMP_BIT 0x2 /* SMP Initiator port */ 1148*4e1bc9a0SAchim Leubner #define DEVICE_SATA_BIT 0x1 /* SATA device, valid in the discovery response only */ 1149*4e1bc9a0SAchim Leubner 1150*4e1bc9a0SAchim Leubner #define DEVICE_IS_SSP_INITIATOR(DeviceData) \ 1151*4e1bc9a0SAchim Leubner (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT) 1152*4e1bc9a0SAchim Leubner 1153*4e1bc9a0SAchim Leubner #define DEVICE_IS_STP_INITIATOR(DeviceData) \ 1154*4e1bc9a0SAchim Leubner (((DeviceData)->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT) 1155*4e1bc9a0SAchim Leubner 1156*4e1bc9a0SAchim Leubner #define DEVICE_IS_SMP_INITIATOR(DeviceData) \ 1157*4e1bc9a0SAchim Leubner (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT) 1158*4e1bc9a0SAchim Leubner 1159*4e1bc9a0SAchim Leubner #define DEVICE_IS_SSP_TARGET(DeviceData) \ 1160*4e1bc9a0SAchim Leubner (((DeviceData)->target_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT) 1161*4e1bc9a0SAchim Leubner 1162*4e1bc9a0SAchim Leubner #define DEVICE_IS_STP_TARGET(DeviceData) \ 1163*4e1bc9a0SAchim Leubner (((DeviceData)->target_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT) 1164*4e1bc9a0SAchim Leubner 1165*4e1bc9a0SAchim Leubner #define DEVICE_IS_SMP_TARGET(DeviceData) \ 1166*4e1bc9a0SAchim Leubner (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT) 1167*4e1bc9a0SAchim Leubner 1168*4e1bc9a0SAchim Leubner #define DEVICE_IS_SATA_DEVICE(DeviceData) \ 1169*4e1bc9a0SAchim Leubner (((DeviceData)->target_ssp_stp_smp & DEVICE_SATA_BIT) == DEVICE_SATA_BIT) 1170*4e1bc9a0SAchim Leubner 1171*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */ 1172*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \ 1173*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo) 1174*4e1bc9a0SAchim Leubner 1175*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \ 1176*4e1bc9a0SAchim Leubner DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi) 1177*4e1bc9a0SAchim Leubner 1178*4e1bc9a0SAchim Leubner /* this macro is based on SAS spec, not sTSDK 0xC0 */ 1179*4e1bc9a0SAchim Leubner #define DEVINFO_GET_DEVICETTYPE(devInfo) \ 1180*4e1bc9a0SAchim Leubner (((devInfo)->devType_S_Rate & 0xC0) >> 6) 1181*4e1bc9a0SAchim Leubner 1182*4e1bc9a0SAchim Leubner #define DEVINFO_GET_LINKRATE(devInfo) \ 1183*4e1bc9a0SAchim Leubner ((devInfo)->devType_S_Rate & 0x0F) 1184*4e1bc9a0SAchim Leubner 1185*4e1bc9a0SAchim Leubner 1186*4e1bc9a0SAchim Leubner #define DEVINFO_GET_EXT_SMP(devInfo) \ 1187*4e1bc9a0SAchim Leubner (((devInfo)->ext & 0x100) >> 8) 1188*4e1bc9a0SAchim Leubner 1189*4e1bc9a0SAchim Leubner #define DEVINFO_GET_EXT_EXPANDER_TYPE(devInfo) \ 1190*4e1bc9a0SAchim Leubner (((devInfo)->ext & 0x600) >> 9) 1191*4e1bc9a0SAchim Leubner 1192*4e1bc9a0SAchim Leubner #define DEVINFO_GET_EXT_MCN(devInfo) \ 1193*4e1bc9a0SAchim Leubner (((devInfo)->ext & 0x7800) >> 11) 1194*4e1bc9a0SAchim Leubner 1195*4e1bc9a0SAchim Leubner 1196*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_SMPTO(devInfo, smpto) \ 1197*4e1bc9a0SAchim Leubner ((devInfo)->smpTimeout) = smpto 1198*4e1bc9a0SAchim Leubner 1199*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_ITNEXUSTO(devInfo, itnexusto) \ 1200*4e1bc9a0SAchim Leubner ((devInfo)->it_NexusTimeout) = itnexusto 1201*4e1bc9a0SAchim Leubner 1202*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_FBS(devInfo, fbs) \ 1203*4e1bc9a0SAchim Leubner ((devInfo)->firstBurstSize) = fbs 1204*4e1bc9a0SAchim Leubner 1205*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_FLAG(devInfo, tlr) \ 1206*4e1bc9a0SAchim Leubner ((devInfo)->flag) = tlr 1207*4e1bc9a0SAchim Leubner 1208*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_DEV_S_RATE(devInfo, dev_s_rate) \ 1209*4e1bc9a0SAchim Leubner ((devInfo)->devType_S_Rate) = dev_s_rate 1210*4e1bc9a0SAchim Leubner 1211*4e1bc9a0SAchim Leubner /* bit32 -> bit8 array[4] */ 1212*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_SAS_ADDRESSLO(devInfo, src32) \ 1213*4e1bc9a0SAchim Leubner *(bit32 *)((devInfo)->sasAddressLo) = BIT32_TO_DMA_BEBIT32(src32) 1214*4e1bc9a0SAchim Leubner 1215*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_SAS_ADDRESSHI(devInfo, src32) \ 1216*4e1bc9a0SAchim Leubner *(bit32 *)((devInfo)->sasAddressHi) = BIT32_TO_DMA_BEBIT32(src32) 1217*4e1bc9a0SAchim Leubner 1218*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_INITIATOR_SSP_STP_SMP(devInfo, ini_ssp_stp_smp) \ 1219*4e1bc9a0SAchim Leubner ((devInfo)->initiator_ssp_stp_smp) = ini_ssp_stp_smp 1220*4e1bc9a0SAchim Leubner 1221*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_TARGET_SSP_STP_SMP(devInfo, tgt_ssp_stp_smp) \ 1222*4e1bc9a0SAchim Leubner ((devInfo)->target_ssp_stp_smp) = tgt_ssp_stp_smp 1223*4e1bc9a0SAchim Leubner 1224*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_EXT(devInfo, extension) \ 1225*4e1bc9a0SAchim Leubner ((devInfo)->ext) = extension 1226*4e1bc9a0SAchim Leubner 1227*4e1bc9a0SAchim Leubner #endif /* __DMDEFS_H__ */ 1228*4e1bc9a0SAchim Leubner 1229