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