#ifndef __DMDEFS_H__
#define __DMDEFS_H__
#include <dev/pms/RefTisa/tisa/sassata/common/ossa.h>
#define DIRECT_SMP
#define DM_ROOT_MEM_INDEX 0
#define DM_PORT_MEM_INDEX 1
#define DM_DEVICE_MEM_INDEX 2
#define DM_EXPANDER_MEM_INDEX 3
#define DM_SMP_MEM_INDEX 4
#define DM_INDIRECT_SMP_MEM_INDEX 5
#define DM_MAX_NUM_PHYS 16
#define DM_MAX_EXPANDER_PHYS 256
#define DM_MAX_DEV 2048
#define DM_MAX_EXPANDER_DEV 32
#define DM_MAX_PORT_CONTEXT 16
#define DM_MAX_SMP 32
#define DM_MAX_INDIRECT_SMP DM_MAX_SMP
#define DM_USECS_PER_TICK 1000000
#define PIO_SETUP_DEV_TO_HOST_FIS 0x5F
#define REG_DEV_TO_HOST_FIS 0x34
#define SET_DEV_BITS_FIS 0xA1
#define DEFAULT_KEY_BUFFER_SIZE 64
enum dm_locks_e
{
DM_PORT_LOCK = 0,
DM_DEVICE_LOCK,
DM_EXPANDER_LOCK,
DM_TIMER_LOCK,
DM_SMP_LOCK,
DM_MAX_LOCKS
};
#define DEFAULT_SMP_TIMEOUT 0xFFFF
#define SMP_DIRECT_PAYLOAD_LIMIT 44
#define SMP_INDIRECT_PAYLOAD 512
#define SMP_MAXIMUM_PAYLOAD 1024
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
#ifndef MAX
#define MAX(a,b) ((a) < (b) ? (b) : (a))
#endif
#ifndef agNULL
#define agNULL ((void *)0)
#endif
#if defined(DM_DEBUG)
extern bit32 gDMDebugLevel;
#define DM_DBG0(format) tddmLogDebugString(gDMDebugLevel, 0, format)
#define DM_DBG1(format) tddmLogDebugString(gDMDebugLevel, 1, format)
#define DM_DBG2(format) tddmLogDebugString(gDMDebugLevel, 2, format)
#define DM_DBG3(format) tddmLogDebugString(gDMDebugLevel, 3, format)
#define DM_DBG4(format) tddmLogDebugString(gDMDebugLevel, 4, format)
#define DM_DBG5(format) tddmLogDebugString(gDMDebugLevel, 5, format)
#define DM_DBG6(format) tddmLogDebugString(gDMDebugLevel, 6, format)
#else
#define DM_DBG0(format)
#define DM_DBG1(format)
#define DM_DBG2(format)
#define DM_DBG3(format)
#define DM_DBG4(format)
#define DM_DBG5(format)
#define DM_DBG6(format)
#endif
#define DM_DSTATE_NOT_STARTED 0
#define DM_DSTATE_STARTED 1
#define DM_DSTATE_COMPLETED 2
#define DM_DSTATE_COMPLETED_WITH_FAILURE 3
#define DISCOVERY_NOT_START 0
#define DISCOVERY_UP_STREAM 1
#define DISCOVERY_DOWN_STREAM 2
#define DISCOVERY_CONFIG_ROUTING 3
#define DISCOVERY_SAS_DONE 4
#define DISCOVERY_REPORT_PHY_SATA 5
#define SMP_REPORT_GENERAL 0x00
#define SMP_REPORT_MANUFACTURE_INFORMATION 0x01
#define SMP_READ_GPIO_REGISTER 0x02
#define SMP_DISCOVER 0x10
#define SMP_REPORT_PHY_ERROR_LOG 0x11
#define SMP_REPORT_PHY_SATA 0x12
#define SMP_REPORT_ROUTING_INFORMATION 0x13
#define SMP_WRITE_GPIO_REGISTER 0x82
#define SMP_CONFIGURE_ROUTING_INFORMATION 0x90
#define SMP_PHY_CONTROL 0x91
#define SMP_PHY_TEST_FUNCTION 0x92
#define SMP_PMC_SPECIFIC 0xC0
#define SMP_DISCOVER_LIST 0x20
#define SMP_FUNCTION_ACCEPTED 0x00
#define UNKNOWN_SMP_FUNCTION 0x01
#define SMP_FUNCTION_FAILED 0x02
#define INVALID_REQUEST_FRAME_LENGTH 0x03
#define INVALID_EXPANDER_CHANGE_COUNT 0x04
#define SMP_FN_BUSY 0x05
#define INCOMPLETE_DESCRIPTOR_LIST 0x06
#define PHY_DOES_NOT_EXIST 0x10
#define INDEX_DOES_NOT_EXIST 0x11
#define PHY_DOES_NOT_SUPPORT_SATA 0x12
#define UNKNOWN_PHY_OPERATION 0x13
#define UNKNOWN_PHY_TEST_FUNCTION 0x14
#define PHY_TEST_FUNCTION_IN_PROGRESS 0x15
#define PHY_VACANT 0x16
#define UNKNOWN_PHY_EVENT_SOURCE 0x17
#define UNKNOWN_DESCRIPTOT_TYPE 0x18
#define UNKNOWN_PHY_FILETER 0x19
#define AFFILIATION_VIOLATION 0x1A
#define SMP_ZONE_VIOLATION 0x20
#define NO_MANAGEMENT_ACCESS_RIGHTS 0x21
#define UNKNOWN_ENABLE_DISABLE_ZONING_VALUE 0x22
#define ZONE_LOCK_VIOLATION 0x23
#define NOT_ACTIVATED 0x24
#define ZONE_GROUP_OUT_OF_RANGE 0x25
#define NO_PHYSICAL_PRESENCE 0x26
#define SAVING_NOT_SUPPORTED 0x27
#define SOURCE_ZONE_GROUP_DOES_NOT_EXIST 0x28
#define DISABLED_PASSWORD_NOT_SUPPORTED 0x29
#define SMP_PHY_CONTROL_NOP 0x00
#define SMP_PHY_CONTROL_LINK_RESET 0x01
#define SMP_PHY_CONTROL_HARD_RESET 0x02
#define SMP_PHY_CONTROL_DISABLE 0x03
#define SMP_PHY_CONTROL_CLEAR_ERROR_LOG 0x05
#define SMP_PHY_CONTROL_CLEAR_AFFILIATION 0x06
#define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL 0x07
#define DM_VEN_DEV_SPC 0x80010000
#define DM_VEN_DEV_ADAPSPC 0x80810000
#define DM_VEN_DEV_SPCv 0x80080000
#define DM_VEN_DEV_SPCve 0x80090000
#define DM_VEN_DEV_SPCvplus 0x80180000
#define DM_VEN_DEV_SPCveplus 0x80190000
#define DM_VEN_DEV_ADAPvplus 0x80880000
#define DM_VEN_DEV_ADAPveplus 0x80890000
#define DMIsSPC(agr) (DM_VEN_DEV_SPC == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
#define DMIsSPCADAP(agr) (DM_VEN_DEV_SPC == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
#define DMIsSPCv(agr) (DM_VEN_DEV_SPCv == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
#define DMIsSPCve(agr) (DM_VEN_DEV_SPCve == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
#define DMIsSPCvplus(agr) (DM_VEN_DEV_SPCvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
#define DMIsSPCveplus(agr) (DM_VEN_DEV_SPCveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
#define DMIsSPCADAPvplus(agr) (DM_VEN_DEV_ADAPvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
#define DMIsSPCADAPveplus(agr) (DM_VEN_DEV_ADAPveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
typedef struct dmSMPFrameHeader_s
{
bit8 smpFrameType;
bit8 smpFunction;
bit8 smpFunctionResult;
bit8 smpReserved;
} dmSMPFrameHeader_t;
#ifdef FOR_COMPLETENESS
typedef struct smpReqReportGeneral_s
{
} smpReqReportGeneral_t;
#endif
#define REPORT_GENERAL_CONFIGURING_BIT 0x2
#define REPORT_GENERAL_CONFIGURABLE_BIT 0x1
#define REPORT_GENERAL_LONG_RESPONSE_BIT 0x80
typedef struct smpRespReportGeneral_s
{
bit8 expanderChangeCount16[2];
bit8 expanderRouteIndexes16[2];
bit8 reserved1;
bit8 numOfPhys;
bit8 configuring_configurable;
bit8 reserved4[17];
} smpRespReportGeneral_t;
#define REPORT_GENERAL_IS_CONFIGURING(pResp) \
(((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURING_BIT) == \
REPORT_GENERAL_CONFIGURING_BIT)
#define REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
(((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURABLE_BIT) == \
REPORT_GENERAL_CONFIGURABLE_BIT)
#define REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
#define REPORT_GENERAL_IS_LONG_RESPONSE(pResp) \
(((pResp)->reserved1 & REPORT_GENERAL_LONG_RESPONSE_BIT) == \
REPORT_GENERAL_LONG_RESPONSE_BIT)
typedef struct smpRespReportManufactureInfo_s
{
bit8 reserved1[8];
bit8 vendorIdentification[8];
bit8 productIdentification[16];
bit8 productRevisionLevel[4];
bit8 vendorSpecific[20];
} smpRespReportManufactureInfo_t;
typedef struct smpReqDiscover_s
{
bit32 reserved1;
bit8 reserved2;
bit8 phyIdentifier;
bit8 ignored;
bit8 reserved3;
} smpReqDiscover_t;
typedef struct smpRespDiscover_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
bit8 attachedDeviceType;
bit8 negotiatedPhyLinkRate;
bit8 attached_Ssp_Stp_Smp_Sata_Initiator;
bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target;
bit8 sasAddressHi[4];
bit8 sasAddressLo[4];
bit8 attachedSasAddressHi[4];
bit8 attachedSasAddressLo[4];
bit8 attachedPhyIdentifier;
bit8 reserved9[7];
bit8 programmedAndHardware_MinPhyLinkRate;
bit8 programmedAndHardware_MaxPhyLinkRate;
bit8 phyChangeCount;
bit8 virtualPhy_partialPathwayTimeout;
bit8 routingAttribute;
bit8 reserved13[5];
bit8 vendorSpecific[2];
} smpRespDiscover_t;
#define DISCRSP_SSP_BIT 0x08
#define DISCRSP_STP_BIT 0x04
#define DISCRSP_SMP_BIT 0x02
#define DISCRSP_SATA_BIT 0x01
#define DISCRSP_SATA_PS_BIT 0x80
#define DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
(((pResp)->attachedDeviceType & 0x70) >> 4)
#define DISCRSP_GET_LINKRATE(pResp) \
((pResp)->negotiatedPhyLinkRate & 0x0F)
#define DISCRSP_IS_SSP_INITIATOR(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
#define DISCRSP_IS_STP_INITIATOR(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
#define DISCRSP_IS_SMP_INITIATOR(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
#define DISCRSP_IS_SATA_HOST(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
#define DISCRSP_IS_SSP_TARGET(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
#define DISCRSP_IS_STP_TARGET(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
#define DISCRSP_IS_SMP_TARGET(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
#define DISCRSP_IS_SATA_DEVICE(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
#define DISCRSP_IS_SATA_PORTSELECTOR(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT)
#define DISCRSP_GET_SAS_ADDRESSHI(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi)
#define DISCRSP_GET_SAS_ADDRESSLO(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo)
#define DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi)
#define DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo)
#define DISCRSP_VIRTUALPHY_BIT 0x80
#define DISCRSP_IS_VIRTUALPHY(pResp) \
(((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT)
#define DISCRSP_GET_ROUTINGATTRIB(pResp) \
((pResp)->routingAttribute & 0x0F)
typedef struct smpReqReportRouteTable_s
{
bit8 reserved1[2];
bit8 expanderRouteIndex16[20];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
} smpReqReportRouteTable_t;
typedef struct smpRespReportRouteTable_s
{
bit8 reserved1[2];
bit8 expanderRouteIndex16[2];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
bit8 disabled;
bit8 reserved5[3];
bit8 routedSasAddressHi32[4];
bit8 routedSasAddressLo32[4];
bit8 reserved6[16];
} smpRespReportRouteTable_t;
typedef struct smpReqConfigureRouteInformation_s
{
bit8 reserved1[2];
bit8 expanderRouteIndex[2];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
bit8 disabledBit_reserved4;
bit8 reserved5[3];
bit8 routedSasAddressHi[4];
bit8 routedSasAddressLo[4];
bit8 reserved6[16];
} smpReqConfigureRouteInformation_t;
#ifdef FOR_COMPLETENESS
typedef struct smpRespConfigureRouteInformation_s
{
} smpRespConfigureRouteInformation_t;
#endif
typedef struct smpReqReportPhySata_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
} smpReqReportPhySata_t;
typedef struct smpRespReportPhySata_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3;
bit8 affiliations_sup_valid;
bit8 reserved5[4];
bit8 stpSasAddressHi[4];
bit8 stpSasAddressLo[4];
bit8 regDevToHostFis[20];
bit8 reserved6[4];
bit8 affiliatedStpInitiatorSasAddressHi[4];
bit8 affiliatedStpInitiatorSasAddressLo[4];
} smpRespReportPhySata_t;
typedef struct smpReqPhyControl_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 phyOperation;
bit8 updatePartialPathwayTOValue;
bit8 reserved3[20];
bit8 programmedMinPhysicalLinkRate;
bit8 programmedMaxPhysicalLinkRate;
bit8 reserved4[2];
bit8 partialPathwayTOValue;
bit8 reserved5[3];
} smpReqPhyControl_t;
#ifdef FOR_COMPLETENESS
typedef struct smpRespPhyControl_s
{
} smpRespPhyControl_t;
#endif
typedef struct tdssSMPFrameHeader2_s
{
bit8 smpFrameType;
bit8 smpFunction;
bit8 smpAllocLenFuncResult;
bit8 smpReqResLen;
} tdssSMPFrameHeader2_t;
#ifdef FOR_COMPLETENESS
typedef struct smpReqReportGeneral2_s
{
} smpReqReportGeneral2_t;
#endif
#define REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT 0x80
#define REPORT_GENERAL_CONFIGURES_OTHERS_BIT 0x04
typedef struct smpRespReportGeneral2_s
{
bit8 expanderChangeCount16[2];
bit8 expanderRouteIndexes16[2];
bit8 LongResponse;
bit8 numOfPhys;
bit8 byte10;
bit8 reserved1;
bit8 EnclosureLogicalID[8];
bit8 reserved2[8];
bit8 reserved3[2];
bit8 STPBusInactivityTimeLimit[2];
bit8 STPMaxConnectTimeLimit[2];
bit8 STPSMPI_TNexusLossTime[2];
bit8 byte36;
bit8 byte37;
bit8 MaxNumOfRoutedSASAddr[2];
bit8 ActiveZoneManagerSASAddr[8];
bit8 ZoneLockInactivityTimeLimit[2];
bit8 reserved4[2];
bit8 reserved5;
bit8 FirstEnclosureConnectorElementIdx;
bit8 NumOfEnclosureConnectorElementIdxs;
bit8 reserved6;
bit8 ReducedFunctionality;
bit8 TimeToReducedFunctionality;
bit8 InitialTimeToReducedFunctionality;
bit8 MaxReducedFunctionalityTime;
bit8 LastSelfConfigurationStatusDescIdx[2];
bit8 MaxNumOfStoredSelfConfigurationStatusDesc[2];
bit8 LastPhyEventListDescIdx[2];
bit8 MaxNumbOfStoredPhyEventListDesc[2];
bit8 STPRejectToOpenLimit[2];
bit8 reserved7[2];
} smpRespReportGeneral2_t;
#define SAS2_REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
#define SAS2_REPORT_GENERAL_IS_CONFIGURING(pResp) \
(((pResp)->byte10 & REPORT_GENERAL_CONFIGURING_BIT) == \
REPORT_GENERAL_CONFIGURING_BIT)
#define SAS2_REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
(((pResp)->byte10 & REPORT_GENERAL_CONFIGURABLE_BIT) == \
REPORT_GENERAL_CONFIGURABLE_BIT)
#define SAS2_REPORT_GENERAL_IS_TABLE_TO_TABLE_SUPPORTED(pResp) \
(((pResp)->byte10 & REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT) == \
REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT)
#define SAS2_REPORT_GENERAL_IS_CONFIGURES_OTHERS(pResp) \
(((pResp)->byte10 & REPORT_GENERAL_CONFIGURES_OTHERS_BIT) == \
REPORT_GENERAL_CONFIGURES_OTHERS_BIT)
#ifdef FOR_COMPLETENESS
typedef struct smpReqReportManufactureInfo2_s
{
} smpReqReportManufactureInfo2_t;
#endif
typedef struct smpRespReportManufactureInfo2_s
{
bit16 ExpanderChangeCount;
bit8 reserved1[2];
bit8 SAS11Format;
bit8 reserved2[3];
bit8 vendorIdentification[8];
bit8 productIdentification[16];
bit8 productRevisionLevel[4];
bit8 componentVendorID[8];
bit8 componentID[2];
bit8 componentRevisionLevel;
bit8 reserved3;
bit8 vendorSpecific[8];
} smpRespReportManufactureInfo2_t;
typedef struct smpReqDiscover2_s
{
bit32 reserved1;
bit8 IgnoreZoneGroup;
bit8 phyIdentifier;
bit16 reserved2;
} smpReqDiscover2_t;
typedef struct smpRespDiscover2_s
{
bit16 ExpanderChangeCount;
bit8 reserved1[3];
bit8 phyIdentifier;
bit8 reserved2[2];
bit8 attachedDeviceTypeReason;
bit8 NegotiatedLogicalLinkRate;
bit8 attached_Ssp_Stp_Smp_Sata_Initiator;
bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target;
bit8 sasAddressHi[4];
bit8 sasAddressLo[4];
bit8 attachedSasAddressHi[4];
bit8 attachedSasAddressLo[4];
bit8 attachedPhyIdentifier;
bit8 byte33;
bit8 reserved3[6];
bit8 programmedAndHardware_MinPhyLinkRate;
bit8 programmedAndHardware_MaxPhyLinkRate;
bit8 phyChangeCount;
bit8 virtualPhy_partialPathwayTimeout;
bit8 routingAttribute;
bit8 ConnectorType;
bit8 ConnectorElementIndex;
bit8 ConnectorPhysicalLink;
bit8 reserved4[2];
bit8 vendorSpecific[2];
bit8 AttachedDeviceName[8];
bit8 byte60;
bit8 reserved5[2];
bit8 ZoneGroup;
bit8 SelfCongfiguringStatus;
bit8 SelfCongfigurationLevelsCompleted;
bit8 reserved6[2];
bit8 SelfConfigurationSASAddressHi[4];
bit8 SelfConfigurationSASAddressLo[4];
bit8 ProgrammedphyCapabilities[4];
bit8 CurrentphyCapabilities[4];
bit8 AttachedphyCapabilities[4];
bit8 reserved7[6];
bit8 ReasonNegotiatedPhysicalLinkRate;
bit8 NegotiatedSSCHWMuxingSupported;
bit8 byte96;
bit8 reserved8;
bit8 reserved9;
bit8 DefaultZoneGroup;
bit8 byte100;
bit8 reserved10;
bit8 reserved11;
bit8 SavedZoneGroup;
bit8 byte104;
bit8 reserved12;
bit8 reserved13;
bit8 ShadowZoneGroup;
bit8 DeviceSlotNumber;
bit8 GroupNumber;
bit16 PathToEnclosure;
} smpRespDiscover2_t;
#define SAS2_DISCRSP_SSP_BIT 0x08
#define SAS2_DISCRSP_STP_BIT 0x04
#define SAS2_DISCRSP_SMP_BIT 0x02
#define SAS2_DISCRSP_SATA_BIT 0x01
#define SAS2_DISCRSP_SATA_PS_BIT 0x80
#define SAS2_MUXING_SUPPORTED 0x01
#define SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
(((pResp)->attachedDeviceTypeReason & 0x70) >> 4)
#define SAS2_DISCRSP_GET_LINKRATE(pResp) \
((pResp)->ReasonNegotiatedPhysicalLinkRate & 0x0F)
#define SAS2_DISCRSP_GET_LOGICAL_LINKRATE(pResp) \
((pResp)->NegotiatedLogicalLinkRate & 0x0F)
#define SAS2_DISCRSP_IS_SSP_INITIATOR(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
#define SAS2_DISCRSP_IS_STP_INITIATOR(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
#define SAS2_DISCRSP_IS_SMP_INITIATOR(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
#define SAS2_DISCRSP_IS_SATA_HOST(pResp) \
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
#define SAS2_DISCRSP_IS_SSP_TARGET(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
#define SAS2_DISCRSP_IS_STP_TARGET(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
#define SAS2_DISCRSP_IS_SMP_TARGET(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
#define SAS2_DISCRSP_IS_SATA_DEVICE(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
#define SAS2_DISCRSP_IS_SATA_PORTSELECTOR(pResp) \
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT)
#define SAS2_DISCRSP_GET_SAS_ADDRESSHI(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi)
#define SAS2_DISCRSP_GET_SAS_ADDRESSLO(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo)
#define SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi)
#define SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo)
#define SAS2_DISCRSP_VIRTUALPHY_BIT 0x80
#define SAS2_DISCRSP_IS_VIRTUALPHY(pResp) \
(((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT)
#define SAS2_DISCRSP_GET_ROUTINGATTRIB(pResp) \
((pResp)->routingAttribute & 0x0F)
#define SAS2_DISCRSP_IS_MUXING_SUPPORTED(pResp) \
(((pResp)->NegotiatedSSCHWMuxingSupported & SAS2_MUXING_SUPPORTED) == SAS2_MUXING_SUPPORTED)
typedef struct smpReqDiscoverList2_s
{
bit32 reserved1;
bit8 StartingPhyID;
bit8 MaxNumDiscoverDesc;
bit8 byte10;
bit8 byte11;
bit32 reserved2;
bit8 VendorSpecific[12];
} smpReqDiscoverList2_t;
typedef struct smpRespDiscoverList2_s
{
bit16 ExpanderChangeCount;
bit16 reserved1;
bit8 StartingPhyID;
bit8 MaxNumDiscoverDesc;
bit8 byte10;
bit8 byte11;
bit8 DescLen;
bit8 reserved2;
bit16 reserved3;
bit8 byte16;
bit8 reserved4;
bit16 LastDescIdx;
bit16 LastPhyDescIdx;
bit8 reserved5[10];
bit8 VendorSpecific[16];
} smpRespDiscoverList2_t;
typedef struct smpReqReportRouteTable2_s
{
bit8 reserved1[2];
bit8 expanderRouteIndex16[20];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
} smpReqReportRouteTable2_t;
typedef struct smpRespReportRouteTable2_s
{
bit16 expanderChangeCount;
bit16 expanderRouteIndex;
bit8 reserved1;
bit8 phyIdentifier;
bit8 reserved2[2];
bit8 disabledBit_reserved3;
bit8 reserved4[3];
bit8 routedSasAddressHi[4];
bit8 routedSasAddressLo[4];
bit8 reserved5[16];
} smpRespReportRouteTable2_t;
typedef struct smpReqConfigureRouteInformation2_s
{
bit16 expectedExpanderChangeCount;
bit16 expanderRouteIndex;
bit8 reserved1;
bit8 phyIdentifier;
bit8 reserved2[2];
bit8 disabledBit_reserved3;
bit8 reserved4[3];
bit8 routedSasAddressHi[4];
bit8 routedSasAddressLo[4];
bit8 reserved5[16];
} smpReqConfigureRouteInformation2_t;
#ifdef FOR_COMPLETENESS
typedef struct smpRespConfigureRouteInformation2_s
{
} smpRespConfigureRouteInformation2_t;
#endif
typedef struct smpReqReportPhySata2_s
{
bit8 reserved1[5];
bit8 phyIdentifier;
bit8 AffiliationContext;
bit8 reserved2;
} smpReqReportPhySata2_t;
typedef struct smpRespReportPhySata2_s
{
bit16 expanderChangeCount;
bit8 reserved1[3];
bit8 phyIdentifier;
bit8 reserved2;
bit8 byte11;
bit8 reserved3[4];
bit8 stpSasAddressHi[4];
bit8 stpSasAddressLo[4];
bit8 regDevToHostFis[20];
bit8 reserved4[4];
bit8 affiliatedStpInitiatorSasAddressHi[4];
bit8 affiliatedStpInitiatorSasAddressLo[4];
bit8 STPITNexusLossSASAddressHi[4];
bit8 STPITNexusLossSASAddressLo[4];
bit8 reserved5;
bit8 AffiliationContext;
bit8 CurrentAffiliationContexts;
bit8 MaxAffiliationContexts;
} smpRespReportPhySata2_t;
typedef struct smpReqPhyControl2_s
{
bit16 expectedExpanderChangeCount;
bit8 reserved1[3];
bit8 phyIdentifier;
bit8 phyOperation;
bit8 updatePartialPathwayTOValue;
bit8 reserved2[12];
bit8 AttachedDeviceName[8];
bit8 programmedMinPhysicalLinkRate;
bit8 programmedMaxPhysicalLinkRate;
bit8 reserved3[2];
bit8 partialPathwayTOValue;
bit8 reserved4[3];
} smpReqPhyControl2_t;
#ifdef FOR_COMPLETENESS
typedef struct smpRespPhyControl2_s
{
} smpRespPhyControl2_t;
#endif
#define SMP_REQUEST 0x40
#define SMP_RESPONSE 0x41
#define DM_GET_SAS_ADDRESSLO(sasAddressLo) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo)
#define DM_GET_SAS_ADDRESSHI(sasAddressHi) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi)
#define DM_GET_LINK_RATE(input) (input & 0x0F)
#define DM_SAS_CONNECTION_RATE_1_5G 0x08
#define DM_SAS_CONNECTION_RATE_3_0G 0x09
#define DM_SAS_CONNECTION_RATE_6_0G 0x0A
#define DM_SAS_CONNECTION_RATE_12_0G 0x0B
#define DISCOVERY_CONFIGURING_TIMER_VALUE (3 * 1000 * 1000)
#define DISCOVERY_RETRIES 3
#define CONFIGURE_ROUTE_TIMER_VALUE (1 * 1000 * 1000)
#define DEVICE_REGISTRATION_TIMER_VALUE (2 * 1000 * 1000)
#define SMP_RETRIES 5
#define SMP_BUSY_TIMER_VALUE (1 * 1000 * 1000)
#define SMP_BUSY_RETRIES 5
#define SATA_ID_DEVICE_DATA_TIMER_VALUE (3 * 1000 * 1000)
#define SATA_ID_DEVICE_DATA_RETRIES 3
#define BC_TIMER_VALUE (5 * 1000 * 1000)
#define SMP_TIMER_VALUE (30 * 1000 * 1000)
#define STP_DEVICE_TYPE 0
#define SAS_DEVICE_TYPE 1
#define SATA_DEVICE_TYPE 2
#define ATAPI_DEVICE_FLAG 0x200000
#define SATA_ATA_DEVICE 0x01
#define SATA_ATAPI_DEVICE 0x02
#define SATA_PM_DEVICE 0x03
#define SATA_SEMB_DEVICE 0x04
#define SATA_SEMB_WO_SEP_DEVICE 0x05
#define UNKNOWN_DEVICE 0xFF
#define SAS_NO_DEVICE 0
#define SAS_END_DEVICE 1
#define SAS_EDGE_EXPANDER_DEVICE 2
#define SAS_FANOUT_EXPANDER_DEVICE 3
#define SAS_ROUTING_DIRECT 0x00
#define SAS_ROUTING_SUBTRACTIVE 0x01
#define SAS_ROUTING_TABLE 0x02
#define SAS_CONNECTION_RATE_1_5G 0x08
#define SAS_CONNECTION_RATE_3_0G 0x09
#define SAS_CONNECTION_RATE_6_0G 0x0A
#define SAS_CONNECTION_RATE_12_0G 0x0B
#define IT_NEXUS_TIMEOUT 0x7D0
#define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo)
#define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi)
#define DEVINFO_GET_DEVICETTYPE(devInfo) \
(((devInfo)->devType_S_Rate & 0xC0) >> 6)
#define DEVINFO_GET_LINKRATE(devInfo) \
((devInfo)->devType_S_Rate & 0x0F)
#define DM_DEFAULT_DEVICE 0
#define DM_SAS_DEVICE 1
#define DM_SATA_DEVICE 2
#define DEVICE_SSP_BIT 0x8
#define DEVICE_STP_BIT 0x4
#define DEVICE_SMP_BIT 0x2
#define DEVICE_SATA_BIT 0x1
#define DEVICE_IS_SSP_INITIATOR(DeviceData) \
(((DeviceData)->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
#define DEVICE_IS_STP_INITIATOR(DeviceData) \
(((DeviceData)->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
#define DEVICE_IS_SMP_INITIATOR(DeviceData) \
(((DeviceData)->initiator_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
#define DEVICE_IS_SSP_TARGET(DeviceData) \
(((DeviceData)->target_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
#define DEVICE_IS_STP_TARGET(DeviceData) \
(((DeviceData)->target_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
#define DEVICE_IS_SMP_TARGET(DeviceData) \
(((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
#define DEVICE_IS_SATA_DEVICE(DeviceData) \
(((DeviceData)->target_ssp_stp_smp & DEVICE_SATA_BIT) == DEVICE_SATA_BIT)
#define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo)
#define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \
DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi)
#define DEVINFO_GET_DEVICETTYPE(devInfo) \
(((devInfo)->devType_S_Rate & 0xC0) >> 6)
#define DEVINFO_GET_LINKRATE(devInfo) \
((devInfo)->devType_S_Rate & 0x0F)
#define DEVINFO_GET_EXT_SMP(devInfo) \
(((devInfo)->ext & 0x100) >> 8)
#define DEVINFO_GET_EXT_EXPANDER_TYPE(devInfo) \
(((devInfo)->ext & 0x600) >> 9)
#define DEVINFO_GET_EXT_MCN(devInfo) \
(((devInfo)->ext & 0x7800) >> 11)
#define DEVINFO_PUT_SMPTO(devInfo, smpto) \
((devInfo)->smpTimeout) = smpto
#define DEVINFO_PUT_ITNEXUSTO(devInfo, itnexusto) \
((devInfo)->it_NexusTimeout) = itnexusto
#define DEVINFO_PUT_FBS(devInfo, fbs) \
((devInfo)->firstBurstSize) = fbs
#define DEVINFO_PUT_FLAG(devInfo, tlr) \
((devInfo)->flag) = tlr
#define DEVINFO_PUT_DEV_S_RATE(devInfo, dev_s_rate) \
((devInfo)->devType_S_Rate) = dev_s_rate
#define DEVINFO_PUT_SAS_ADDRESSLO(devInfo, src32) \
*(bit32 *)((devInfo)->sasAddressLo) = BIT32_TO_DMA_BEBIT32(src32)
#define DEVINFO_PUT_SAS_ADDRESSHI(devInfo, src32) \
*(bit32 *)((devInfo)->sasAddressHi) = BIT32_TO_DMA_BEBIT32(src32)
#define DEVINFO_PUT_INITIATOR_SSP_STP_SMP(devInfo, ini_ssp_stp_smp) \
((devInfo)->initiator_ssp_stp_smp) = ini_ssp_stp_smp
#define DEVINFO_PUT_TARGET_SSP_STP_SMP(devInfo, tgt_ssp_stp_smp) \
((devInfo)->target_ssp_stp_smp) = tgt_ssp_stp_smp
#define DEVINFO_PUT_EXT(devInfo, extension) \
((devInfo)->ext) = extension
#endif