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 62enum 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*/ 110extern 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 */ 227typedef 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 239typedef 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 252typedef 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 ****************************************************************/ 283typedef 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 ****************************************************************/ 295typedef 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 ****************************************************************/ 307typedef 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 ****************************************************************/ 411typedef 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 ****************************************************************/ 423typedef 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 ****************************************************************/ 442typedef 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 460typedef 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 ****************************************************************/ 469typedef 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 ****************************************************************/ 480typedef 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 ****************************************************************/ 503typedef 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 530typedef 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 */ 541typedef 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 553typedef 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 565typedef 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 650typedef 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 ****************************************************************/ 659typedef 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 ****************************************************************/ 680typedef 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 ****************************************************************/ 691typedef 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 ****************************************************************/ 872typedef 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 ****************************************************************/ 893typedef 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 ****************************************************************/ 928typedef 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 ****************************************************************/ 940typedef 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 ****************************************************************/ 959typedef 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 979typedef 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 ****************************************************************/ 988typedef 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 ****************************************************************/ 999typedef 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 ****************************************************************/ 1029typedef 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 1058typedef 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