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