mirror of
https://github.com/opnsense/src.git
synced 2026-04-15 14:29:58 -04:00
1194 lines
47 KiB
C
1194 lines
47 KiB
C
/******************************************************************************
|
|
*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$
|
|
*
|
|
******************************************************************************/
|
|
/*****************************************************************************/
|
|
/*! \file sa_spec.h
|
|
* \brief The file defines the constants defined by sas spec
|
|
*/
|
|
|
|
/*****************************************************************************/
|
|
|
|
#ifndef __SA_SPEC_H__
|
|
#define __SA_SPEC_H__
|
|
|
|
/****************************************************************
|
|
* SAS Specification related defines *
|
|
****************************************************************/
|
|
#define SA_SAS_PROTOCOL_SMP 0x00
|
|
#define SA_SAS_PROTOCOL_SSP 0x01
|
|
#define SA_SAS_PROTOCOL_STP 0x02
|
|
|
|
#define SA_OPENFRM_SIZE (28)
|
|
#define SA_IDENTIFY_FRAME_SIZE (28)
|
|
//#define SAS_IDENTIFY_FRM_SIZE SA_IDENTIFY_FRAME_SIZE
|
|
|
|
#define SA_SAS_FRAME_TYPE_SSP_DATA 0x01
|
|
#define SA_SAS_FRAME_TYPE_SSP_XRDY 0x05
|
|
#define SA_SAS_FRAME_TYPE_SSP_CMD 0x06
|
|
#define SA_SAS_FRAME_TYPE_SSP_RSP 0x07
|
|
#define SA_SAS_FRAME_TYPE_SSP_TASK 0x16
|
|
#define SA_SAS_FRAME_TYPE_SMP_REQ 0x40
|
|
#define SA_SAS_FRAME_TYPE_SMP_RSP 0x41
|
|
|
|
#define SA_SAS_CONNECTION_RATE_1_5G 0x08
|
|
#define SA_SAS_CONNECTION_RATE_3_0G 0x09
|
|
#define SA_SAS_CONNECTION_RATE_6_0G 0x0A
|
|
#define SA_SAS_CONNECTION_RATE_12_0G 0x0B
|
|
|
|
#define SA_SAS_DEV_TYPE_NO_DEVICE 0x00
|
|
#define SA_SAS_DEV_TYPE_END_DEVICE 0x01
|
|
#define SA_SAS_DEV_TYPE_EDGE_EXPANDER 0x02
|
|
#define SA_SAS_DEV_TYPE_FANOUT_EXPANDER 0x03
|
|
|
|
#define AGSA_DEV_TYPE_END_DEVICE (SA_SAS_DEV_TYPE_END_DEVICE << 4)
|
|
#define AGSA_DEV_TYPE_EDGE_EXPANDER (SA_SAS_DEV_TYPE_EDGE_EXPANDER << 4)
|
|
#define AGSA_DEV_TYPE_FAN_EXPANDER (SA_SAS_DEV_TYPE_FANOUT_EXPANDER << 4)
|
|
|
|
#define SA_SAS_SMP_REPORT_GENERAL 0x00
|
|
#define SA_SAS_SMP_REPORT_MANUFACTURE_INFORMATION 0x01
|
|
#define SA_SAS_SMP_READ_GPIO_REGISTER 0x02
|
|
#define SA_SAS_SMP_DISCOVER 0x10
|
|
#define SA_SAS_SMP_REPORT_PHY_ERROR_LOG 0x11
|
|
#define SA_SAS_SMP_REPORT_PHY_SATA 0x12
|
|
#define SA_SAS_SMP_REPORT_ROUTING_INFORMATION 0x13
|
|
#define SA_SAS_SMP_WRITE_GPIO_REGISTER 0x82
|
|
#define SA_SAS_SMP_CONFIGURE_ROUTING_INFORMATION 0x90
|
|
#define SA_SAS_SMP_PHY_CONTROL 0x91
|
|
#define SA_SAS_SMP_PHY_TEST 0x92
|
|
|
|
#define SA_SAS_SMP_FUNCTION_ACCEPTED 0x00
|
|
#define SA_SAS_SMP_FUNCTION_UNKNOWN 0x01
|
|
#define SA_SAS_SMP_FUNCTION_FAILED 0x02
|
|
#define SA_SAS_SMP_INVALID_REQ_FRAME_LENGTH 0x03
|
|
#define SA_SAS_SMP_PHY_NOT_EXIST 0x10
|
|
|
|
#define SA_SAS_ROUTING_DIRECT 0x00
|
|
#define SA_SAS_ROUTING_SUBTRACTIVE 0x01
|
|
#define SA_SAS_ROUTING_TABLE 0x02
|
|
|
|
#define SA_SAS_PHYCTL_LINK_RESET 0x01
|
|
#define SA_SAS_PHYCTL_HARD_RESET 0x02
|
|
#define SA_SAS_PHYCTL_DISABLE 0x03
|
|
#define SA_SAS_PHYCTL_CLEAR_ERROR_LOG 0x05
|
|
#define SA_SAS_PHYCTL_CLEAR_AFFILIATION 0x06
|
|
#define SA_SAS_PHYCTL_TRANSMIT_PS_SIGNAL 0x07
|
|
|
|
#define SA_SSP_CMDIU_LEN_BYTES 28
|
|
#define SA_SSP_TMIU_LEN_BYTES 28
|
|
|
|
|
|
#define SASD_DEV_SATA_MASK 0xF0
|
|
#define SASD_DEV_SAS_MASK 0x0F
|
|
|
|
#define SASD_DEV_SAS_END_DEVICE 0x01 /* SAS end device type */
|
|
#define SASD_DEV_SAS_EDGE_EXPANDER 0x02 /* SAS edge expander device type */
|
|
#define SASD_DEV_SAS_FAN_EXPANDER 0x03 /* SAS fan out expander device type */
|
|
|
|
#define SASD_DEV_SATA_ATA_DEVICE 0x10 /* SATA ATA device type */
|
|
#define SASD_DEV_SATA_ATAPI_DEVICE 0x20 /* SATA ATAPI device type */
|
|
#define SASD_DEV_SATA_PM_DEVICE 0x30 /* SATA PM device type */
|
|
#define SASD_DEV_SATA_SEMB_DEVICE 0x40 /* SATA SEMB device type */
|
|
#define SASD_DEV_SATA_SEMB_WO_SEP_DEVICE 0x50 /* SATA SEMB without SEP device type */
|
|
|
|
#define SASD_DEV_SATA_UNKNOWN_DEVICE 0xFF /* SAS SATA unknown device type */
|
|
|
|
|
|
#define SASD_TASK_ATTR_SIMPLE 0x0
|
|
#define SASD_TASK_ATTR_HEAD_OF_QUEUE 0x1
|
|
#define SASD_TASK_ATTR_ORDERED 0x2
|
|
#define SASD_TASK_ATTR_ACA 0x4
|
|
|
|
|
|
/*****************************************************************************
|
|
** SAS TM Function definitions
|
|
*****************************************************************************/
|
|
#define SASD_SAS_ABORT_TASK 0x01
|
|
#define SASD_SAS_ABORT_TASK_SET 0x02
|
|
#define SASD_SAS_CLEAR_TASK_SET 0x04
|
|
#define SASD_SAS_LOGICAL_UNIT_RESET 0x08
|
|
#define SASD_SAS_CLEAR_ACA 0x40
|
|
#define SASD_SAS_QUARY_TASK 0x80
|
|
|
|
/****************************************************************
|
|
* SATA Specification related defines *
|
|
****************************************************************/
|
|
#define SA_SATA_MAX_QUEUED_COMMANDS 32
|
|
#define SA_SATA_MAX_PM_PORTS 15
|
|
|
|
#define SA_SATA_FIS_TYPE_HOST_2_DEV 0x27
|
|
#define SA_SATA_FIS_TYPE_DEV_2_HOST 0x34
|
|
#define SA_SATA_FIS_TYPE_SET_DEVICE 0xA1
|
|
#define SA_SATA_FIS_TYPE_DMA_ACTIVE 0x39
|
|
#define SA_SATA_FIS_TYPE_FDMA_SETUP 0x41
|
|
#define SA_SATA_FIS_TYPE_BIST 0x58
|
|
|
|
#define SA_SATA_CMD_IDENTIFY_DEVICE 0xEC
|
|
#define SA_SATA_CMD_EXEC_DEV_DIAG 0x90
|
|
|
|
#define SA_SATA_CONTROL_SRST 0x04
|
|
|
|
#define SA_SATA_H2DREG_LEN_BYTES 20
|
|
#define SA_SATA_H2D_BIST_LEN_BYTES 12
|
|
/****************************************************************
|
|
* SAS Specification related structures *
|
|
****************************************************************/
|
|
|
|
|
|
|
|
/** \brief Structure for SATA BIST FIS
|
|
*
|
|
* The agsaFisBIST_t data structure describes a SATA FIS (Frame Information Structures)
|
|
* for FIS type BIST (Built In Self Test) Activate Bidirectional.
|
|
*
|
|
* This data structure is one instance of the SATA request structure agsaSATAInitiatorRequest_t,
|
|
* which is one instance of the generic request, issued to saSATAStart().
|
|
*/
|
|
|
|
|
|
#define SA_SATA_BIST_PATTERN_T_BIT 0x80
|
|
#define SA_SATA_BIST_PATTERN_A_BIT 0x40
|
|
#define SA_SATA_BIST_PATTERN_S_BIT 0x20
|
|
#define SA_SATA_BIST_PATTERN_L_BIT 0x10
|
|
#define SA_SATA_BIST_PATTERN_F_BIT 0x08
|
|
#define SA_SATA_BIST_PATTERN_P_BIT 0x04
|
|
#define SA_SATA_BIST_PATTERN_R_BIT 0x02
|
|
#define SA_SATA_BIST_PATTERN_V_BIT 0x01
|
|
|
|
/*
|
|
* The first SATA DWORD types.
|
|
*/
|
|
typedef struct agsaFisBISTHeader_s
|
|
{
|
|
bit8 fisType; /* fisType, set to 58h for BIST */
|
|
bit8 pmPort;
|
|
/* b7-b4 reserved */
|
|
/* b3-b0 PM Port. device port address that the PM should deliver the FIS to */
|
|
bit8 patternDefinition;
|
|
/* b7 : T Far end transmit only mode */
|
|
/* b6 : A ALIGN Bypass (Do not Transmit Align Primitives) (valid only in combination with T Bit) (optional behavior) */
|
|
/* b5 : S Bypass Scrambling (valid only in combination with T Bit) (optional behavior) */
|
|
/* b4 : L Far End Retimed Loopback. Transmitter shall insert additional ALIGNS) */
|
|
/* b3 : F Far End Analog (AFE) Loopback (Optional) */
|
|
/* b2 : P Primitive bit. (valid only in combination with the T Bit) (optional behavior) */
|
|
/* b1 : R Reserved */
|
|
/* b0 : V Vendor Specific Test Mode. Causes all other bits to be ignored */
|
|
bit8 reserved5; /* Reserved */
|
|
} agsaFisBISTHeader_t;
|
|
|
|
|
|
typedef struct agsaFisRegD2HHeader_s
|
|
{
|
|
bit8 fisType; /* fisType, set to 34h for DeviceToHostReg */
|
|
bit8 i_pmPort;
|
|
/* b7 : reserved */
|
|
/* b6 : I Interrupt bit */
|
|
/* b5-b4 : reserved */
|
|
/* b3-b0 : PM Port */
|
|
bit8 status; /* Contains the contents to be placed in the Status(and Alternate status)
|
|
Register of the Shadow Command Block */
|
|
bit8 error; /* Contains the contents to be placed in the Error register of the Shadow Command Block */
|
|
} agsaFisRegD2HHeader_t;
|
|
|
|
typedef struct agsaFisSetDevBitsHeader_s
|
|
{
|
|
bit8 fisType; /* fisType, set to A1h for SetDeviceBit */
|
|
bit8 n_i_pmPort;
|
|
/* b7 : n Bit. Notification bit. If set device needs attention. */
|
|
/* b6 : i Bit. Interrupt Bit */
|
|
/* b5-b4: reserved2 */
|
|
/* b3-b0: PM Port */
|
|
bit8 statusHi_Lo;
|
|
/* b7 : reserved */
|
|
/* b6-b4: Status Hi. Contains the contents to be placed in bits 6, 5, and 4 of
|
|
the Status register of the Shadow Command Block */
|
|
/* b3 : Reserved */
|
|
/* b2-b0: Status Lo Contains the contents to be placed in bits 2,1, and 0 of the
|
|
Status register of the Shadow Command Block */
|
|
bit8 error; /* Contains the contents to be placed in the Error register of
|
|
the Shadow Command Block */
|
|
} agsaFisSetDevBitsHeader_t;
|
|
|
|
typedef struct agsaFisRegH2DHeader_s
|
|
{
|
|
bit8 fisType; /* fisType, set to 27h for DeviceToHostReg */
|
|
bit8 c_pmPort;
|
|
/* b7 : C_bit This bit is set to one when the register transfer is
|
|
due to an update of the Command register */
|
|
/* b6-b4: reserved */
|
|
/* b3-b0: PM Port */
|
|
bit8 command; /* Contains the contents of the Command register of
|
|
the Shadow Command Block */
|
|
bit8 features; /* Contains the contents of the Features register of
|
|
the Shadow Command Block */
|
|
} agsaFisRegH2DHeader_t;
|
|
|
|
typedef struct agsaFisPioSetupHeader_s
|
|
{
|
|
bit8 fisType; /* set to 5F */
|
|
bit8 i_d_pmPort;
|
|
/* b7 : reserved */
|
|
/* b6 : i bit. Interrupt bit */
|
|
/* b5 : d bit. data transfer direction. set to 1 for device to host xfer */
|
|
/* b4 : reserved */
|
|
/* b3-b0: PM Port */
|
|
bit8 status;
|
|
bit8 error;
|
|
} agsaFisPioSetupHeader_t;
|
|
|
|
typedef union agsaFisHeader_s
|
|
{
|
|
agsaFisBISTHeader_t Bist;
|
|
agsaFisRegD2HHeader_t D2H;
|
|
agsaFisRegH2DHeader_t H2D;
|
|
agsaFisSetDevBitsHeader_t SetDevBits;
|
|
agsaFisPioSetupHeader_t PioSetup;
|
|
} agsaFisHeader_t;
|
|
|
|
|
|
typedef struct agsaFisBISTData_s
|
|
{
|
|
bit8 data[8]; /* BIST data */
|
|
} agsaFisBISTData_t;
|
|
|
|
|
|
typedef struct agsaFisBIST_s
|
|
{
|
|
agsaFisBISTHeader_t h;
|
|
agsaFisBISTData_t d;
|
|
} agsaFisBIST_t;
|
|
|
|
/** \brief Structure for SATA Device to Host Register FIS
|
|
*
|
|
* The agsaFisRegDeviceToHost_t data structure describes a SATA FIS (Frame Information
|
|
* Structures) for FIS type Register Device to Host.
|
|
*
|
|
* This structure is used only as inbound data (device to host) to describe device to
|
|
* host response.
|
|
*/
|
|
|
|
#define SA_SATA_RD2H_I_BIT 0x40
|
|
|
|
typedef struct agsaFisRegD2HData_s
|
|
{
|
|
bit8 lbaLow; /* Contains the contents to be placed in the LBA Low register
|
|
of the Shadow Command Block */
|
|
bit8 lbaMid; /* Contains the contents to be placed in the LBA Mid register
|
|
of the Shadow Command Block */
|
|
|
|
bit8 lbaHigh; /* Contains the contents to be placed in the LBA High register
|
|
of the Shadow Command Block */
|
|
bit8 device; /* Contains the contents to be placed in the Device register of the Shadow Command Block */
|
|
|
|
bit8 lbaLowExp; /* Contains the contents of the expanded address field
|
|
of the Shadow Command Block */
|
|
bit8 lbaMidExp; /* Contains the contents of the expanded address field
|
|
of the Shadow Command Block */
|
|
bit8 lbaHighExp; /* Contains the contents of the expanded address field
|
|
of the Shadow Command Block */
|
|
bit8 reserved4; /** reserved */
|
|
|
|
bit8 sectorCount; /* Contains the contents to be placed in the Sector
|
|
Count register of the Shadow Command Block */
|
|
bit8 sectorCountExp; /* Contains the contents of the expanded address
|
|
field of the Shadow Command Block */
|
|
bit8 reserved6; /* Reserved */
|
|
bit8 reserved5; /* Reserved */
|
|
bit32 reserved7; /* Reserved */
|
|
} agsaFisRegD2HData_t;
|
|
|
|
|
|
typedef struct agsaFisRegDeviceToHost_s
|
|
{
|
|
agsaFisRegD2HHeader_t h;
|
|
agsaFisRegD2HData_t d;
|
|
} agsaFisRegDeviceToHost_t;
|
|
|
|
|
|
|
|
/** \brief Structure for SATA Host to Device Register FIS
|
|
*
|
|
* The agsaFisRegHostToDevice_t data structure describes a SATA FIS
|
|
* (Frame Information Structures) for FIS type Register Host to Device.
|
|
|
|
* This data structure is one instance of the SATA request structure
|
|
* agsaSATAInitiatorRequest_t, which is one instance of the generic request,
|
|
* issued to saSATAStart().
|
|
*/
|
|
typedef struct agsaFisRegH2DData_s
|
|
{
|
|
bit8 lbaLow; /* Contains the contents of the LBA Low register of the Shadow Command Block */
|
|
bit8 lbaMid; /* Contains the contents of the LBA Mid register of the Shadow Command Block */
|
|
bit8 lbaHigh; /* Contains the contents of the LBA High register of the Shadow Command Block */
|
|
bit8 device; /* Contains the contents of the Device register of the Shadow Command Block */
|
|
|
|
bit8 lbaLowExp; /* Contains the contents of the expanded address field of the
|
|
Shadow Command Block */
|
|
bit8 lbaMidExp; /* Contains the contents of the expanded address field of the
|
|
Shadow Command Block */
|
|
bit8 lbaHighExp; /* Contains the contents of the expanded address field of the
|
|
Shadow Command Block */
|
|
bit8 featuresExp; /* Contains the contents of the expanded address field of the
|
|
Shadow Command Block */
|
|
|
|
bit8 sectorCount; /* Contains the contents of the Sector Count register of the
|
|
Shadow Command Block */
|
|
bit8 sectorCountExp; /* Contains the contents of the expanded address field of
|
|
the Shadow Command Block */
|
|
bit8 reserved4; /* Reserved */
|
|
bit8 control; /* Contains the contents of the Device Control register of the
|
|
Shadow Command Block */
|
|
bit32 reserved5; /* Reserved */
|
|
} agsaFisRegH2DData_t;
|
|
|
|
typedef struct agsaFisRegHostToDevice_s
|
|
{
|
|
agsaFisRegH2DHeader_t h;
|
|
agsaFisRegH2DData_t d;
|
|
} agsaFisRegHostToDevice_t;
|
|
|
|
|
|
/** \brief Structure for SATA SetDeviceBit FIS
|
|
*
|
|
* The agsaFisSetDevBits_t data structure describes a SATA FIS (Frame Information Structures)
|
|
* for FIS type Set Device Bits - Device to Host.
|
|
*
|
|
* This structure is used only as inbound data (device to host) to describe device to host
|
|
* response.
|
|
*/
|
|
typedef struct agsaFisSetDevBitsData_s
|
|
{
|
|
bit32 reserved6; /* Reserved */
|
|
} agsaFisSetDevBitsData_t;
|
|
|
|
|
|
typedef struct agsaFisSetDevBits_s
|
|
{
|
|
agsaFisSetDevBitsHeader_t h;
|
|
agsaFisSetDevBitsData_t d;
|
|
} agsaFisSetDevBits_t;
|
|
|
|
|
|
/** \brief union data structure specifies a FIS from host software
|
|
*
|
|
* union data structure specifies a FIS from host software
|
|
*/
|
|
typedef union agsaSATAHostFis_u
|
|
{
|
|
agsaFisRegHostToDevice_t fisRegHostToDev; /* Structure containing the FIS request
|
|
for Register - Host to Device */
|
|
agsaFisBIST_t fisBIST; /* Structure containing the FIS request for BIST */
|
|
} agsaSATAHostFis_t;
|
|
|
|
/** \brief
|
|
*
|
|
* This structure is used
|
|
*
|
|
*/
|
|
typedef struct agsaFisPioSetupData_s
|
|
{
|
|
bit8 lbaLow; /* Contains the contents of the LBA Low register of the Shadow Command Block */
|
|
bit8 lbaMid; /* Contains the contents of the LBA Mid register of the Shadow Command Block */
|
|
bit8 lbaHigh; /* Contains the contents of the LBA High register of the Shadow Command Block */
|
|
bit8 device; /* Contains the contents of the Device register of the Shadow Command Block */
|
|
|
|
bit8 lbaLowExp; /* Contains the contents of the expanded address field of the
|
|
Shadow Command Block */
|
|
bit8 lbaMidExp; /* Contains the contents of the expanded address field of the
|
|
Shadow Command Block */
|
|
bit8 lbaHighExp; /* Contains the contents of the expanded address field of the
|
|
Shadow Command Block */
|
|
bit8 reserved1; /* reserved */
|
|
|
|
bit8 sectorCount; /* Contains the contents of the Sector Count register of the
|
|
Shadow Command Block */
|
|
bit8 sectorCountExp; /* Contains the contents of the expanded address field of
|
|
the Shadow Command Block */
|
|
bit8 reserved2; /* Reserved */
|
|
bit8 e_status; /* Contains the new value of Status Reg of the Command block
|
|
at the conclusion of the subsequent Data FIS */
|
|
bit8 reserved4[2]; /* Reserved */
|
|
bit8 transferCount[2]; /* the number of bytes to be xfered in the subsequent Data FiS */
|
|
} agsaFisPioSetupData_t;
|
|
|
|
|
|
typedef struct agsaFisPioSetup_s
|
|
{
|
|
agsaFisPioSetupHeader_t h;
|
|
agsaFisPioSetupData_t d;
|
|
} agsaFisPioSetup_t;
|
|
|
|
|
|
|
|
/** \brief describe SAS IDENTIFY address frame
|
|
*
|
|
* describe SAS IDENTIFY address frame, the CRC field is not included in the structure
|
|
*
|
|
*/
|
|
typedef struct agsaSASIdentify_s
|
|
{
|
|
bit8 deviceType_addressFrameType;
|
|
/* b7 : reserved */
|
|
/* b6-4 : device type */
|
|
/* b3-0 : address frame type */
|
|
bit8 reason; /* reserved */
|
|
/* b7-4 : reserved */
|
|
/* b3-0 : reason SAS2 */
|
|
bit8 initiator_ssp_stp_smp;
|
|
/* b8-4 : reserved */
|
|
/* b3 : SSP initiator port */
|
|
/* b2 : STP initiator port */
|
|
/* b1 : SMP initiator port */
|
|
/* b0 : reserved */
|
|
bit8 target_ssp_stp_smp;
|
|
/* b8-4 : reserved */
|
|
/* b3 : SSP target port */
|
|
/* b2 : STP target port */
|
|
/* b1 : SMP target port */
|
|
/* b0 : reserved */
|
|
bit8 deviceName[8]; /* reserved */
|
|
|
|
bit8 sasAddressHi[4]; /* BE SAS address Lo */
|
|
bit8 sasAddressLo[4]; /* BE SAS address Hi */
|
|
|
|
bit8 phyIdentifier; /* phy identifier of the phy transmitting the IDENTIFY address frame */
|
|
bit8 zpsds_breakReplyCap;
|
|
/* b7-3 : reserved */
|
|
/* b2 : Inside ZPSDS Persistent */
|
|
/* b1 : Requested Inside ZPSDS */
|
|
/* b0 : Break Reply Capable */
|
|
bit8 reserved3[6]; /* reserved */
|
|
} agsaSASIdentify_t;
|
|
|
|
#define SA_IDFRM_GET_SAS_ADDRESSLO(identFrame) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32 *)(identFrame)->sasAddressLo)
|
|
|
|
#define SA_IDFRM_GET_SAS_ADDRESSHI(identFrame) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32 *)(identFrame)->sasAddressHi)
|
|
|
|
#define SA_IDFRM_GET_DEVICETTYPE(identFrame) \
|
|
(((identFrame)->deviceType_addressFrameType & 0x70) >> 4)
|
|
|
|
#define SA_IDFRM_PUT_SAS_ADDRESSLO(identFrame, src32) \
|
|
((*(bit32 *)((identFrame)->sasAddressLo)) = BIT32_TO_DMA_BEBIT32(src32))
|
|
|
|
#define SA_IDFRM_PUT_SAS_ADDRESSHI(identFrame, src32) \
|
|
((*(bit32 *)((identFrame)->sasAddressHi)) = BIT32_TO_DMA_BEBIT32(src32))
|
|
|
|
#define SA_IDFRM_SSP_BIT 0x8 /* SSP Initiator port */
|
|
#define SA_IDFRM_STP_BIT 0x4 /* STP Initiator port */
|
|
#define SA_IDFRM_SMP_BIT 0x2 /* SMP Initiator port */
|
|
#define SA_IDFRM_SATA_BIT 0x1 /* SATA device, valid in the discovery response only */
|
|
|
|
|
|
#define SA_IDFRM_IS_SSP_INITIATOR(identFrame) \
|
|
(((identFrame)->initiator_ssp_stp_smp & SA_IDFRM_SSP_BIT) == SA_IDFRM_SSP_BIT)
|
|
|
|
#define SA_IDFRM_IS_STP_INITIATOR(identFrame) \
|
|
(((identFrame)->initiator_ssp_stp_smp & SA_IDFRM_STP_BIT) == SA_IDFRM_STP_BIT)
|
|
|
|
#define SA_IDFRM_IS_SMP_INITIATOR(identFrame) \
|
|
(((identFrame)->initiator_ssp_stp_smp & SA_IDFRM_SMP_BIT) == SA_IDFRM_SMP_BIT)
|
|
|
|
#define SA_IDFRM_IS_SSP_TARGET(identFrame) \
|
|
(((identFrame)->target_ssp_stp_smp & SA_IDFRM_SSP_BIT) == SA_IDFRM_SSP_BIT)
|
|
|
|
#define SA_IDFRM_IS_STP_TARGET(identFrame) \
|
|
(((identFrame)->target_ssp_stp_smp & SA_IDFRM_STP_BIT) == SA_IDFRM_STP_BIT)
|
|
|
|
#define SA_IDFRM_IS_SMP_TARGET(identFrame) \
|
|
(((identFrame)->target_ssp_stp_smp & SA_IDFRM_SMP_BIT) == SA_IDFRM_SMP_BIT)
|
|
|
|
#define SA_IDFRM_IS_SATA_DEVICE(identFrame) \
|
|
(((identFrame)->target_ssp_stp_smp & SA_IDFRM_SATA_BIT) == SA_IDFRM_SATA_BIT)
|
|
|
|
/** \brief data structure provides the identify data of the SATA device
|
|
*
|
|
* data structure provides the identify data of the SATA device
|
|
*
|
|
*/
|
|
typedef struct agsaSATAIdentifyData_s
|
|
{
|
|
bit16 rm_ataDevice;
|
|
/* b15-b9 : */
|
|
/* b8 : ataDevice */
|
|
/* b7-b1 : */
|
|
/* b0 : removableMedia */
|
|
bit16 word1_9[9]; /**< word 1 to 9 of identify device information */
|
|
bit8 serialNumber[20]; /**< word 10 to 19 of identify device information, 20 ASCII chars */
|
|
bit16 word20_22[3]; /**< word 20 to 22 of identify device information */
|
|
bit8 firmwareVersion[8]; /**< word 23 to 26 of identify device information, 4 ASCII chars */
|
|
bit8 modelNumber[40]; /**< word 27 to 46 of identify device information, 40 ASCII chars */
|
|
bit16 word47_48[2]; /**< word 47 to 48 of identify device information, 40 ASCII chars */
|
|
bit16 dma_lba_iod_ios_stimer;
|
|
/* b15-b14:word49_bit14_15 */
|
|
/* b13 : standbyTimerSupported */
|
|
/* b12 : word49_bit12 */
|
|
/* b11 : IORDYSupported */
|
|
/* b10 : IORDYDisabled */
|
|
/* b9 : lbaSupported */
|
|
/* b8 : dmaSupported */
|
|
/* b7-b0 : retired */
|
|
bit16 word50_52[3]; /**< word 50 to 52 of identify device information, 40 ASCII chars */
|
|
bit16 valid_w88_w70;
|
|
/* b15-3 : word53_bit3_15 */
|
|
/* b2 : validWord88 */
|
|
/* b1 : validWord70_64 */
|
|
/* b0 : word53_bit0 */
|
|
bit16 word54_59[6]; /**< word54-59 of identify device information */
|
|
bit16 numOfUserAddressableSectorsLo; /**< word60 of identify device information */
|
|
bit16 numOfUserAddressableSectorsHi; /**< word61 of identify device information */
|
|
bit16 word62_74[13]; /**< word62-74 of identify device information */
|
|
bit16 queueDepth;
|
|
/* b15-5 : word75_bit5_15 */
|
|
/* b4-0 : queueDepth */
|
|
bit16 sataCapabilities;
|
|
/* b15-b11: word76_bit11_15 */
|
|
/* b10 : phyEventCountersSupport */
|
|
/* b9 : hostInitPowerMangment */
|
|
/* b8 : nativeCommandQueuing */
|
|
/* b7-b3 : word76_bit4_7 */
|
|
/* b2 : sataGen2Supported (3.0 Gbps) */
|
|
/* b1 : sataGen1Supported (1.5 Gbps) */
|
|
/* b0 :word76_bit0 */
|
|
bit16 word77; /**< word77 of identify device information */
|
|
/* b15-b6 : word77 bit6_15, Reserved */
|
|
/* b5 : DMA Setup Auto-Activate support */
|
|
/* b4 : NCQ streaming support */
|
|
/* b3-b1 : coded value indicating current negotiated SATA signal speed */
|
|
/* b0 : shall be zero */
|
|
bit16 sataFeaturesSupported;
|
|
/* b15-b7 : word78_bit7_15 */
|
|
/* b6 : softSettingPreserveSupported */
|
|
/* b5 : word78_bit5 */
|
|
/* b4 : inOrderDataDeliverySupported */
|
|
/* b3 : devInitPowerManagementSupported */
|
|
/* b2 : autoActiveDMASupported */
|
|
/* b1 : nonZeroBufOffsetSupported */
|
|
/* b0 : word78_bit0 */
|
|
bit16 sataFeaturesEnabled;
|
|
/* b15-7 : word79_bit7_15 */
|
|
/* b6 : softSettingPreserveEnabled */
|
|
/* b5 : word79_bit5 */
|
|
/* b4 : inOrderDataDeliveryEnabled */
|
|
/* b3 : devInitPowerManagementEnabled */
|
|
/* b2 : autoActiveDMAEnabled */
|
|
/* b1 : nonZeroBufOffsetEnabled */
|
|
/* b0 : word79_bit0 */
|
|
bit16 majorVersionNumber;
|
|
/* b15 : word80_bit15 */
|
|
/* b14 : supportATA_ATAPI14 */
|
|
/* b13 : supportATA_ATAPI13 */
|
|
/* b12 : supportATA_ATAPI12 */
|
|
/* b11 : supportATA_ATAPI11 */
|
|
/* b10 : supportATA_ATAPI10 */
|
|
/* b9 : supportATA_ATAPI9 */
|
|
/* b8 : supportATA_ATAPI8 */
|
|
/* b7 : supportATA_ATAPI7 */
|
|
/* b6 : supportATA_ATAPI6 */
|
|
/* b5 : supportATA_ATAPI5 */
|
|
/* b4 : supportATA_ATAPI4 */
|
|
/* b3 : supportATA3 */
|
|
/* b2-0 : word80_bit0_2 */
|
|
bit16 minorVersionNumber; /**< word81 of identify device information */
|
|
bit16 commandSetSupported;
|
|
/* b15 : word82_bit15 */
|
|
/* b14 : NOPSupported */
|
|
/* b13 : READ_BUFFERSupported */
|
|
/* b12 : WRITE_BUFFERSupported */
|
|
/* b11 : word82_bit11 */
|
|
/* b10 : hostProtectedAreaSupported */
|
|
/* b9 : DEVICE_RESETSupported */
|
|
/* b8 : SERVICEInterruptSupported */
|
|
/* b7 : releaseInterruptSupported */
|
|
/* b6 : lookAheadSupported */
|
|
/* b5 : writeCacheSupported */
|
|
/* b4 : word82_bit4 */
|
|
/* b3 : mandPowerManagmentSupported */
|
|
/* b2 : removableMediaSupported */
|
|
/* b1 : securityModeSupported */
|
|
/* b0 : SMARTSupported */
|
|
bit16 commandSetSupported1;
|
|
/* b15-b14: word83_bit14_15 */
|
|
/* b13 : FLUSH_CACHE_EXTSupported */
|
|
/* b12 : mandatoryFLUSH_CACHESupported */
|
|
/* b11 : devConfOverlaySupported */
|
|
/* b10 : address48BitsSupported */
|
|
/* b9 : autoAcousticManageSupported */
|
|
/* b8 : SET_MAX_SecurityExtSupported */
|
|
/* b7 : word83_bit7 */
|
|
/* b6 : SET_FEATUREReqSpinupSupported */
|
|
/* b5 : powerUpInStandyBySupported */
|
|
/* b4 : removableMediaStNotifSupported */
|
|
/* b3 : advanPowerManagmentSupported */
|
|
/* b2 : CFASupported */
|
|
/* b1 : DMAQueuedSupported */
|
|
/* b0 : DOWNLOAD_MICROCODESupported */
|
|
bit16 commandSetFeatureSupportedExt;
|
|
/* b15-b13: word84_bit13_15 */
|
|
/* b12 : timeLimitRWContSupported */
|
|
/* b11 : timeLimitRWSupported */
|
|
/* b10 : writeURGBitSupported */
|
|
/* b9 : readURGBitSupported */
|
|
/* b8 : wwwNameSupported */
|
|
/* b7 : WRITE_DMAQ_FUA_EXTSupported */
|
|
/* b6 : WRITE_FUA_EXTSupported */
|
|
/* b5 : generalPurposeLogSupported */
|
|
/* b4 : streamingSupported */
|
|
/* b3 : mediaCardPassThroughSupported */
|
|
/* b2 : mediaSerialNoSupported */
|
|
/* b1 : SMARTSelfRestSupported */
|
|
/* b0 : SMARTErrorLogSupported */
|
|
bit16 commandSetFeatureEnabled;
|
|
/* b15 : word85_bit15 */
|
|
/* b14 : NOPEnabled */
|
|
/* b13 : READ_BUFFEREnabled */
|
|
/* b12 : WRITE_BUFFEREnabled */
|
|
/* b11 : word85_bit11 */
|
|
/* b10 : hostProtectedAreaEnabled */
|
|
/* b9 : DEVICE_RESETEnabled */
|
|
/* b8 : SERVICEInterruptEnabled */
|
|
/* b7 : releaseInterruptEnabled */
|
|
/* b6 : lookAheadEnabled */
|
|
/* b5 : writeCacheEnabled */
|
|
/* b4 : word85_bit4 */
|
|
/* b3 : mandPowerManagmentEnabled */
|
|
/* b2 : removableMediaEnabled */
|
|
/* b1 : securityModeEnabled */
|
|
/* b0 : SMARTEnabled */
|
|
bit16 commandSetFeatureEnabled1;
|
|
/* b15-b14: word86_bit14_15 */
|
|
/* b13 : FLUSH_CACHE_EXTEnabled */
|
|
/* b12 : mandatoryFLUSH_CACHEEnabled */
|
|
/* b11 : devConfOverlayEnabled */
|
|
/* b10 : address48BitsEnabled */
|
|
/* b9 : autoAcousticManageEnabled */
|
|
/* b8 : SET_MAX_SecurityExtEnabled */
|
|
/* b7 : word86_bit7 */
|
|
/* b6 : SET_FEATUREReqSpinupEnabled */
|
|
/* b5 : powerUpInStandyByEnabled */
|
|
/* b4 : removableMediaStNotifEnabled */
|
|
/* b3 : advanPowerManagmentEnabled */
|
|
/* b2 : CFAEnabled */
|
|
/* b1 : DMAQueuedEnabled */
|
|
/* b0 : DOWNLOAD_MICROCODEEnabled */
|
|
bit16 commandSetFeatureDefault;
|
|
/* b15-b13: word87_bit13_15 */
|
|
/* b12 : timeLimitRWContEnabled */
|
|
/* b11 : timeLimitRWEnabled */
|
|
/* b10 : writeURGBitEnabled */
|
|
/* b9 : readURGBitEnabled */
|
|
/* b8 : wwwNameEnabled */
|
|
/* b7 : WRITE_DMAQ_FUA_EXTEnabled */
|
|
/* b6 : WRITE_FUA_EXTEnabled */
|
|
/* b5 : generalPurposeLogEnabled */
|
|
/* b4 : streamingEnabled */
|
|
/* b3 : mediaCardPassThroughEnabled */
|
|
/* b2 : mediaSerialNoEnabled */
|
|
/* b1 : SMARTSelfRestEnabled */
|
|
/* b0 : SMARTErrorLogEnabled */
|
|
bit16 ultraDMAModes;
|
|
/* b15 : word88_bit15 */
|
|
/* b14 : ultraDMAMode6Selected */
|
|
/* b13 : ultraDMAMode5Selected */
|
|
/* b12 : ultraDMAMode4Selected */
|
|
/* b11 : ultraDMAMode3Selected */
|
|
/* b10 : ultraDMAMode2Selected */
|
|
/* b9 : ultraDMAMode1Selected */
|
|
/* b8 : ultraDMAMode0Selected */
|
|
/* b7 : word88_bit7 */
|
|
/* b6 : ultraDMAMode6Supported */
|
|
/* b5 : ultraDMAMode5Supported */
|
|
/* b4 : ultraDMAMode4Supported */
|
|
/* b3 : ultraDMAMode3Supported */
|
|
/* b2 : ultraDMAMode2Supported */
|
|
/* b1 : ultraDMAMode1Supported */
|
|
/* b0 : ultraDMAMode0Supported */
|
|
bit16 timeToSecurityErase;
|
|
bit16 timeToEnhhancedSecurityErase;
|
|
bit16 currentAPMValue;
|
|
bit16 masterPasswordRevCode;
|
|
bit16 hardwareResetResult;
|
|
/* b15-b14: word93_bit15_14 */
|
|
/* b13 : deviceDetectedCBLIBbelow Vil */
|
|
/* b12-b8 : device1 HardwareResetResult */
|
|
/* b7-b0 : device0 HardwareResetResult */
|
|
bit16 currentAutoAccousticManagementValue;
|
|
/* b15-b8 : Vendor recommended value */
|
|
/* b7-b0 : current value */
|
|
bit16 word95_99[5]; /**< word85-99 of identify device information */
|
|
bit16 maxLBA0_15; /**< word100 of identify device information */
|
|
bit16 maxLBA16_31; /**< word101 of identify device information */
|
|
bit16 maxLBA32_47; /**< word102 of identify device information */
|
|
bit16 maxLBA48_63; /**< word103 of identify device information */
|
|
bit16 word104_107[4]; /**< word104-107 of identify device information */
|
|
bit16 namingAuthority;
|
|
/* b15-b12: NAA_bit0_3 */
|
|
/* b11-b0 : IEEE_OUI_bit12_23*/
|
|
bit16 namingAuthority1;
|
|
/* b15-b4 : IEEE_OUI_bit0_11 */
|
|
/* b3-b0 : uniqueID_bit32_35 */
|
|
bit16 uniqueID_bit16_31; /**< word110 of identify device information */
|
|
bit16 uniqueID_bit0_15; /**< word111 of identify device information */
|
|
bit16 word112_126[15];
|
|
bit16 removableMediaStatusNotificationFeature;
|
|
/* b15-b2 : word127_b16_2 */
|
|
/* b1-b0 : supported set see ATAPI6 spec */
|
|
bit16 securityStatus;
|
|
/* b15-b9 : word128_b15_9 */
|
|
/* b8 : securityLevel */
|
|
/* b7-b6 : word128_b7_6 */
|
|
/* b5 : enhancedSecurityEraseSupported */
|
|
/* b4 : securityCountExpired */
|
|
/* b3 : securityFrozen */
|
|
/* b2 : securityLocked */
|
|
/* b1 : securityEnabled */
|
|
/* b0 : securitySupported */
|
|
bit16 vendorSpecific[31];
|
|
bit16 cfaPowerMode1;
|
|
/* b15 : word 160 supported */
|
|
/* b14 : word160_b14 */
|
|
/* b13 : cfaPowerRequired */
|
|
/* b12 : cfaPowerModeDisabled */
|
|
/* b11-b0 : maxCurrentInMa */
|
|
bit16 word161_175[15];
|
|
bit16 currentMediaSerialNumber[30];
|
|
bit16 word206_254[49]; /**< word206-254 of identify device information */
|
|
bit16 integrityWord;
|
|
/* b15-b8 : cheksum */
|
|
/* b7-b0 : signature */
|
|
} agsaSATAIdentifyData_t;
|
|
|
|
|
|
|
|
|
|
/** \brief data structure describes an SSP Command INFORMATION UNIT
|
|
*
|
|
* data structure describes an SSP Command INFORMATION UNIT used for SSP command and is part of
|
|
* the SSP frame.
|
|
*
|
|
* Currently, only CDB up to 16 bytes is supported. Additional CDB length is supported to 0 bytes..
|
|
*
|
|
*/
|
|
typedef struct agsaSSPCmdInfoUnit_s
|
|
{
|
|
bit8 lun[8]; /* SCSI Logical Unit Number */
|
|
bit8 reserved1; /* reserved */
|
|
bit8 efb_tp_taskAttribute;
|
|
/* B7 : enabledFirstBurst */
|
|
/* B6-3 : taskPriority */
|
|
/* B2-0 : taskAttribute */
|
|
bit8 reserved2; /* reserved */
|
|
bit8 additionalCdbLen;
|
|
/* B7-2 : additionalCdbLen */
|
|
/* B1-0 : reserved */
|
|
bit8 cdb[16]; /* The SCSI CDB up to 16 bytes length */
|
|
} agsaSSPCmdInfoUnit_t;
|
|
|
|
#define SA_SSPCMD_GET_TASKATTRIB(pCmd) ((pCmd)->efb_tp_taskAttribute & 0x7)
|
|
|
|
|
|
/** \brief structure describes an SSP Response INFORMATION UNIT
|
|
*
|
|
* data structure describes an SSP Response INFORMATION UNIT used for SSP response to Command IU
|
|
* or Task IU and is part of the SSP frame
|
|
*
|
|
*/
|
|
|
|
typedef struct agsaSSPResponseInfoUnit_s
|
|
{
|
|
bit8 reserved1[10]; /* reserved */
|
|
|
|
bit8 dataPres; /* which data is present */
|
|
/* B7-2 : reserved */
|
|
/* B1-0 : data Present */
|
|
bit8 status; /* SCSI status as define by SAM-3 */
|
|
bit8 reserved4[4]; /* reserved */
|
|
bit8 senseDataLen[4]; /* SCSI Sense Data length */
|
|
bit8 responsedataLen[4]; /* Response data length */
|
|
/* Follow by Response Data if any */
|
|
/* Follow by Sense Data if any */
|
|
} agsaSSPResponseInfoUnit_t;
|
|
|
|
|
|
typedef struct agsaSSPFrameFormat_s
|
|
{
|
|
bit8 frameType; /* frame type */
|
|
bit8 hdsa[3]; /* Hashed destination SAS Address */
|
|
bit8 reserved1;
|
|
bit8 hssa[3]; /* Hashed source SAS Address */
|
|
bit8 reserved2;
|
|
bit8 reserved3;
|
|
bit8 tlr_rdf;
|
|
/* B7-5 : reserved */
|
|
/* B4-3 : TLR control*/
|
|
/* B2 : Retry Data Frames */
|
|
/* B1 : Retransmit */
|
|
/* B0 : Changing Data Pointer */
|
|
bit8 fill_bytes;
|
|
/* B7-2 : reserved */
|
|
/* B1-0 : Number of Fill bytes*/
|
|
bit8 reserved5;
|
|
bit8 reserved6[3];
|
|
bit8 tag[2]; /* CMD or TM tag */
|
|
bit8 tptt[2]; /* target port transfer tag */
|
|
bit8 dataOffset[4]; /* data offset */
|
|
/* Follow by IU */
|
|
} agsaSSPFrameFormat_t;
|
|
|
|
|
|
typedef struct agsaSSPOpenFrame_s
|
|
{
|
|
bit8 frameType; /* frame type */
|
|
/* B7 : Initiator Port */
|
|
/* B6-4 : Protocol */
|
|
/* B3-0 : Address Frame Type */
|
|
bit8 feat_connrate;
|
|
/* B7-4 : features */
|
|
/* B3-0 : connection rate */
|
|
bit8 initiatorConnTag[2]; /* Initiator connection tag */
|
|
bit8 dstSasAddr[8]; /* Destination SAS Address */
|
|
bit8 srcSasAddr[8]; /* Source SAS Address */
|
|
bit8 zoneSrcGroup; /* Zone source group */
|
|
bit8 pathwayBlockCount; /* pathway block count */
|
|
bit8 arbWaitTime[2]; /* Arbitration Wait Time */
|
|
bit8 moreCompatFeat[4]; /* More Compatibility Features */
|
|
/* Follow by CRC */
|
|
} agsaSSPOpenFrame_t;
|
|
|
|
#define SA_SSPRESP_GET_SENSEDATALEN(pSSPResp) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32*)(pSSPResp)->senseDataLen)
|
|
|
|
#define SA_SSPRESP_GET_RESPONSEDATALEN(pSSPResp) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32*)(pSSPResp)->responsedataLen)
|
|
|
|
#define SA_SSPRESP_GET_DATAPRES(pSSPResp) ((pSSPResp)->dataPres & 0x3)
|
|
|
|
/** \brief structure describes a SAS SSP Task Management command request
|
|
*
|
|
* The agsaSSPScsiTaskMgntReq_t data structure describes a SAS SSP Task Management command request sent by the
|
|
* initiator or received by the target.
|
|
*
|
|
* The response to Task Management is specified by agsaSSPResponseInfoUnit_t.
|
|
*
|
|
* This data structure is one instance of the generic request issued to saSSPStart() and is passed
|
|
* as an agsaSASRequestBody_t
|
|
*
|
|
*/
|
|
typedef struct agsaSSPScsiTaskMgntReq_s
|
|
{
|
|
bit8 lun[8]; /* SCSI Logical Unit Number */
|
|
bit16 reserved1; /* reserved */
|
|
bit8 taskMgntFunction; /* task management function code */
|
|
bit8 reserved2; /* reserved */
|
|
bit16 tagOfTaskToBeManaged; /* Tag/context of task to be managed */
|
|
bit16 reserved3; /* reserved */
|
|
bit32 reserved4[3]; /* reserved */
|
|
bit32 tmOption; /* Not part of SSP TMF IU */
|
|
/* B7-2 : reserved */
|
|
/* B1 : DS_OPTION */
|
|
/* B0 : ADS_OPTION */
|
|
} agsaSSPScsiTaskMgntReq_t;
|
|
|
|
|
|
/** \brief data structure describes the first four bytes of the SMP frame.
|
|
*
|
|
* The agsaSMPFrameHeader_t data structure describes the first four bytes of the SMP frame.
|
|
*
|
|
*
|
|
*/
|
|
|
|
typedef struct agsaSMPFrameHeader_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 */
|
|
} agsaSMPFrameHeader_t;
|
|
|
|
/****************************************************************
|
|
* report general response
|
|
****************************************************************/
|
|
#define SA_REPORT_GENERAL_CONFIGURING_BIT 0x2
|
|
#define SA_REPORT_GENERAL_CONFIGURABLE_BIT 0x1
|
|
|
|
typedef struct agsaSmpRespReportGeneral_s
|
|
{
|
|
bit8 expanderChangeCount16[2];
|
|
bit8 expanderRouteIndexes16[2];
|
|
bit8 reserved1;
|
|
bit8 numOfPhys;
|
|
bit8 configuring_configurable;
|
|
/* B7-2 : reserved */
|
|
/* B1 : configuring */
|
|
/* B0 : configurable */
|
|
bit8 reserved4[17];
|
|
} agsaSmpRespReportGeneral_t;
|
|
|
|
#define SA_REPORT_GENERAL_IS_CONFIGURING(pResp) \
|
|
(((pResp)->configuring_configurable & SA_REPORT_GENERAL_CONFIGURING_BIT) == \
|
|
SA_REPORT_GENERAL_CONFIGURING_BIT)
|
|
|
|
#define SA_REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
|
|
(((pResp)->configuring_configurable & SA_REPORT_GENERAL_CONFIGURABLE_BIT) == \
|
|
SA_REPORT_GENERAL_CONFIGURABLE_BIT)
|
|
|
|
#define SA_REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
|
|
DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
|
|
|
|
/****************************************************************
|
|
* report manufacturer info response
|
|
****************************************************************/
|
|
typedef struct agsaSmpRespReportManufactureInfo_s
|
|
{
|
|
bit8 reserved1[8];
|
|
bit8 vendorIdentification[8];
|
|
bit8 productIdentification[16];
|
|
bit8 productRevisionLevel[4];
|
|
bit8 vendorSpecific[20];
|
|
} agsaSmpRespReportManufactureInfo_t;
|
|
|
|
/****************************************************************
|
|
* discover request
|
|
****************************************************************/
|
|
typedef struct agsaSmpReqDiscover_s
|
|
{
|
|
bit32 reserved1;
|
|
bit8 reserved2;
|
|
bit8 phyIdentifier;
|
|
bit8 ignored;
|
|
bit8 reserved3;
|
|
} agsaSmpReqDiscover_t;
|
|
|
|
/****************************************************************
|
|
* discover response
|
|
****************************************************************/
|
|
typedef struct agsaSmpRespDiscover_s
|
|
{
|
|
bit8 reserved1[4];
|
|
bit8 reserved2;
|
|
bit8 phyIdentifier;
|
|
bit8 reserved3[2];
|
|
bit8 attachedDeviceType;
|
|
/* B7 : reserved */
|
|
/* B6-4 : attachedDeviceType */
|
|
/* B3-0 : reserved */
|
|
bit8 negotiatedPhyLinkRate;
|
|
/* B7-4 : reserved */
|
|
/* B3-0 : negotiatedPhyLinkRate */
|
|
bit8 attached_Ssp_Stp_Smp_Sata_Initiator;
|
|
/* B7-4 : reserved */
|
|
/* B3 : attachedSspInitiator */
|
|
/* B2 : attachedStpInitiator */
|
|
/* B1 : attachedSmpInitiator */
|
|
/* B0 : attachedSataHost */
|
|
bit8 attached_SataPS_Ssp_Stp_Smp_Sata_Target;
|
|
/* 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;
|
|
/* B7 : virtualPhy*/
|
|
/* B6-4 : reserved */
|
|
/* B3-0 : partialPathwayTimeout */
|
|
bit8 routingAttribute;
|
|
/* B7-4 : reserved */
|
|
/* B3-0 : routingAttribute */
|
|
bit8 reserved13[5];
|
|
bit8 vendorSpecific[2];
|
|
} agsaSmpRespDiscover_t;
|
|
|
|
#define SA_DISCRSP_SSP_BIT 0x08
|
|
#define SA_DISCRSP_STP_BIT 0x04
|
|
#define SA_DISCRSP_SMP_BIT 0x02
|
|
#define SA_DISCRSP_SATA_BIT 0x01
|
|
|
|
#define SA_DISCRSP_SATA_PS_BIT 0x80
|
|
|
|
#define SA_DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
|
|
(((pResp)->attachedDeviceType & 0x70) >> 4)
|
|
#define SA_DISCRSP_GET_LINKRATE(pResp) \
|
|
((pResp)->negotiatedPhyLinkRate & 0x0F)
|
|
|
|
#define SA_DISCRSP_IS_SSP_INITIATOR(pResp) \
|
|
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_SSP_BIT) == SA_DISCRSP_SSP_BIT)
|
|
#define SA_DISCRSP_IS_STP_INITIATOR(pResp) \
|
|
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_STP_BIT) == SA_DISCRSP_STP_BIT)
|
|
#define SA_DISCRSP_IS_SMP_INITIATOR(pResp) \
|
|
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_SMP_BIT) == SA_DISCRSP_SMP_BIT)
|
|
#define SA_DISCRSP_IS_SATA_HOST(pResp) \
|
|
(((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_SATA_BIT) == SA_DISCRSP_SATA_BIT)
|
|
|
|
#define SA_DISCRSP_IS_SSP_TARGET(pResp) \
|
|
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SSP_BIT) == SA_DISCRSP_SSP_BIT)
|
|
#define SA_DISCRSP_IS_STP_TARGET(pResp) \
|
|
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_STP_BIT) == SA_DISCRSP_STP_BIT)
|
|
#define SA_DISCRSP_IS_SMP_TARGET(pResp) \
|
|
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SMP_BIT) == SA_DISCRSP_SMP_BIT)
|
|
#define SA_DISCRSP_IS_SATA_DEVICE(pResp) \
|
|
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SATA_BIT) == SA_DISCRSP_SATA_BIT)
|
|
#define SA_DISCRSP_IS_SATA_PORTSELECTOR(pResp) \
|
|
(((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SATA_PS_BIT) == SA_DISCRSP_SATA_PS_BIT)
|
|
|
|
#define SA_DISCRSP_GET_SAS_ADDRESSHI(pResp) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi)
|
|
#define SA_DISCRSP_GET_SAS_ADDRESSLO(pResp) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo)
|
|
|
|
#define SA_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi)
|
|
#define SA_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \
|
|
DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo)
|
|
|
|
#define SA_DISCRSP_VIRTUALPHY_BIT 0x80
|
|
#define SA_DISCRSP_IS_VIRTUALPHY(pResp) \
|
|
(((pResp)->virtualPhy_partialPathwayTimeout & SA_DISCRSP_VIRTUALPHY_BIT) == SA_DISCRSP_VIRTUALPHY_BIT)
|
|
|
|
#define SA_DISCRSP_GET_ROUTINGATTRIB(pResp) \
|
|
((pResp)->routingAttribute & 0x0F)
|
|
|
|
/****************************************************************
|
|
* report route table request
|
|
****************************************************************/
|
|
typedef struct agsaSmpReqReportRouteTable_s
|
|
{
|
|
bit8 reserved1[2];
|
|
bit8 expanderRouteIndex16[20];
|
|
bit8 reserved2;
|
|
bit8 phyIdentifier;
|
|
bit8 reserved3[2];
|
|
} agsaSmpReqReportRouteTable_t;
|
|
|
|
/****************************************************************
|
|
* report route response
|
|
****************************************************************/
|
|
typedef struct agsaSmpRespReportRouteTable_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];
|
|
} agsaSmpRespReportRouteTable_t;
|
|
|
|
/****************************************************************
|
|
* configure route information request
|
|
****************************************************************/
|
|
typedef struct agsaSmpReqConfigureRouteInformation_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];
|
|
} agsaSmpReqConfigureRouteInformation_t;
|
|
|
|
/****************************************************************
|
|
* report Phy Sata request
|
|
****************************************************************/
|
|
typedef struct agsaSmpReqReportPhySata_s
|
|
{
|
|
bit8 reserved1[4];
|
|
bit8 reserved2;
|
|
bit8 phyIdentifier;
|
|
bit8 reserved3[2];
|
|
} agsaSmpReqReportPhySata_t;
|
|
|
|
/****************************************************************
|
|
* report Phy Sata response
|
|
****************************************************************/
|
|
typedef struct agsaSmpRespReportPhySata_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];
|
|
} agsaSmpRespReportPhySata_t;
|
|
|
|
/****************************************************************
|
|
* Phy Control request
|
|
****************************************************************/
|
|
typedef struct agsaSmpReqPhyControl_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];
|
|
} agsaSmpReqPhyControl_t;
|
|
|
|
|
|
|
|
|
|
#endif /*__SASPEC_H__ */
|