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