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
62enum 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*/
110extern 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 */
227typedef 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
239typedef 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
252typedef 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 ****************************************************************/
283typedef 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 ****************************************************************/
295typedef 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 ****************************************************************/
307typedef 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 ****************************************************************/
411typedef 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 ****************************************************************/
423typedef 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 ****************************************************************/
442typedef 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
460typedef 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 ****************************************************************/
469typedef 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 ****************************************************************/
480typedef 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 ****************************************************************/
503typedef 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
530typedef 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 */
541typedef 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
553typedef 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
565typedef 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
650typedef 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 ****************************************************************/
659typedef 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 ****************************************************************/
680typedef 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 ****************************************************************/
691typedef 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 ****************************************************************/
872typedef 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 ****************************************************************/
893typedef 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 ****************************************************************/
928typedef 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 ****************************************************************/
940typedef 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 ****************************************************************/
959typedef 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
979typedef 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 ****************************************************************/
988typedef 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 ****************************************************************/
999typedef 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 ****************************************************************/
1029typedef 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
1058typedef 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