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