/*******************************************************************************
**
* Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
*
*Redistribution and use in source and binary forms, with or without modification, are permitted provided
*that the following conditions are met:
*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
*following disclaimer.
*2. Redistributions in binary form must reproduce the above copyright notice,
*this list of conditions and the following disclaimer in the documentation and/or other materials provided
*with the distribution.
*
*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
**
* $FreeBSD$
*
********************************************************************************/
#ifndef __DMDEFS_H__
#define __DMDEFS_H__
#include <dev/pms/RefTisa/tisa/sassata/common/ossa.h>
#define DIRECT_SMP
//#undef DIRECT_SMP
/* the index for memory requirement, must be continious */
#define DM_ROOT_MEM_INDEX 0 /**< the index of dm root memory */
#define DM_PORT_MEM_INDEX 1 /**< the index of port context memory */
#define DM_DEVICE_MEM_INDEX 2 /**< the index of Device descriptors memory */
#define DM_EXPANDER_MEM_INDEX 3 /**< the index of Expander device descriptors memory */
#define DM_SMP_MEM_INDEX 4 /**< the index of SMP command descriptors memory */
#define DM_INDIRECT_SMP_MEM_INDEX 5 /**< the index of Indirect SMP command descriptors memory */
#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 /**< defines the heart beat of the LL layer 10ms */
/*
* FIS type
*/
#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
};
/* default SMP timeout: 0xFFFF is the Maximum Allowed */
#define DEFAULT_SMP_TIMEOUT 0xFFFF
/* SMP direct payload size limit: IOMB direct payload size = 48 */
#define SMP_DIRECT_PAYLOAD_LIMIT 44
#define SMP_INDIRECT_PAYLOAD 512
/* SMP maximum payload size allowed by SAS spec withtout CRC 4 bytes */
#define SMP_MAXIMUM_PAYLOAD 1024
/*! \def MIN(a,b)
* \brief MIN macro
*
* use to find MIN of two values
*/
#ifndef MIN
#define MIN(a,b) ((a) < (b) ? (a) : (b))
#endif
/*! \def MAX(a,b)
* \brief MAX macro
*
* use to find MAX of two values
*/
#ifndef MAX
#define MAX(a,b) ((a) < (b) ? (b) : (a))
#endif
#ifndef agNULL
#define agNULL ((void *)0)
#endif
/* for debugging print */
#if defined(DM_DEBUG)
/*
* for debugging purposes.
*/
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 /* DM_DEBUG */
//#define DM_ASSERT OS_ASSERT
//#define tddmLogDebugString TIDEBUG_MSG
/* discovery related state */
#define DM_DSTATE_NOT_STARTED 0
#define DM_DSTATE_STARTED 1
#define DM_DSTATE_COMPLETED 2
#define DM_DSTATE_COMPLETED_WITH_FAILURE 3
/* SAS/SATA discovery status */
#define DISCOVERY_NOT_START 0 /**< status indicates discovery not started */
#define DISCOVERY_UP_STREAM 1 /**< status indicates discover upstream */
#define DISCOVERY_DOWN_STREAM 2 /**< status indicates discover downstream */
#define DISCOVERY_CONFIG_ROUTING 3 /**< status indicates discovery config routing table */
#define DISCOVERY_SAS_DONE 4 /**< status indicates discovery done */
#define DISCOVERY_REPORT_PHY_SATA 5 /**< status indicates discovery report phy sata */
/* SMP function */
#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
/* SMP function results */
#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
/* SMP PHY CONTROL OPERATION */
#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) /* returns true config space read is SPC */
#define DMIsSPCADAP(agr) (DM_VEN_DEV_SPC == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */
#define DMIsSPCv(agr) (DM_VEN_DEV_SPCv == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv */
#define DMIsSPCve(agr) (DM_VEN_DEV_SPCve == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve */
#define DMIsSPCvplus(agr) (DM_VEN_DEV_SPCvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */
#define DMIsSPCveplus(agr) (DM_VEN_DEV_SPCveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */
#define DMIsSPCADAPvplus(agr) (DM_VEN_DEV_ADAPvplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */
#define DMIsSPCADAPveplus(agr) (DM_VEN_DEV_ADAPveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */
/****************************************************************
* SAS 1.1 Spec
****************************************************************/
/* SMP header definition */
typedef struct dmSMPFrameHeader_s
{
bit8 smpFrameType; /* The first byte of SMP frame represents the SMP FRAME TYPE */
bit8 smpFunction; /* The second byte of the SMP frame represents the SMP FUNCTION */
bit8 smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */
bit8 smpReserved; /* reserved */
} dmSMPFrameHeader_t;
/****************************************************************
* report general request
****************************************************************/
#ifdef FOR_COMPLETENESS
typedef struct smpReqReportGeneral_s
{
/* nothing. some compiler disallowed structure with no member */
} smpReqReportGeneral_t;
#endif
/****************************************************************
* report general response
****************************************************************/
#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; /* byte 9; has LONG Response for SAS 2 at bit 8 */
bit8 numOfPhys;
bit8 configuring_configurable;
/* B7-2 : reserved */
/* B1 : configuring */
/* B0 : 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)
/****************************************************************
* report manufacturer info response
****************************************************************/
typedef struct smpRespReportManufactureInfo_s
{
bit8 reserved1[8];
bit8 vendorIdentification[8];
bit8 productIdentification[16];
bit8 productRevisionLevel[4];
bit8 vendorSpecific[20];
} smpRespReportManufactureInfo_t;
/****************************************************************
* discover request
****************************************************************/
typedef struct smpReqDiscover_s
{
bit32 reserved1;
bit8 reserved2;
bit8 phyIdentifier;
bit8 ignored;
bit8 reserved3;
} smpReqDiscover_t;
/****************************************************************
* discover response
****************************************************************/
typedef struct smpRespDiscover_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
bit8 attachedDeviceType; /* byte 12 */
/* B7 : reserved */
/* B6-4 : attachedDeviceType */
/* B3-0 : reserved */
bit8 negotiatedPhyLinkRate; /* byte 11 */
/* B7-4 : reserved */
/* B3-0 : negotiatedPhyLinkRate */
bit8 attached_Ssp_Stp_Smp_Sata_Initiator; /* byte 14 */
/* B7-4 : reserved */
/* B3 : attachedSspInitiator */
/* B2 : attachedStpInitiator */
/* B1 : attachedSmpInitiator */
/* B0 : attachedSataHost */
bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target; /* byte 15 */
/* B7 : attachedSataPortSelector */
/* B6-4 : reserved */
/* B3 : attachedSspTarget */
/* B2 : attachedStpTarget */
/* B1 : attachedSmpTarget */
/* B0 : attachedSatadevice */
bit8 sasAddressHi[4];
bit8 sasAddressLo[4];
bit8 attachedSasAddressHi[4];
bit8 attachedSasAddressLo[4];
bit8 attachedPhyIdentifier;
bit8 reserved9[7];
bit8 programmedAndHardware_MinPhyLinkRate;
/* B7-4 : programmedMinPhyLinkRate */
/* B3-0 : hardwareMinPhyLinkRate */
bit8 programmedAndHardware_MaxPhyLinkRate;
/* B7-4 : programmedMaxPhyLinkRate */
/* B3-0 : hardwareMaxPhyLinkRate */
bit8 phyChangeCount;
bit8 virtualPhy_partialPathwayTimeout; /* byte 43 */
/* B7 : virtualPhy*/
/* B6-4 : reserved */
/* B3-0 : partialPathwayTimeout */
bit8 routingAttribute;
/* B7-4 : reserved */
/* B3-0 : 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)
/* bit8 array[4] -> bit32 */
#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)
/* bit8 array[4] -> bit32 */
#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)
/****************************************************************
* report route table request
****************************************************************/
typedef struct smpReqReportRouteTable_s
{
bit8 reserved1[2];
bit8 expanderRouteIndex16[20];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
} smpReqReportRouteTable_t;
/****************************************************************
* report route response
****************************************************************/
typedef struct smpRespReportRouteTable_s
{
bit8 reserved1[2];
bit8 expanderRouteIndex16[2];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
bit8 disabled;
/* B7 : expander route entry disabled */
/* B6-0 : reserved */
bit8 reserved5[3];
bit8 routedSasAddressHi32[4];
bit8 routedSasAddressLo32[4];
bit8 reserved6[16];
} smpRespReportRouteTable_t;
/****************************************************************
* configure route information request
****************************************************************/
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;
/****************************************************************
* configure route response
****************************************************************/
#ifdef FOR_COMPLETENESS
typedef struct smpRespConfigureRouteInformation_s
{
/* nothing. some compiler disallowed structure with no member */
} smpRespConfigureRouteInformation_t;
#endif
/****************************************************************
* report Phy Sata request
****************************************************************/
typedef struct smpReqReportPhySata_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3[2];
} smpReqReportPhySata_t;
/****************************************************************
* report Phy Sata response
****************************************************************/
typedef struct smpRespReportPhySata_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 reserved3;
bit8 affiliations_sup_valid;
/* b7-2 : reserved */
/* b1 : Affiliations supported */
/* b0 : Affiliation valid */
bit8 reserved5[4];
bit8 stpSasAddressHi[4];
bit8 stpSasAddressLo[4];
bit8 regDevToHostFis[20];
bit8 reserved6[4];
bit8 affiliatedStpInitiatorSasAddressHi[4];
bit8 affiliatedStpInitiatorSasAddressLo[4];
} smpRespReportPhySata_t;
/****************************************************************
* Phy Control request
****************************************************************/
typedef struct smpReqPhyControl_s
{
bit8 reserved1[4];
bit8 reserved2;
bit8 phyIdentifier;
bit8 phyOperation;
bit8 updatePartialPathwayTOValue;
/* b7-1 : reserved */
/* b0 : update partial pathway timeout value */
bit8 reserved3[20];
bit8 programmedMinPhysicalLinkRate;
/* b7-4 : programmed Minimum Physical Link Rate*/
/* b3-0 : reserved */
bit8 programmedMaxPhysicalLinkRate;
/* b7-4 : programmed Maximum Physical Link Rate*/
/* b3-0 : reserved */
bit8 reserved4[2];
bit8 partialPathwayTOValue;
/* b7-4 : reserved */
/* b3-0 : partial Pathway TO Value */
bit8 reserved5[3];
} smpReqPhyControl_t;
/****************************************************************
* Phy Control response
****************************************************************/
#ifdef FOR_COMPLETENESS
typedef struct smpRespPhyControl_s
{
/* nothing. some compiler disallowed structure with no member */
} smpRespPhyControl_t;
#endif
/****************************************************************
* SAS 2 Rev 14c Spec
****************************************************************/
/* SMP header definition */
typedef struct tdssSMPFrameHeader2_s
{
bit8 smpFrameType; /* The first byte of SMP frame represents the SMP FRAME TYPE */
bit8 smpFunction; /* The second byte of the SMP frame represents the SMP FUNCTION */
bit8 smpAllocLenFuncResult; /* The third byte of SMP frame represents ALLOCATED RESPONSE LENGTH of SMP request or FUNCTION RESULT of the SMP response. */
bit8 smpReqResLen; /* The third byte of SMP frame represents REQUEST LENGTH of SMP request or RESPONSE LENGTH of the SMP response. */
} tdssSMPFrameHeader2_t;
/****************************************************************
* report general request
****************************************************************/
#ifdef FOR_COMPLETENESS
typedef struct smpReqReportGeneral2_s
{
/* nothing. some compiler disallowed structure with no member */
} smpReqReportGeneral2_t;
#endif
/****************************************************************
* report general response
****************************************************************/
#define REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT 0x80
#define REPORT_GENERAL_CONFIGURES_OTHERS_BIT 0x04
typedef struct smpRespReportGeneral2_s
{
bit8 expanderChangeCount16[2]; /* byte 4-5 */
bit8 expanderRouteIndexes16[2]; /* byte 6-7 */
bit8 LongResponse; /* byte 8 */
/* B7: LongResponse */
/* B6-0: Reserved */
bit8 numOfPhys; /* byte 9 */
bit8 byte10;
/* B7 : TABLE TO TABLE SUPPORTED */
/* B6 : ZONE CONFIGURING */
/* B5 : SELF CONFIGURING */
/* B4 : STP CONTINUE AWT */
/* B3 : OPEN REJECT RETRY SUPPORTED */
/* B2 : CONFIGURES OTHERS */
/* B1 : CONFIGURING */
/* B0 : EXTERNALLY CONFIGURABLE ROUTE TABLE */
bit8 reserved1; /* byte11 */
bit8 EnclosureLogicalID[8];
bit8 reserved2[8]; /* upto byte27; Spec 1.1 */
bit8 reserved3[2];
bit8 STPBusInactivityTimeLimit[2];
bit8 STPMaxConnectTimeLimit[2]; /* byte33 */
bit8 STPSMPI_TNexusLossTime[2]; /* byte35 */
bit8 byte36;
/* B7-6 : NUMBER OF ZONE GROUPS */
/* B5 : RESERVED */
/* B4 : ZONE LOCKED */
/* B3 : PHYSICAL PRESENCE SUPPORTED */
/* B2 : PHYSICAL PRESENCE ASSERTED */
/* B1 : ZONING SUPPORTED */
/* B0 : ZONING ENABLED */
bit8 byte37;
/* B7-5 : RESERVED */
/* B4 : SAVING */
/* B3 : SAVING ZONE MANAGER PASSWORD SUPPORTED */
/* B2 : SAVING ZONE PHY INFORMATION SUPPORTED */
/* B1 : SAVING ZONE PERMISSION TABLE SUPPORTED */
/* B0 : SAVING ZONING ENABLED SUPPORTED */
bit8 MaxNumOfRoutedSASAddr[2]; /* byte39 */
bit8 ActiveZoneManagerSASAddr[8]; /* byte47 */
bit8 ZoneLockInactivityTimeLimit[2]; /* byte49 */
bit8 reserved4[2];
bit8 reserved5; /* byte52 */
bit8 FirstEnclosureConnectorElementIdx; /* byte53 */
bit8 NumOfEnclosureConnectorElementIdxs; /* byte54 */
bit8 reserved6; /* byte55 */
bit8 ReducedFunctionality;
/* B7: ReducedFunctionality */
/* B6-0: Reserved */
bit8 TimeToReducedFunctionality;
bit8 InitialTimeToReducedFunctionality;
bit8 MaxReducedFunctionalityTime; /* byte59 */
bit8 LastSelfConfigurationStatusDescIdx[2];
bit8 MaxNumOfStoredSelfConfigurationStatusDesc[2];
bit8 LastPhyEventListDescIdx[2];
bit8 MaxNumbOfStoredPhyEventListDesc[2]; /* byte67 */
bit8 STPRejectToOpenLimit[2]; /* byte69 */
bit8 reserved7[2]; /* byte71 */
} 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)
/****************************************************************
* report manufacturer info request
****************************************************************/
#ifdef FOR_COMPLETENESS
typedef struct smpReqReportManufactureInfo2_s
{
/* nothing. some compiler disallowed structure with no member */
} smpReqReportManufactureInfo2_t;
#endif
/****************************************************************
* report manufacturer info response
****************************************************************/
typedef struct smpRespReportManufactureInfo2_s
{
bit16 ExpanderChangeCount; /* byte 4-5 */
bit8 reserved1[2]; /* byte 6-7 */
bit8 SAS11Format; /* byte 8 */
/* B7-1 : RESERVED */
/* B0 : SAS-1.1 Format */
bit8 reserved2[3]; /* byte 9-11 */
bit8 vendorIdentification[8]; /* byte 12-19 */
bit8 productIdentification[16]; /* byte 20-35 */
bit8 productRevisionLevel[4]; /* byte 36-39 */
bit8 componentVendorID[8]; /* byte 40-47 */
bit8 componentID[2]; /* byte 48-49 */
bit8 componentRevisionLevel; /* byte 50 */
bit8 reserved3; /* byte 51 */
bit8 vendorSpecific[8]; /* byte 52-59 */
} smpRespReportManufactureInfo2_t;
/****************************************************************
* discover request
****************************************************************/
typedef struct smpReqDiscover2_s
{
bit32 reserved1; /* byte 4 - 7 */
bit8 IgnoreZoneGroup; /* byte 8 */
bit8 phyIdentifier; /* byte 9 */
bit16 reserved2; /* byte 10 - 11*/
} smpReqDiscover2_t;
/****************************************************************
* discover response
****************************************************************/
typedef struct smpRespDiscover2_s
{
bit16 ExpanderChangeCount; /* byte 4 - 5 */
bit8 reserved1[3]; /* byte 6 - 8 */
bit8 phyIdentifier; /* byte 9 */
bit8 reserved2[2]; /* byte 10 - 11 */
bit8 attachedDeviceTypeReason; /* byte 12 */
/* B7 : RESERVED */
/* B6-4 : Attached Device Type */
/* B3-0 : Attached Reason */
bit8 NegotiatedLogicalLinkRate; /* byte 13 */
/* B7-4 : RESERVED */
/* B3-0 : Negotiated Logical Link Rate */
bit8 attached_Ssp_Stp_Smp_Sata_Initiator; /* byte 14 */
/* B7-4 : reserved */
/* B3 : attached SSP Initiator */
/* B2 : attached STP Initiator */
/* B1 : attached SMP Initiator */
/* B0 : attached SATA Host */
bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target; /* byte 15 */
/* B7 : attached SATA Port Selector */
/* B6-4 : reserved */
/* B3 : attached SSP Target */
/* B2 : attached STP Target */
/* B1 : attached SMP Target */
/* B0 : attached SATA device */
bit8 sasAddressHi[4]; /* byte 16 - 19 */
bit8 sasAddressLo[4]; /* byte 20 - 23 */
bit8 attachedSasAddressHi[4]; /* byte 24 - 27 */
bit8 attachedSasAddressLo[4]; /* byte 28 - 31 */
bit8 attachedPhyIdentifier; /* byte 32 */
bit8 byte33; /* byte 33 */
/* B7-3 : reserved */
/* B2 : attached Inside ZPSDS Persistent */
/* B1 : attached Requested Inside ZPSDS */
/* B0 : attached Break Reply Capable */
bit8 reserved3[6]; /* byte 34 - 39; for indentify address frame related fields */
bit8 programmedAndHardware_MinPhyLinkRate; /* byte 40 */
/* B7-4 : programmedMinPhyLinkRate */
/* B3-0 : hardwareMinPhyLinkRate */
bit8 programmedAndHardware_MaxPhyLinkRate; /* byte 41 */
/* B7-4 : programmedMaxPhyLinkRate */
/* B3-0 : hardwareMaxPhyLinkRate */
bit8 phyChangeCount; /* byte 42 */
bit8 virtualPhy_partialPathwayTimeout; /* byte 43 */
/* B7 : virtualPhy*/
/* B6-4 : reserved */
/* B3-0 : partialPathwayTimeout */
bit8 routingAttribute; /* byte 44 */
/* B7-4 : reserved */
/* B3-0 : routingAttribute */
bit8 ConnectorType; /* byte 45 */
/* B7 : reserved */
/* B6-0 : Connector Type */
bit8 ConnectorElementIndex; /* byte 46 */
bit8 ConnectorPhysicalLink; /* byte 47 */
bit8 reserved4[2]; /* byte 48 - 49 */
bit8 vendorSpecific[2]; /* byte 50 - 51*/
bit8 AttachedDeviceName[8]; /* byte 52 - 59*/
bit8 byte60; /* byte 60 */
/* B7 : reserved */
/* B6 : Requested Inside ZPSDS Changed By Expander */
/* B5 : Inside ZPSDS Persistent */
/* B4 : Requested Inside ZPSDS */
/* B3 : reserved */
/* B2 : Zone Group Persistent */
/* B1 : Inside ZPSDS */
/* B0 : Zoning Enabled */
bit8 reserved5[2]; /* byte 61 - 62; zoning-related fields */
bit8 ZoneGroup; /* byte 63 */
bit8 SelfCongfiguringStatus; /* byte 64 */
bit8 SelfCongfigurationLevelsCompleted; /* byte 65 */
bit8 reserved6[2]; /* byte 66 - 67; self configuration related fields */
bit8 SelfConfigurationSASAddressHi[4]; /* byte 68 - 71 */
bit8 SelfConfigurationSASAddressLo[4]; /* byte 72 - 75 */
bit8 ProgrammedphyCapabilities[4]; /* byte 76 - 79 */
bit8 CurrentphyCapabilities[4]; /* byte 80 - 83 */
bit8 AttachedphyCapabilities[4]; /* byte 84 - 87 */
bit8 reserved7[6]; /* byte 88 - 93 */
bit8 ReasonNegotiatedPhysicalLinkRate; /* byte 94 */
bit8 NegotiatedSSCHWMuxingSupported; /* byte 95 */
/* B7-2 : reserved */
/* B1 : Negotiated SSC */
/* B0 : HW Muxing Supported */
bit8 byte96; /* byte 96 */
/* B7-6 : reserved */
/* B5 : Default Inside ZPSDS Persistent */
/* B4 : Default Requested Inside ZPSDS */
/* B3 : reserved */
/* B2 : Default Zone Group Persistent */
/* B1 : reserved */
/* B0 : Default Zoning Enabled */
bit8 reserved8; /* byte 97 */
bit8 reserved9; /* byte 98 */
bit8 DefaultZoneGroup; /* byte 99 */
bit8 byte100; /* byte 100 */
/* B7-6 : reserved */
/* B5 : Saved Inside ZPSDS Persistent */
/* B4 : Saved Requested Inside ZPSDS */
/* B3 : reserved */
/* B2 : Saved Zone Group Persistent */
/* B1 : reserved */
/* B0 : Saved Zoning Enabled */
bit8 reserved10; /* byte 101 */
bit8 reserved11; /* byte 102 */
bit8 SavedZoneGroup; /* byte 103 */
bit8 byte104; /* byte 104 */
/* B7-6 : reserved */
/* B5 : Shadow Inside ZPSDS Persistent */
/* B4 : Shadow Requested Inside ZPSDS */
/* B3 : reserved */
/* B2 : Shadow Zone Group Persistent */
/* B1-0 : reserved */
bit8 reserved12; /* byte 105 */
bit8 reserved13; /* byte 106 */
bit8 ShadowZoneGroup; /* byte 107 */
bit8 DeviceSlotNumber; /* byte 108 */
bit8 GroupNumber; /* byte 109 */
bit16 PathToEnclosure; /* byte 110 - 111 */
} 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)
/****************************************************************
* discover list request
****************************************************************/
typedef struct smpReqDiscoverList2_s
{
bit32 reserved1; /* byte 4 - 7 */
bit8 StartingPhyID; /* byte 8 */
bit8 MaxNumDiscoverDesc; /* byte 9 */
bit8 byte10; /* byte 10 */
/* B7 : Ignore Zone Group */
/* B6-4 : Reserved */
/* B3-0 : Phy Filter */
bit8 byte11; /* byte 11 */
/* B7-4 : Reserved */
/* B6-4 : Descriptor Type */
bit32 reserved2; /* byte 12 - 15 */
bit8 VendorSpecific[12]; /* byte 16 - 27 */
} smpReqDiscoverList2_t;
/****************************************************************
* discover list response
****************************************************************/
typedef struct smpRespDiscoverList2_s
{
bit16 ExpanderChangeCount; /* byte 4 - 5 */
bit16 reserved1; /* byte 6 - 7 */
bit8 StartingPhyID; /* byte 8 */
bit8 MaxNumDiscoverDesc; /* byte 9 */
bit8 byte10; /* byte 10 */
/* B7-4 : Reserved */
/* B3-0 : Phy Filter */
bit8 byte11; /* byte 11 */
/* B7-4 : Reserved */
/* B6-4 : Descriptor Type */
bit8 DescLen; /* byte 12 */
bit8 reserved2; /* byte 13 */
bit16 reserved3; /* byte 14 - 15 */
bit8 byte16; /* byte 16 */
/* B7 : Zoning Supported */
/* B6 : Zoning Enabled */
/* B5-4 : Reserved */
/* B3 : Self Configuring */
/* B2 : Zone Configuring */
/* B1 : Configuring */
/* B0 : Externally Configurable Route Table */
bit8 reserved4; /* byte 17 */
bit16 LastDescIdx; /* byte 18 - 19 */
bit16 LastPhyDescIdx; /* byte 20 - 21 */
bit8 reserved5[10]; /* byte 22 - 31 */
bit8 VendorSpecific[16]; /* byte 32 - 47 */
} smpRespDiscoverList2_t;
/****************************************************************
* report route table request
****************************************************************/
typedef struct smpReqReportRouteTable2_s
{
bit8 reserved1[2]; /* byte 4 - 5 */
bit8 expanderRouteIndex16[20]; /* byte 6- 7 */
bit8 reserved2; /* byte 8 */
bit8 phyIdentifier; /* byte 9 */
bit8 reserved3[2]; /* byte 10 -11 */
} smpReqReportRouteTable2_t;
/****************************************************************
* report route response
****************************************************************/
typedef struct smpRespReportRouteTable2_s
{
bit16 expanderChangeCount; /* byte 4 - 5 */
bit16 expanderRouteIndex; /* byte 6 - 7 */
bit8 reserved1; /* byte 8 */
bit8 phyIdentifier; /* byte 9 */
bit8 reserved2[2]; /* byte 10 - 11 */
bit8 disabledBit_reserved3; /* byte 12 */
/* B7 : Expander Route Entry Disabled */
/* B6-0 : reserved */
bit8 reserved4[3]; /* byte 13-15 */
bit8 routedSasAddressHi[4]; /* byte 16-19 */
bit8 routedSasAddressLo[4]; /* byte 20-23 */
bit8 reserved5[16]; /* byte 24-39 */
} smpRespReportRouteTable2_t;
/****************************************************************
* configure route information request
****************************************************************/
typedef struct smpReqConfigureRouteInformation2_s
{
bit16 expectedExpanderChangeCount; /* byte 4-5 */
bit16 expanderRouteIndex; /* byte 6-7 */
bit8 reserved1; /* byte 8 */
bit8 phyIdentifier; /* byte 9 */
bit8 reserved2[2]; /* byte 10-11 */
bit8 disabledBit_reserved3; /* byte 12 */
/* B7 : Expander Route Entry Disabled */
/* B6-0 : reserved */
bit8 reserved4[3]; /* byte 13-15 */
bit8 routedSasAddressHi[4]; /* byte 16-19 */
bit8 routedSasAddressLo[4]; /* byte 20-23 */
bit8 reserved5[16]; /* byte 24-39 */
} smpReqConfigureRouteInformation2_t;
/****************************************************************
* configure route response
****************************************************************/
#ifdef FOR_COMPLETENESS
typedef struct smpRespConfigureRouteInformation2_s
{
/* nothing. some compiler disallowed structure with no member */
} smpRespConfigureRouteInformation2_t;
#endif
/****************************************************************
* report Phy Sata request
****************************************************************/
typedef struct smpReqReportPhySata2_s
{
bit8 reserved1[5]; /* byte 4-8 */
bit8 phyIdentifier; /* byte 9 */
bit8 AffiliationContext; /* byte 10 */
bit8 reserved2; /* byte 11 */
} smpReqReportPhySata2_t;
/****************************************************************
* report Phy Sata response
****************************************************************/
typedef struct smpRespReportPhySata2_s
{
bit16 expanderChangeCount; /* byte 4-5 */
bit8 reserved1[3]; /* byte 6-8 */
bit8 phyIdentifier; /* byte 9 */
bit8 reserved2; /* byte 10 */
bit8 byte11; /* byte 11 */
/* b7-3 : reserved */
/* b2 : STP I_T Nexus Loss Occurred */
/* b1 : Affiliations supported */
/* b0 : Affiliation valid */
bit8 reserved3[4]; /* byte 12-15 */
bit8 stpSasAddressHi[4]; /* byte 16-19 */
bit8 stpSasAddressLo[4]; /* byte 20-23 */
bit8 regDevToHostFis[20]; /* byte 24-43 */
bit8 reserved4[4]; /* byte 44-47 */
bit8 affiliatedStpInitiatorSasAddressHi[4]; /* byte 48-51 */
bit8 affiliatedStpInitiatorSasAddressLo[4]; /* byte 52-55 */
bit8 STPITNexusLossSASAddressHi[4]; /* byte 56-59 */
bit8 STPITNexusLossSASAddressLo[4]; /* byte 60-63 */
bit8 reserved5; /* byte 64 */
bit8 AffiliationContext; /* byte 65 */
bit8 CurrentAffiliationContexts; /* byte 66 */
bit8 MaxAffiliationContexts; /* byte 67 */
} smpRespReportPhySata2_t;
/****************************************************************
* Phy Control request
****************************************************************/
typedef struct smpReqPhyControl2_s
{
bit16 expectedExpanderChangeCount; /* byte 4-5 */
bit8 reserved1[3]; /* byte 6-8 */
bit8 phyIdentifier; /* byte 9 */
bit8 phyOperation; /* byte 10 */
bit8 updatePartialPathwayTOValue; /* byte 11 */
/* b7-1 : reserved */
/* b0 : update partial pathway timeout value */
bit8 reserved2[12]; /* byte 12-23 */
bit8 AttachedDeviceName[8]; /* byte 24-31 */
bit8 programmedMinPhysicalLinkRate; /* byte 32 */
/* b7-4 : programmed Minimum Physical Link Rate*/
/* b3-0 : reserved */
bit8 programmedMaxPhysicalLinkRate; /* byte 33 */
/* b7-4 : programmed Maximum Physical Link Rate*/
/* b3-0 : reserved */
bit8 reserved3[2]; /* byte 34-35 */
bit8 partialPathwayTOValue; /* byte 36 */
/* b7-4 : reserved */
/* b3-0 : partial Pathway TO Value */
bit8 reserved4[3]; /* byte 37-39 */
} smpReqPhyControl2_t;
/****************************************************************
* Phy Control response
****************************************************************/
#ifdef FOR_COMPLETENESS
typedef struct smpRespPhyControl2_s
{
/* nothing. some compiler disallowed structure with no member */
} smpRespPhyControl2_t;
#endif
#define SMP_REQUEST 0x40
#define SMP_RESPONSE 0x41
/* bit8 array[4] -> bit32 */
#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) /* 3 seconds */
#define DISCOVERY_RETRIES 3
#define CONFIGURE_ROUTE_TIMER_VALUE (1 * 1000 * 1000) /* 1 seconds */
#define DEVICE_REGISTRATION_TIMER_VALUE (2 * 1000 * 1000) /* 2 seconds */
#define SMP_RETRIES 5
#define SMP_BUSY_TIMER_VALUE (1 * 1000 * 1000) /* 1 second */
#define SMP_BUSY_RETRIES 5
#define SATA_ID_DEVICE_DATA_TIMER_VALUE (3 * 1000 * 1000) /* 3 second */
#define SATA_ID_DEVICE_DATA_RETRIES 3
#define BC_TIMER_VALUE (5 * 1000 * 1000) /* 5 second */
#define SMP_TIMER_VALUE (30 * 1000 * 1000) /* 30 second */
#define STP_DEVICE_TYPE 0 /* SATA behind expander 00*/
#define SAS_DEVICE_TYPE 1 /* SSP or SMP 01 */
#define SATA_DEVICE_TYPE 2 /* direct SATA 10 */
#define ATAPI_DEVICE_FLAG 0x200000 /* ATAPI device flag*/
/* ATA device type */
#define SATA_ATA_DEVICE 0x01 /**< ATA ATA device type */
#define SATA_ATAPI_DEVICE 0x02 /**< ATA ATAPI device type */
#define SATA_PM_DEVICE 0x03 /**< ATA PM device type */
#define SATA_SEMB_DEVICE 0x04 /**< ATA SEMB device type */
#define SATA_SEMB_WO_SEP_DEVICE 0x05 /**< ATA SEMB without SEP device type */
#define UNKNOWN_DEVICE 0xFF
/* SAS device type definition. SAS spec(r.7) p206 */
#define SAS_NO_DEVICE 0
#define SAS_END_DEVICE 1
#define SAS_EDGE_EXPANDER_DEVICE 2
#define SAS_FANOUT_EXPANDER_DEVICE 3
/* routing attributes */
#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 /* 2000 ms; old value was 0xFFFF */
/* bit8 array[4] -> bit32 */
#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)
/* this macro is based on SAS spec, not sTSDK 0xC0 */
#define DEVINFO_GET_DEVICETTYPE(devInfo) \
(((devInfo)->devType_S_Rate & 0xC0) >> 6)
#define DEVINFO_GET_LINKRATE(devInfo) \
((devInfo)->devType_S_Rate & 0x0F)
/**< target device type */
#define DM_DEFAULT_DEVICE 0
#define DM_SAS_DEVICE 1
#define DM_SATA_DEVICE 2
#define DEVICE_SSP_BIT 0x8 /* SSP Initiator port */
#define DEVICE_STP_BIT 0x4 /* STP Initiator port */
#define DEVICE_SMP_BIT 0x2 /* SMP Initiator port */
#define DEVICE_SATA_BIT 0x1 /* SATA device, valid in the discovery response only */
#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)
/* bit8 array[4] -> bit32 */
#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)
/* this macro is based on SAS spec, not sTSDK 0xC0 */
#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
/* bit32 -> bit8 array[4] */
#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 /* __DMDEFS_H__ */