xref: /freebsd/sys/dev/pms/RefTisa/discovery/dm/dmdefs.h (revision 2ff63af9b88c7413b7d71715b5532625752a248e)
1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner **
3*4e1bc9a0SAchim Leubner * Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
4*4e1bc9a0SAchim Leubner *
5*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
6*4e1bc9a0SAchim Leubner *that the following conditions are met:
7*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
8*4e1bc9a0SAchim Leubner *following disclaimer.
9*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
10*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
11*4e1bc9a0SAchim Leubner *with the distribution.
12*4e1bc9a0SAchim Leubner *
13*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
15*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
16*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
17*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
18*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
19*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
20*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
21*4e1bc9a0SAchim Leubner **
22*4e1bc9a0SAchim Leubner *
23*4e1bc9a0SAchim Leubner ********************************************************************************/
24*4e1bc9a0SAchim Leubner #ifndef __DMDEFS_H__
25*4e1bc9a0SAchim Leubner #define __DMDEFS_H__
26*4e1bc9a0SAchim Leubner 
27*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/ossa.h>
28*4e1bc9a0SAchim Leubner 
29*4e1bc9a0SAchim Leubner #define DIRECT_SMP
30*4e1bc9a0SAchim Leubner //#undef DIRECT_SMP
31*4e1bc9a0SAchim Leubner 
32*4e1bc9a0SAchim Leubner /* the index for memory requirement, must be continious */
33*4e1bc9a0SAchim Leubner #define DM_ROOT_MEM_INDEX                          0                       /**< the index of dm root memory */
34*4e1bc9a0SAchim Leubner #define DM_PORT_MEM_INDEX                          1                       /**< the index of port context memory */
35*4e1bc9a0SAchim Leubner #define DM_DEVICE_MEM_INDEX                        2                       /**< the index of Device descriptors memory */
36*4e1bc9a0SAchim Leubner #define DM_EXPANDER_MEM_INDEX                      3                       /**< the index of Expander device descriptors memory */
37*4e1bc9a0SAchim Leubner #define DM_SMP_MEM_INDEX                           4                       /**< the index of SMP command descriptors memory */
38*4e1bc9a0SAchim Leubner #define DM_INDIRECT_SMP_MEM_INDEX                  5                       /**< the index of Indirect SMP command descriptors memory */
39*4e1bc9a0SAchim Leubner 
40*4e1bc9a0SAchim Leubner 
41*4e1bc9a0SAchim Leubner 
42*4e1bc9a0SAchim Leubner #define DM_MAX_NUM_PHYS                         16
43*4e1bc9a0SAchim Leubner #define DM_MAX_EXPANDER_PHYS                    256
44*4e1bc9a0SAchim Leubner #define DM_MAX_DEV                              2048
45*4e1bc9a0SAchim Leubner #define DM_MAX_EXPANDER_DEV                     32
46*4e1bc9a0SAchim Leubner #define DM_MAX_PORT_CONTEXT                     16
47*4e1bc9a0SAchim Leubner #define DM_MAX_SMP                              32
48*4e1bc9a0SAchim Leubner #define DM_MAX_INDIRECT_SMP                     DM_MAX_SMP
49*4e1bc9a0SAchim Leubner 
50*4e1bc9a0SAchim Leubner #define DM_USECS_PER_TICK                       1000000                   /**< defines the heart beat of the LL layer 10ms */
51*4e1bc9a0SAchim Leubner 
52*4e1bc9a0SAchim Leubner /*
53*4e1bc9a0SAchim Leubner *  FIS type
54*4e1bc9a0SAchim Leubner */
55*4e1bc9a0SAchim Leubner #define PIO_SETUP_DEV_TO_HOST_FIS   0x5F
56*4e1bc9a0SAchim Leubner #define REG_DEV_TO_HOST_FIS         0x34
57*4e1bc9a0SAchim Leubner #define SET_DEV_BITS_FIS            0xA1
58*4e1bc9a0SAchim Leubner 
59*4e1bc9a0SAchim Leubner #define DEFAULT_KEY_BUFFER_SIZE     64
60*4e1bc9a0SAchim Leubner 
61*4e1bc9a0SAchim Leubner enum dm_locks_e
62*4e1bc9a0SAchim Leubner {
63*4e1bc9a0SAchim Leubner   DM_PORT_LOCK = 0,
64*4e1bc9a0SAchim Leubner   DM_DEVICE_LOCK,
65*4e1bc9a0SAchim Leubner   DM_EXPANDER_LOCK,
66*4e1bc9a0SAchim Leubner   DM_TIMER_LOCK,
67*4e1bc9a0SAchim Leubner   DM_SMP_LOCK,
68*4e1bc9a0SAchim Leubner   DM_MAX_LOCKS
69*4e1bc9a0SAchim Leubner };
70*4e1bc9a0SAchim Leubner /* default SMP timeout: 0xFFFF is the Maximum Allowed */
71*4e1bc9a0SAchim Leubner #define DEFAULT_SMP_TIMEOUT       0xFFFF
72*4e1bc9a0SAchim Leubner 
73*4e1bc9a0SAchim Leubner /* SMP direct payload size limit: IOMB direct payload size = 48 */
74*4e1bc9a0SAchim Leubner #define SMP_DIRECT_PAYLOAD_LIMIT 44
75*4e1bc9a0SAchim Leubner 
76*4e1bc9a0SAchim Leubner #define SMP_INDIRECT_PAYLOAD	512
77*4e1bc9a0SAchim Leubner 
78*4e1bc9a0SAchim Leubner /* SMP maximum payload size allowed by SAS spec withtout CRC 4 bytes */
79*4e1bc9a0SAchim Leubner #define SMP_MAXIMUM_PAYLOAD      1024
80*4e1bc9a0SAchim Leubner 
81*4e1bc9a0SAchim Leubner /*! \def MIN(a,b)
82*4e1bc9a0SAchim Leubner * \brief MIN macro
83*4e1bc9a0SAchim Leubner *
84*4e1bc9a0SAchim Leubner * use to find MIN of two values
85*4e1bc9a0SAchim Leubner */
86*4e1bc9a0SAchim Leubner #ifndef MIN
87*4e1bc9a0SAchim Leubner #define MIN(a,b) ((a) < (b) ? (a) : (b))
88*4e1bc9a0SAchim Leubner #endif
89*4e1bc9a0SAchim Leubner 
90*4e1bc9a0SAchim Leubner /*! \def MAX(a,b)
91*4e1bc9a0SAchim Leubner * \brief MAX macro
92*4e1bc9a0SAchim Leubner *
93*4e1bc9a0SAchim Leubner * use to find MAX of two values
94*4e1bc9a0SAchim Leubner */
95*4e1bc9a0SAchim Leubner #ifndef MAX
96*4e1bc9a0SAchim Leubner #define MAX(a,b) ((a) < (b) ? (b) : (a))
97*4e1bc9a0SAchim Leubner #endif
98*4e1bc9a0SAchim Leubner 
99*4e1bc9a0SAchim Leubner #ifndef agNULL
100*4e1bc9a0SAchim Leubner #define agNULL     ((void *)0)
101*4e1bc9a0SAchim Leubner #endif
102*4e1bc9a0SAchim Leubner 
103*4e1bc9a0SAchim Leubner /* for debugging print */
104*4e1bc9a0SAchim Leubner #if defined(DM_DEBUG)
105*4e1bc9a0SAchim Leubner 
106*4e1bc9a0SAchim Leubner /*
107*4e1bc9a0SAchim Leubner * for debugging purposes.
108*4e1bc9a0SAchim Leubner */
109*4e1bc9a0SAchim Leubner extern bit32 gDMDebugLevel;
110*4e1bc9a0SAchim Leubner 
111*4e1bc9a0SAchim Leubner #define DM_DBG0(format) tddmLogDebugString(gDMDebugLevel, 0, format)
112*4e1bc9a0SAchim Leubner #define DM_DBG1(format) tddmLogDebugString(gDMDebugLevel, 1, format)
113*4e1bc9a0SAchim Leubner #define DM_DBG2(format) tddmLogDebugString(gDMDebugLevel, 2, format)
114*4e1bc9a0SAchim Leubner #define DM_DBG3(format) tddmLogDebugString(gDMDebugLevel, 3, format)
115*4e1bc9a0SAchim Leubner #define DM_DBG4(format) tddmLogDebugString(gDMDebugLevel, 4, format)
116*4e1bc9a0SAchim Leubner #define DM_DBG5(format) tddmLogDebugString(gDMDebugLevel, 5, format)
117*4e1bc9a0SAchim Leubner #define DM_DBG6(format) tddmLogDebugString(gDMDebugLevel, 6, format)
118*4e1bc9a0SAchim Leubner 
119*4e1bc9a0SAchim Leubner 
120*4e1bc9a0SAchim Leubner #else
121*4e1bc9a0SAchim Leubner 
122*4e1bc9a0SAchim Leubner #define DM_DBG0(format)
123*4e1bc9a0SAchim Leubner #define DM_DBG1(format)
124*4e1bc9a0SAchim Leubner #define DM_DBG2(format)
125*4e1bc9a0SAchim Leubner #define DM_DBG3(format)
126*4e1bc9a0SAchim Leubner #define DM_DBG4(format)
127*4e1bc9a0SAchim Leubner #define DM_DBG5(format)
128*4e1bc9a0SAchim Leubner #define DM_DBG6(format)
129*4e1bc9a0SAchim Leubner 
130*4e1bc9a0SAchim Leubner #endif /* DM_DEBUG */
131*4e1bc9a0SAchim Leubner 
132*4e1bc9a0SAchim Leubner //#define DM_ASSERT OS_ASSERT
133*4e1bc9a0SAchim Leubner //#define tddmLogDebugString TIDEBUG_MSG
134*4e1bc9a0SAchim Leubner 
135*4e1bc9a0SAchim Leubner /* discovery related state */
136*4e1bc9a0SAchim Leubner #define DM_DSTATE_NOT_STARTED                 0
137*4e1bc9a0SAchim Leubner #define DM_DSTATE_STARTED                     1
138*4e1bc9a0SAchim Leubner #define DM_DSTATE_COMPLETED                   2
139*4e1bc9a0SAchim Leubner #define DM_DSTATE_COMPLETED_WITH_FAILURE      3
140*4e1bc9a0SAchim Leubner 
141*4e1bc9a0SAchim Leubner /* SAS/SATA discovery status */
142*4e1bc9a0SAchim Leubner #define DISCOVERY_NOT_START                       0                       /**< status indicates discovery not started */
143*4e1bc9a0SAchim Leubner #define DISCOVERY_UP_STREAM                       1                       /**< status indicates discover upstream */
144*4e1bc9a0SAchim Leubner #define DISCOVERY_DOWN_STREAM                     2                       /**< status indicates discover downstream */
145*4e1bc9a0SAchim Leubner #define DISCOVERY_CONFIG_ROUTING                  3                       /**< status indicates discovery config routing table */
146*4e1bc9a0SAchim Leubner #define DISCOVERY_SAS_DONE                        4                       /**< status indicates discovery done */
147*4e1bc9a0SAchim Leubner #define DISCOVERY_REPORT_PHY_SATA                 5                       /**< status indicates discovery report phy sata */
148*4e1bc9a0SAchim Leubner 
149*4e1bc9a0SAchim Leubner /* SMP function */
150*4e1bc9a0SAchim Leubner #define SMP_REPORT_GENERAL                         0x00
151*4e1bc9a0SAchim Leubner #define SMP_REPORT_MANUFACTURE_INFORMATION         0x01
152*4e1bc9a0SAchim Leubner #define SMP_READ_GPIO_REGISTER                     0x02
153*4e1bc9a0SAchim Leubner #define SMP_DISCOVER                               0x10
154*4e1bc9a0SAchim Leubner #define SMP_REPORT_PHY_ERROR_LOG                   0x11
155*4e1bc9a0SAchim Leubner #define SMP_REPORT_PHY_SATA                        0x12
156*4e1bc9a0SAchim Leubner #define SMP_REPORT_ROUTING_INFORMATION             0x13
157*4e1bc9a0SAchim Leubner #define SMP_WRITE_GPIO_REGISTER                    0x82
158*4e1bc9a0SAchim Leubner #define SMP_CONFIGURE_ROUTING_INFORMATION          0x90
159*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL                            0x91
160*4e1bc9a0SAchim Leubner #define SMP_PHY_TEST_FUNCTION                      0x92
161*4e1bc9a0SAchim Leubner #define SMP_PMC_SPECIFIC                           0xC0
162*4e1bc9a0SAchim Leubner #define SMP_DISCOVER_LIST                          0x20
163*4e1bc9a0SAchim Leubner 
164*4e1bc9a0SAchim Leubner 
165*4e1bc9a0SAchim Leubner /* SMP function results */
166*4e1bc9a0SAchim Leubner #define SMP_FUNCTION_ACCEPTED                      0x00
167*4e1bc9a0SAchim Leubner #define UNKNOWN_SMP_FUNCTION                       0x01
168*4e1bc9a0SAchim Leubner #define SMP_FUNCTION_FAILED                        0x02
169*4e1bc9a0SAchim Leubner #define INVALID_REQUEST_FRAME_LENGTH               0x03
170*4e1bc9a0SAchim Leubner #define INVALID_EXPANDER_CHANGE_COUNT              0x04
171*4e1bc9a0SAchim Leubner #define SMP_FN_BUSY                                0x05
172*4e1bc9a0SAchim Leubner #define INCOMPLETE_DESCRIPTOR_LIST                 0x06
173*4e1bc9a0SAchim Leubner #define PHY_DOES_NOT_EXIST                         0x10
174*4e1bc9a0SAchim Leubner #define INDEX_DOES_NOT_EXIST                       0x11
175*4e1bc9a0SAchim Leubner #define PHY_DOES_NOT_SUPPORT_SATA                  0x12
176*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_OPERATION                      0x13
177*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_TEST_FUNCTION                  0x14
178*4e1bc9a0SAchim Leubner #define PHY_TEST_FUNCTION_IN_PROGRESS              0x15
179*4e1bc9a0SAchim Leubner #define PHY_VACANT                                 0x16
180*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_EVENT_SOURCE                   0x17
181*4e1bc9a0SAchim Leubner #define UNKNOWN_DESCRIPTOT_TYPE                    0x18
182*4e1bc9a0SAchim Leubner #define UNKNOWN_PHY_FILETER                        0x19
183*4e1bc9a0SAchim Leubner #define AFFILIATION_VIOLATION                      0x1A
184*4e1bc9a0SAchim Leubner #define SMP_ZONE_VIOLATION                         0x20
185*4e1bc9a0SAchim Leubner #define NO_MANAGEMENT_ACCESS_RIGHTS                0x21
186*4e1bc9a0SAchim Leubner #define UNKNOWN_ENABLE_DISABLE_ZONING_VALUE        0x22
187*4e1bc9a0SAchim Leubner #define ZONE_LOCK_VIOLATION                        0x23
188*4e1bc9a0SAchim Leubner #define NOT_ACTIVATED                              0x24
189*4e1bc9a0SAchim Leubner #define ZONE_GROUP_OUT_OF_RANGE                    0x25
190*4e1bc9a0SAchim Leubner #define NO_PHYSICAL_PRESENCE                       0x26
191*4e1bc9a0SAchim Leubner #define SAVING_NOT_SUPPORTED                       0x27
192*4e1bc9a0SAchim Leubner #define SOURCE_ZONE_GROUP_DOES_NOT_EXIST           0x28
193*4e1bc9a0SAchim Leubner #define DISABLED_PASSWORD_NOT_SUPPORTED            0x29
194*4e1bc9a0SAchim Leubner 
195*4e1bc9a0SAchim Leubner /* SMP PHY CONTROL OPERATION */
196*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_NOP                        0x00
197*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_LINK_RESET                 0x01
198*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_HARD_RESET                 0x02
199*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_DISABLE                    0x03
200*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_ERROR_LOG            0x05
201*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_AFFILIATION          0x06
202*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL        0x07
203*4e1bc9a0SAchim Leubner 
204*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPC                               0x80010000
205*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_ADAPSPC                           0x80810000
206*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCv                              0x80080000
207*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCve                             0x80090000
208*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCvplus                          0x80180000
209*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_SPCveplus                         0x80190000
210*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_ADAPvplus                         0x80880000
211*4e1bc9a0SAchim Leubner #define DM_VEN_DEV_ADAPveplus                        0x80890000
212*4e1bc9a0SAchim Leubner 
213*4e1bc9a0SAchim Leubner #define DMIsSPC(agr)           (DM_VEN_DEV_SPC        == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */
214*4e1bc9a0SAchim Leubner #define DMIsSPCADAP(agr)       (DM_VEN_DEV_SPC        == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */
215*4e1bc9a0SAchim Leubner #define DMIsSPCv(agr)          (DM_VEN_DEV_SPCv       == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv */
216*4e1bc9a0SAchim Leubner #define DMIsSPCve(agr)         (DM_VEN_DEV_SPCve      == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve */
217*4e1bc9a0SAchim Leubner #define DMIsSPCvplus(agr)      (DM_VEN_DEV_SPCvplus   == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */
218*4e1bc9a0SAchim Leubner #define DMIsSPCveplus(agr)     (DM_VEN_DEV_SPCveplus  == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */
219*4e1bc9a0SAchim Leubner #define DMIsSPCADAPvplus(agr)  (DM_VEN_DEV_ADAPvplus  == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */
220*4e1bc9a0SAchim Leubner #define DMIsSPCADAPveplus(agr) (DM_VEN_DEV_ADAPveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */
221*4e1bc9a0SAchim Leubner 
222*4e1bc9a0SAchim Leubner /****************************************************************
223*4e1bc9a0SAchim Leubner  *            SAS 1.1 Spec
224*4e1bc9a0SAchim Leubner  ****************************************************************/
225*4e1bc9a0SAchim Leubner /* SMP header definition */
226*4e1bc9a0SAchim Leubner typedef struct dmSMPFrameHeader_s
227*4e1bc9a0SAchim Leubner {
228*4e1bc9a0SAchim Leubner     bit8   smpFrameType;      /* The first byte of SMP frame represents the SMP FRAME TYPE */
229*4e1bc9a0SAchim Leubner     bit8   smpFunction;       /* The second byte of the SMP frame represents the SMP FUNCTION */
230*4e1bc9a0SAchim Leubner     bit8   smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */
231*4e1bc9a0SAchim Leubner     bit8   smpReserved;       /* reserved */
232*4e1bc9a0SAchim Leubner } dmSMPFrameHeader_t;
233*4e1bc9a0SAchim Leubner 
234*4e1bc9a0SAchim Leubner /****************************************************************
235*4e1bc9a0SAchim Leubner  *            report general request
236*4e1bc9a0SAchim Leubner  ****************************************************************/
237*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS
238*4e1bc9a0SAchim Leubner typedef struct smpReqReportGeneral_s
239*4e1bc9a0SAchim Leubner {
240*4e1bc9a0SAchim Leubner   /* nothing. some compiler disallowed structure with no member */
241*4e1bc9a0SAchim Leubner } smpReqReportGeneral_t;
242*4e1bc9a0SAchim Leubner #endif
243*4e1bc9a0SAchim Leubner 
244*4e1bc9a0SAchim Leubner /****************************************************************
245*4e1bc9a0SAchim Leubner  *            report general response
246*4e1bc9a0SAchim Leubner  ****************************************************************/
247*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_CONFIGURING_BIT     0x2
248*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_CONFIGURABLE_BIT    0x1
249*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_LONG_RESPONSE_BIT   0x80
250*4e1bc9a0SAchim Leubner 
251*4e1bc9a0SAchim Leubner typedef struct smpRespReportGeneral_s
252*4e1bc9a0SAchim Leubner {
253*4e1bc9a0SAchim Leubner   bit8   expanderChangeCount16[2];
254*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndexes16[2];
255*4e1bc9a0SAchim Leubner   bit8   reserved1; /* byte 9; has LONG Response for SAS 2 at bit 8 */
256*4e1bc9a0SAchim Leubner   bit8   numOfPhys;
257*4e1bc9a0SAchim Leubner   bit8   configuring_configurable;
258*4e1bc9a0SAchim Leubner     /* B7-2 : reserved */
259*4e1bc9a0SAchim Leubner     /* B1   : configuring */
260*4e1bc9a0SAchim Leubner     /* B0   : configurable */
261*4e1bc9a0SAchim Leubner   bit8   reserved4[17];
262*4e1bc9a0SAchim Leubner } smpRespReportGeneral_t;
263*4e1bc9a0SAchim Leubner 
264*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_IS_CONFIGURING(pResp) \
265*4e1bc9a0SAchim Leubner   (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURING_BIT) == \
266*4e1bc9a0SAchim Leubner       REPORT_GENERAL_CONFIGURING_BIT)
267*4e1bc9a0SAchim Leubner 
268*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
269*4e1bc9a0SAchim Leubner   (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURABLE_BIT) == \
270*4e1bc9a0SAchim Leubner       REPORT_GENERAL_CONFIGURABLE_BIT)
271*4e1bc9a0SAchim Leubner 
272*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
273*4e1bc9a0SAchim Leubner   DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
274*4e1bc9a0SAchim Leubner 
275*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_IS_LONG_RESPONSE(pResp) \
276*4e1bc9a0SAchim Leubner   (((pResp)->reserved1 & REPORT_GENERAL_LONG_RESPONSE_BIT) == \
277*4e1bc9a0SAchim Leubner       REPORT_GENERAL_LONG_RESPONSE_BIT)
278*4e1bc9a0SAchim Leubner 
279*4e1bc9a0SAchim Leubner /****************************************************************
280*4e1bc9a0SAchim Leubner  *            report manufacturer info response
281*4e1bc9a0SAchim Leubner  ****************************************************************/
282*4e1bc9a0SAchim Leubner typedef struct smpRespReportManufactureInfo_s
283*4e1bc9a0SAchim Leubner {
284*4e1bc9a0SAchim Leubner   bit8    reserved1[8];
285*4e1bc9a0SAchim Leubner   bit8    vendorIdentification[8];
286*4e1bc9a0SAchim Leubner   bit8    productIdentification[16];
287*4e1bc9a0SAchim Leubner   bit8    productRevisionLevel[4];
288*4e1bc9a0SAchim Leubner   bit8    vendorSpecific[20];
289*4e1bc9a0SAchim Leubner } smpRespReportManufactureInfo_t;
290*4e1bc9a0SAchim Leubner 
291*4e1bc9a0SAchim Leubner /****************************************************************
292*4e1bc9a0SAchim Leubner  *           discover request
293*4e1bc9a0SAchim Leubner  ****************************************************************/
294*4e1bc9a0SAchim Leubner typedef struct smpReqDiscover_s
295*4e1bc9a0SAchim Leubner {
296*4e1bc9a0SAchim Leubner   bit32   reserved1;
297*4e1bc9a0SAchim Leubner   bit8    reserved2;
298*4e1bc9a0SAchim Leubner   bit8    phyIdentifier;
299*4e1bc9a0SAchim Leubner   bit8    ignored;
300*4e1bc9a0SAchim Leubner   bit8    reserved3;
301*4e1bc9a0SAchim Leubner } smpReqDiscover_t;
302*4e1bc9a0SAchim Leubner 
303*4e1bc9a0SAchim Leubner /****************************************************************
304*4e1bc9a0SAchim Leubner  *           discover response
305*4e1bc9a0SAchim Leubner  ****************************************************************/
306*4e1bc9a0SAchim Leubner typedef struct smpRespDiscover_s
307*4e1bc9a0SAchim Leubner {
308*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
309*4e1bc9a0SAchim Leubner   bit8   reserved2;
310*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
311*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
312*4e1bc9a0SAchim Leubner   bit8   attachedDeviceType; /* byte 12 */
313*4e1bc9a0SAchim Leubner     /* B7   : reserved */
314*4e1bc9a0SAchim Leubner     /* B6-4 : attachedDeviceType */
315*4e1bc9a0SAchim Leubner     /* B3-0 : reserved */
316*4e1bc9a0SAchim Leubner   bit8   negotiatedPhyLinkRate; /* byte 11 */
317*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
318*4e1bc9a0SAchim Leubner     /* B3-0 : negotiatedPhyLinkRate */
319*4e1bc9a0SAchim Leubner   bit8   attached_Ssp_Stp_Smp_Sata_Initiator; /* byte 14 */
320*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
321*4e1bc9a0SAchim Leubner     /* B3   : attachedSspInitiator */
322*4e1bc9a0SAchim Leubner     /* B2   : attachedStpInitiator */
323*4e1bc9a0SAchim Leubner     /* B1   : attachedSmpInitiator */
324*4e1bc9a0SAchim Leubner     /* B0   : attachedSataHost */
325*4e1bc9a0SAchim Leubner   bit8   attached_SataPS_Ssp_Stp_Smp_Sata_Target; /* byte 15 */
326*4e1bc9a0SAchim Leubner     /* B7   : attachedSataPortSelector */
327*4e1bc9a0SAchim Leubner     /* B6-4 : reserved */
328*4e1bc9a0SAchim Leubner     /* B3   : attachedSspTarget */
329*4e1bc9a0SAchim Leubner     /* B2   : attachedStpTarget */
330*4e1bc9a0SAchim Leubner     /* B1   : attachedSmpTarget */
331*4e1bc9a0SAchim Leubner     /* B0   : attachedSatadevice */
332*4e1bc9a0SAchim Leubner   bit8   sasAddressHi[4];
333*4e1bc9a0SAchim Leubner   bit8   sasAddressLo[4];
334*4e1bc9a0SAchim Leubner   bit8   attachedSasAddressHi[4];
335*4e1bc9a0SAchim Leubner   bit8   attachedSasAddressLo[4];
336*4e1bc9a0SAchim Leubner   bit8   attachedPhyIdentifier;
337*4e1bc9a0SAchim Leubner   bit8   reserved9[7];
338*4e1bc9a0SAchim Leubner   bit8   programmedAndHardware_MinPhyLinkRate;
339*4e1bc9a0SAchim Leubner     /* B7-4 : programmedMinPhyLinkRate */
340*4e1bc9a0SAchim Leubner     /* B3-0 : hardwareMinPhyLinkRate */
341*4e1bc9a0SAchim Leubner   bit8   programmedAndHardware_MaxPhyLinkRate;
342*4e1bc9a0SAchim Leubner     /* B7-4 : programmedMaxPhyLinkRate */
343*4e1bc9a0SAchim Leubner     /* B3-0 : hardwareMaxPhyLinkRate */
344*4e1bc9a0SAchim Leubner   bit8   phyChangeCount;
345*4e1bc9a0SAchim Leubner   bit8   virtualPhy_partialPathwayTimeout; /* byte 43 */
346*4e1bc9a0SAchim Leubner     /* B7   : virtualPhy*/
347*4e1bc9a0SAchim Leubner     /* B6-4 : reserved */
348*4e1bc9a0SAchim Leubner     /* B3-0 : partialPathwayTimeout */
349*4e1bc9a0SAchim Leubner   bit8   routingAttribute;
350*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
351*4e1bc9a0SAchim Leubner     /* B3-0 : routingAttribute */
352*4e1bc9a0SAchim Leubner   bit8   reserved13[5];
353*4e1bc9a0SAchim Leubner   bit8   vendorSpecific[2];
354*4e1bc9a0SAchim Leubner } smpRespDiscover_t;
355*4e1bc9a0SAchim Leubner 
356*4e1bc9a0SAchim Leubner #define DISCRSP_SSP_BIT    0x08
357*4e1bc9a0SAchim Leubner #define DISCRSP_STP_BIT    0x04
358*4e1bc9a0SAchim Leubner #define DISCRSP_SMP_BIT    0x02
359*4e1bc9a0SAchim Leubner #define DISCRSP_SATA_BIT   0x01
360*4e1bc9a0SAchim Leubner 
361*4e1bc9a0SAchim Leubner #define DISCRSP_SATA_PS_BIT   0x80
362*4e1bc9a0SAchim Leubner 
363*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
364*4e1bc9a0SAchim Leubner   (((pResp)->attachedDeviceType & 0x70) >> 4)
365*4e1bc9a0SAchim Leubner #define DISCRSP_GET_LINKRATE(pResp) \
366*4e1bc9a0SAchim Leubner   ((pResp)->negotiatedPhyLinkRate & 0x0F)
367*4e1bc9a0SAchim Leubner 
368*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SSP_INITIATOR(pResp) \
369*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
370*4e1bc9a0SAchim Leubner #define DISCRSP_IS_STP_INITIATOR(pResp) \
371*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
372*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SMP_INITIATOR(pResp) \
373*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
374*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SATA_HOST(pResp) \
375*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
376*4e1bc9a0SAchim Leubner 
377*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SSP_TARGET(pResp) \
378*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
379*4e1bc9a0SAchim Leubner #define DISCRSP_IS_STP_TARGET(pResp) \
380*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
381*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SMP_TARGET(pResp) \
382*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
383*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SATA_DEVICE(pResp) \
384*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
385*4e1bc9a0SAchim Leubner #define DISCRSP_IS_SATA_PORTSELECTOR(pResp) \
386*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT)
387*4e1bc9a0SAchim Leubner 
388*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */
389*4e1bc9a0SAchim Leubner #define DISCRSP_GET_SAS_ADDRESSHI(pResp) \
390*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi)
391*4e1bc9a0SAchim Leubner #define DISCRSP_GET_SAS_ADDRESSLO(pResp) \
392*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo)
393*4e1bc9a0SAchim Leubner 
394*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */
395*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \
396*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi)
397*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \
398*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo)
399*4e1bc9a0SAchim Leubner 
400*4e1bc9a0SAchim Leubner #define DISCRSP_VIRTUALPHY_BIT 0x80
401*4e1bc9a0SAchim Leubner #define DISCRSP_IS_VIRTUALPHY(pResp) \
402*4e1bc9a0SAchim Leubner   (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT)
403*4e1bc9a0SAchim Leubner 
404*4e1bc9a0SAchim Leubner #define DISCRSP_GET_ROUTINGATTRIB(pResp) \
405*4e1bc9a0SAchim Leubner   ((pResp)->routingAttribute & 0x0F)
406*4e1bc9a0SAchim Leubner 
407*4e1bc9a0SAchim Leubner /****************************************************************
408*4e1bc9a0SAchim Leubner  *            report route table request
409*4e1bc9a0SAchim Leubner  ****************************************************************/
410*4e1bc9a0SAchim Leubner typedef struct smpReqReportRouteTable_s
411*4e1bc9a0SAchim Leubner {
412*4e1bc9a0SAchim Leubner   bit8   reserved1[2];
413*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndex16[20];
414*4e1bc9a0SAchim Leubner   bit8   reserved2;
415*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
416*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
417*4e1bc9a0SAchim Leubner } smpReqReportRouteTable_t;
418*4e1bc9a0SAchim Leubner 
419*4e1bc9a0SAchim Leubner /****************************************************************
420*4e1bc9a0SAchim Leubner  *            report route response
421*4e1bc9a0SAchim Leubner  ****************************************************************/
422*4e1bc9a0SAchim Leubner typedef struct smpRespReportRouteTable_s
423*4e1bc9a0SAchim Leubner {
424*4e1bc9a0SAchim Leubner   bit8   reserved1[2];
425*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndex16[2];
426*4e1bc9a0SAchim Leubner   bit8   reserved2;
427*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
428*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
429*4e1bc9a0SAchim Leubner   bit8   disabled;
430*4e1bc9a0SAchim Leubner     /* B7   : expander route entry disabled */
431*4e1bc9a0SAchim Leubner     /* B6-0 : reserved */
432*4e1bc9a0SAchim Leubner   bit8   reserved5[3];
433*4e1bc9a0SAchim Leubner   bit8   routedSasAddressHi32[4];
434*4e1bc9a0SAchim Leubner   bit8   routedSasAddressLo32[4];
435*4e1bc9a0SAchim Leubner   bit8   reserved6[16];
436*4e1bc9a0SAchim Leubner } smpRespReportRouteTable_t;
437*4e1bc9a0SAchim Leubner 
438*4e1bc9a0SAchim Leubner /****************************************************************
439*4e1bc9a0SAchim Leubner  *            configure route information request
440*4e1bc9a0SAchim Leubner  ****************************************************************/
441*4e1bc9a0SAchim Leubner typedef struct smpReqConfigureRouteInformation_s
442*4e1bc9a0SAchim Leubner {
443*4e1bc9a0SAchim Leubner   bit8   reserved1[2];
444*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndex[2];
445*4e1bc9a0SAchim Leubner   bit8   reserved2;
446*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
447*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
448*4e1bc9a0SAchim Leubner   bit8   disabledBit_reserved4;
449*4e1bc9a0SAchim Leubner   bit8   reserved5[3];
450*4e1bc9a0SAchim Leubner   bit8   routedSasAddressHi[4];
451*4e1bc9a0SAchim Leubner   bit8   routedSasAddressLo[4];
452*4e1bc9a0SAchim Leubner   bit8   reserved6[16];
453*4e1bc9a0SAchim Leubner } smpReqConfigureRouteInformation_t;
454*4e1bc9a0SAchim Leubner 
455*4e1bc9a0SAchim Leubner /****************************************************************
456*4e1bc9a0SAchim Leubner  *            configure route response
457*4e1bc9a0SAchim Leubner  ****************************************************************/
458*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS
459*4e1bc9a0SAchim Leubner typedef struct smpRespConfigureRouteInformation_s
460*4e1bc9a0SAchim Leubner {
461*4e1bc9a0SAchim Leubner   /* nothing. some compiler disallowed structure with no member */
462*4e1bc9a0SAchim Leubner } smpRespConfigureRouteInformation_t;
463*4e1bc9a0SAchim Leubner #endif
464*4e1bc9a0SAchim Leubner 
465*4e1bc9a0SAchim Leubner /****************************************************************
466*4e1bc9a0SAchim Leubner  *            report Phy Sata request
467*4e1bc9a0SAchim Leubner  ****************************************************************/
468*4e1bc9a0SAchim Leubner typedef struct smpReqReportPhySata_s
469*4e1bc9a0SAchim Leubner {
470*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
471*4e1bc9a0SAchim Leubner   bit8   reserved2;
472*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
473*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
474*4e1bc9a0SAchim Leubner } smpReqReportPhySata_t;
475*4e1bc9a0SAchim Leubner 
476*4e1bc9a0SAchim Leubner /****************************************************************
477*4e1bc9a0SAchim Leubner  *            report Phy Sata response
478*4e1bc9a0SAchim Leubner  ****************************************************************/
479*4e1bc9a0SAchim Leubner typedef struct smpRespReportPhySata_s
480*4e1bc9a0SAchim Leubner {
481*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
482*4e1bc9a0SAchim Leubner   bit8   reserved2;
483*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
484*4e1bc9a0SAchim Leubner   bit8   reserved3;
485*4e1bc9a0SAchim Leubner   bit8   affiliations_sup_valid;
486*4e1bc9a0SAchim Leubner     /* b7-2 : reserved */
487*4e1bc9a0SAchim Leubner     /* b1   : Affiliations supported */
488*4e1bc9a0SAchim Leubner     /* b0   : Affiliation valid */
489*4e1bc9a0SAchim Leubner   bit8   reserved5[4];
490*4e1bc9a0SAchim Leubner   bit8   stpSasAddressHi[4];
491*4e1bc9a0SAchim Leubner   bit8   stpSasAddressLo[4];
492*4e1bc9a0SAchim Leubner   bit8   regDevToHostFis[20];
493*4e1bc9a0SAchim Leubner   bit8   reserved6[4];
494*4e1bc9a0SAchim Leubner   bit8   affiliatedStpInitiatorSasAddressHi[4];
495*4e1bc9a0SAchim Leubner   bit8   affiliatedStpInitiatorSasAddressLo[4];
496*4e1bc9a0SAchim Leubner } smpRespReportPhySata_t;
497*4e1bc9a0SAchim Leubner 
498*4e1bc9a0SAchim Leubner 
499*4e1bc9a0SAchim Leubner /****************************************************************
500*4e1bc9a0SAchim Leubner  *            Phy Control request
501*4e1bc9a0SAchim Leubner  ****************************************************************/
502*4e1bc9a0SAchim Leubner typedef struct smpReqPhyControl_s
503*4e1bc9a0SAchim Leubner {
504*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
505*4e1bc9a0SAchim Leubner   bit8   reserved2;
506*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
507*4e1bc9a0SAchim Leubner   bit8   phyOperation;
508*4e1bc9a0SAchim Leubner   bit8   updatePartialPathwayTOValue;
509*4e1bc9a0SAchim Leubner     /* b7-1 : reserved */
510*4e1bc9a0SAchim Leubner     /* b0   : update partial pathway timeout value */
511*4e1bc9a0SAchim Leubner   bit8   reserved3[20];
512*4e1bc9a0SAchim Leubner   bit8   programmedMinPhysicalLinkRate;
513*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Minimum Physical Link Rate*/
514*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
515*4e1bc9a0SAchim Leubner   bit8   programmedMaxPhysicalLinkRate;
516*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Maximum Physical Link Rate*/
517*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
518*4e1bc9a0SAchim Leubner   bit8   reserved4[2];
519*4e1bc9a0SAchim Leubner   bit8   partialPathwayTOValue;
520*4e1bc9a0SAchim Leubner     /* b7-4 : reserved */
521*4e1bc9a0SAchim Leubner     /* b3-0 : partial Pathway TO Value */
522*4e1bc9a0SAchim Leubner   bit8   reserved5[3];
523*4e1bc9a0SAchim Leubner } smpReqPhyControl_t;
524*4e1bc9a0SAchim Leubner 
525*4e1bc9a0SAchim Leubner /****************************************************************
526*4e1bc9a0SAchim Leubner  *            Phy Control response
527*4e1bc9a0SAchim Leubner  ****************************************************************/
528*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS
529*4e1bc9a0SAchim Leubner typedef struct smpRespPhyControl_s
530*4e1bc9a0SAchim Leubner {
531*4e1bc9a0SAchim Leubner   /* nothing. some compiler disallowed structure with no member */
532*4e1bc9a0SAchim Leubner } smpRespPhyControl_t;
533*4e1bc9a0SAchim Leubner #endif
534*4e1bc9a0SAchim Leubner 
535*4e1bc9a0SAchim Leubner 
536*4e1bc9a0SAchim Leubner /****************************************************************
537*4e1bc9a0SAchim Leubner  *            SAS 2 Rev 14c Spec
538*4e1bc9a0SAchim Leubner  ****************************************************************/
539*4e1bc9a0SAchim Leubner /* SMP header definition */
540*4e1bc9a0SAchim Leubner typedef struct tdssSMPFrameHeader2_s
541*4e1bc9a0SAchim Leubner {
542*4e1bc9a0SAchim Leubner     bit8   smpFrameType;      /* The first byte of SMP frame represents the SMP FRAME TYPE */
543*4e1bc9a0SAchim Leubner     bit8   smpFunction;       /* The second byte of the SMP frame represents the SMP FUNCTION */
544*4e1bc9a0SAchim Leubner     bit8   smpAllocLenFuncResult; /* The third byte of SMP frame represents ALLOCATED RESPONSE LENGTH of SMP request or FUNCTION RESULT of the SMP response. */
545*4e1bc9a0SAchim Leubner     bit8   smpReqResLen;       /* The third byte of SMP frame represents REQUEST LENGTH of SMP request or RESPONSE LENGTH of the SMP response. */
546*4e1bc9a0SAchim Leubner } tdssSMPFrameHeader2_t;
547*4e1bc9a0SAchim Leubner 
548*4e1bc9a0SAchim Leubner /****************************************************************
549*4e1bc9a0SAchim Leubner  *            report general request
550*4e1bc9a0SAchim Leubner  ****************************************************************/
551*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS
552*4e1bc9a0SAchim Leubner typedef struct smpReqReportGeneral2_s
553*4e1bc9a0SAchim Leubner {
554*4e1bc9a0SAchim Leubner   /* nothing. some compiler disallowed structure with no member */
555*4e1bc9a0SAchim Leubner } smpReqReportGeneral2_t;
556*4e1bc9a0SAchim Leubner #endif
557*4e1bc9a0SAchim Leubner 
558*4e1bc9a0SAchim Leubner /****************************************************************
559*4e1bc9a0SAchim Leubner  *            report general response
560*4e1bc9a0SAchim Leubner  ****************************************************************/
561*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT   0x80
562*4e1bc9a0SAchim Leubner #define REPORT_GENERAL_CONFIGURES_OTHERS_BIT          0x04
563*4e1bc9a0SAchim Leubner 
564*4e1bc9a0SAchim Leubner typedef struct smpRespReportGeneral2_s
565*4e1bc9a0SAchim Leubner {
566*4e1bc9a0SAchim Leubner   bit8   expanderChangeCount16[2]; /* byte 4-5 */
567*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndexes16[2]; /* byte 6-7 */
568*4e1bc9a0SAchim Leubner   bit8   LongResponse; /* byte 8 */
569*4e1bc9a0SAchim Leubner   /* B7: LongResponse */
570*4e1bc9a0SAchim Leubner   /* B6-0: Reserved */
571*4e1bc9a0SAchim Leubner   bit8   numOfPhys; /* byte 9 */
572*4e1bc9a0SAchim Leubner   bit8   byte10;
573*4e1bc9a0SAchim Leubner     /* B7   : TABLE TO TABLE SUPPORTED */
574*4e1bc9a0SAchim Leubner     /* B6   : ZONE CONFIGURING */
575*4e1bc9a0SAchim Leubner     /* B5   : SELF CONFIGURING */
576*4e1bc9a0SAchim Leubner     /* B4   : STP CONTINUE AWT */
577*4e1bc9a0SAchim Leubner     /* B3   : OPEN REJECT RETRY SUPPORTED */
578*4e1bc9a0SAchim Leubner     /* B2   : CONFIGURES OTHERS */
579*4e1bc9a0SAchim Leubner     /* B1   : CONFIGURING */
580*4e1bc9a0SAchim Leubner     /* B0   : EXTERNALLY CONFIGURABLE ROUTE TABLE  */
581*4e1bc9a0SAchim Leubner   bit8   reserved1; /* byte11 */
582*4e1bc9a0SAchim Leubner   bit8   EnclosureLogicalID[8];
583*4e1bc9a0SAchim Leubner   bit8   reserved2[8]; /* upto byte27; Spec 1.1 */
584*4e1bc9a0SAchim Leubner   bit8   reserved3[2];
585*4e1bc9a0SAchim Leubner   bit8   STPBusInactivityTimeLimit[2];
586*4e1bc9a0SAchim Leubner   bit8   STPMaxConnectTimeLimit[2]; /* byte33 */
587*4e1bc9a0SAchim Leubner   bit8   STPSMPI_TNexusLossTime[2]; /* byte35 */
588*4e1bc9a0SAchim Leubner   bit8   byte36;
589*4e1bc9a0SAchim Leubner     /* B7-6 : NUMBER OF ZONE GROUPS */
590*4e1bc9a0SAchim Leubner     /* B5   : RESERVED */
591*4e1bc9a0SAchim Leubner     /* B4   : ZONE LOCKED */
592*4e1bc9a0SAchim Leubner     /* B3   : PHYSICAL PRESENCE SUPPORTED */
593*4e1bc9a0SAchim Leubner     /* B2   : PHYSICAL PRESENCE ASSERTED */
594*4e1bc9a0SAchim Leubner     /* B1   : ZONING SUPPORTED */
595*4e1bc9a0SAchim Leubner     /* B0   : ZONING ENABLED */
596*4e1bc9a0SAchim Leubner   bit8   byte37;
597*4e1bc9a0SAchim Leubner     /* B7-5 : RESERVED */
598*4e1bc9a0SAchim Leubner     /* B4   : SAVING */
599*4e1bc9a0SAchim Leubner     /* B3   : SAVING ZONE MANAGER PASSWORD SUPPORTED */
600*4e1bc9a0SAchim Leubner     /* B2   : SAVING ZONE PHY INFORMATION SUPPORTED   */
601*4e1bc9a0SAchim Leubner     /* B1   : SAVING ZONE PERMISSION TABLE SUPPORTED */
602*4e1bc9a0SAchim Leubner     /* B0   : SAVING ZONING ENABLED SUPPORTED */
603*4e1bc9a0SAchim Leubner   bit8   MaxNumOfRoutedSASAddr[2]; /* byte39 */
604*4e1bc9a0SAchim Leubner   bit8   ActiveZoneManagerSASAddr[8]; /* byte47 */
605*4e1bc9a0SAchim Leubner   bit8   ZoneLockInactivityTimeLimit[2]; /* byte49 */
606*4e1bc9a0SAchim Leubner   bit8   reserved4[2];
607*4e1bc9a0SAchim Leubner   bit8   reserved5; /* byte52 */
608*4e1bc9a0SAchim Leubner   bit8   FirstEnclosureConnectorElementIdx; /* byte53 */
609*4e1bc9a0SAchim Leubner   bit8   NumOfEnclosureConnectorElementIdxs; /* byte54 */
610*4e1bc9a0SAchim Leubner   bit8   reserved6; /* byte55 */
611*4e1bc9a0SAchim Leubner   bit8   ReducedFunctionality;
612*4e1bc9a0SAchim Leubner   /* B7: ReducedFunctionality */
613*4e1bc9a0SAchim Leubner   /* B6-0: Reserved */
614*4e1bc9a0SAchim Leubner   bit8   TimeToReducedFunctionality;
615*4e1bc9a0SAchim Leubner   bit8   InitialTimeToReducedFunctionality;
616*4e1bc9a0SAchim Leubner   bit8   MaxReducedFunctionalityTime; /* byte59 */
617*4e1bc9a0SAchim Leubner   bit8   LastSelfConfigurationStatusDescIdx[2];
618*4e1bc9a0SAchim Leubner   bit8   MaxNumOfStoredSelfConfigurationStatusDesc[2];
619*4e1bc9a0SAchim Leubner   bit8   LastPhyEventListDescIdx[2];
620*4e1bc9a0SAchim Leubner   bit8   MaxNumbOfStoredPhyEventListDesc[2]; /* byte67 */
621*4e1bc9a0SAchim Leubner   bit8   STPRejectToOpenLimit[2]; /* byte69 */
622*4e1bc9a0SAchim Leubner   bit8   reserved7[2]; /* byte71 */
623*4e1bc9a0SAchim Leubner 
624*4e1bc9a0SAchim Leubner } smpRespReportGeneral2_t;
625*4e1bc9a0SAchim Leubner 
626*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
627*4e1bc9a0SAchim Leubner   DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
628*4e1bc9a0SAchim Leubner 
629*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_CONFIGURING(pResp) \
630*4e1bc9a0SAchim Leubner   (((pResp)->byte10 & REPORT_GENERAL_CONFIGURING_BIT) == \
631*4e1bc9a0SAchim Leubner       REPORT_GENERAL_CONFIGURING_BIT)
632*4e1bc9a0SAchim Leubner 
633*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
634*4e1bc9a0SAchim Leubner   (((pResp)->byte10 & REPORT_GENERAL_CONFIGURABLE_BIT) == \
635*4e1bc9a0SAchim Leubner       REPORT_GENERAL_CONFIGURABLE_BIT)
636*4e1bc9a0SAchim Leubner 
637*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_TABLE_TO_TABLE_SUPPORTED(pResp) \
638*4e1bc9a0SAchim Leubner   (((pResp)->byte10 & REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT) == \
639*4e1bc9a0SAchim Leubner       REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT)
640*4e1bc9a0SAchim Leubner 
641*4e1bc9a0SAchim Leubner #define SAS2_REPORT_GENERAL_IS_CONFIGURES_OTHERS(pResp) \
642*4e1bc9a0SAchim Leubner   (((pResp)->byte10 & REPORT_GENERAL_CONFIGURES_OTHERS_BIT) == \
643*4e1bc9a0SAchim Leubner       REPORT_GENERAL_CONFIGURES_OTHERS_BIT)
644*4e1bc9a0SAchim Leubner 
645*4e1bc9a0SAchim Leubner /****************************************************************
646*4e1bc9a0SAchim Leubner  *            report manufacturer info request
647*4e1bc9a0SAchim Leubner  ****************************************************************/
648*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS
649*4e1bc9a0SAchim Leubner typedef struct smpReqReportManufactureInfo2_s
650*4e1bc9a0SAchim Leubner {
651*4e1bc9a0SAchim Leubner   /* nothing. some compiler disallowed structure with no member */
652*4e1bc9a0SAchim Leubner } smpReqReportManufactureInfo2_t;
653*4e1bc9a0SAchim Leubner #endif
654*4e1bc9a0SAchim Leubner 
655*4e1bc9a0SAchim Leubner /****************************************************************
656*4e1bc9a0SAchim Leubner  *            report manufacturer info response
657*4e1bc9a0SAchim Leubner  ****************************************************************/
658*4e1bc9a0SAchim Leubner typedef struct smpRespReportManufactureInfo2_s
659*4e1bc9a0SAchim Leubner {
660*4e1bc9a0SAchim Leubner   bit16   ExpanderChangeCount; /* byte 4-5 */
661*4e1bc9a0SAchim Leubner   bit8    reserved1[2]; /* byte 6-7 */
662*4e1bc9a0SAchim Leubner   bit8    SAS11Format; /* byte 8 */
663*4e1bc9a0SAchim Leubner     /* B7-1 : RESERVED */
664*4e1bc9a0SAchim Leubner     /* B0   : SAS-1.1 Format */
665*4e1bc9a0SAchim Leubner   bit8    reserved2[3]; /* byte 9-11 */
666*4e1bc9a0SAchim Leubner   bit8    vendorIdentification[8]; /* byte 12-19 */
667*4e1bc9a0SAchim Leubner   bit8    productIdentification[16]; /* byte 20-35 */
668*4e1bc9a0SAchim Leubner   bit8    productRevisionLevel[4]; /* byte 36-39 */
669*4e1bc9a0SAchim Leubner   bit8    componentVendorID[8]; /* byte 40-47 */
670*4e1bc9a0SAchim Leubner   bit8    componentID[2]; /* byte 48-49 */
671*4e1bc9a0SAchim Leubner   bit8    componentRevisionLevel; /* byte 50 */
672*4e1bc9a0SAchim Leubner   bit8    reserved3; /* byte 51 */
673*4e1bc9a0SAchim Leubner   bit8    vendorSpecific[8]; /* byte 52-59 */
674*4e1bc9a0SAchim Leubner } smpRespReportManufactureInfo2_t;
675*4e1bc9a0SAchim Leubner 
676*4e1bc9a0SAchim Leubner /****************************************************************
677*4e1bc9a0SAchim Leubner  *           discover request
678*4e1bc9a0SAchim Leubner  ****************************************************************/
679*4e1bc9a0SAchim Leubner typedef struct smpReqDiscover2_s
680*4e1bc9a0SAchim Leubner {
681*4e1bc9a0SAchim Leubner   bit32   reserved1; /* byte 4 - 7 */
682*4e1bc9a0SAchim Leubner   bit8    IgnoreZoneGroup; /* byte 8 */
683*4e1bc9a0SAchim Leubner   bit8    phyIdentifier; /* byte 9 */
684*4e1bc9a0SAchim Leubner   bit16   reserved2;  /* byte 10 - 11*/
685*4e1bc9a0SAchim Leubner } smpReqDiscover2_t;
686*4e1bc9a0SAchim Leubner 
687*4e1bc9a0SAchim Leubner /****************************************************************
688*4e1bc9a0SAchim Leubner  *           discover response
689*4e1bc9a0SAchim Leubner  ****************************************************************/
690*4e1bc9a0SAchim Leubner typedef struct smpRespDiscover2_s
691*4e1bc9a0SAchim Leubner {
692*4e1bc9a0SAchim Leubner   bit16  ExpanderChangeCount; /* byte 4 - 5 */
693*4e1bc9a0SAchim Leubner   bit8   reserved1[3]; /* byte 6 - 8 */
694*4e1bc9a0SAchim Leubner   bit8   phyIdentifier; /* byte 9 */
695*4e1bc9a0SAchim Leubner   bit8   reserved2[2]; /* byte 10 - 11 */
696*4e1bc9a0SAchim Leubner   bit8   attachedDeviceTypeReason; /* byte 12 */
697*4e1bc9a0SAchim Leubner     /* B7   : RESERVED */
698*4e1bc9a0SAchim Leubner     /* B6-4 : Attached Device Type */
699*4e1bc9a0SAchim Leubner     /* B3-0 : Attached Reason */
700*4e1bc9a0SAchim Leubner   bit8   NegotiatedLogicalLinkRate; /* byte 13 */
701*4e1bc9a0SAchim Leubner     /* B7-4 : RESERVED */
702*4e1bc9a0SAchim Leubner     /* B3-0 : Negotiated Logical Link Rate */
703*4e1bc9a0SAchim Leubner   bit8   attached_Ssp_Stp_Smp_Sata_Initiator; /* byte 14 */
704*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
705*4e1bc9a0SAchim Leubner     /* B3   : attached SSP Initiator */
706*4e1bc9a0SAchim Leubner     /* B2   : attached STP Initiator */
707*4e1bc9a0SAchim Leubner     /* B1   : attached SMP Initiator */
708*4e1bc9a0SAchim Leubner     /* B0   : attached SATA Host */
709*4e1bc9a0SAchim Leubner   bit8   attached_SataPS_Ssp_Stp_Smp_Sata_Target; /* byte 15 */
710*4e1bc9a0SAchim Leubner     /* B7   : attached SATA Port Selector */
711*4e1bc9a0SAchim Leubner     /* B6-4 : reserved */
712*4e1bc9a0SAchim Leubner     /* B3   : attached SSP Target */
713*4e1bc9a0SAchim Leubner     /* B2   : attached STP Target */
714*4e1bc9a0SAchim Leubner     /* B1   : attached SMP Target */
715*4e1bc9a0SAchim Leubner     /* B0   : attached SATA device */
716*4e1bc9a0SAchim Leubner   bit8   sasAddressHi[4]; /* byte 16 - 19 */
717*4e1bc9a0SAchim Leubner   bit8   sasAddressLo[4]; /* byte 20 - 23 */
718*4e1bc9a0SAchim Leubner   bit8   attachedSasAddressHi[4]; /* byte 24 - 27 */
719*4e1bc9a0SAchim Leubner   bit8   attachedSasAddressLo[4]; /* byte 28 - 31 */
720*4e1bc9a0SAchim Leubner   bit8   attachedPhyIdentifier; /* byte 32 */
721*4e1bc9a0SAchim Leubner   bit8   byte33; /* byte 33 */
722*4e1bc9a0SAchim Leubner     /* B7-3   : reserved */
723*4e1bc9a0SAchim Leubner     /* B2   : attached Inside ZPSDS Persistent */
724*4e1bc9a0SAchim Leubner     /* B1   : attached Requested Inside ZPSDS */
725*4e1bc9a0SAchim Leubner     /* B0   : attached Break Reply Capable */
726*4e1bc9a0SAchim Leubner   bit8   reserved3[6]; /* byte 34 - 39; for indentify address frame related fields */
727*4e1bc9a0SAchim Leubner   bit8   programmedAndHardware_MinPhyLinkRate; /* byte 40 */
728*4e1bc9a0SAchim Leubner     /* B7-4 : programmedMinPhyLinkRate */
729*4e1bc9a0SAchim Leubner     /* B3-0 : hardwareMinPhyLinkRate */
730*4e1bc9a0SAchim Leubner   bit8   programmedAndHardware_MaxPhyLinkRate; /* byte 41 */
731*4e1bc9a0SAchim Leubner     /* B7-4 : programmedMaxPhyLinkRate */
732*4e1bc9a0SAchim Leubner     /* B3-0 : hardwareMaxPhyLinkRate */
733*4e1bc9a0SAchim Leubner   bit8   phyChangeCount;  /* byte 42 */
734*4e1bc9a0SAchim Leubner   bit8   virtualPhy_partialPathwayTimeout; /* byte 43 */
735*4e1bc9a0SAchim Leubner     /* B7   : virtualPhy*/
736*4e1bc9a0SAchim Leubner     /* B6-4 : reserved */
737*4e1bc9a0SAchim Leubner     /* B3-0 : partialPathwayTimeout */
738*4e1bc9a0SAchim Leubner   bit8   routingAttribute; /* byte 44 */
739*4e1bc9a0SAchim Leubner     /* B7-4 : reserved */
740*4e1bc9a0SAchim Leubner     /* B3-0 : routingAttribute */
741*4e1bc9a0SAchim Leubner   bit8   ConnectorType; /* byte 45 */
742*4e1bc9a0SAchim Leubner     /* B7   : reserved */
743*4e1bc9a0SAchim Leubner     /* B6-0 : Connector Type */
744*4e1bc9a0SAchim Leubner   bit8   ConnectorElementIndex; /* byte 46 */
745*4e1bc9a0SAchim Leubner   bit8   ConnectorPhysicalLink; /* byte 47 */
746*4e1bc9a0SAchim Leubner   bit8   reserved4[2]; /* byte 48 - 49 */
747*4e1bc9a0SAchim Leubner   bit8   vendorSpecific[2]; /* byte 50 - 51*/
748*4e1bc9a0SAchim Leubner   bit8   AttachedDeviceName[8]; /* byte 52 - 59*/
749*4e1bc9a0SAchim Leubner   bit8   byte60; /* byte 60 */
750*4e1bc9a0SAchim Leubner     /* B7   : reserved */
751*4e1bc9a0SAchim Leubner     /* B6   : Requested Inside ZPSDS Changed By Expander */
752*4e1bc9a0SAchim Leubner     /* B5   : Inside ZPSDS Persistent */
753*4e1bc9a0SAchim Leubner     /* B4   : Requested Inside ZPSDS */
754*4e1bc9a0SAchim Leubner     /* B3   : reserved */
755*4e1bc9a0SAchim Leubner     /* B2   : Zone Group Persistent */
756*4e1bc9a0SAchim Leubner     /* B1   : Inside ZPSDS */
757*4e1bc9a0SAchim Leubner     /* B0   : Zoning Enabled */
758*4e1bc9a0SAchim Leubner   bit8   reserved5[2]; /* byte 61 - 62; zoning-related fields */
759*4e1bc9a0SAchim Leubner   bit8   ZoneGroup; /* byte 63 */
760*4e1bc9a0SAchim Leubner   bit8   SelfCongfiguringStatus; /* byte 64 */
761*4e1bc9a0SAchim Leubner   bit8   SelfCongfigurationLevelsCompleted; /* byte 65 */
762*4e1bc9a0SAchim Leubner   bit8   reserved6[2]; /* byte 66 - 67; self configuration related fields */
763*4e1bc9a0SAchim Leubner   bit8   SelfConfigurationSASAddressHi[4]; /* byte 68 - 71 */
764*4e1bc9a0SAchim Leubner   bit8   SelfConfigurationSASAddressLo[4]; /* byte 72 - 75 */
765*4e1bc9a0SAchim Leubner   bit8   ProgrammedphyCapabilities[4]; /* byte 76 - 79 */
766*4e1bc9a0SAchim Leubner   bit8   CurrentphyCapabilities[4]; /* byte 80 - 83 */
767*4e1bc9a0SAchim Leubner   bit8   AttachedphyCapabilities[4]; /* byte 84 - 87 */
768*4e1bc9a0SAchim Leubner   bit8   reserved7[6]; /* byte 88 - 93 */
769*4e1bc9a0SAchim Leubner   bit8   ReasonNegotiatedPhysicalLinkRate; /* byte 94 */
770*4e1bc9a0SAchim Leubner   bit8   NegotiatedSSCHWMuxingSupported; /* byte 95 */
771*4e1bc9a0SAchim Leubner     /* B7-2 : reserved */
772*4e1bc9a0SAchim Leubner     /* B1   : Negotiated SSC */
773*4e1bc9a0SAchim Leubner     /* B0   : HW Muxing Supported */
774*4e1bc9a0SAchim Leubner   bit8   byte96; /* byte 96 */
775*4e1bc9a0SAchim Leubner     /* B7-6 : reserved */
776*4e1bc9a0SAchim Leubner     /* B5   : Default Inside ZPSDS Persistent */
777*4e1bc9a0SAchim Leubner     /* B4   : Default Requested Inside ZPSDS */
778*4e1bc9a0SAchim Leubner     /* B3   : reserved */
779*4e1bc9a0SAchim Leubner     /* B2   : Default Zone Group Persistent */
780*4e1bc9a0SAchim Leubner     /* B1   : reserved */
781*4e1bc9a0SAchim Leubner     /* B0   : Default Zoning Enabled */
782*4e1bc9a0SAchim Leubner   bit8   reserved8; /* byte 97 */
783*4e1bc9a0SAchim Leubner   bit8   reserved9; /* byte 98 */
784*4e1bc9a0SAchim Leubner   bit8   DefaultZoneGroup; /* byte 99 */
785*4e1bc9a0SAchim Leubner   bit8   byte100; /* byte 100 */
786*4e1bc9a0SAchim Leubner     /* B7-6 : reserved */
787*4e1bc9a0SAchim Leubner     /* B5   : Saved Inside ZPSDS Persistent */
788*4e1bc9a0SAchim Leubner     /* B4   : Saved Requested Inside ZPSDS */
789*4e1bc9a0SAchim Leubner     /* B3   : reserved */
790*4e1bc9a0SAchim Leubner     /* B2   : Saved Zone Group Persistent */
791*4e1bc9a0SAchim Leubner     /* B1   : reserved */
792*4e1bc9a0SAchim Leubner     /* B0   : Saved Zoning Enabled */
793*4e1bc9a0SAchim Leubner   bit8   reserved10; /* byte 101 */
794*4e1bc9a0SAchim Leubner   bit8   reserved11; /* byte 102 */
795*4e1bc9a0SAchim Leubner   bit8   SavedZoneGroup; /* byte 103 */
796*4e1bc9a0SAchim Leubner   bit8   byte104; /* byte 104 */
797*4e1bc9a0SAchim Leubner     /* B7-6 : reserved */
798*4e1bc9a0SAchim Leubner     /* B5   : Shadow Inside ZPSDS Persistent */
799*4e1bc9a0SAchim Leubner     /* B4   : Shadow Requested Inside ZPSDS */
800*4e1bc9a0SAchim Leubner     /* B3   : reserved */
801*4e1bc9a0SAchim Leubner     /* B2   : Shadow Zone Group Persistent */
802*4e1bc9a0SAchim Leubner     /* B1-0 : reserved */
803*4e1bc9a0SAchim Leubner   bit8   reserved12; /* byte 105 */
804*4e1bc9a0SAchim Leubner   bit8   reserved13; /* byte 106 */
805*4e1bc9a0SAchim Leubner   bit8   ShadowZoneGroup; /* byte 107 */
806*4e1bc9a0SAchim Leubner   bit8   DeviceSlotNumber; /* byte 108 */
807*4e1bc9a0SAchim Leubner   bit8   GroupNumber; /* byte 109 */
808*4e1bc9a0SAchim Leubner   bit16  PathToEnclosure; /* byte 110 - 111 */
809*4e1bc9a0SAchim Leubner 
810*4e1bc9a0SAchim Leubner } smpRespDiscover2_t;
811*4e1bc9a0SAchim Leubner 
812*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SSP_BIT    0x08
813*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_STP_BIT    0x04
814*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SMP_BIT    0x02
815*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SATA_BIT   0x01
816*4e1bc9a0SAchim Leubner 
817*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_SATA_PS_BIT   0x80
818*4e1bc9a0SAchim Leubner 
819*4e1bc9a0SAchim Leubner #define SAS2_MUXING_SUPPORTED   0x01
820*4e1bc9a0SAchim Leubner 
821*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
822*4e1bc9a0SAchim Leubner   (((pResp)->attachedDeviceTypeReason & 0x70) >> 4)
823*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_LINKRATE(pResp) \
824*4e1bc9a0SAchim Leubner   ((pResp)->ReasonNegotiatedPhysicalLinkRate & 0x0F)
825*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_LOGICAL_LINKRATE(pResp) \
826*4e1bc9a0SAchim Leubner   ((pResp)->NegotiatedLogicalLinkRate & 0x0F)
827*4e1bc9a0SAchim Leubner 
828*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SSP_INITIATOR(pResp) \
829*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
830*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_STP_INITIATOR(pResp) \
831*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
832*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SMP_INITIATOR(pResp) \
833*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
834*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SATA_HOST(pResp) \
835*4e1bc9a0SAchim Leubner   (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
836*4e1bc9a0SAchim Leubner 
837*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SSP_TARGET(pResp) \
838*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
839*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_STP_TARGET(pResp) \
840*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
841*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SMP_TARGET(pResp) \
842*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
843*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SATA_DEVICE(pResp) \
844*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
845*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_SATA_PORTSELECTOR(pResp) \
846*4e1bc9a0SAchim Leubner   (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT)
847*4e1bc9a0SAchim Leubner 
848*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_SAS_ADDRESSHI(pResp) \
849*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi)
850*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_SAS_ADDRESSLO(pResp) \
851*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo)
852*4e1bc9a0SAchim Leubner 
853*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \
854*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi)
855*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \
856*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo)
857*4e1bc9a0SAchim Leubner 
858*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_VIRTUALPHY_BIT 0x80
859*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_VIRTUALPHY(pResp) \
860*4e1bc9a0SAchim Leubner   (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT)
861*4e1bc9a0SAchim Leubner 
862*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_GET_ROUTINGATTRIB(pResp) \
863*4e1bc9a0SAchim Leubner   ((pResp)->routingAttribute & 0x0F)
864*4e1bc9a0SAchim Leubner 
865*4e1bc9a0SAchim Leubner #define SAS2_DISCRSP_IS_MUXING_SUPPORTED(pResp) \
866*4e1bc9a0SAchim Leubner   (((pResp)->NegotiatedSSCHWMuxingSupported & SAS2_MUXING_SUPPORTED) == SAS2_MUXING_SUPPORTED)
867*4e1bc9a0SAchim Leubner 
868*4e1bc9a0SAchim Leubner /****************************************************************
869*4e1bc9a0SAchim Leubner  *           discover list request
870*4e1bc9a0SAchim Leubner  ****************************************************************/
871*4e1bc9a0SAchim Leubner typedef struct smpReqDiscoverList2_s
872*4e1bc9a0SAchim Leubner {
873*4e1bc9a0SAchim Leubner   bit32   reserved1; /* byte 4 - 7 */
874*4e1bc9a0SAchim Leubner   bit8    StartingPhyID; /* byte 8 */
875*4e1bc9a0SAchim Leubner   bit8    MaxNumDiscoverDesc; /* byte 9 */
876*4e1bc9a0SAchim Leubner   bit8    byte10;  /* byte 10 */
877*4e1bc9a0SAchim Leubner     /* B7   : Ignore Zone Group */
878*4e1bc9a0SAchim Leubner     /* B6-4 : Reserved */
879*4e1bc9a0SAchim Leubner     /* B3-0 : Phy Filter */
880*4e1bc9a0SAchim Leubner   bit8    byte11;  /* byte 11 */
881*4e1bc9a0SAchim Leubner     /* B7-4 : Reserved */
882*4e1bc9a0SAchim Leubner     /* B6-4 : Descriptor Type */
883*4e1bc9a0SAchim Leubner   bit32   reserved2; /* byte 12 - 15 */
884*4e1bc9a0SAchim Leubner   bit8    VendorSpecific[12]; /* byte 16 - 27 */
885*4e1bc9a0SAchim Leubner } smpReqDiscoverList2_t;
886*4e1bc9a0SAchim Leubner 
887*4e1bc9a0SAchim Leubner 
888*4e1bc9a0SAchim Leubner 
889*4e1bc9a0SAchim Leubner /****************************************************************
890*4e1bc9a0SAchim Leubner  *           discover list response
891*4e1bc9a0SAchim Leubner  ****************************************************************/
892*4e1bc9a0SAchim Leubner typedef struct smpRespDiscoverList2_s
893*4e1bc9a0SAchim Leubner {
894*4e1bc9a0SAchim Leubner   bit16   ExpanderChangeCount; /* byte 4 - 5 */
895*4e1bc9a0SAchim Leubner   bit16   reserved1; /* byte 6 - 7 */
896*4e1bc9a0SAchim Leubner   bit8    StartingPhyID; /* byte 8 */
897*4e1bc9a0SAchim Leubner   bit8    MaxNumDiscoverDesc; /* byte 9 */
898*4e1bc9a0SAchim Leubner   bit8    byte10;  /* byte 10 */
899*4e1bc9a0SAchim Leubner     /* B7-4 : Reserved */
900*4e1bc9a0SAchim Leubner     /* B3-0 : Phy Filter */
901*4e1bc9a0SAchim Leubner   bit8    byte11;  /* byte 11 */
902*4e1bc9a0SAchim Leubner     /* B7-4 : Reserved */
903*4e1bc9a0SAchim Leubner     /* B6-4 : Descriptor Type */
904*4e1bc9a0SAchim Leubner   bit8    DescLen;  /* byte 12 */
905*4e1bc9a0SAchim Leubner   bit8    reserved2; /* byte 13 */
906*4e1bc9a0SAchim Leubner   bit16   reserved3; /* byte 14 - 15 */
907*4e1bc9a0SAchim Leubner   bit8    byte16; /* byte 16 */
908*4e1bc9a0SAchim Leubner     /* B7   : Zoning Supported */
909*4e1bc9a0SAchim Leubner     /* B6   : Zoning Enabled */
910*4e1bc9a0SAchim Leubner     /* B5-4 : Reserved */
911*4e1bc9a0SAchim Leubner     /* B3   : Self Configuring */
912*4e1bc9a0SAchim Leubner     /* B2   : Zone Configuring */
913*4e1bc9a0SAchim Leubner     /* B1   : Configuring */
914*4e1bc9a0SAchim Leubner     /* B0   : Externally Configurable Route Table */
915*4e1bc9a0SAchim Leubner   bit8    reserved4; /* byte 17 */
916*4e1bc9a0SAchim Leubner   bit16   LastDescIdx; /* byte 18 - 19 */
917*4e1bc9a0SAchim Leubner   bit16   LastPhyDescIdx; /* byte 20 - 21 */
918*4e1bc9a0SAchim Leubner   bit8    reserved5[10]; /* byte 22 - 31 */
919*4e1bc9a0SAchim Leubner   bit8    VendorSpecific[16]; /* byte 32 - 47 */
920*4e1bc9a0SAchim Leubner } smpRespDiscoverList2_t;
921*4e1bc9a0SAchim Leubner 
922*4e1bc9a0SAchim Leubner 
923*4e1bc9a0SAchim Leubner 
924*4e1bc9a0SAchim Leubner /****************************************************************
925*4e1bc9a0SAchim Leubner  *            report route table request
926*4e1bc9a0SAchim Leubner  ****************************************************************/
927*4e1bc9a0SAchim Leubner typedef struct smpReqReportRouteTable2_s
928*4e1bc9a0SAchim Leubner {
929*4e1bc9a0SAchim Leubner   bit8   reserved1[2]; /* byte 4 - 5 */
930*4e1bc9a0SAchim Leubner   bit8   expanderRouteIndex16[20]; /* byte 6- 7 */
931*4e1bc9a0SAchim Leubner   bit8   reserved2; /* byte 8 */
932*4e1bc9a0SAchim Leubner   bit8   phyIdentifier; /* byte 9 */
933*4e1bc9a0SAchim Leubner   bit8   reserved3[2]; /* byte 10 -11  */
934*4e1bc9a0SAchim Leubner } smpReqReportRouteTable2_t;
935*4e1bc9a0SAchim Leubner 
936*4e1bc9a0SAchim Leubner /****************************************************************
937*4e1bc9a0SAchim Leubner  *            report route response
938*4e1bc9a0SAchim Leubner  ****************************************************************/
939*4e1bc9a0SAchim Leubner typedef struct smpRespReportRouteTable2_s
940*4e1bc9a0SAchim Leubner {
941*4e1bc9a0SAchim Leubner   bit16  expanderChangeCount; /* byte 4 - 5 */
942*4e1bc9a0SAchim Leubner   bit16  expanderRouteIndex; /* byte 6 - 7 */
943*4e1bc9a0SAchim Leubner   bit8   reserved1; /* byte 8 */
944*4e1bc9a0SAchim Leubner   bit8   phyIdentifier; /* byte 9 */
945*4e1bc9a0SAchim Leubner   bit8   reserved2[2]; /* byte 10 - 11 */
946*4e1bc9a0SAchim Leubner   bit8   disabledBit_reserved3; /* byte 12 */
947*4e1bc9a0SAchim Leubner     /* B7   : Expander Route Entry Disabled */
948*4e1bc9a0SAchim Leubner     /* B6-0 : reserved */
949*4e1bc9a0SAchim Leubner   bit8   reserved4[3]; /* byte 13-15 */
950*4e1bc9a0SAchim Leubner   bit8   routedSasAddressHi[4]; /* byte 16-19 */
951*4e1bc9a0SAchim Leubner   bit8   routedSasAddressLo[4]; /* byte 20-23 */
952*4e1bc9a0SAchim Leubner   bit8   reserved5[16]; /* byte 24-39 */
953*4e1bc9a0SAchim Leubner } smpRespReportRouteTable2_t;
954*4e1bc9a0SAchim Leubner 
955*4e1bc9a0SAchim Leubner /****************************************************************
956*4e1bc9a0SAchim Leubner  *            configure route information request
957*4e1bc9a0SAchim Leubner  ****************************************************************/
958*4e1bc9a0SAchim Leubner typedef struct smpReqConfigureRouteInformation2_s
959*4e1bc9a0SAchim Leubner {
960*4e1bc9a0SAchim Leubner   bit16  expectedExpanderChangeCount; /* byte 4-5 */
961*4e1bc9a0SAchim Leubner   bit16  expanderRouteIndex; /* byte 6-7 */
962*4e1bc9a0SAchim Leubner   bit8   reserved1; /* byte 8 */
963*4e1bc9a0SAchim Leubner   bit8   phyIdentifier; /* byte 9 */
964*4e1bc9a0SAchim Leubner   bit8   reserved2[2]; /* byte 10-11 */
965*4e1bc9a0SAchim Leubner   bit8   disabledBit_reserved3; /* byte 12 */
966*4e1bc9a0SAchim Leubner     /* B7   : Expander Route Entry Disabled */
967*4e1bc9a0SAchim Leubner     /* B6-0 : reserved */
968*4e1bc9a0SAchim Leubner   bit8   reserved4[3]; /* byte 13-15 */
969*4e1bc9a0SAchim Leubner   bit8   routedSasAddressHi[4]; /* byte 16-19 */
970*4e1bc9a0SAchim Leubner   bit8   routedSasAddressLo[4]; /* byte 20-23 */
971*4e1bc9a0SAchim Leubner   bit8   reserved5[16]; /* byte 24-39 */
972*4e1bc9a0SAchim Leubner } smpReqConfigureRouteInformation2_t;
973*4e1bc9a0SAchim Leubner 
974*4e1bc9a0SAchim Leubner /****************************************************************
975*4e1bc9a0SAchim Leubner  *            configure route response
976*4e1bc9a0SAchim Leubner  ****************************************************************/
977*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS
978*4e1bc9a0SAchim Leubner typedef struct smpRespConfigureRouteInformation2_s
979*4e1bc9a0SAchim Leubner {
980*4e1bc9a0SAchim Leubner   /* nothing. some compiler disallowed structure with no member */
981*4e1bc9a0SAchim Leubner } smpRespConfigureRouteInformation2_t;
982*4e1bc9a0SAchim Leubner #endif
983*4e1bc9a0SAchim Leubner 
984*4e1bc9a0SAchim Leubner /****************************************************************
985*4e1bc9a0SAchim Leubner  *            report Phy Sata request
986*4e1bc9a0SAchim Leubner  ****************************************************************/
987*4e1bc9a0SAchim Leubner typedef struct smpReqReportPhySata2_s
988*4e1bc9a0SAchim Leubner {
989*4e1bc9a0SAchim Leubner   bit8   reserved1[5]; /* byte 4-8 */
990*4e1bc9a0SAchim Leubner   bit8   phyIdentifier; /* byte 9 */
991*4e1bc9a0SAchim Leubner   bit8   AffiliationContext; /* byte 10 */
992*4e1bc9a0SAchim Leubner   bit8   reserved2; /* byte 11 */
993*4e1bc9a0SAchim Leubner } smpReqReportPhySata2_t;
994*4e1bc9a0SAchim Leubner 
995*4e1bc9a0SAchim Leubner /****************************************************************
996*4e1bc9a0SAchim Leubner  *            report Phy Sata response
997*4e1bc9a0SAchim Leubner  ****************************************************************/
998*4e1bc9a0SAchim Leubner typedef struct smpRespReportPhySata2_s
999*4e1bc9a0SAchim Leubner {
1000*4e1bc9a0SAchim Leubner   bit16  expanderChangeCount; /* byte 4-5 */
1001*4e1bc9a0SAchim Leubner   bit8   reserved1[3]; /* byte 6-8 */
1002*4e1bc9a0SAchim Leubner   bit8   phyIdentifier; /* byte 9 */
1003*4e1bc9a0SAchim Leubner   bit8   reserved2; /* byte 10 */
1004*4e1bc9a0SAchim Leubner   bit8   byte11; /* byte 11 */
1005*4e1bc9a0SAchim Leubner     /* b7-3 : reserved */
1006*4e1bc9a0SAchim Leubner     /* b2   : STP I_T Nexus Loss Occurred */
1007*4e1bc9a0SAchim Leubner     /* b1   : Affiliations supported */
1008*4e1bc9a0SAchim Leubner     /* b0   : Affiliation valid */
1009*4e1bc9a0SAchim Leubner   bit8   reserved3[4]; /* byte 12-15 */
1010*4e1bc9a0SAchim Leubner   bit8   stpSasAddressHi[4]; /* byte 16-19 */
1011*4e1bc9a0SAchim Leubner   bit8   stpSasAddressLo[4]; /* byte 20-23 */
1012*4e1bc9a0SAchim Leubner   bit8   regDevToHostFis[20]; /* byte 24-43 */
1013*4e1bc9a0SAchim Leubner   bit8   reserved4[4]; /* byte 44-47 */
1014*4e1bc9a0SAchim Leubner   bit8   affiliatedStpInitiatorSasAddressHi[4]; /* byte 48-51 */
1015*4e1bc9a0SAchim Leubner   bit8   affiliatedStpInitiatorSasAddressLo[4]; /* byte 52-55 */
1016*4e1bc9a0SAchim Leubner   bit8   STPITNexusLossSASAddressHi[4]; /* byte 56-59 */
1017*4e1bc9a0SAchim Leubner   bit8   STPITNexusLossSASAddressLo[4]; /* byte 60-63 */
1018*4e1bc9a0SAchim Leubner   bit8   reserved5; /* byte 64 */
1019*4e1bc9a0SAchim Leubner   bit8   AffiliationContext; /* byte 65 */
1020*4e1bc9a0SAchim Leubner   bit8   CurrentAffiliationContexts; /* byte 66 */
1021*4e1bc9a0SAchim Leubner   bit8   MaxAffiliationContexts; /* byte 67 */
1022*4e1bc9a0SAchim Leubner 
1023*4e1bc9a0SAchim Leubner } smpRespReportPhySata2_t;
1024*4e1bc9a0SAchim Leubner 
1025*4e1bc9a0SAchim Leubner /****************************************************************
1026*4e1bc9a0SAchim Leubner  *            Phy Control request
1027*4e1bc9a0SAchim Leubner  ****************************************************************/
1028*4e1bc9a0SAchim Leubner typedef struct smpReqPhyControl2_s
1029*4e1bc9a0SAchim Leubner {
1030*4e1bc9a0SAchim Leubner   bit16  expectedExpanderChangeCount; /* byte 4-5 */
1031*4e1bc9a0SAchim Leubner   bit8   reserved1[3]; /* byte 6-8 */
1032*4e1bc9a0SAchim Leubner   bit8   phyIdentifier; /* byte 9 */
1033*4e1bc9a0SAchim Leubner   bit8   phyOperation; /* byte 10 */
1034*4e1bc9a0SAchim Leubner   bit8   updatePartialPathwayTOValue; /* byte 11 */
1035*4e1bc9a0SAchim Leubner     /* b7-1 : reserved */
1036*4e1bc9a0SAchim Leubner     /* b0   : update partial pathway timeout value */
1037*4e1bc9a0SAchim Leubner   bit8   reserved2[12]; /* byte 12-23 */
1038*4e1bc9a0SAchim Leubner   bit8   AttachedDeviceName[8]; /* byte 24-31 */
1039*4e1bc9a0SAchim Leubner   bit8   programmedMinPhysicalLinkRate; /* byte 32 */
1040*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Minimum Physical Link Rate*/
1041*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
1042*4e1bc9a0SAchim Leubner   bit8   programmedMaxPhysicalLinkRate; /* byte 33 */
1043*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Maximum Physical Link Rate*/
1044*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
1045*4e1bc9a0SAchim Leubner   bit8   reserved3[2]; /* byte 34-35 */
1046*4e1bc9a0SAchim Leubner   bit8   partialPathwayTOValue; /* byte 36 */
1047*4e1bc9a0SAchim Leubner     /* b7-4 : reserved */
1048*4e1bc9a0SAchim Leubner     /* b3-0 : partial Pathway TO Value */
1049*4e1bc9a0SAchim Leubner   bit8   reserved4[3]; /* byte 37-39 */
1050*4e1bc9a0SAchim Leubner 
1051*4e1bc9a0SAchim Leubner } smpReqPhyControl2_t;
1052*4e1bc9a0SAchim Leubner 
1053*4e1bc9a0SAchim Leubner /****************************************************************
1054*4e1bc9a0SAchim Leubner  *            Phy Control response
1055*4e1bc9a0SAchim Leubner  ****************************************************************/
1056*4e1bc9a0SAchim Leubner #ifdef FOR_COMPLETENESS
1057*4e1bc9a0SAchim Leubner typedef struct smpRespPhyControl2_s
1058*4e1bc9a0SAchim Leubner {
1059*4e1bc9a0SAchim Leubner   /* nothing. some compiler disallowed structure with no member */
1060*4e1bc9a0SAchim Leubner } smpRespPhyControl2_t;
1061*4e1bc9a0SAchim Leubner #endif
1062*4e1bc9a0SAchim Leubner 
1063*4e1bc9a0SAchim Leubner #define SMP_REQUEST        0x40
1064*4e1bc9a0SAchim Leubner #define SMP_RESPONSE       0x41
1065*4e1bc9a0SAchim Leubner 
1066*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */
1067*4e1bc9a0SAchim Leubner #define DM_GET_SAS_ADDRESSLO(sasAddressLo)                  \
1068*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo)
1069*4e1bc9a0SAchim Leubner 
1070*4e1bc9a0SAchim Leubner #define DM_GET_SAS_ADDRESSHI(sasAddressHi)                  \
1071*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi)
1072*4e1bc9a0SAchim Leubner 
1073*4e1bc9a0SAchim Leubner 
1074*4e1bc9a0SAchim Leubner #define DM_GET_LINK_RATE(input) (input & 0x0F)
1075*4e1bc9a0SAchim Leubner 
1076*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_1_5G                       0x08
1077*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_3_0G                       0x09
1078*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_6_0G                       0x0A
1079*4e1bc9a0SAchim Leubner #define DM_SAS_CONNECTION_RATE_12_0G                      0x0B
1080*4e1bc9a0SAchim Leubner 
1081*4e1bc9a0SAchim Leubner #define DISCOVERY_CONFIGURING_TIMER_VALUE (3 * 1000 * 1000)       /* 3 seconds */
1082*4e1bc9a0SAchim Leubner #define DISCOVERY_RETRIES                  3
1083*4e1bc9a0SAchim Leubner #define CONFIGURE_ROUTE_TIMER_VALUE       (1 * 1000 * 1000)       /* 1 seconds */
1084*4e1bc9a0SAchim Leubner #define DEVICE_REGISTRATION_TIMER_VALUE   (2 * 1000 * 1000)       /* 2 seconds */
1085*4e1bc9a0SAchim Leubner #define SMP_RETRIES                        5
1086*4e1bc9a0SAchim Leubner #define SMP_BUSY_TIMER_VALUE              (1 * 1000 * 1000)       /* 1 second */
1087*4e1bc9a0SAchim Leubner #define SMP_BUSY_RETRIES                   5
1088*4e1bc9a0SAchim Leubner #define SATA_ID_DEVICE_DATA_TIMER_VALUE   (3 * 1000 * 1000)       /* 3 second */
1089*4e1bc9a0SAchim Leubner #define SATA_ID_DEVICE_DATA_RETRIES        3
1090*4e1bc9a0SAchim Leubner #define BC_TIMER_VALUE                    (5 * 1000 * 1000)       /* 5 second */
1091*4e1bc9a0SAchim Leubner #define SMP_TIMER_VALUE                   (30 * 1000 * 1000)       /* 30 second */
1092*4e1bc9a0SAchim Leubner 
1093*4e1bc9a0SAchim Leubner #define STP_DEVICE_TYPE 0     /* SATA behind expander 00*/
1094*4e1bc9a0SAchim Leubner #define SAS_DEVICE_TYPE 1     /* SSP or SMP 01 */
1095*4e1bc9a0SAchim Leubner #define SATA_DEVICE_TYPE 2    /* direct SATA 10 */
1096*4e1bc9a0SAchim Leubner #define ATAPI_DEVICE_FLAG 0x200000   /* ATAPI device flag*/
1097*4e1bc9a0SAchim Leubner 
1098*4e1bc9a0SAchim Leubner 
1099*4e1bc9a0SAchim Leubner /* ATA device type */
1100*4e1bc9a0SAchim Leubner #define SATA_ATA_DEVICE                           0x01                       /**< ATA ATA device type */
1101*4e1bc9a0SAchim Leubner #define SATA_ATAPI_DEVICE                         0x02                       /**< ATA ATAPI device type */
1102*4e1bc9a0SAchim Leubner #define SATA_PM_DEVICE                            0x03                       /**< ATA PM device type */
1103*4e1bc9a0SAchim Leubner #define SATA_SEMB_DEVICE                          0x04                       /**< ATA SEMB device type */
1104*4e1bc9a0SAchim Leubner #define SATA_SEMB_WO_SEP_DEVICE                   0x05                       /**< ATA SEMB without SEP device type */
1105*4e1bc9a0SAchim Leubner #define UNKNOWN_DEVICE                            0xFF
1106*4e1bc9a0SAchim Leubner 
1107*4e1bc9a0SAchim Leubner 
1108*4e1bc9a0SAchim Leubner /* SAS device type definition. SAS spec(r.7) p206  */
1109*4e1bc9a0SAchim Leubner #define SAS_NO_DEVICE                    0
1110*4e1bc9a0SAchim Leubner #define SAS_END_DEVICE                   1
1111*4e1bc9a0SAchim Leubner #define SAS_EDGE_EXPANDER_DEVICE         2
1112*4e1bc9a0SAchim Leubner #define SAS_FANOUT_EXPANDER_DEVICE       3
1113*4e1bc9a0SAchim Leubner 
1114*4e1bc9a0SAchim Leubner /* routing attributes */
1115*4e1bc9a0SAchim Leubner #define SAS_ROUTING_DIRECT                             0x00
1116*4e1bc9a0SAchim Leubner #define SAS_ROUTING_SUBTRACTIVE                        0x01
1117*4e1bc9a0SAchim Leubner #define SAS_ROUTING_TABLE                              0x02
1118*4e1bc9a0SAchim Leubner 
1119*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_1_5G                       0x08
1120*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_3_0G                       0x09
1121*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_6_0G                       0x0A
1122*4e1bc9a0SAchim Leubner #define SAS_CONNECTION_RATE_12_0G                      0x0B
1123*4e1bc9a0SAchim Leubner 
1124*4e1bc9a0SAchim Leubner #define IT_NEXUS_TIMEOUT    0x7D0 /* 2000 ms; old value was 0xFFFF */
1125*4e1bc9a0SAchim Leubner 
1126*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */
1127*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \
1128*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo)
1129*4e1bc9a0SAchim Leubner 
1130*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \
1131*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi)
1132*4e1bc9a0SAchim Leubner 
1133*4e1bc9a0SAchim Leubner /* this macro is based on SAS spec, not sTSDK 0xC0 */
1134*4e1bc9a0SAchim Leubner #define DEVINFO_GET_DEVICETTYPE(devInfo) \
1135*4e1bc9a0SAchim Leubner   (((devInfo)->devType_S_Rate & 0xC0) >> 6)
1136*4e1bc9a0SAchim Leubner 
1137*4e1bc9a0SAchim Leubner #define DEVINFO_GET_LINKRATE(devInfo) \
1138*4e1bc9a0SAchim Leubner   ((devInfo)->devType_S_Rate & 0x0F)
1139*4e1bc9a0SAchim Leubner 
1140*4e1bc9a0SAchim Leubner /**< target device type */
1141*4e1bc9a0SAchim Leubner #define DM_DEFAULT_DEVICE 0
1142*4e1bc9a0SAchim Leubner #define DM_SAS_DEVICE 1
1143*4e1bc9a0SAchim Leubner #define DM_SATA_DEVICE 2
1144*4e1bc9a0SAchim Leubner 
1145*4e1bc9a0SAchim Leubner #define DEVICE_SSP_BIT         0x8   /* SSP Initiator port */
1146*4e1bc9a0SAchim Leubner #define DEVICE_STP_BIT         0x4   /* STP Initiator port */
1147*4e1bc9a0SAchim Leubner #define DEVICE_SMP_BIT         0x2   /* SMP Initiator port */
1148*4e1bc9a0SAchim Leubner #define DEVICE_SATA_BIT        0x1   /* SATA device, valid in the discovery response only */
1149*4e1bc9a0SAchim Leubner 
1150*4e1bc9a0SAchim Leubner #define DEVICE_IS_SSP_INITIATOR(DeviceData) \
1151*4e1bc9a0SAchim Leubner   (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
1152*4e1bc9a0SAchim Leubner 
1153*4e1bc9a0SAchim Leubner #define DEVICE_IS_STP_INITIATOR(DeviceData) \
1154*4e1bc9a0SAchim Leubner   (((DeviceData)->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
1155*4e1bc9a0SAchim Leubner 
1156*4e1bc9a0SAchim Leubner #define DEVICE_IS_SMP_INITIATOR(DeviceData) \
1157*4e1bc9a0SAchim Leubner   (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
1158*4e1bc9a0SAchim Leubner 
1159*4e1bc9a0SAchim Leubner #define DEVICE_IS_SSP_TARGET(DeviceData) \
1160*4e1bc9a0SAchim Leubner   (((DeviceData)->target_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
1161*4e1bc9a0SAchim Leubner 
1162*4e1bc9a0SAchim Leubner #define DEVICE_IS_STP_TARGET(DeviceData) \
1163*4e1bc9a0SAchim Leubner   (((DeviceData)->target_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
1164*4e1bc9a0SAchim Leubner 
1165*4e1bc9a0SAchim Leubner #define DEVICE_IS_SMP_TARGET(DeviceData) \
1166*4e1bc9a0SAchim Leubner   (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
1167*4e1bc9a0SAchim Leubner 
1168*4e1bc9a0SAchim Leubner #define DEVICE_IS_SATA_DEVICE(DeviceData) \
1169*4e1bc9a0SAchim Leubner   (((DeviceData)->target_ssp_stp_smp & DEVICE_SATA_BIT) == DEVICE_SATA_BIT)
1170*4e1bc9a0SAchim Leubner 
1171*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */
1172*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \
1173*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo)
1174*4e1bc9a0SAchim Leubner 
1175*4e1bc9a0SAchim Leubner #define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \
1176*4e1bc9a0SAchim Leubner   DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi)
1177*4e1bc9a0SAchim Leubner 
1178*4e1bc9a0SAchim Leubner /* this macro is based on SAS spec, not sTSDK 0xC0 */
1179*4e1bc9a0SAchim Leubner #define DEVINFO_GET_DEVICETTYPE(devInfo) \
1180*4e1bc9a0SAchim Leubner   (((devInfo)->devType_S_Rate & 0xC0) >> 6)
1181*4e1bc9a0SAchim Leubner 
1182*4e1bc9a0SAchim Leubner #define DEVINFO_GET_LINKRATE(devInfo) \
1183*4e1bc9a0SAchim Leubner   ((devInfo)->devType_S_Rate & 0x0F)
1184*4e1bc9a0SAchim Leubner 
1185*4e1bc9a0SAchim Leubner 
1186*4e1bc9a0SAchim Leubner #define DEVINFO_GET_EXT_SMP(devInfo) \
1187*4e1bc9a0SAchim Leubner   (((devInfo)->ext & 0x100) >> 8)
1188*4e1bc9a0SAchim Leubner 
1189*4e1bc9a0SAchim Leubner #define DEVINFO_GET_EXT_EXPANDER_TYPE(devInfo) \
1190*4e1bc9a0SAchim Leubner   (((devInfo)->ext & 0x600) >> 9)
1191*4e1bc9a0SAchim Leubner 
1192*4e1bc9a0SAchim Leubner #define DEVINFO_GET_EXT_MCN(devInfo) \
1193*4e1bc9a0SAchim Leubner   (((devInfo)->ext & 0x7800) >> 11)
1194*4e1bc9a0SAchim Leubner 
1195*4e1bc9a0SAchim Leubner 
1196*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_SMPTO(devInfo, smpto) \
1197*4e1bc9a0SAchim Leubner   ((devInfo)->smpTimeout) = smpto
1198*4e1bc9a0SAchim Leubner 
1199*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_ITNEXUSTO(devInfo, itnexusto) \
1200*4e1bc9a0SAchim Leubner   ((devInfo)->it_NexusTimeout) = itnexusto
1201*4e1bc9a0SAchim Leubner 
1202*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_FBS(devInfo, fbs) \
1203*4e1bc9a0SAchim Leubner   ((devInfo)->firstBurstSize) = fbs
1204*4e1bc9a0SAchim Leubner 
1205*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_FLAG(devInfo, tlr) \
1206*4e1bc9a0SAchim Leubner   ((devInfo)->flag) = tlr
1207*4e1bc9a0SAchim Leubner 
1208*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_DEV_S_RATE(devInfo, dev_s_rate) \
1209*4e1bc9a0SAchim Leubner   ((devInfo)->devType_S_Rate) = dev_s_rate
1210*4e1bc9a0SAchim Leubner 
1211*4e1bc9a0SAchim Leubner /* bit32 -> bit8 array[4] */
1212*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_SAS_ADDRESSLO(devInfo, src32) \
1213*4e1bc9a0SAchim Leubner   *(bit32 *)((devInfo)->sasAddressLo) = BIT32_TO_DMA_BEBIT32(src32)
1214*4e1bc9a0SAchim Leubner 
1215*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_SAS_ADDRESSHI(devInfo, src32) \
1216*4e1bc9a0SAchim Leubner   *(bit32 *)((devInfo)->sasAddressHi) = BIT32_TO_DMA_BEBIT32(src32)
1217*4e1bc9a0SAchim Leubner 
1218*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_INITIATOR_SSP_STP_SMP(devInfo, ini_ssp_stp_smp) \
1219*4e1bc9a0SAchim Leubner   ((devInfo)->initiator_ssp_stp_smp) = ini_ssp_stp_smp
1220*4e1bc9a0SAchim Leubner 
1221*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_TARGET_SSP_STP_SMP(devInfo, tgt_ssp_stp_smp) \
1222*4e1bc9a0SAchim Leubner   ((devInfo)->target_ssp_stp_smp) = tgt_ssp_stp_smp
1223*4e1bc9a0SAchim Leubner 
1224*4e1bc9a0SAchim Leubner #define DEVINFO_PUT_EXT(devInfo, extension) \
1225*4e1bc9a0SAchim Leubner   ((devInfo)->ext) = extension
1226*4e1bc9a0SAchim Leubner 
1227*4e1bc9a0SAchim Leubner #endif /* __DMDEFS_H__ */
1228*4e1bc9a0SAchim Leubner 
1229