xref: /freebsd/sys/dev/pms/RefTisa/sallsdk/api/sa_spec.h (revision 2ff63af9b88c7413b7d71715b5532625752a248e)
1*4e1bc9a0SAchim Leubner /******************************************************************************
2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*4e1bc9a0SAchim Leubner *
4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*4e1bc9a0SAchim Leubner *that the following conditions are met:
6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*4e1bc9a0SAchim Leubner *following disclaimer.
8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*4e1bc9a0SAchim Leubner *with the distribution.
11*4e1bc9a0SAchim Leubner *
12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*4e1bc9a0SAchim Leubner *
21*4e1bc9a0SAchim Leubner *
22*4e1bc9a0SAchim Leubner ******************************************************************************/
23*4e1bc9a0SAchim Leubner /*****************************************************************************/
24*4e1bc9a0SAchim Leubner /*! \file sa_spec.h
25*4e1bc9a0SAchim Leubner  *  \brief The file defines the constants defined by sas spec
26*4e1bc9a0SAchim Leubner  */
27*4e1bc9a0SAchim Leubner 
28*4e1bc9a0SAchim Leubner /*****************************************************************************/
29*4e1bc9a0SAchim Leubner 
30*4e1bc9a0SAchim Leubner #ifndef  __SA_SPEC_H__
31*4e1bc9a0SAchim Leubner #define __SA_SPEC_H__
32*4e1bc9a0SAchim Leubner 
33*4e1bc9a0SAchim Leubner /****************************************************************
34*4e1bc9a0SAchim Leubner  *            SAS Specification related defines                 *
35*4e1bc9a0SAchim Leubner  ****************************************************************/
36*4e1bc9a0SAchim Leubner #define SA_SAS_PROTOCOL_SMP                               0x00
37*4e1bc9a0SAchim Leubner #define SA_SAS_PROTOCOL_SSP                               0x01
38*4e1bc9a0SAchim Leubner #define SA_SAS_PROTOCOL_STP                               0x02
39*4e1bc9a0SAchim Leubner 
40*4e1bc9a0SAchim Leubner #define SA_OPENFRM_SIZE                                   (28)
41*4e1bc9a0SAchim Leubner #define SA_IDENTIFY_FRAME_SIZE                            (28)
42*4e1bc9a0SAchim Leubner //#define SAS_IDENTIFY_FRM_SIZE                             SA_IDENTIFY_FRAME_SIZE
43*4e1bc9a0SAchim Leubner 
44*4e1bc9a0SAchim Leubner #define SA_SAS_FRAME_TYPE_SSP_DATA                        0x01
45*4e1bc9a0SAchim Leubner #define SA_SAS_FRAME_TYPE_SSP_XRDY                        0x05
46*4e1bc9a0SAchim Leubner #define SA_SAS_FRAME_TYPE_SSP_CMD                         0x06
47*4e1bc9a0SAchim Leubner #define SA_SAS_FRAME_TYPE_SSP_RSP                         0x07
48*4e1bc9a0SAchim Leubner #define SA_SAS_FRAME_TYPE_SSP_TASK                        0x16
49*4e1bc9a0SAchim Leubner #define SA_SAS_FRAME_TYPE_SMP_REQ                         0x40
50*4e1bc9a0SAchim Leubner #define SA_SAS_FRAME_TYPE_SMP_RSP                         0x41
51*4e1bc9a0SAchim Leubner 
52*4e1bc9a0SAchim Leubner #define SA_SAS_CONNECTION_RATE_1_5G                       0x08
53*4e1bc9a0SAchim Leubner #define SA_SAS_CONNECTION_RATE_3_0G                       0x09
54*4e1bc9a0SAchim Leubner #define SA_SAS_CONNECTION_RATE_6_0G                       0x0A
55*4e1bc9a0SAchim Leubner #define SA_SAS_CONNECTION_RATE_12_0G                      0x0B
56*4e1bc9a0SAchim Leubner 
57*4e1bc9a0SAchim Leubner #define SA_SAS_DEV_TYPE_NO_DEVICE                         0x00
58*4e1bc9a0SAchim Leubner #define SA_SAS_DEV_TYPE_END_DEVICE                        0x01
59*4e1bc9a0SAchim Leubner #define SA_SAS_DEV_TYPE_EDGE_EXPANDER                     0x02
60*4e1bc9a0SAchim Leubner #define SA_SAS_DEV_TYPE_FANOUT_EXPANDER                   0x03
61*4e1bc9a0SAchim Leubner 
62*4e1bc9a0SAchim Leubner #define AGSA_DEV_TYPE_END_DEVICE                          (SA_SAS_DEV_TYPE_END_DEVICE << 4)
63*4e1bc9a0SAchim Leubner #define AGSA_DEV_TYPE_EDGE_EXPANDER                       (SA_SAS_DEV_TYPE_EDGE_EXPANDER << 4)
64*4e1bc9a0SAchim Leubner #define AGSA_DEV_TYPE_FAN_EXPANDER                        (SA_SAS_DEV_TYPE_FANOUT_EXPANDER << 4)
65*4e1bc9a0SAchim Leubner 
66*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_REPORT_GENERAL                         0x00
67*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_REPORT_MANUFACTURE_INFORMATION         0x01
68*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_READ_GPIO_REGISTER                     0x02
69*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_DISCOVER                               0x10
70*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_REPORT_PHY_ERROR_LOG                   0x11
71*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_REPORT_PHY_SATA                        0x12
72*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_REPORT_ROUTING_INFORMATION             0x13
73*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_WRITE_GPIO_REGISTER                    0x82
74*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_CONFIGURE_ROUTING_INFORMATION          0x90
75*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_PHY_CONTROL                            0x91
76*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_PHY_TEST                               0x92
77*4e1bc9a0SAchim Leubner 
78*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_FUNCTION_ACCEPTED                      0x00
79*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_FUNCTION_UNKNOWN                       0x01
80*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_FUNCTION_FAILED                        0x02
81*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_INVALID_REQ_FRAME_LENGTH               0x03
82*4e1bc9a0SAchim Leubner #define SA_SAS_SMP_PHY_NOT_EXIST                          0x10
83*4e1bc9a0SAchim Leubner 
84*4e1bc9a0SAchim Leubner #define SA_SAS_ROUTING_DIRECT                             0x00
85*4e1bc9a0SAchim Leubner #define SA_SAS_ROUTING_SUBTRACTIVE                        0x01
86*4e1bc9a0SAchim Leubner #define SA_SAS_ROUTING_TABLE                              0x02
87*4e1bc9a0SAchim Leubner 
88*4e1bc9a0SAchim Leubner #define SA_SAS_PHYCTL_LINK_RESET                          0x01
89*4e1bc9a0SAchim Leubner #define SA_SAS_PHYCTL_HARD_RESET                          0x02
90*4e1bc9a0SAchim Leubner #define SA_SAS_PHYCTL_DISABLE                             0x03
91*4e1bc9a0SAchim Leubner #define SA_SAS_PHYCTL_CLEAR_ERROR_LOG                     0x05
92*4e1bc9a0SAchim Leubner #define SA_SAS_PHYCTL_CLEAR_AFFILIATION                   0x06
93*4e1bc9a0SAchim Leubner #define SA_SAS_PHYCTL_TRANSMIT_PS_SIGNAL                  0x07
94*4e1bc9a0SAchim Leubner 
95*4e1bc9a0SAchim Leubner #define SA_SSP_CMDIU_LEN_BYTES                            28
96*4e1bc9a0SAchim Leubner #define SA_SSP_TMIU_LEN_BYTES                             28
97*4e1bc9a0SAchim Leubner 
98*4e1bc9a0SAchim Leubner 
99*4e1bc9a0SAchim Leubner #define SASD_DEV_SATA_MASK                                0xF0
100*4e1bc9a0SAchim Leubner #define SASD_DEV_SAS_MASK                                 0x0F
101*4e1bc9a0SAchim Leubner 
102*4e1bc9a0SAchim Leubner #define SASD_DEV_SAS_END_DEVICE                           0x01 /* SAS end device type */
103*4e1bc9a0SAchim Leubner #define SASD_DEV_SAS_EDGE_EXPANDER                        0x02 /* SAS edge expander device type */
104*4e1bc9a0SAchim Leubner #define SASD_DEV_SAS_FAN_EXPANDER                         0x03 /* SAS fan out expander device type */
105*4e1bc9a0SAchim Leubner 
106*4e1bc9a0SAchim Leubner #define SASD_DEV_SATA_ATA_DEVICE                          0x10 /* SATA ATA device type */
107*4e1bc9a0SAchim Leubner #define SASD_DEV_SATA_ATAPI_DEVICE                        0x20 /* SATA ATAPI device type */
108*4e1bc9a0SAchim Leubner #define SASD_DEV_SATA_PM_DEVICE                           0x30 /* SATA PM device type */
109*4e1bc9a0SAchim Leubner #define SASD_DEV_SATA_SEMB_DEVICE                         0x40 /* SATA SEMB device type */
110*4e1bc9a0SAchim Leubner #define SASD_DEV_SATA_SEMB_WO_SEP_DEVICE                  0x50 /* SATA SEMB without SEP device type */
111*4e1bc9a0SAchim Leubner 
112*4e1bc9a0SAchim Leubner #define SASD_DEV_SATA_UNKNOWN_DEVICE                      0xFF /* SAS SATA unknown device type */
113*4e1bc9a0SAchim Leubner 
114*4e1bc9a0SAchim Leubner 
115*4e1bc9a0SAchim Leubner #define SASD_TASK_ATTR_SIMPLE                             0x0
116*4e1bc9a0SAchim Leubner #define SASD_TASK_ATTR_HEAD_OF_QUEUE                      0x1
117*4e1bc9a0SAchim Leubner #define SASD_TASK_ATTR_ORDERED                            0x2
118*4e1bc9a0SAchim Leubner #define SASD_TASK_ATTR_ACA                                0x4
119*4e1bc9a0SAchim Leubner 
120*4e1bc9a0SAchim Leubner 
121*4e1bc9a0SAchim Leubner /*****************************************************************************
122*4e1bc9a0SAchim Leubner ** SAS TM Function definitions
123*4e1bc9a0SAchim Leubner *****************************************************************************/
124*4e1bc9a0SAchim Leubner #define SASD_SAS_ABORT_TASK                               0x01
125*4e1bc9a0SAchim Leubner #define SASD_SAS_ABORT_TASK_SET                           0x02
126*4e1bc9a0SAchim Leubner #define SASD_SAS_CLEAR_TASK_SET                           0x04
127*4e1bc9a0SAchim Leubner #define SASD_SAS_LOGICAL_UNIT_RESET                       0x08
128*4e1bc9a0SAchim Leubner #define SASD_SAS_CLEAR_ACA                                0x40
129*4e1bc9a0SAchim Leubner #define SASD_SAS_QUARY_TASK                               0x80
130*4e1bc9a0SAchim Leubner 
131*4e1bc9a0SAchim Leubner /****************************************************************
132*4e1bc9a0SAchim Leubner  *            SATA Specification related defines                *
133*4e1bc9a0SAchim Leubner  ****************************************************************/
134*4e1bc9a0SAchim Leubner #define SA_SATA_MAX_QUEUED_COMMANDS                       32
135*4e1bc9a0SAchim Leubner #define SA_SATA_MAX_PM_PORTS                              15
136*4e1bc9a0SAchim Leubner 
137*4e1bc9a0SAchim Leubner #define SA_SATA_FIS_TYPE_HOST_2_DEV                       0x27
138*4e1bc9a0SAchim Leubner #define SA_SATA_FIS_TYPE_DEV_2_HOST                       0x34
139*4e1bc9a0SAchim Leubner #define SA_SATA_FIS_TYPE_SET_DEVICE                       0xA1
140*4e1bc9a0SAchim Leubner #define SA_SATA_FIS_TYPE_DMA_ACTIVE                       0x39
141*4e1bc9a0SAchim Leubner #define SA_SATA_FIS_TYPE_FDMA_SETUP                       0x41
142*4e1bc9a0SAchim Leubner #define SA_SATA_FIS_TYPE_BIST                             0x58
143*4e1bc9a0SAchim Leubner 
144*4e1bc9a0SAchim Leubner #define SA_SATA_CMD_IDENTIFY_DEVICE                       0xEC
145*4e1bc9a0SAchim Leubner #define SA_SATA_CMD_EXEC_DEV_DIAG                         0x90
146*4e1bc9a0SAchim Leubner 
147*4e1bc9a0SAchim Leubner #define SA_SATA_CONTROL_SRST                              0x04
148*4e1bc9a0SAchim Leubner 
149*4e1bc9a0SAchim Leubner #define SA_SATA_H2DREG_LEN_BYTES                          20
150*4e1bc9a0SAchim Leubner #define SA_SATA_H2D_BIST_LEN_BYTES                        12
151*4e1bc9a0SAchim Leubner /****************************************************************
152*4e1bc9a0SAchim Leubner  *            SAS Specification related structures              *
153*4e1bc9a0SAchim Leubner  ****************************************************************/
154*4e1bc9a0SAchim Leubner 
155*4e1bc9a0SAchim Leubner 
156*4e1bc9a0SAchim Leubner 
157*4e1bc9a0SAchim Leubner /** \brief Structure for SATA BIST FIS
158*4e1bc9a0SAchim Leubner  *
159*4e1bc9a0SAchim Leubner  * The agsaFisBIST_t data structure describes a SATA FIS (Frame Information Structures)
160*4e1bc9a0SAchim Leubner  * for FIS type BIST (Built In Self Test) Activate Bidirectional.
161*4e1bc9a0SAchim Leubner  *
162*4e1bc9a0SAchim Leubner  * This data structure is one instance of the SATA request structure agsaSATAInitiatorRequest_t,
163*4e1bc9a0SAchim Leubner  * which is one instance of the generic request, issued to saSATAStart().
164*4e1bc9a0SAchim Leubner  */
165*4e1bc9a0SAchim Leubner 
166*4e1bc9a0SAchim Leubner 
167*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_T_BIT  0x80
168*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_A_BIT  0x40
169*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_S_BIT  0x20
170*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_L_BIT  0x10
171*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_F_BIT  0x08
172*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_P_BIT  0x04
173*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_R_BIT  0x02
174*4e1bc9a0SAchim Leubner #define SA_SATA_BIST_PATTERN_V_BIT  0x01
175*4e1bc9a0SAchim Leubner 
176*4e1bc9a0SAchim Leubner /*
177*4e1bc9a0SAchim Leubner  * The first SATA DWORD types.
178*4e1bc9a0SAchim Leubner  */
179*4e1bc9a0SAchim Leubner typedef struct agsaFisBISTHeader_s
180*4e1bc9a0SAchim Leubner {
181*4e1bc9a0SAchim Leubner     bit8    fisType; /* fisType, set to 58h for BIST */
182*4e1bc9a0SAchim Leubner     bit8    pmPort;
183*4e1bc9a0SAchim Leubner     /* b7-b4  reserved */
184*4e1bc9a0SAchim Leubner     /* b3-b0  PM Port. device port address that the PM should deliver the FIS to */
185*4e1bc9a0SAchim Leubner     bit8   patternDefinition;
186*4e1bc9a0SAchim Leubner     /* b7 : T Far end transmit only mode */
187*4e1bc9a0SAchim Leubner     /* b6 : A ALIGN Bypass (Do not Transmit Align Primitives) (valid only in combination with T Bit) (optional behavior) */
188*4e1bc9a0SAchim Leubner     /* b5 : S Bypass Scrambling (valid only in combination with T Bit) (optional behavior) */
189*4e1bc9a0SAchim Leubner     /* b4 : L Far End Retimed Loopback. Transmitter shall insert additional ALIGNS) */
190*4e1bc9a0SAchim Leubner     /* b3 : F Far End Analog (AFE) Loopback (Optional) */
191*4e1bc9a0SAchim Leubner     /* b2 : P Primitive bit. (valid only in combination with the T Bit) (optional behavior) */
192*4e1bc9a0SAchim Leubner     /* b1 : R Reserved */
193*4e1bc9a0SAchim Leubner     /* b0 : V Vendor Specific Test Mode. Causes all other bits to be ignored */
194*4e1bc9a0SAchim Leubner     bit8   reserved5;       /* Reserved */
195*4e1bc9a0SAchim Leubner } agsaFisBISTHeader_t;
196*4e1bc9a0SAchim Leubner 
197*4e1bc9a0SAchim Leubner 
198*4e1bc9a0SAchim Leubner typedef struct agsaFisRegD2HHeader_s
199*4e1bc9a0SAchim Leubner {
200*4e1bc9a0SAchim Leubner     bit8    fisType; /* fisType, set to 34h for DeviceToHostReg */
201*4e1bc9a0SAchim Leubner     bit8    i_pmPort;
202*4e1bc9a0SAchim Leubner     /* b7     : reserved */
203*4e1bc9a0SAchim Leubner     /* b6     : I Interrupt bit */
204*4e1bc9a0SAchim Leubner     /* b5-b4  : reserved */
205*4e1bc9a0SAchim Leubner     /* b3-b0  : PM Port */
206*4e1bc9a0SAchim Leubner     bit8    status; /* Contains the contents to be placed in the Status(and Alternate status)
207*4e1bc9a0SAchim Leubner                        Register of the Shadow Command Block */
208*4e1bc9a0SAchim Leubner     bit8    error;  /* Contains the contents to be placed in the Error register of the Shadow Command Block */
209*4e1bc9a0SAchim Leubner } agsaFisRegD2HHeader_t;
210*4e1bc9a0SAchim Leubner 
211*4e1bc9a0SAchim Leubner typedef struct agsaFisSetDevBitsHeader_s
212*4e1bc9a0SAchim Leubner {
213*4e1bc9a0SAchim Leubner     bit8    fisType;    /* fisType, set to A1h for SetDeviceBit */
214*4e1bc9a0SAchim Leubner     bit8    n_i_pmPort;
215*4e1bc9a0SAchim Leubner     /* b7   : n Bit. Notification bit. If set device needs attention. */
216*4e1bc9a0SAchim Leubner     /* b6   : i Bit. Interrupt Bit */
217*4e1bc9a0SAchim Leubner     /* b5-b4: reserved2 */
218*4e1bc9a0SAchim Leubner     /* b3-b0: PM Port */
219*4e1bc9a0SAchim Leubner     bit8    statusHi_Lo;
220*4e1bc9a0SAchim Leubner     /* b7   : reserved */
221*4e1bc9a0SAchim Leubner     /* b6-b4: Status Hi. Contains the contents to be placed in bits 6, 5, and 4 of
222*4e1bc9a0SAchim Leubner        the Status register of the Shadow Command Block */
223*4e1bc9a0SAchim Leubner     /* b3   : Reserved */
224*4e1bc9a0SAchim Leubner     /* b2-b0: Status Lo  Contains the contents to be placed in bits 2,1, and 0 of the
225*4e1bc9a0SAchim Leubner        Status register of the Shadow Command Block */
226*4e1bc9a0SAchim Leubner     bit8    error;    /* Contains the contents to be placed in the Error register of
227*4e1bc9a0SAchim Leubner                          the Shadow Command Block */
228*4e1bc9a0SAchim Leubner } agsaFisSetDevBitsHeader_t;
229*4e1bc9a0SAchim Leubner 
230*4e1bc9a0SAchim Leubner typedef struct agsaFisRegH2DHeader_s
231*4e1bc9a0SAchim Leubner {
232*4e1bc9a0SAchim Leubner     bit8    fisType;      /* fisType, set to 27h for DeviceToHostReg */
233*4e1bc9a0SAchim Leubner     bit8    c_pmPort;
234*4e1bc9a0SAchim Leubner     /* b7   : C_bit This bit is set to one when the register transfer is
235*4e1bc9a0SAchim Leubner        due to an update of the Command register */
236*4e1bc9a0SAchim Leubner     /* b6-b4: reserved */
237*4e1bc9a0SAchim Leubner     /* b3-b0: PM Port */
238*4e1bc9a0SAchim Leubner     bit8    command;  /* Contains the contents of the Command register of
239*4e1bc9a0SAchim Leubner                          the Shadow Command Block */
240*4e1bc9a0SAchim Leubner     bit8    features; /* Contains the contents of the Features register of
241*4e1bc9a0SAchim Leubner                          the Shadow Command Block */
242*4e1bc9a0SAchim Leubner } agsaFisRegH2DHeader_t;
243*4e1bc9a0SAchim Leubner 
244*4e1bc9a0SAchim Leubner typedef struct agsaFisPioSetupHeader_s
245*4e1bc9a0SAchim Leubner {
246*4e1bc9a0SAchim Leubner     bit8    fisType;  /* set to 5F */
247*4e1bc9a0SAchim Leubner     bit8    i_d_pmPort;
248*4e1bc9a0SAchim Leubner     /* b7   : reserved */
249*4e1bc9a0SAchim Leubner     /* b6   : i bit. Interrupt bit */
250*4e1bc9a0SAchim Leubner     /* b5   : d bit. data transfer direction. set to 1 for device to host xfer */
251*4e1bc9a0SAchim Leubner     /* b4   : reserved */
252*4e1bc9a0SAchim Leubner     /* b3-b0: PM Port */
253*4e1bc9a0SAchim Leubner     bit8    status;
254*4e1bc9a0SAchim Leubner     bit8    error;
255*4e1bc9a0SAchim Leubner } agsaFisPioSetupHeader_t;
256*4e1bc9a0SAchim Leubner 
257*4e1bc9a0SAchim Leubner typedef union agsaFisHeader_s
258*4e1bc9a0SAchim Leubner {
259*4e1bc9a0SAchim Leubner     agsaFisBISTHeader_t       Bist;
260*4e1bc9a0SAchim Leubner     agsaFisRegD2HHeader_t     D2H;
261*4e1bc9a0SAchim Leubner     agsaFisRegH2DHeader_t     H2D;
262*4e1bc9a0SAchim Leubner     agsaFisSetDevBitsHeader_t SetDevBits;
263*4e1bc9a0SAchim Leubner     agsaFisPioSetupHeader_t   PioSetup;
264*4e1bc9a0SAchim Leubner } agsaFisHeader_t;
265*4e1bc9a0SAchim Leubner 
266*4e1bc9a0SAchim Leubner 
267*4e1bc9a0SAchim Leubner typedef struct agsaFisBISTData_s
268*4e1bc9a0SAchim Leubner {
269*4e1bc9a0SAchim Leubner     bit8    data[8]; /* BIST data */
270*4e1bc9a0SAchim Leubner } agsaFisBISTData_t;
271*4e1bc9a0SAchim Leubner 
272*4e1bc9a0SAchim Leubner 
273*4e1bc9a0SAchim Leubner typedef struct agsaFisBIST_s
274*4e1bc9a0SAchim Leubner {
275*4e1bc9a0SAchim Leubner     agsaFisBISTHeader_t   h;
276*4e1bc9a0SAchim Leubner     agsaFisBISTData_t     d;
277*4e1bc9a0SAchim Leubner } agsaFisBIST_t;
278*4e1bc9a0SAchim Leubner 
279*4e1bc9a0SAchim Leubner /** \brief Structure for SATA Device to Host Register FIS
280*4e1bc9a0SAchim Leubner  *
281*4e1bc9a0SAchim Leubner  * The agsaFisRegDeviceToHost_t data structure describes a SATA FIS (Frame Information
282*4e1bc9a0SAchim Leubner  * Structures) for FIS type Register Device to Host.
283*4e1bc9a0SAchim Leubner  *
284*4e1bc9a0SAchim Leubner  * This structure is used only as inbound data (device to host) to describe device to
285*4e1bc9a0SAchim Leubner  * host response.
286*4e1bc9a0SAchim Leubner  */
287*4e1bc9a0SAchim Leubner 
288*4e1bc9a0SAchim Leubner #define SA_SATA_RD2H_I_BIT  0x40
289*4e1bc9a0SAchim Leubner 
290*4e1bc9a0SAchim Leubner typedef struct agsaFisRegD2HData_s
291*4e1bc9a0SAchim Leubner {
292*4e1bc9a0SAchim Leubner     bit8    lbaLow;     /* Contains the contents to be placed in the LBA Low register
293*4e1bc9a0SAchim Leubner                            of the Shadow Command Block */
294*4e1bc9a0SAchim Leubner     bit8    lbaMid;     /* Contains the contents to be placed in the LBA Mid register
295*4e1bc9a0SAchim Leubner                            of the Shadow Command Block */
296*4e1bc9a0SAchim Leubner 
297*4e1bc9a0SAchim Leubner     bit8    lbaHigh;    /* Contains the contents to be placed in the LBA High register
298*4e1bc9a0SAchim Leubner                            of the Shadow Command Block */
299*4e1bc9a0SAchim Leubner     bit8    device;     /* Contains the contents to be placed in the Device register of the Shadow Command Block */
300*4e1bc9a0SAchim Leubner 
301*4e1bc9a0SAchim Leubner     bit8    lbaLowExp;  /* Contains the contents of the expanded address field
302*4e1bc9a0SAchim Leubner                            of the Shadow Command Block */
303*4e1bc9a0SAchim Leubner     bit8    lbaMidExp;  /* Contains the contents of the expanded address field
304*4e1bc9a0SAchim Leubner                            of the Shadow Command Block */
305*4e1bc9a0SAchim Leubner     bit8    lbaHighExp; /* Contains the contents of the expanded address field
306*4e1bc9a0SAchim Leubner                            of the Shadow Command Block */
307*4e1bc9a0SAchim Leubner     bit8    reserved4;  /** reserved */
308*4e1bc9a0SAchim Leubner 
309*4e1bc9a0SAchim Leubner     bit8    sectorCount; /* Contains the contents to be placed in the Sector
310*4e1bc9a0SAchim Leubner                             Count register of the Shadow Command Block */
311*4e1bc9a0SAchim Leubner     bit8    sectorCountExp;  /* Contains the contents of the expanded address
312*4e1bc9a0SAchim Leubner                                 field of the Shadow Command Block */
313*4e1bc9a0SAchim Leubner     bit8    reserved6;  /* Reserved */
314*4e1bc9a0SAchim Leubner     bit8    reserved5;  /* Reserved */
315*4e1bc9a0SAchim Leubner     bit32   reserved7; /* Reserved */
316*4e1bc9a0SAchim Leubner } agsaFisRegD2HData_t;
317*4e1bc9a0SAchim Leubner 
318*4e1bc9a0SAchim Leubner 
319*4e1bc9a0SAchim Leubner typedef struct agsaFisRegDeviceToHost_s
320*4e1bc9a0SAchim Leubner {
321*4e1bc9a0SAchim Leubner     agsaFisRegD2HHeader_t     h;
322*4e1bc9a0SAchim Leubner     agsaFisRegD2HData_t       d;
323*4e1bc9a0SAchim Leubner } agsaFisRegDeviceToHost_t;
324*4e1bc9a0SAchim Leubner 
325*4e1bc9a0SAchim Leubner 
326*4e1bc9a0SAchim Leubner 
327*4e1bc9a0SAchim Leubner /** \brief Structure for SATA Host to Device Register FIS
328*4e1bc9a0SAchim Leubner  *
329*4e1bc9a0SAchim Leubner  * The agsaFisRegHostToDevice_t data structure describes a SATA FIS
330*4e1bc9a0SAchim Leubner  * (Frame Information Structures) for FIS type Register Host to Device.
331*4e1bc9a0SAchim Leubner 
332*4e1bc9a0SAchim Leubner  * This data structure is one instance of the SATA request structure
333*4e1bc9a0SAchim Leubner  * agsaSATAInitiatorRequest_t, which is one instance of the generic request,
334*4e1bc9a0SAchim Leubner  * issued to saSATAStart().
335*4e1bc9a0SAchim Leubner  */
336*4e1bc9a0SAchim Leubner typedef struct agsaFisRegH2DData_s
337*4e1bc9a0SAchim Leubner {
338*4e1bc9a0SAchim Leubner     bit8    lbaLow;       /* Contains the contents of the LBA Low register of the Shadow Command Block */
339*4e1bc9a0SAchim Leubner     bit8    lbaMid;       /* Contains the contents of the LBA Mid register of the Shadow Command Block */
340*4e1bc9a0SAchim Leubner     bit8    lbaHigh;      /* Contains the contents of the LBA High register of the Shadow Command Block */
341*4e1bc9a0SAchim Leubner     bit8    device;       /* Contains the contents of the Device register of the Shadow Command Block */
342*4e1bc9a0SAchim Leubner 
343*4e1bc9a0SAchim Leubner     bit8    lbaLowExp;    /* Contains the contents of the expanded address field of the
344*4e1bc9a0SAchim Leubner                              Shadow Command Block */
345*4e1bc9a0SAchim Leubner     bit8    lbaMidExp;    /* Contains the contents of the expanded address field of the
346*4e1bc9a0SAchim Leubner                              Shadow Command Block */
347*4e1bc9a0SAchim Leubner     bit8    lbaHighExp;   /* Contains the contents of the expanded address field of the
348*4e1bc9a0SAchim Leubner                              Shadow Command Block */
349*4e1bc9a0SAchim Leubner     bit8    featuresExp;  /* Contains the contents of the expanded address field of the
350*4e1bc9a0SAchim Leubner                              Shadow Command Block */
351*4e1bc9a0SAchim Leubner 
352*4e1bc9a0SAchim Leubner     bit8    sectorCount;    /* Contains the contents of the Sector Count register of the
353*4e1bc9a0SAchim Leubner                                Shadow Command Block */
354*4e1bc9a0SAchim Leubner     bit8    sectorCountExp; /* Contains the contents of the expanded address field of
355*4e1bc9a0SAchim Leubner                                the Shadow Command Block */
356*4e1bc9a0SAchim Leubner     bit8    reserved4;    /* Reserved */
357*4e1bc9a0SAchim Leubner     bit8    control;      /* Contains the contents of the Device Control register of the
358*4e1bc9a0SAchim Leubner                              Shadow Command Block */
359*4e1bc9a0SAchim Leubner     bit32   reserved5;      /* Reserved */
360*4e1bc9a0SAchim Leubner } agsaFisRegH2DData_t;
361*4e1bc9a0SAchim Leubner 
362*4e1bc9a0SAchim Leubner typedef struct agsaFisRegHostToDevice_s
363*4e1bc9a0SAchim Leubner {
364*4e1bc9a0SAchim Leubner     agsaFisRegH2DHeader_t   h;
365*4e1bc9a0SAchim Leubner     agsaFisRegH2DData_t     d;
366*4e1bc9a0SAchim Leubner } agsaFisRegHostToDevice_t;
367*4e1bc9a0SAchim Leubner 
368*4e1bc9a0SAchim Leubner 
369*4e1bc9a0SAchim Leubner /** \brief Structure for SATA SetDeviceBit FIS
370*4e1bc9a0SAchim Leubner  *
371*4e1bc9a0SAchim Leubner  * The agsaFisSetDevBits_t data structure describes a SATA FIS (Frame Information Structures)
372*4e1bc9a0SAchim Leubner  * for FIS type Set Device Bits - Device to Host.
373*4e1bc9a0SAchim Leubner  *
374*4e1bc9a0SAchim Leubner  * This structure is used only as inbound data (device to host) to describe device to host
375*4e1bc9a0SAchim Leubner  * response.
376*4e1bc9a0SAchim Leubner  */
377*4e1bc9a0SAchim Leubner typedef struct agsaFisSetDevBitsData_s
378*4e1bc9a0SAchim Leubner {
379*4e1bc9a0SAchim Leubner     bit32   reserved6; /* Reserved */
380*4e1bc9a0SAchim Leubner } agsaFisSetDevBitsData_t;
381*4e1bc9a0SAchim Leubner 
382*4e1bc9a0SAchim Leubner 
383*4e1bc9a0SAchim Leubner typedef struct agsaFisSetDevBits_s
384*4e1bc9a0SAchim Leubner {
385*4e1bc9a0SAchim Leubner     agsaFisSetDevBitsHeader_t   h;
386*4e1bc9a0SAchim Leubner     agsaFisSetDevBitsData_t     d;
387*4e1bc9a0SAchim Leubner } agsaFisSetDevBits_t;
388*4e1bc9a0SAchim Leubner 
389*4e1bc9a0SAchim Leubner 
390*4e1bc9a0SAchim Leubner /** \brief union data structure specifies a FIS from host software
391*4e1bc9a0SAchim Leubner  *
392*4e1bc9a0SAchim Leubner  * union data structure specifies a FIS from host software
393*4e1bc9a0SAchim Leubner  */
394*4e1bc9a0SAchim Leubner typedef union agsaSATAHostFis_u
395*4e1bc9a0SAchim Leubner {
396*4e1bc9a0SAchim Leubner     agsaFisRegHostToDevice_t    fisRegHostToDev; /* Structure containing the FIS request
397*4e1bc9a0SAchim Leubner                                                     for Register - Host to Device */
398*4e1bc9a0SAchim Leubner     agsaFisBIST_t               fisBIST; /* Structure containing the FIS request for BIST */
399*4e1bc9a0SAchim Leubner } agsaSATAHostFis_t;
400*4e1bc9a0SAchim Leubner 
401*4e1bc9a0SAchim Leubner /** \brief
402*4e1bc9a0SAchim Leubner  *
403*4e1bc9a0SAchim Leubner  * This structure is used
404*4e1bc9a0SAchim Leubner  *
405*4e1bc9a0SAchim Leubner  */
406*4e1bc9a0SAchim Leubner typedef struct agsaFisPioSetupData_s
407*4e1bc9a0SAchim Leubner {
408*4e1bc9a0SAchim Leubner     bit8    lbaLow;       /* Contains the contents of the LBA Low register of the Shadow Command Block */
409*4e1bc9a0SAchim Leubner     bit8    lbaMid;       /* Contains the contents of the LBA Mid register of the Shadow Command Block */
410*4e1bc9a0SAchim Leubner     bit8    lbaHigh;      /* Contains the contents of the LBA High register of the Shadow Command Block */
411*4e1bc9a0SAchim Leubner     bit8    device;       /* Contains the contents of the Device register of the Shadow Command Block */
412*4e1bc9a0SAchim Leubner 
413*4e1bc9a0SAchim Leubner     bit8    lbaLowExp;    /* Contains the contents of the expanded address field of the
414*4e1bc9a0SAchim Leubner                              Shadow Command Block */
415*4e1bc9a0SAchim Leubner     bit8    lbaMidExp;    /* Contains the contents of the expanded address field of the
416*4e1bc9a0SAchim Leubner                              Shadow Command Block */
417*4e1bc9a0SAchim Leubner     bit8    lbaHighExp;   /* Contains the contents of the expanded address field of the
418*4e1bc9a0SAchim Leubner                              Shadow Command Block */
419*4e1bc9a0SAchim Leubner     bit8    reserved1;    /* reserved */
420*4e1bc9a0SAchim Leubner 
421*4e1bc9a0SAchim Leubner     bit8    sectorCount;    /* Contains the contents of the Sector Count register of the
422*4e1bc9a0SAchim Leubner                                Shadow Command Block */
423*4e1bc9a0SAchim Leubner     bit8    sectorCountExp; /* Contains the contents of the expanded address field of
424*4e1bc9a0SAchim Leubner                                the Shadow Command Block */
425*4e1bc9a0SAchim Leubner     bit8    reserved2;    /* Reserved */
426*4e1bc9a0SAchim Leubner     bit8    e_status;     /* Contains the new value of Status Reg of the Command block
427*4e1bc9a0SAchim Leubner                              at the conclusion of the subsequent Data FIS */
428*4e1bc9a0SAchim Leubner     bit8    reserved4[2];    /* Reserved */
429*4e1bc9a0SAchim Leubner     bit8    transferCount[2]; /* the number of bytes to be xfered in the subsequent Data FiS */
430*4e1bc9a0SAchim Leubner } agsaFisPioSetupData_t;
431*4e1bc9a0SAchim Leubner 
432*4e1bc9a0SAchim Leubner 
433*4e1bc9a0SAchim Leubner typedef struct agsaFisPioSetup_s
434*4e1bc9a0SAchim Leubner {
435*4e1bc9a0SAchim Leubner     agsaFisPioSetupHeader_t h;
436*4e1bc9a0SAchim Leubner     agsaFisPioSetupData_t   d;
437*4e1bc9a0SAchim Leubner } agsaFisPioSetup_t;
438*4e1bc9a0SAchim Leubner 
439*4e1bc9a0SAchim Leubner 
440*4e1bc9a0SAchim Leubner 
441*4e1bc9a0SAchim Leubner /** \brief describe SAS IDENTIFY address frame
442*4e1bc9a0SAchim Leubner  *
443*4e1bc9a0SAchim Leubner  * describe SAS IDENTIFY address frame, the CRC field is not included in the structure
444*4e1bc9a0SAchim Leubner  *
445*4e1bc9a0SAchim Leubner  */
446*4e1bc9a0SAchim Leubner typedef struct agsaSASIdentify_s
447*4e1bc9a0SAchim Leubner {
448*4e1bc9a0SAchim Leubner     bit8  deviceType_addressFrameType;
449*4e1bc9a0SAchim Leubner     /* b7   : reserved */
450*4e1bc9a0SAchim Leubner     /* b6-4 : device type */
451*4e1bc9a0SAchim Leubner     /* b3-0 : address frame type */
452*4e1bc9a0SAchim Leubner     bit8  reason;  /* reserved */
453*4e1bc9a0SAchim Leubner     /* b7-4 : reserved */
454*4e1bc9a0SAchim Leubner     /* b3-0 : reason SAS2 */
455*4e1bc9a0SAchim Leubner     bit8  initiator_ssp_stp_smp;
456*4e1bc9a0SAchim Leubner     /* b8-4 : reserved */
457*4e1bc9a0SAchim Leubner     /* b3   : SSP initiator port */
458*4e1bc9a0SAchim Leubner     /* b2   : STP initiator port */
459*4e1bc9a0SAchim Leubner     /* b1   : SMP initiator port */
460*4e1bc9a0SAchim Leubner     /* b0   : reserved */
461*4e1bc9a0SAchim Leubner     bit8  target_ssp_stp_smp;
462*4e1bc9a0SAchim Leubner     /* b8-4 : reserved */
463*4e1bc9a0SAchim Leubner     /* b3   : SSP target port */
464*4e1bc9a0SAchim Leubner     /* b2   : STP target port */
465*4e1bc9a0SAchim Leubner     /* b1   : SMP target port */
466*4e1bc9a0SAchim Leubner     /* b0   : reserved */
467*4e1bc9a0SAchim Leubner     bit8  deviceName[8];            /* reserved */
468*4e1bc9a0SAchim Leubner 
469*4e1bc9a0SAchim Leubner     bit8  sasAddressHi[4];          /* BE SAS address Lo */
470*4e1bc9a0SAchim Leubner     bit8  sasAddressLo[4];          /* BE SAS address Hi */
471*4e1bc9a0SAchim Leubner 
472*4e1bc9a0SAchim Leubner     bit8  phyIdentifier;            /* phy identifier of the phy transmitting the IDENTIFY address frame */
473*4e1bc9a0SAchim Leubner     bit8  zpsds_breakReplyCap;
474*4e1bc9a0SAchim Leubner     /* b7-3 : reserved */
475*4e1bc9a0SAchim Leubner     /* b2   : Inside ZPSDS Persistent */
476*4e1bc9a0SAchim Leubner     /* b1   : Requested Inside ZPSDS */
477*4e1bc9a0SAchim Leubner     /* b0   : Break Reply Capable */
478*4e1bc9a0SAchim Leubner     bit8  reserved3[6];             /* reserved */
479*4e1bc9a0SAchim Leubner } agsaSASIdentify_t;
480*4e1bc9a0SAchim Leubner 
481*4e1bc9a0SAchim Leubner #define SA_IDFRM_GET_SAS_ADDRESSLO(identFrame)                  \
482*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32 *)(identFrame)->sasAddressLo)
483*4e1bc9a0SAchim Leubner 
484*4e1bc9a0SAchim Leubner #define SA_IDFRM_GET_SAS_ADDRESSHI(identFrame)                  \
485*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32 *)(identFrame)->sasAddressHi)
486*4e1bc9a0SAchim Leubner 
487*4e1bc9a0SAchim Leubner #define SA_IDFRM_GET_DEVICETTYPE(identFrame)                    \
488*4e1bc9a0SAchim Leubner     (((identFrame)->deviceType_addressFrameType & 0x70) >> 4)
489*4e1bc9a0SAchim Leubner 
490*4e1bc9a0SAchim Leubner #define SA_IDFRM_PUT_SAS_ADDRESSLO(identFrame, src32)                   \
491*4e1bc9a0SAchim Leubner     ((*(bit32 *)((identFrame)->sasAddressLo)) = BIT32_TO_DMA_BEBIT32(src32))
492*4e1bc9a0SAchim Leubner 
493*4e1bc9a0SAchim Leubner #define SA_IDFRM_PUT_SAS_ADDRESSHI(identFrame, src32)                   \
494*4e1bc9a0SAchim Leubner     ((*(bit32 *)((identFrame)->sasAddressHi)) = BIT32_TO_DMA_BEBIT32(src32))
495*4e1bc9a0SAchim Leubner 
496*4e1bc9a0SAchim Leubner #define SA_IDFRM_SSP_BIT         0x8   /* SSP Initiator port */
497*4e1bc9a0SAchim Leubner #define SA_IDFRM_STP_BIT         0x4   /* STP Initiator port */
498*4e1bc9a0SAchim Leubner #define SA_IDFRM_SMP_BIT         0x2   /* SMP Initiator port */
499*4e1bc9a0SAchim Leubner #define SA_IDFRM_SATA_BIT        0x1   /* SATA device, valid in the discovery response only */
500*4e1bc9a0SAchim Leubner 
501*4e1bc9a0SAchim Leubner 
502*4e1bc9a0SAchim Leubner #define SA_IDFRM_IS_SSP_INITIATOR(identFrame)                           \
503*4e1bc9a0SAchim Leubner     (((identFrame)->initiator_ssp_stp_smp & SA_IDFRM_SSP_BIT) == SA_IDFRM_SSP_BIT)
504*4e1bc9a0SAchim Leubner 
505*4e1bc9a0SAchim Leubner #define SA_IDFRM_IS_STP_INITIATOR(identFrame)                           \
506*4e1bc9a0SAchim Leubner     (((identFrame)->initiator_ssp_stp_smp & SA_IDFRM_STP_BIT) == SA_IDFRM_STP_BIT)
507*4e1bc9a0SAchim Leubner 
508*4e1bc9a0SAchim Leubner #define SA_IDFRM_IS_SMP_INITIATOR(identFrame)                           \
509*4e1bc9a0SAchim Leubner     (((identFrame)->initiator_ssp_stp_smp & SA_IDFRM_SMP_BIT) == SA_IDFRM_SMP_BIT)
510*4e1bc9a0SAchim Leubner 
511*4e1bc9a0SAchim Leubner #define SA_IDFRM_IS_SSP_TARGET(identFrame)                              \
512*4e1bc9a0SAchim Leubner     (((identFrame)->target_ssp_stp_smp & SA_IDFRM_SSP_BIT) == SA_IDFRM_SSP_BIT)
513*4e1bc9a0SAchim Leubner 
514*4e1bc9a0SAchim Leubner #define SA_IDFRM_IS_STP_TARGET(identFrame)                              \
515*4e1bc9a0SAchim Leubner     (((identFrame)->target_ssp_stp_smp & SA_IDFRM_STP_BIT) == SA_IDFRM_STP_BIT)
516*4e1bc9a0SAchim Leubner 
517*4e1bc9a0SAchim Leubner #define SA_IDFRM_IS_SMP_TARGET(identFrame)                              \
518*4e1bc9a0SAchim Leubner     (((identFrame)->target_ssp_stp_smp & SA_IDFRM_SMP_BIT) == SA_IDFRM_SMP_BIT)
519*4e1bc9a0SAchim Leubner 
520*4e1bc9a0SAchim Leubner #define SA_IDFRM_IS_SATA_DEVICE(identFrame)                             \
521*4e1bc9a0SAchim Leubner     (((identFrame)->target_ssp_stp_smp & SA_IDFRM_SATA_BIT) == SA_IDFRM_SATA_BIT)
522*4e1bc9a0SAchim Leubner 
523*4e1bc9a0SAchim Leubner /** \brief data structure provides the identify data of the SATA device
524*4e1bc9a0SAchim Leubner  *
525*4e1bc9a0SAchim Leubner  * data structure provides the identify data of the SATA device
526*4e1bc9a0SAchim Leubner  *
527*4e1bc9a0SAchim Leubner  */
528*4e1bc9a0SAchim Leubner typedef struct agsaSATAIdentifyData_s
529*4e1bc9a0SAchim Leubner {
530*4e1bc9a0SAchim Leubner   bit16   rm_ataDevice;
531*4e1bc9a0SAchim Leubner     /* b15-b9 :  */
532*4e1bc9a0SAchim Leubner     /* b8     :  ataDevice */
533*4e1bc9a0SAchim Leubner     /* b7-b1  : */
534*4e1bc9a0SAchim Leubner     /* b0     :  removableMedia */
535*4e1bc9a0SAchim Leubner   bit16   word1_9[9];                    /**< word 1 to 9 of identify device information */
536*4e1bc9a0SAchim Leubner   bit8    serialNumber[20];              /**< word 10 to 19 of identify device information, 20 ASCII chars */
537*4e1bc9a0SAchim Leubner   bit16   word20_22[3];                  /**< word 20 to 22 of identify device information */
538*4e1bc9a0SAchim Leubner   bit8    firmwareVersion[8];            /**< word 23 to 26 of identify device information, 4 ASCII chars */
539*4e1bc9a0SAchim Leubner   bit8    modelNumber[40];               /**< word 27 to 46 of identify device information, 40 ASCII chars */
540*4e1bc9a0SAchim Leubner   bit16   word47_48[2];                  /**< word 47 to 48 of identify device information, 40 ASCII chars */
541*4e1bc9a0SAchim Leubner   bit16   dma_lba_iod_ios_stimer;
542*4e1bc9a0SAchim Leubner     /* b15-b14:word49_bit14_15 */
543*4e1bc9a0SAchim Leubner     /* b13    : standbyTimerSupported */
544*4e1bc9a0SAchim Leubner     /* b12    : word49_bit12 */
545*4e1bc9a0SAchim Leubner     /* b11    : IORDYSupported */
546*4e1bc9a0SAchim Leubner     /* b10     : IORDYDisabled */
547*4e1bc9a0SAchim Leubner     /* b9     : lbaSupported */
548*4e1bc9a0SAchim Leubner     /* b8     : dmaSupported */
549*4e1bc9a0SAchim Leubner     /* b7-b0  : retired */
550*4e1bc9a0SAchim Leubner   bit16   word50_52[3];                  /**< word 50 to 52 of identify device information, 40 ASCII chars */
551*4e1bc9a0SAchim Leubner   bit16   valid_w88_w70;
552*4e1bc9a0SAchim Leubner     /* b15-3  : word53_bit3_15 */
553*4e1bc9a0SAchim Leubner     /* b2     : validWord88  */
554*4e1bc9a0SAchim Leubner     /* b1     : validWord70_64  */
555*4e1bc9a0SAchim Leubner     /* b0     : word53_bit0  */
556*4e1bc9a0SAchim Leubner   bit16   word54_59[6];                  /**< word54-59 of identify device information  */
557*4e1bc9a0SAchim Leubner   bit16   numOfUserAddressableSectorsLo; /**< word60 of identify device information  */
558*4e1bc9a0SAchim Leubner   bit16   numOfUserAddressableSectorsHi; /**< word61 of identify device information  */
559*4e1bc9a0SAchim Leubner   bit16   word62_74[13];                 /**< word62-74 of identify device information  */
560*4e1bc9a0SAchim Leubner   bit16   queueDepth;
561*4e1bc9a0SAchim Leubner     /* b15-5  : word75_bit5_15 */
562*4e1bc9a0SAchim Leubner     /* b4-0   : queueDepth */
563*4e1bc9a0SAchim Leubner   bit16   sataCapabilities;
564*4e1bc9a0SAchim Leubner     /* b15-b11: word76_bit11_15  */
565*4e1bc9a0SAchim Leubner     /* b10    : phyEventCountersSupport */
566*4e1bc9a0SAchim Leubner     /* b9     : hostInitPowerMangment */
567*4e1bc9a0SAchim Leubner     /* b8     : nativeCommandQueuing */
568*4e1bc9a0SAchim Leubner     /* b7-b3  : word76_bit4_7 */
569*4e1bc9a0SAchim Leubner     /* b2     : sataGen2Supported (3.0 Gbps) */
570*4e1bc9a0SAchim Leubner     /* b1     : sataGen1Supported (1.5 Gbps) */
571*4e1bc9a0SAchim Leubner     /* b0      :word76_bit0 */
572*4e1bc9a0SAchim Leubner   bit16   word77;                        /**< word77 of identify device information */
573*4e1bc9a0SAchim Leubner     /* b15-b6 : word77 bit6_15, Reserved */
574*4e1bc9a0SAchim Leubner     /* b5     : DMA Setup Auto-Activate support */
575*4e1bc9a0SAchim Leubner     /* b4     : NCQ streaming support */
576*4e1bc9a0SAchim Leubner     /* b3-b1  : coded value indicating current negotiated SATA signal speed */
577*4e1bc9a0SAchim Leubner     /* b0     : shall be zero */
578*4e1bc9a0SAchim Leubner   bit16   sataFeaturesSupported;
579*4e1bc9a0SAchim Leubner     /* b15-b7 : word78_bit7_15 */
580*4e1bc9a0SAchim Leubner     /* b6     : softSettingPreserveSupported */
581*4e1bc9a0SAchim Leubner     /* b5     : word78_bit5 */
582*4e1bc9a0SAchim Leubner     /* b4     : inOrderDataDeliverySupported */
583*4e1bc9a0SAchim Leubner     /* b3     : devInitPowerManagementSupported */
584*4e1bc9a0SAchim Leubner     /* b2     : autoActiveDMASupported */
585*4e1bc9a0SAchim Leubner     /* b1     : nonZeroBufOffsetSupported */
586*4e1bc9a0SAchim Leubner     /* b0     : word78_bit0  */
587*4e1bc9a0SAchim Leubner   bit16   sataFeaturesEnabled;
588*4e1bc9a0SAchim Leubner     /* b15-7  : word79_bit7_15  */
589*4e1bc9a0SAchim Leubner     /* b6     : softSettingPreserveEnabled */
590*4e1bc9a0SAchim Leubner     /* b5     : word79_bit5  */
591*4e1bc9a0SAchim Leubner     /* b4     : inOrderDataDeliveryEnabled */
592*4e1bc9a0SAchim Leubner     /* b3     : devInitPowerManagementEnabled */
593*4e1bc9a0SAchim Leubner     /* b2     : autoActiveDMAEnabled */
594*4e1bc9a0SAchim Leubner     /* b1     : nonZeroBufOffsetEnabled */
595*4e1bc9a0SAchim Leubner     /* b0     : word79_bit0 */
596*4e1bc9a0SAchim Leubner   bit16   majorVersionNumber;
597*4e1bc9a0SAchim Leubner     /* b15    : word80_bit15 */
598*4e1bc9a0SAchim Leubner     /* b14    : supportATA_ATAPI14 */
599*4e1bc9a0SAchim Leubner     /* b13    : supportATA_ATAPI13 */
600*4e1bc9a0SAchim Leubner     /* b12    : supportATA_ATAPI12 */
601*4e1bc9a0SAchim Leubner     /* b11    : supportATA_ATAPI11 */
602*4e1bc9a0SAchim Leubner     /* b10    : supportATA_ATAPI10 */
603*4e1bc9a0SAchim Leubner     /* b9     : supportATA_ATAPI9  */
604*4e1bc9a0SAchim Leubner     /* b8     : supportATA_ATAPI8  */
605*4e1bc9a0SAchim Leubner     /* b7     : supportATA_ATAPI7  */
606*4e1bc9a0SAchim Leubner     /* b6     : supportATA_ATAPI6  */
607*4e1bc9a0SAchim Leubner     /* b5     : supportATA_ATAPI5  */
608*4e1bc9a0SAchim Leubner     /* b4     : supportATA_ATAPI4 */
609*4e1bc9a0SAchim Leubner     /* b3     : supportATA3 */
610*4e1bc9a0SAchim Leubner     /* b2-0   : word80_bit0_2 */
611*4e1bc9a0SAchim Leubner   bit16   minorVersionNumber;            /**< word81 of identify device information */
612*4e1bc9a0SAchim Leubner   bit16   commandSetSupported;
613*4e1bc9a0SAchim Leubner     /* b15    : word82_bit15 */
614*4e1bc9a0SAchim Leubner     /* b14    : NOPSupported */
615*4e1bc9a0SAchim Leubner     /* b13    : READ_BUFFERSupported */
616*4e1bc9a0SAchim Leubner     /* b12    : WRITE_BUFFERSupported */
617*4e1bc9a0SAchim Leubner     /* b11    : word82_bit11 */
618*4e1bc9a0SAchim Leubner     /* b10    : hostProtectedAreaSupported */
619*4e1bc9a0SAchim Leubner     /* b9     : DEVICE_RESETSupported */
620*4e1bc9a0SAchim Leubner     /* b8     : SERVICEInterruptSupported */
621*4e1bc9a0SAchim Leubner     /* b7     : releaseInterruptSupported */
622*4e1bc9a0SAchim Leubner     /* b6     : lookAheadSupported */
623*4e1bc9a0SAchim Leubner     /* b5     : writeCacheSupported */
624*4e1bc9a0SAchim Leubner     /* b4     : word82_bit4 */
625*4e1bc9a0SAchim Leubner     /* b3     : mandPowerManagmentSupported */
626*4e1bc9a0SAchim Leubner     /* b2     : removableMediaSupported */
627*4e1bc9a0SAchim Leubner     /* b1     : securityModeSupported */
628*4e1bc9a0SAchim Leubner     /* b0     : SMARTSupported */
629*4e1bc9a0SAchim Leubner   bit16   commandSetSupported1;
630*4e1bc9a0SAchim Leubner     /* b15-b14: word83_bit14_15  */
631*4e1bc9a0SAchim Leubner     /* b13    : FLUSH_CACHE_EXTSupported  */
632*4e1bc9a0SAchim Leubner     /* b12    : mandatoryFLUSH_CACHESupported */
633*4e1bc9a0SAchim Leubner     /* b11    : devConfOverlaySupported */
634*4e1bc9a0SAchim Leubner     /* b10    : address48BitsSupported */
635*4e1bc9a0SAchim Leubner     /* b9     : autoAcousticManageSupported */
636*4e1bc9a0SAchim Leubner     /* b8     : SET_MAX_SecurityExtSupported */
637*4e1bc9a0SAchim Leubner     /* b7     : word83_bit7 */
638*4e1bc9a0SAchim Leubner     /* b6     : SET_FEATUREReqSpinupSupported */
639*4e1bc9a0SAchim Leubner     /* b5     : powerUpInStandyBySupported */
640*4e1bc9a0SAchim Leubner     /* b4     : removableMediaStNotifSupported */
641*4e1bc9a0SAchim Leubner     /* b3     : advanPowerManagmentSupported */
642*4e1bc9a0SAchim Leubner     /* b2     : CFASupported */
643*4e1bc9a0SAchim Leubner     /* b1     : DMAQueuedSupported */
644*4e1bc9a0SAchim Leubner     /* b0     : DOWNLOAD_MICROCODESupported */
645*4e1bc9a0SAchim Leubner   bit16   commandSetFeatureSupportedExt;
646*4e1bc9a0SAchim Leubner     /* b15-b13: word84_bit13_15 */
647*4e1bc9a0SAchim Leubner     /* b12    : timeLimitRWContSupported */
648*4e1bc9a0SAchim Leubner     /* b11    : timeLimitRWSupported */
649*4e1bc9a0SAchim Leubner     /* b10    : writeURGBitSupported */
650*4e1bc9a0SAchim Leubner     /* b9     : readURGBitSupported */
651*4e1bc9a0SAchim Leubner     /* b8     : wwwNameSupported */
652*4e1bc9a0SAchim Leubner     /* b7     : WRITE_DMAQ_FUA_EXTSupported */
653*4e1bc9a0SAchim Leubner     /* b6     : WRITE_FUA_EXTSupported */
654*4e1bc9a0SAchim Leubner     /* b5     : generalPurposeLogSupported */
655*4e1bc9a0SAchim Leubner     /* b4     : streamingSupported  */
656*4e1bc9a0SAchim Leubner     /* b3     : mediaCardPassThroughSupported */
657*4e1bc9a0SAchim Leubner     /* b2     : mediaSerialNoSupported */
658*4e1bc9a0SAchim Leubner     /* b1     : SMARTSelfRestSupported */
659*4e1bc9a0SAchim Leubner     /* b0     : SMARTErrorLogSupported */
660*4e1bc9a0SAchim Leubner   bit16   commandSetFeatureEnabled;
661*4e1bc9a0SAchim Leubner     /* b15    : word85_bit15 */
662*4e1bc9a0SAchim Leubner     /* b14    : NOPEnabled */
663*4e1bc9a0SAchim Leubner     /* b13    : READ_BUFFEREnabled  */
664*4e1bc9a0SAchim Leubner     /* b12    : WRITE_BUFFEREnabled */
665*4e1bc9a0SAchim Leubner     /* b11    : word85_bit11 */
666*4e1bc9a0SAchim Leubner     /* b10    : hostProtectedAreaEnabled  */
667*4e1bc9a0SAchim Leubner     /* b9     : DEVICE_RESETEnabled */
668*4e1bc9a0SAchim Leubner     /* b8     : SERVICEInterruptEnabled */
669*4e1bc9a0SAchim Leubner     /* b7     : releaseInterruptEnabled */
670*4e1bc9a0SAchim Leubner     /* b6     : lookAheadEnabled */
671*4e1bc9a0SAchim Leubner     /* b5     : writeCacheEnabled */
672*4e1bc9a0SAchim Leubner     /* b4     : word85_bit4 */
673*4e1bc9a0SAchim Leubner     /* b3     : mandPowerManagmentEnabled */
674*4e1bc9a0SAchim Leubner     /* b2     : removableMediaEnabled */
675*4e1bc9a0SAchim Leubner     /* b1     : securityModeEnabled */
676*4e1bc9a0SAchim Leubner     /* b0     : SMARTEnabled */
677*4e1bc9a0SAchim Leubner   bit16   commandSetFeatureEnabled1;
678*4e1bc9a0SAchim Leubner     /* b15-b14: word86_bit14_15 */
679*4e1bc9a0SAchim Leubner     /* b13    : FLUSH_CACHE_EXTEnabled */
680*4e1bc9a0SAchim Leubner     /* b12    : mandatoryFLUSH_CACHEEnabled */
681*4e1bc9a0SAchim Leubner     /* b11    : devConfOverlayEnabled */
682*4e1bc9a0SAchim Leubner     /* b10    : address48BitsEnabled */
683*4e1bc9a0SAchim Leubner     /* b9     : autoAcousticManageEnabled */
684*4e1bc9a0SAchim Leubner     /* b8     : SET_MAX_SecurityExtEnabled */
685*4e1bc9a0SAchim Leubner     /* b7     : word86_bit7 */
686*4e1bc9a0SAchim Leubner     /* b6     : SET_FEATUREReqSpinupEnabled */
687*4e1bc9a0SAchim Leubner     /* b5     : powerUpInStandyByEnabled  */
688*4e1bc9a0SAchim Leubner     /* b4     : removableMediaStNotifEnabled */
689*4e1bc9a0SAchim Leubner     /* b3     : advanPowerManagmentEnabled */
690*4e1bc9a0SAchim Leubner     /* b2     : CFAEnabled */
691*4e1bc9a0SAchim Leubner     /* b1     : DMAQueuedEnabled */
692*4e1bc9a0SAchim Leubner     /* b0     : DOWNLOAD_MICROCODEEnabled */
693*4e1bc9a0SAchim Leubner   bit16   commandSetFeatureDefault;
694*4e1bc9a0SAchim Leubner     /* b15-b13: word87_bit13_15 */
695*4e1bc9a0SAchim Leubner     /* b12    : timeLimitRWContEnabled */
696*4e1bc9a0SAchim Leubner     /* b11    : timeLimitRWEnabled */
697*4e1bc9a0SAchim Leubner     /* b10    : writeURGBitEnabled */
698*4e1bc9a0SAchim Leubner     /* b9     : readURGBitEnabled */
699*4e1bc9a0SAchim Leubner     /* b8     : wwwNameEnabled */
700*4e1bc9a0SAchim Leubner     /* b7     : WRITE_DMAQ_FUA_EXTEnabled */
701*4e1bc9a0SAchim Leubner     /* b6     : WRITE_FUA_EXTEnabled */
702*4e1bc9a0SAchim Leubner     /* b5     : generalPurposeLogEnabled */
703*4e1bc9a0SAchim Leubner     /* b4     : streamingEnabled */
704*4e1bc9a0SAchim Leubner     /* b3     : mediaCardPassThroughEnabled */
705*4e1bc9a0SAchim Leubner     /* b2     : mediaSerialNoEnabled */
706*4e1bc9a0SAchim Leubner     /* b1     : SMARTSelfRestEnabled */
707*4e1bc9a0SAchim Leubner     /* b0     : SMARTErrorLogEnabled */
708*4e1bc9a0SAchim Leubner   bit16   ultraDMAModes;
709*4e1bc9a0SAchim Leubner     /* b15    : word88_bit15 */
710*4e1bc9a0SAchim Leubner     /* b14    : ultraDMAMode6Selected */
711*4e1bc9a0SAchim Leubner     /* b13    : ultraDMAMode5Selected */
712*4e1bc9a0SAchim Leubner     /* b12    : ultraDMAMode4Selected */
713*4e1bc9a0SAchim Leubner     /* b11    : ultraDMAMode3Selected */
714*4e1bc9a0SAchim Leubner     /* b10    : ultraDMAMode2Selected */
715*4e1bc9a0SAchim Leubner     /* b9     : ultraDMAMode1Selected */
716*4e1bc9a0SAchim Leubner     /* b8     : ultraDMAMode0Selected */
717*4e1bc9a0SAchim Leubner     /* b7     : word88_bit7  */
718*4e1bc9a0SAchim Leubner     /* b6     : ultraDMAMode6Supported */
719*4e1bc9a0SAchim Leubner     /* b5     : ultraDMAMode5Supported */
720*4e1bc9a0SAchim Leubner     /* b4     : ultraDMAMode4Supported */
721*4e1bc9a0SAchim Leubner     /* b3     : ultraDMAMode3Supported */
722*4e1bc9a0SAchim Leubner     /* b2     : ultraDMAMode2Supported */
723*4e1bc9a0SAchim Leubner     /* b1     : ultraDMAMode1Supported */
724*4e1bc9a0SAchim Leubner     /* b0     : ultraDMAMode0Supported */
725*4e1bc9a0SAchim Leubner   bit16   timeToSecurityErase;
726*4e1bc9a0SAchim Leubner   bit16   timeToEnhhancedSecurityErase;
727*4e1bc9a0SAchim Leubner   bit16   currentAPMValue;
728*4e1bc9a0SAchim Leubner   bit16   masterPasswordRevCode;
729*4e1bc9a0SAchim Leubner   bit16   hardwareResetResult;
730*4e1bc9a0SAchim Leubner     /* b15-b14: word93_bit15_14 */
731*4e1bc9a0SAchim Leubner     /* b13    : deviceDetectedCBLIBbelow Vil */
732*4e1bc9a0SAchim Leubner     /* b12-b8 : device1 HardwareResetResult */
733*4e1bc9a0SAchim Leubner     /* b7-b0  : device0 HardwareResetResult */
734*4e1bc9a0SAchim Leubner   bit16   currentAutoAccousticManagementValue;
735*4e1bc9a0SAchim Leubner     /* b15-b8 : Vendor recommended value */
736*4e1bc9a0SAchim Leubner     /* b7-b0  : current value */
737*4e1bc9a0SAchim Leubner   bit16   word95_99[5];                  /**< word85-99 of identify device information  */
738*4e1bc9a0SAchim Leubner   bit16   maxLBA0_15;                    /**< word100 of identify device information  */
739*4e1bc9a0SAchim Leubner   bit16   maxLBA16_31;                   /**< word101 of identify device information  */
740*4e1bc9a0SAchim Leubner   bit16   maxLBA32_47;                   /**< word102 of identify device information  */
741*4e1bc9a0SAchim Leubner   bit16   maxLBA48_63;                   /**< word103 of identify device information  */
742*4e1bc9a0SAchim Leubner   bit16   word104_107[4];                /**< word104-107 of identify device information  */
743*4e1bc9a0SAchim Leubner   bit16   namingAuthority;
744*4e1bc9a0SAchim Leubner     /* b15-b12: NAA_bit0_3  */
745*4e1bc9a0SAchim Leubner     /* b11-b0 : IEEE_OUI_bit12_23*/
746*4e1bc9a0SAchim Leubner   bit16   namingAuthority1;
747*4e1bc9a0SAchim Leubner     /* b15-b4 : IEEE_OUI_bit0_11 */
748*4e1bc9a0SAchim Leubner     /* b3-b0  : uniqueID_bit32_35 */
749*4e1bc9a0SAchim Leubner   bit16   uniqueID_bit16_31;                      /**< word110 of identify device information  */
750*4e1bc9a0SAchim Leubner   bit16   uniqueID_bit0_15;                       /**< word111 of identify device information  */
751*4e1bc9a0SAchim Leubner   bit16   word112_126[15];
752*4e1bc9a0SAchim Leubner   bit16   removableMediaStatusNotificationFeature;
753*4e1bc9a0SAchim Leubner     /* b15-b2 : word127_b16_2 */
754*4e1bc9a0SAchim Leubner     /* b1-b0  : supported set see ATAPI6 spec */
755*4e1bc9a0SAchim Leubner   bit16   securityStatus;
756*4e1bc9a0SAchim Leubner     /* b15-b9 : word128_b15_9 */
757*4e1bc9a0SAchim Leubner     /* b8     : securityLevel */
758*4e1bc9a0SAchim Leubner     /* b7-b6  : word128_b7_6 */
759*4e1bc9a0SAchim Leubner     /* b5     : enhancedSecurityEraseSupported */
760*4e1bc9a0SAchim Leubner     /* b4     : securityCountExpired */
761*4e1bc9a0SAchim Leubner     /* b3     : securityFrozen */
762*4e1bc9a0SAchim Leubner     /* b2     : securityLocked */
763*4e1bc9a0SAchim Leubner     /* b1     : securityEnabled */
764*4e1bc9a0SAchim Leubner     /* b0     : securitySupported */
765*4e1bc9a0SAchim Leubner   bit16   vendorSpecific[31];
766*4e1bc9a0SAchim Leubner   bit16   cfaPowerMode1;
767*4e1bc9a0SAchim Leubner     /* b15    : word 160 supported */
768*4e1bc9a0SAchim Leubner     /* b14    : word160_b14 */
769*4e1bc9a0SAchim Leubner     /* b13    : cfaPowerRequired */
770*4e1bc9a0SAchim Leubner     /* b12    : cfaPowerModeDisabled */
771*4e1bc9a0SAchim Leubner     /* b11-b0 : maxCurrentInMa */
772*4e1bc9a0SAchim Leubner   bit16   word161_175[15];
773*4e1bc9a0SAchim Leubner   bit16   currentMediaSerialNumber[30];
774*4e1bc9a0SAchim Leubner   bit16   word206_254[49];              /**< word206-254 of identify device information  */
775*4e1bc9a0SAchim Leubner   bit16   integrityWord;
776*4e1bc9a0SAchim Leubner     /* b15-b8 : cheksum */
777*4e1bc9a0SAchim Leubner     /* b7-b0  : signature */
778*4e1bc9a0SAchim Leubner } agsaSATAIdentifyData_t;
779*4e1bc9a0SAchim Leubner 
780*4e1bc9a0SAchim Leubner 
781*4e1bc9a0SAchim Leubner 
782*4e1bc9a0SAchim Leubner 
783*4e1bc9a0SAchim Leubner /** \brief data structure describes an SSP Command INFORMATION UNIT
784*4e1bc9a0SAchim Leubner  *
785*4e1bc9a0SAchim Leubner  * data structure describes an SSP Command INFORMATION UNIT used for SSP command and is part of
786*4e1bc9a0SAchim Leubner  * the SSP frame.
787*4e1bc9a0SAchim Leubner  *
788*4e1bc9a0SAchim Leubner  * Currently, only CDB up to 16 bytes is supported. Additional CDB length is supported to 0 bytes..
789*4e1bc9a0SAchim Leubner  *
790*4e1bc9a0SAchim Leubner  */
791*4e1bc9a0SAchim Leubner typedef struct agsaSSPCmdInfoUnit_s
792*4e1bc9a0SAchim Leubner {
793*4e1bc9a0SAchim Leubner     bit8    lun[8];                /* SCSI Logical Unit Number */
794*4e1bc9a0SAchim Leubner     bit8    reserved1;             /* reserved */
795*4e1bc9a0SAchim Leubner     bit8    efb_tp_taskAttribute;
796*4e1bc9a0SAchim Leubner     /* B7   : enabledFirstBurst */
797*4e1bc9a0SAchim Leubner     /* B6-3 : taskPriority */
798*4e1bc9a0SAchim Leubner     /* B2-0 : taskAttribute */
799*4e1bc9a0SAchim Leubner     bit8    reserved2;             /* reserved */
800*4e1bc9a0SAchim Leubner     bit8    additionalCdbLen;
801*4e1bc9a0SAchim Leubner     /* B7-2 : additionalCdbLen */
802*4e1bc9a0SAchim Leubner     /* B1-0 : reserved */
803*4e1bc9a0SAchim Leubner     bit8    cdb[16];      /* The SCSI CDB up to 16 bytes length */
804*4e1bc9a0SAchim Leubner } agsaSSPCmdInfoUnit_t;
805*4e1bc9a0SAchim Leubner 
806*4e1bc9a0SAchim Leubner #define SA_SSPCMD_GET_TASKATTRIB(pCmd) ((pCmd)->efb_tp_taskAttribute & 0x7)
807*4e1bc9a0SAchim Leubner 
808*4e1bc9a0SAchim Leubner 
809*4e1bc9a0SAchim Leubner /** \brief structure describes an SSP Response INFORMATION UNIT
810*4e1bc9a0SAchim Leubner  *
811*4e1bc9a0SAchim Leubner  * data structure describes an SSP Response INFORMATION UNIT used for SSP response to Command IU
812*4e1bc9a0SAchim Leubner  * or Task IU and is part of the SSP frame
813*4e1bc9a0SAchim Leubner  *
814*4e1bc9a0SAchim Leubner  */
815*4e1bc9a0SAchim Leubner 
816*4e1bc9a0SAchim Leubner typedef struct agsaSSPResponseInfoUnit_s
817*4e1bc9a0SAchim Leubner {
818*4e1bc9a0SAchim Leubner     bit8    reserved1[10];      /* reserved */
819*4e1bc9a0SAchim Leubner 
820*4e1bc9a0SAchim Leubner     bit8    dataPres;           /* which data is present */
821*4e1bc9a0SAchim Leubner     /* B7-2 : reserved */
822*4e1bc9a0SAchim Leubner     /* B1-0 : data Present */
823*4e1bc9a0SAchim Leubner     bit8    status;             /* SCSI status as define by SAM-3 */
824*4e1bc9a0SAchim Leubner     bit8    reserved4[4];       /* reserved */
825*4e1bc9a0SAchim Leubner     bit8    senseDataLen[4];    /* SCSI Sense Data length */
826*4e1bc9a0SAchim Leubner     bit8    responsedataLen[4]; /* Response data length */
827*4e1bc9a0SAchim Leubner     /* Follow by Response Data if any */
828*4e1bc9a0SAchim Leubner     /* Follow by Sense Data if any */
829*4e1bc9a0SAchim Leubner } agsaSSPResponseInfoUnit_t;
830*4e1bc9a0SAchim Leubner 
831*4e1bc9a0SAchim Leubner 
832*4e1bc9a0SAchim Leubner typedef struct agsaSSPFrameFormat_s
833*4e1bc9a0SAchim Leubner {
834*4e1bc9a0SAchim Leubner     bit8    frameType;             /* frame type */
835*4e1bc9a0SAchim Leubner     bit8    hdsa[3];               /* Hashed destination SAS Address */
836*4e1bc9a0SAchim Leubner     bit8    reserved1;
837*4e1bc9a0SAchim Leubner     bit8    hssa[3];               /* Hashed source SAS Address */
838*4e1bc9a0SAchim Leubner     bit8    reserved2;
839*4e1bc9a0SAchim Leubner     bit8    reserved3;
840*4e1bc9a0SAchim Leubner     bit8    tlr_rdf;
841*4e1bc9a0SAchim Leubner     /* B7-5 : reserved */
842*4e1bc9a0SAchim Leubner     /* B4-3 : TLR control*/
843*4e1bc9a0SAchim Leubner     /* B2   : Retry Data Frames */
844*4e1bc9a0SAchim Leubner     /* B1   : Retransmit */
845*4e1bc9a0SAchim Leubner     /* B0   : Changing Data Pointer */
846*4e1bc9a0SAchim Leubner     bit8    fill_bytes;
847*4e1bc9a0SAchim Leubner     /* B7-2 : reserved */
848*4e1bc9a0SAchim Leubner     /* B1-0 : Number of Fill bytes*/
849*4e1bc9a0SAchim Leubner     bit8    reserved5;
850*4e1bc9a0SAchim Leubner     bit8    reserved6[3];
851*4e1bc9a0SAchim Leubner     bit8    tag[2];               /* CMD or TM tag */
852*4e1bc9a0SAchim Leubner     bit8    tptt[2];              /* target port transfer tag */
853*4e1bc9a0SAchim Leubner     bit8    dataOffset[4];        /* data offset */
854*4e1bc9a0SAchim Leubner     /* Follow by IU  */
855*4e1bc9a0SAchim Leubner } agsaSSPFrameFormat_t;
856*4e1bc9a0SAchim Leubner 
857*4e1bc9a0SAchim Leubner 
858*4e1bc9a0SAchim Leubner typedef struct agsaSSPOpenFrame_s
859*4e1bc9a0SAchim Leubner {
860*4e1bc9a0SAchim Leubner     bit8    frameType;             /* frame type */
861*4e1bc9a0SAchim Leubner     /* B7   : Initiator Port */
862*4e1bc9a0SAchim Leubner     /* B6-4 : Protocol */
863*4e1bc9a0SAchim Leubner     /* B3-0 : Address Frame Type */
864*4e1bc9a0SAchim Leubner     bit8    feat_connrate;
865*4e1bc9a0SAchim Leubner     /* B7-4 : features */
866*4e1bc9a0SAchim Leubner     /* B3-0 : connection rate */
867*4e1bc9a0SAchim Leubner     bit8    initiatorConnTag[2];    /* Initiator connection tag */
868*4e1bc9a0SAchim Leubner     bit8    dstSasAddr[8];          /* Destination SAS Address */
869*4e1bc9a0SAchim Leubner     bit8    srcSasAddr[8];          /* Source SAS Address */
870*4e1bc9a0SAchim Leubner     bit8    zoneSrcGroup;           /* Zone source group */
871*4e1bc9a0SAchim Leubner     bit8    pathwayBlockCount;      /* pathway block count */
872*4e1bc9a0SAchim Leubner     bit8    arbWaitTime[2];         /* Arbitration Wait Time */
873*4e1bc9a0SAchim Leubner     bit8    moreCompatFeat[4];      /* More Compatibility Features */
874*4e1bc9a0SAchim Leubner     /* Follow by CRC  */
875*4e1bc9a0SAchim Leubner } agsaSSPOpenFrame_t;
876*4e1bc9a0SAchim Leubner 
877*4e1bc9a0SAchim Leubner #define SA_SSPRESP_GET_SENSEDATALEN(pSSPResp)                   \
878*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32*)(pSSPResp)->senseDataLen)
879*4e1bc9a0SAchim Leubner 
880*4e1bc9a0SAchim Leubner #define SA_SSPRESP_GET_RESPONSEDATALEN(pSSPResp)                \
881*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32*)(pSSPResp)->responsedataLen)
882*4e1bc9a0SAchim Leubner 
883*4e1bc9a0SAchim Leubner #define SA_SSPRESP_GET_DATAPRES(pSSPResp) ((pSSPResp)->dataPres & 0x3)
884*4e1bc9a0SAchim Leubner 
885*4e1bc9a0SAchim Leubner /** \brief structure describes a SAS SSP Task Management command request
886*4e1bc9a0SAchim Leubner  *
887*4e1bc9a0SAchim Leubner  * The agsaSSPScsiTaskMgntReq_t data structure describes a SAS SSP Task Management command request sent by the
888*4e1bc9a0SAchim Leubner  * initiator or received by the target.
889*4e1bc9a0SAchim Leubner  *
890*4e1bc9a0SAchim Leubner  * The response to Task Management is specified by agsaSSPResponseInfoUnit_t.
891*4e1bc9a0SAchim Leubner  *
892*4e1bc9a0SAchim Leubner  * This data structure is one instance of the generic request issued to saSSPStart() and is passed
893*4e1bc9a0SAchim Leubner  * as an agsaSASRequestBody_t
894*4e1bc9a0SAchim Leubner  *
895*4e1bc9a0SAchim Leubner  */
896*4e1bc9a0SAchim Leubner typedef struct agsaSSPScsiTaskMgntReq_s
897*4e1bc9a0SAchim Leubner {
898*4e1bc9a0SAchim Leubner     bit8    lun[8];               /* SCSI Logical Unit Number */
899*4e1bc9a0SAchim Leubner     bit16   reserved1;            /* reserved */
900*4e1bc9a0SAchim Leubner     bit8    taskMgntFunction;     /* task management function code */
901*4e1bc9a0SAchim Leubner     bit8    reserved2;            /* reserved */
902*4e1bc9a0SAchim Leubner     bit16   tagOfTaskToBeManaged; /* Tag/context of task to be managed */
903*4e1bc9a0SAchim Leubner     bit16   reserved3;            /* reserved */
904*4e1bc9a0SAchim Leubner     bit32   reserved4[3];         /* reserved */
905*4e1bc9a0SAchim Leubner     bit32   tmOption;             /* Not part of SSP TMF IU */
906*4e1bc9a0SAchim Leubner     /* B7-2 : reserved */
907*4e1bc9a0SAchim Leubner     /* B1   : DS_OPTION */
908*4e1bc9a0SAchim Leubner     /* B0   : ADS_OPTION */
909*4e1bc9a0SAchim Leubner } agsaSSPScsiTaskMgntReq_t;
910*4e1bc9a0SAchim Leubner 
911*4e1bc9a0SAchim Leubner 
912*4e1bc9a0SAchim Leubner /** \brief data structure describes the first four bytes of the SMP frame.
913*4e1bc9a0SAchim Leubner  *
914*4e1bc9a0SAchim Leubner  * The agsaSMPFrameHeader_t data structure describes the first four bytes of the SMP frame.
915*4e1bc9a0SAchim Leubner  *
916*4e1bc9a0SAchim Leubner  *
917*4e1bc9a0SAchim Leubner  */
918*4e1bc9a0SAchim Leubner 
919*4e1bc9a0SAchim Leubner typedef struct agsaSMPFrameHeader_s
920*4e1bc9a0SAchim Leubner {
921*4e1bc9a0SAchim Leubner     bit8   smpFrameType;      /* The first byte of SMP frame represents the SMP FRAME TYPE */
922*4e1bc9a0SAchim Leubner     bit8   smpFunction;       /* The second byte of the SMP frame represents the SMP FUNCTION */
923*4e1bc9a0SAchim Leubner     bit8   smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */
924*4e1bc9a0SAchim Leubner     bit8   smpReserved;       /* reserved */
925*4e1bc9a0SAchim Leubner } agsaSMPFrameHeader_t;
926*4e1bc9a0SAchim Leubner 
927*4e1bc9a0SAchim Leubner /****************************************************************
928*4e1bc9a0SAchim Leubner  *            report general response
929*4e1bc9a0SAchim Leubner  ****************************************************************/
930*4e1bc9a0SAchim Leubner #define SA_REPORT_GENERAL_CONFIGURING_BIT     0x2
931*4e1bc9a0SAchim Leubner #define SA_REPORT_GENERAL_CONFIGURABLE_BIT    0x1
932*4e1bc9a0SAchim Leubner 
933*4e1bc9a0SAchim Leubner typedef struct agsaSmpRespReportGeneral_s
934*4e1bc9a0SAchim Leubner {
935*4e1bc9a0SAchim Leubner   bit8   expanderChangeCount16[2];
936*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndexes16[2];
937*4e1bc9a0SAchim Leubner   bit8   reserved1;
938*4e1bc9a0SAchim Leubner   bit8   numOfPhys;
939*4e1bc9a0SAchim Leubner   bit8   configuring_configurable;
940*4e1bc9a0SAchim Leubner     /* B7-2 : reserved */
941*4e1bc9a0SAchim Leubner     /* B1   : configuring */
942*4e1bc9a0SAchim Leubner     /* B0   : configurable */
943*4e1bc9a0SAchim Leubner   bit8   reserved4[17];
944*4e1bc9a0SAchim Leubner } agsaSmpRespReportGeneral_t;
945*4e1bc9a0SAchim Leubner 
946*4e1bc9a0SAchim Leubner #define SA_REPORT_GENERAL_IS_CONFIGURING(pResp) \
947*4e1bc9a0SAchim Leubner   (((pResp)->configuring_configurable & SA_REPORT_GENERAL_CONFIGURING_BIT) == \
948*4e1bc9a0SAchim Leubner       SA_REPORT_GENERAL_CONFIGURING_BIT)
949*4e1bc9a0SAchim Leubner 
950*4e1bc9a0SAchim Leubner #define SA_REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
951*4e1bc9a0SAchim Leubner   (((pResp)->configuring_configurable & SA_REPORT_GENERAL_CONFIGURABLE_BIT) == \
952*4e1bc9a0SAchim Leubner       SA_REPORT_GENERAL_CONFIGURABLE_BIT)
953*4e1bc9a0SAchim Leubner 
954*4e1bc9a0SAchim Leubner #define SA_REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
955*4e1bc9a0SAchim Leubner   DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
956*4e1bc9a0SAchim Leubner 
957*4e1bc9a0SAchim Leubner /****************************************************************
958*4e1bc9a0SAchim Leubner  *            report manufacturer info response
959*4e1bc9a0SAchim Leubner  ****************************************************************/
960*4e1bc9a0SAchim Leubner typedef struct agsaSmpRespReportManufactureInfo_s
961*4e1bc9a0SAchim Leubner {
962*4e1bc9a0SAchim Leubner   bit8    reserved1[8];
963*4e1bc9a0SAchim Leubner   bit8    vendorIdentification[8];
964*4e1bc9a0SAchim Leubner   bit8    productIdentification[16];
965*4e1bc9a0SAchim Leubner   bit8    productRevisionLevel[4];
966*4e1bc9a0SAchim Leubner   bit8    vendorSpecific[20];
967*4e1bc9a0SAchim Leubner } agsaSmpRespReportManufactureInfo_t;
968*4e1bc9a0SAchim Leubner 
969*4e1bc9a0SAchim Leubner /****************************************************************
970*4e1bc9a0SAchim Leubner  *           discover request
971*4e1bc9a0SAchim Leubner  ****************************************************************/
972*4e1bc9a0SAchim Leubner typedef struct agsaSmpReqDiscover_s
973*4e1bc9a0SAchim Leubner {
974*4e1bc9a0SAchim Leubner   bit32   reserved1;
975*4e1bc9a0SAchim Leubner   bit8    reserved2;
976*4e1bc9a0SAchim Leubner   bit8    phyIdentifier;
977*4e1bc9a0SAchim Leubner   bit8    ignored;
978*4e1bc9a0SAchim Leubner   bit8    reserved3;
979*4e1bc9a0SAchim Leubner } agsaSmpReqDiscover_t;
980*4e1bc9a0SAchim Leubner 
981*4e1bc9a0SAchim Leubner /****************************************************************
982*4e1bc9a0SAchim Leubner  *           discover response
983*4e1bc9a0SAchim Leubner  ****************************************************************/
984*4e1bc9a0SAchim Leubner typedef struct agsaSmpRespDiscover_s
985*4e1bc9a0SAchim Leubner {
986*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
987*4e1bc9a0SAchim Leubner   bit8   reserved2;
988*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
989*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
990*4e1bc9a0SAchim Leubner   bit8   attachedDeviceType;
991*4e1bc9a0SAchim Leubner     /* B7   : reserved */
992*4e1bc9a0SAchim Leubner     /* B6-4 : attachedDeviceType */
993*4e1bc9a0SAchim Leubner     /* B3-0 : reserved */
994*4e1bc9a0SAchim Leubner   bit8   negotiatedPhyLinkRate;
995*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
996*4e1bc9a0SAchim Leubner     /* B3-0 : negotiatedPhyLinkRate */
997*4e1bc9a0SAchim Leubner   bit8   attached_Ssp_Stp_Smp_Sata_Initiator;
998*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
999*4e1bc9a0SAchim Leubner     /* B3   : attachedSspInitiator */
1000*4e1bc9a0SAchim Leubner     /* B2   : attachedStpInitiator */
1001*4e1bc9a0SAchim Leubner     /* B1   : attachedSmpInitiator */
1002*4e1bc9a0SAchim Leubner     /* B0   : attachedSataHost */
1003*4e1bc9a0SAchim Leubner   bit8   attached_SataPS_Ssp_Stp_Smp_Sata_Target;
1004*4e1bc9a0SAchim Leubner     /* B7   : attachedSataPortSelector */
1005*4e1bc9a0SAchim Leubner     /* B6-4 : reserved */
1006*4e1bc9a0SAchim Leubner     /* B3   : attachedSspTarget */
1007*4e1bc9a0SAchim Leubner     /* B2   : attachedStpTarget */
1008*4e1bc9a0SAchim Leubner     /* B1   : attachedSmpTarget */
1009*4e1bc9a0SAchim Leubner     /* B0   : attachedSatadevice */
1010*4e1bc9a0SAchim Leubner   bit8   sasAddressHi[4];
1011*4e1bc9a0SAchim Leubner   bit8   sasAddressLo[4];
1012*4e1bc9a0SAchim Leubner   bit8   attachedSasAddressHi[4];
1013*4e1bc9a0SAchim Leubner   bit8   attachedSasAddressLo[4];
1014*4e1bc9a0SAchim Leubner   bit8   attachedPhyIdentifier;
1015*4e1bc9a0SAchim Leubner   bit8   reserved9[7];
1016*4e1bc9a0SAchim Leubner   bit8   programmedAndHardware_MinPhyLinkRate;
1017*4e1bc9a0SAchim Leubner     /* B7-4 : programmedMinPhyLinkRate */
1018*4e1bc9a0SAchim Leubner     /* B3-0 : hardwareMinPhyLinkRate */
1019*4e1bc9a0SAchim Leubner   bit8   programmedAndHardware_MaxPhyLinkRate;
1020*4e1bc9a0SAchim Leubner     /* B7-4 : programmedMaxPhyLinkRate */
1021*4e1bc9a0SAchim Leubner     /* B3-0 : hardwareMaxPhyLinkRate */
1022*4e1bc9a0SAchim Leubner   bit8   phyChangeCount;
1023*4e1bc9a0SAchim Leubner   bit8   virtualPhy_partialPathwayTimeout;
1024*4e1bc9a0SAchim Leubner     /* B7   : virtualPhy*/
1025*4e1bc9a0SAchim Leubner     /* B6-4 : reserved */
1026*4e1bc9a0SAchim Leubner     /* B3-0 : partialPathwayTimeout */
1027*4e1bc9a0SAchim Leubner   bit8   routingAttribute;
1028*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
1029*4e1bc9a0SAchim Leubner     /* B3-0 : routingAttribute */
1030*4e1bc9a0SAchim Leubner   bit8   reserved13[5];
1031*4e1bc9a0SAchim Leubner   bit8   vendorSpecific[2];
1032*4e1bc9a0SAchim Leubner } agsaSmpRespDiscover_t;
1033*4e1bc9a0SAchim Leubner 
1034*4e1bc9a0SAchim Leubner #define SA_DISCRSP_SSP_BIT    0x08
1035*4e1bc9a0SAchim Leubner #define SA_DISCRSP_STP_BIT    0x04
1036*4e1bc9a0SAchim Leubner #define SA_DISCRSP_SMP_BIT    0x02
1037*4e1bc9a0SAchim Leubner #define SA_DISCRSP_SATA_BIT   0x01
1038*4e1bc9a0SAchim Leubner 
1039*4e1bc9a0SAchim Leubner #define SA_DISCRSP_SATA_PS_BIT   0x80
1040*4e1bc9a0SAchim Leubner 
1041*4e1bc9a0SAchim Leubner #define SA_DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
1042*4e1bc9a0SAchim Leubner   (((pResp)->attachedDeviceType & 0x70) >> 4)
1043*4e1bc9a0SAchim Leubner #define SA_DISCRSP_GET_LINKRATE(pResp) \
1044*4e1bc9a0SAchim Leubner   ((pResp)->negotiatedPhyLinkRate & 0x0F)
1045*4e1bc9a0SAchim Leubner 
1046*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_SSP_INITIATOR(pResp) \
1047*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_SSP_BIT) == SA_DISCRSP_SSP_BIT)
1048*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_STP_INITIATOR(pResp) \
1049*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_STP_BIT) == SA_DISCRSP_STP_BIT)
1050*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_SMP_INITIATOR(pResp) \
1051*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_SMP_BIT) == SA_DISCRSP_SMP_BIT)
1052*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_SATA_HOST(pResp) \
1053*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & SA_DISCRSP_SATA_BIT) == SA_DISCRSP_SATA_BIT)
1054*4e1bc9a0SAchim Leubner 
1055*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_SSP_TARGET(pResp) \
1056*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SSP_BIT) == SA_DISCRSP_SSP_BIT)
1057*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_STP_TARGET(pResp) \
1058*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_STP_BIT) == SA_DISCRSP_STP_BIT)
1059*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_SMP_TARGET(pResp) \
1060*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SMP_BIT) == SA_DISCRSP_SMP_BIT)
1061*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_SATA_DEVICE(pResp) \
1062*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SATA_BIT) == SA_DISCRSP_SATA_BIT)
1063*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_SATA_PORTSELECTOR(pResp) \
1064*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & SA_DISCRSP_SATA_PS_BIT) == SA_DISCRSP_SATA_PS_BIT)
1065*4e1bc9a0SAchim Leubner 
1066*4e1bc9a0SAchim Leubner #define SA_DISCRSP_GET_SAS_ADDRESSHI(pResp) \
1067*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi)
1068*4e1bc9a0SAchim Leubner #define SA_DISCRSP_GET_SAS_ADDRESSLO(pResp) \
1069*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo)
1070*4e1bc9a0SAchim Leubner 
1071*4e1bc9a0SAchim Leubner #define SA_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \
1072*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi)
1073*4e1bc9a0SAchim Leubner #define SA_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \
1074*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo)
1075*4e1bc9a0SAchim Leubner 
1076*4e1bc9a0SAchim Leubner #define SA_DISCRSP_VIRTUALPHY_BIT 0x80
1077*4e1bc9a0SAchim Leubner #define SA_DISCRSP_IS_VIRTUALPHY(pResp) \
1078*4e1bc9a0SAchim Leubner   (((pResp)->virtualPhy_partialPathwayTimeout & SA_DISCRSP_VIRTUALPHY_BIT) == SA_DISCRSP_VIRTUALPHY_BIT)
1079*4e1bc9a0SAchim Leubner 
1080*4e1bc9a0SAchim Leubner #define SA_DISCRSP_GET_ROUTINGATTRIB(pResp) \
1081*4e1bc9a0SAchim Leubner   ((pResp)->routingAttribute & 0x0F)
1082*4e1bc9a0SAchim Leubner 
1083*4e1bc9a0SAchim Leubner /****************************************************************
1084*4e1bc9a0SAchim Leubner  *            report route table request
1085*4e1bc9a0SAchim Leubner  ****************************************************************/
1086*4e1bc9a0SAchim Leubner typedef struct agsaSmpReqReportRouteTable_s
1087*4e1bc9a0SAchim Leubner {
1088*4e1bc9a0SAchim Leubner   bit8   reserved1[2];
1089*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndex16[20];
1090*4e1bc9a0SAchim Leubner   bit8   reserved2;
1091*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
1092*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
1093*4e1bc9a0SAchim Leubner } agsaSmpReqReportRouteTable_t;
1094*4e1bc9a0SAchim Leubner 
1095*4e1bc9a0SAchim Leubner /****************************************************************
1096*4e1bc9a0SAchim Leubner  *            report route response
1097*4e1bc9a0SAchim Leubner  ****************************************************************/
1098*4e1bc9a0SAchim Leubner typedef struct agsaSmpRespReportRouteTable_s
1099*4e1bc9a0SAchim Leubner {
1100*4e1bc9a0SAchim Leubner   bit8   reserved1[2];
1101*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndex16[2];
1102*4e1bc9a0SAchim Leubner   bit8   reserved2;
1103*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
1104*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
1105*4e1bc9a0SAchim Leubner   bit8   disabled;
1106*4e1bc9a0SAchim Leubner     /* B7   : expander route entry disabled */
1107*4e1bc9a0SAchim Leubner     /* B6-0 : reserved */
1108*4e1bc9a0SAchim Leubner   bit8   reserved5[3];
1109*4e1bc9a0SAchim Leubner   bit8   routedSasAddressHi32[4];
1110*4e1bc9a0SAchim Leubner   bit8   routedSasAddressLo32[4];
1111*4e1bc9a0SAchim Leubner   bit8   reserved6[16];
1112*4e1bc9a0SAchim Leubner } agsaSmpRespReportRouteTable_t;
1113*4e1bc9a0SAchim Leubner 
1114*4e1bc9a0SAchim Leubner /****************************************************************
1115*4e1bc9a0SAchim Leubner  *            configure route information request
1116*4e1bc9a0SAchim Leubner  ****************************************************************/
1117*4e1bc9a0SAchim Leubner typedef struct agsaSmpReqConfigureRouteInformation_s
1118*4e1bc9a0SAchim Leubner {
1119*4e1bc9a0SAchim Leubner   bit8   reserved1[2];
1120*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndex[2];
1121*4e1bc9a0SAchim Leubner   bit8   reserved2;
1122*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
1123*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
1124*4e1bc9a0SAchim Leubner   bit8   disabledBit_reserved4;
1125*4e1bc9a0SAchim Leubner   bit8   reserved5[3];
1126*4e1bc9a0SAchim Leubner   bit8   routedSasAddressHi[4];
1127*4e1bc9a0SAchim Leubner   bit8   routedSasAddressLo[4];
1128*4e1bc9a0SAchim Leubner   bit8   reserved6[16];
1129*4e1bc9a0SAchim Leubner } agsaSmpReqConfigureRouteInformation_t;
1130*4e1bc9a0SAchim Leubner 
1131*4e1bc9a0SAchim Leubner /****************************************************************
1132*4e1bc9a0SAchim Leubner  *            report Phy Sata request
1133*4e1bc9a0SAchim Leubner  ****************************************************************/
1134*4e1bc9a0SAchim Leubner typedef struct agsaSmpReqReportPhySata_s
1135*4e1bc9a0SAchim Leubner {
1136*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
1137*4e1bc9a0SAchim Leubner   bit8   reserved2;
1138*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
1139*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
1140*4e1bc9a0SAchim Leubner } agsaSmpReqReportPhySata_t;
1141*4e1bc9a0SAchim Leubner 
1142*4e1bc9a0SAchim Leubner /****************************************************************
1143*4e1bc9a0SAchim Leubner  *            report Phy Sata response
1144*4e1bc9a0SAchim Leubner  ****************************************************************/
1145*4e1bc9a0SAchim Leubner typedef struct agsaSmpRespReportPhySata_s
1146*4e1bc9a0SAchim Leubner {
1147*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
1148*4e1bc9a0SAchim Leubner   bit8   reserved2;
1149*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
1150*4e1bc9a0SAchim Leubner   bit8   reserved3;
1151*4e1bc9a0SAchim Leubner   bit8   affiliations_sup_valid;
1152*4e1bc9a0SAchim Leubner     /* b7-2 : reserved */
1153*4e1bc9a0SAchim Leubner     /* b1   : Affiliations supported */
1154*4e1bc9a0SAchim Leubner     /* b0   : Affiliation valid */
1155*4e1bc9a0SAchim Leubner   bit8   reserved5[4];
1156*4e1bc9a0SAchim Leubner   bit8   stpSasAddressHi[4];
1157*4e1bc9a0SAchim Leubner   bit8   stpSasAddressLo[4];
1158*4e1bc9a0SAchim Leubner   bit8   regDevToHostFis[20];
1159*4e1bc9a0SAchim Leubner   bit8   reserved6[4];
1160*4e1bc9a0SAchim Leubner   bit8   affiliatedStpInitiatorSasAddressHi[4];
1161*4e1bc9a0SAchim Leubner   bit8   affiliatedStpInitiatorSasAddressLo[4];
1162*4e1bc9a0SAchim Leubner } agsaSmpRespReportPhySata_t;
1163*4e1bc9a0SAchim Leubner 
1164*4e1bc9a0SAchim Leubner /****************************************************************
1165*4e1bc9a0SAchim Leubner  *            Phy Control request
1166*4e1bc9a0SAchim Leubner  ****************************************************************/
1167*4e1bc9a0SAchim Leubner typedef struct agsaSmpReqPhyControl_s
1168*4e1bc9a0SAchim Leubner {
1169*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
1170*4e1bc9a0SAchim Leubner   bit8   reserved2;
1171*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
1172*4e1bc9a0SAchim Leubner   bit8   phyOperation;
1173*4e1bc9a0SAchim Leubner   bit8   updatePartialPathwayTOValue;
1174*4e1bc9a0SAchim Leubner     /* b7-1 : reserved */
1175*4e1bc9a0SAchim Leubner     /* b0   : update partial pathway timeout value */
1176*4e1bc9a0SAchim Leubner   bit8   reserved3[20];
1177*4e1bc9a0SAchim Leubner   bit8   programmedMinPhysicalLinkRate;
1178*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Minimum Physical Link Rate*/
1179*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
1180*4e1bc9a0SAchim Leubner   bit8   programmedMaxPhysicalLinkRate;
1181*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Maximum Physical Link Rate*/
1182*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
1183*4e1bc9a0SAchim Leubner   bit8   reserved4[2];
1184*4e1bc9a0SAchim Leubner   bit8   partialPathwayTOValue;
1185*4e1bc9a0SAchim Leubner     /* b7-4 : reserved */
1186*4e1bc9a0SAchim Leubner     /* b3-0 : partial Pathway TO Value */
1187*4e1bc9a0SAchim Leubner   bit8   reserved5[3];
1188*4e1bc9a0SAchim Leubner } agsaSmpReqPhyControl_t;
1189*4e1bc9a0SAchim Leubner 
1190*4e1bc9a0SAchim Leubner 
1191*4e1bc9a0SAchim Leubner 
1192*4e1bc9a0SAchim Leubner 
1193*4e1bc9a0SAchim Leubner #endif  /*__SASPEC_H__ */
1194