1 /*******************************************************************************
3 * Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved.
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
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.
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
24 ********************************************************************************/
28 #include <dev/pms/RefTisa/tisa/sassata/common/ossa.h>
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 */
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
49 #define DM_MAX_INDIRECT_SMP DM_MAX_SMP
51 #define DM_USECS_PER_TICK 1000000 /**< defines the heart beat of the LL layer 10ms */
56 #define PIO_SETUP_DEV_TO_HOST_FIS 0x5F
57 #define REG_DEV_TO_HOST_FIS 0x34
58 #define SET_DEV_BITS_FIS 0xA1
60 #define DEFAULT_KEY_BUFFER_SIZE 64
71 /* default SMP timeout: 0xFFFF is the Maximum Allowed */
72 #define DEFAULT_SMP_TIMEOUT 0xFFFF
74 /* SMP direct payload size limit: IOMB direct payload size = 48 */
75 #define SMP_DIRECT_PAYLOAD_LIMIT 44
77 #define SMP_INDIRECT_PAYLOAD 512
79 /* SMP maximum payload size allowed by SAS spec withtout CRC 4 bytes */
80 #define SMP_MAXIMUM_PAYLOAD 1024
85 * use to find MIN of two values
88 #define MIN(a,b) ((a) < (b) ? (a) : (b))
94 * use to find MAX of two values
97 #define MAX(a,b) ((a) < (b) ? (b) : (a))
101 #define agNULL ((void *)0)
104 /* for debugging print */
105 #if defined(DM_DEBUG)
108 * for debugging purposes.
110 extern bit32 gDMDebugLevel;
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)
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)
131 #endif /* DM_DEBUG */
133 //#define DM_ASSERT OS_ASSERT
134 //#define tddmLogDebugString TIDEBUG_MSG
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
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 */
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
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
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
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
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+ */
223 /****************************************************************
225 ****************************************************************/
226 /* SMP header definition */
227 typedef struct dmSMPFrameHeader_s
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;
235 /****************************************************************
236 * report general request
237 ****************************************************************/
238 #ifdef FOR_COMPLETENESS
239 typedef struct smpReqReportGeneral_s
241 /* nothing. some compiler disallowed structure with no member */
242 } smpReqReportGeneral_t;
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
252 typedef struct smpRespReportGeneral_s
254 bit8 expanderChangeCount16[2];
255 bit8 expanderRouteIndexes16[2];
256 bit8 reserved1; /* byte 9; has LONG Response for SAS 2 at bit 8 */
258 bit8 configuring_configurable;
259 /* B7-2 : reserved */
260 /* B1 : configuring */
261 /* B0 : configurable */
263 } smpRespReportGeneral_t;
265 #define REPORT_GENERAL_IS_CONFIGURING(pResp) \
266 (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURING_BIT) == \
267 REPORT_GENERAL_CONFIGURING_BIT)
269 #define REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
270 (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURABLE_BIT) == \
271 REPORT_GENERAL_CONFIGURABLE_BIT)
273 #define REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
274 DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
276 #define REPORT_GENERAL_IS_LONG_RESPONSE(pResp) \
277 (((pResp)->reserved1 & REPORT_GENERAL_LONG_RESPONSE_BIT) == \
278 REPORT_GENERAL_LONG_RESPONSE_BIT)
280 /****************************************************************
281 * report manufacturer info response
282 ****************************************************************/
283 typedef struct smpRespReportManufactureInfo_s
286 bit8 vendorIdentification[8];
287 bit8 productIdentification[16];
288 bit8 productRevisionLevel[4];
289 bit8 vendorSpecific[20];
290 } smpRespReportManufactureInfo_t;
292 /****************************************************************
294 ****************************************************************/
295 typedef struct smpReqDiscover_s
304 /****************************************************************
306 ****************************************************************/
307 typedef struct smpRespDiscover_s
313 bit8 attachedDeviceType; /* byte 12 */
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;
339 bit8 programmedAndHardware_MinPhyLinkRate;
340 /* B7-4 : programmedMinPhyLinkRate */
341 /* B3-0 : hardwareMinPhyLinkRate */
342 bit8 programmedAndHardware_MaxPhyLinkRate;
343 /* B7-4 : programmedMaxPhyLinkRate */
344 /* B3-0 : hardwareMaxPhyLinkRate */
346 bit8 virtualPhy_partialPathwayTimeout; /* byte 43 */
348 /* B6-4 : reserved */
349 /* B3-0 : partialPathwayTimeout */
350 bit8 routingAttribute;
351 /* B7-4 : reserved */
352 /* B3-0 : routingAttribute */
354 bit8 vendorSpecific[2];
357 #define DISCRSP_SSP_BIT 0x08
358 #define DISCRSP_STP_BIT 0x04
359 #define DISCRSP_SMP_BIT 0x02
360 #define DISCRSP_SATA_BIT 0x01
362 #define DISCRSP_SATA_PS_BIT 0x80
364 #define DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
365 (((pResp)->attachedDeviceType & 0x70) >> 4)
366 #define DISCRSP_GET_LINKRATE(pResp) \
367 ((pResp)->negotiatedPhyLinkRate & 0x0F)
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)
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)
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)
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)
401 #define DISCRSP_VIRTUALPHY_BIT 0x80
402 #define DISCRSP_IS_VIRTUALPHY(pResp) \
403 (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT)
405 #define DISCRSP_GET_ROUTINGATTRIB(pResp) \
406 ((pResp)->routingAttribute & 0x0F)
408 /****************************************************************
409 * report route table request
410 ****************************************************************/
411 typedef struct smpReqReportRouteTable_s
414 bit8 expanderRouteIndex16[20];
418 } smpReqReportRouteTable_t;
420 /****************************************************************
421 * report route response
422 ****************************************************************/
423 typedef struct smpRespReportRouteTable_s
426 bit8 expanderRouteIndex16[2];
431 /* B7 : expander route entry disabled */
432 /* B6-0 : reserved */
434 bit8 routedSasAddressHi32[4];
435 bit8 routedSasAddressLo32[4];
437 } smpRespReportRouteTable_t;
439 /****************************************************************
440 * configure route information request
441 ****************************************************************/
442 typedef struct smpReqConfigureRouteInformation_s
445 bit8 expanderRouteIndex[2];
449 bit8 disabledBit_reserved4;
451 bit8 routedSasAddressHi[4];
452 bit8 routedSasAddressLo[4];
454 } smpReqConfigureRouteInformation_t;
456 /****************************************************************
457 * configure route response
458 ****************************************************************/
459 #ifdef FOR_COMPLETENESS
460 typedef struct smpRespConfigureRouteInformation_s
462 /* nothing. some compiler disallowed structure with no member */
463 } smpRespConfigureRouteInformation_t;
466 /****************************************************************
467 * report Phy Sata request
468 ****************************************************************/
469 typedef struct smpReqReportPhySata_s
475 } smpReqReportPhySata_t;
477 /****************************************************************
478 * report Phy Sata response
479 ****************************************************************/
480 typedef struct smpRespReportPhySata_s
486 bit8 affiliations_sup_valid;
487 /* b7-2 : reserved */
488 /* b1 : Affiliations supported */
489 /* b0 : Affiliation valid */
491 bit8 stpSasAddressHi[4];
492 bit8 stpSasAddressLo[4];
493 bit8 regDevToHostFis[20];
495 bit8 affiliatedStpInitiatorSasAddressHi[4];
496 bit8 affiliatedStpInitiatorSasAddressLo[4];
497 } smpRespReportPhySata_t;
500 /****************************************************************
501 * Phy Control request
502 ****************************************************************/
503 typedef struct smpReqPhyControl_s
509 bit8 updatePartialPathwayTOValue;
510 /* b7-1 : reserved */
511 /* b0 : update partial pathway timeout value */
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 */
520 bit8 partialPathwayTOValue;
521 /* b7-4 : reserved */
522 /* b3-0 : partial Pathway TO Value */
524 } smpReqPhyControl_t;
526 /****************************************************************
527 * Phy Control response
528 ****************************************************************/
529 #ifdef FOR_COMPLETENESS
530 typedef struct smpRespPhyControl_s
532 /* nothing. some compiler disallowed structure with no member */
533 } smpRespPhyControl_t;
537 /****************************************************************
539 ****************************************************************/
540 /* SMP header definition */
541 typedef struct tdssSMPFrameHeader2_s
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;
549 /****************************************************************
550 * report general request
551 ****************************************************************/
552 #ifdef FOR_COMPLETENESS
553 typedef struct smpReqReportGeneral2_s
555 /* nothing. some compiler disallowed structure with no member */
556 } smpReqReportGeneral2_t;
559 /****************************************************************
560 * report general response
561 ****************************************************************/
562 #define REPORT_GENERAL_TABLE_TO_TABLE_SUPPORTED_BIT 0x80
563 #define REPORT_GENERAL_CONFIGURES_OTHERS_BIT 0x04
565 typedef struct smpRespReportGeneral2_s
567 bit8 expanderChangeCount16[2]; /* byte 4-5 */
568 bit8 expanderRouteIndexes16[2]; /* byte 6-7 */
569 bit8 LongResponse; /* byte 8 */
570 /* B7: LongResponse */
572 bit8 numOfPhys; /* byte 9 */
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 */
586 bit8 STPBusInactivityTimeLimit[2];
587 bit8 STPMaxConnectTimeLimit[2]; /* byte33 */
588 bit8 STPSMPI_TNexusLossTime[2]; /* byte35 */
590 /* B7-6 : NUMBER OF ZONE GROUPS */
592 /* B4 : ZONE LOCKED */
593 /* B3 : PHYSICAL PRESENCE SUPPORTED */
594 /* B2 : PHYSICAL PRESENCE ASSERTED */
595 /* B1 : ZONING SUPPORTED */
596 /* B0 : ZONING ENABLED */
598 /* B7-5 : RESERVED */
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 */
608 bit8 reserved5; /* byte52 */
609 bit8 FirstEnclosureConnectorElementIdx; /* byte53 */
610 bit8 NumOfEnclosureConnectorElementIdxs; /* byte54 */
611 bit8 reserved6; /* byte55 */
612 bit8 ReducedFunctionality;
613 /* B7: ReducedFunctionality */
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 */
625 } smpRespReportGeneral2_t;
627 #define SAS2_REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
628 DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
630 #define SAS2_REPORT_GENERAL_IS_CONFIGURING(pResp) \
631 (((pResp)->byte10 & REPORT_GENERAL_CONFIGURING_BIT) == \
632 REPORT_GENERAL_CONFIGURING_BIT)
634 #define SAS2_REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
635 (((pResp)->byte10 & REPORT_GENERAL_CONFIGURABLE_BIT) == \
636 REPORT_GENERAL_CONFIGURABLE_BIT)
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)
642 #define SAS2_REPORT_GENERAL_IS_CONFIGURES_OTHERS(pResp) \
643 (((pResp)->byte10 & REPORT_GENERAL_CONFIGURES_OTHERS_BIT) == \
644 REPORT_GENERAL_CONFIGURES_OTHERS_BIT)
646 /****************************************************************
647 * report manufacturer info request
648 ****************************************************************/
649 #ifdef FOR_COMPLETENESS
650 typedef struct smpReqReportManufactureInfo2_s
652 /* nothing. some compiler disallowed structure with no member */
653 } smpReqReportManufactureInfo2_t;
656 /****************************************************************
657 * report manufacturer info response
658 ****************************************************************/
659 typedef struct smpRespReportManufactureInfo2_s
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;
677 /****************************************************************
679 ****************************************************************/
680 typedef struct smpReqDiscover2_s
682 bit32 reserved1; /* byte 4 - 7 */
683 bit8 IgnoreZoneGroup; /* byte 8 */
684 bit8 phyIdentifier; /* byte 9 */
685 bit16 reserved2; /* byte 10 - 11*/
688 /****************************************************************
690 ****************************************************************/
691 typedef struct smpRespDiscover2_s
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 */
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 */
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 */
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 */
752 /* B6 : Requested Inside ZPSDS Changed By Expander */
753 /* B5 : Inside ZPSDS Persistent */
754 /* B4 : Requested Inside ZPSDS */
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 */
780 /* B2 : Default Zone Group Persistent */
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 */
791 /* B2 : Saved Zone Group Persistent */
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 */
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 */
811 } smpRespDiscover2_t;
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
818 #define SAS2_DISCRSP_SATA_PS_BIT 0x80
820 #define SAS2_MUXING_SUPPORTED 0x01
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)
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)
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)
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)
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)
859 #define SAS2_DISCRSP_VIRTUALPHY_BIT 0x80
860 #define SAS2_DISCRSP_IS_VIRTUALPHY(pResp) \
861 (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT)
863 #define SAS2_DISCRSP_GET_ROUTINGATTRIB(pResp) \
864 ((pResp)->routingAttribute & 0x0F)
866 #define SAS2_DISCRSP_IS_MUXING_SUPPORTED(pResp) \
867 (((pResp)->NegotiatedSSCHWMuxingSupported & SAS2_MUXING_SUPPORTED) == SAS2_MUXING_SUPPORTED)
869 /****************************************************************
870 * discover list request
871 ****************************************************************/
872 typedef struct smpReqDiscoverList2_s
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;
890 /****************************************************************
891 * discover list response
892 ****************************************************************/
893 typedef struct smpRespDiscoverList2_s
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;
925 /****************************************************************
926 * report route table request
927 ****************************************************************/
928 typedef struct smpReqReportRouteTable2_s
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;
937 /****************************************************************
938 * report route response
939 ****************************************************************/
940 typedef struct smpRespReportRouteTable2_s
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;
956 /****************************************************************
957 * configure route information request
958 ****************************************************************/
959 typedef struct smpReqConfigureRouteInformation2_s
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;
975 /****************************************************************
976 * configure route response
977 ****************************************************************/
978 #ifdef FOR_COMPLETENESS
979 typedef struct smpRespConfigureRouteInformation2_s
981 /* nothing. some compiler disallowed structure with no member */
982 } smpRespConfigureRouteInformation2_t;
985 /****************************************************************
986 * report Phy Sata request
987 ****************************************************************/
988 typedef struct smpReqReportPhySata2_s
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;
996 /****************************************************************
997 * report Phy Sata response
998 ****************************************************************/
999 typedef struct smpRespReportPhySata2_s
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 */
1024 } smpRespReportPhySata2_t;
1026 /****************************************************************
1027 * Phy Control request
1028 ****************************************************************/
1029 typedef struct smpReqPhyControl2_s
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 */
1052 } smpReqPhyControl2_t;
1054 /****************************************************************
1055 * Phy Control response
1056 ****************************************************************/
1057 #ifdef FOR_COMPLETENESS
1058 typedef struct smpRespPhyControl2_s
1060 /* nothing. some compiler disallowed structure with no member */
1061 } smpRespPhyControl2_t;
1064 #define SMP_REQUEST 0x40
1065 #define SMP_RESPONSE 0x41
1067 /* bit8 array[4] -> bit32 */
1068 #define DM_GET_SAS_ADDRESSLO(sasAddressLo) \
1069 DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo)
1071 #define DM_GET_SAS_ADDRESSHI(sasAddressHi) \
1072 DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi)
1075 #define DM_GET_LINK_RATE(input) (input & 0x0F)
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
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 */
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*/
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
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
1115 /* routing attributes */
1116 #define SAS_ROUTING_DIRECT 0x00
1117 #define SAS_ROUTING_SUBTRACTIVE 0x01
1118 #define SAS_ROUTING_TABLE 0x02
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
1125 #define IT_NEXUS_TIMEOUT 0x7D0 /* 2000 ms; old value was 0xFFFF */
1127 /* bit8 array[4] -> bit32 */
1128 #define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \
1129 DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo)
1131 #define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \
1132 DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi)
1134 /* this macro is based on SAS spec, not sTSDK 0xC0 */
1135 #define DEVINFO_GET_DEVICETTYPE(devInfo) \
1136 (((devInfo)->devType_S_Rate & 0xC0) >> 6)
1138 #define DEVINFO_GET_LINKRATE(devInfo) \
1139 ((devInfo)->devType_S_Rate & 0x0F)
1141 /**< target device type */
1142 #define DM_DEFAULT_DEVICE 0
1143 #define DM_SAS_DEVICE 1
1144 #define DM_SATA_DEVICE 2
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 */
1151 #define DEVICE_IS_SSP_INITIATOR(DeviceData) \
1152 (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
1154 #define DEVICE_IS_STP_INITIATOR(DeviceData) \
1155 (((DeviceData)->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
1157 #define DEVICE_IS_SMP_INITIATOR(DeviceData) \
1158 (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
1160 #define DEVICE_IS_SSP_TARGET(DeviceData) \
1161 (((DeviceData)->target_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
1163 #define DEVICE_IS_STP_TARGET(DeviceData) \
1164 (((DeviceData)->target_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
1166 #define DEVICE_IS_SMP_TARGET(DeviceData) \
1167 (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
1169 #define DEVICE_IS_SATA_DEVICE(DeviceData) \
1170 (((DeviceData)->target_ssp_stp_smp & DEVICE_SATA_BIT) == DEVICE_SATA_BIT)
1172 /* bit8 array[4] -> bit32 */
1173 #define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \
1174 DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo)
1176 #define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \
1177 DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi)
1179 /* this macro is based on SAS spec, not sTSDK 0xC0 */
1180 #define DEVINFO_GET_DEVICETTYPE(devInfo) \
1181 (((devInfo)->devType_S_Rate & 0xC0) >> 6)
1183 #define DEVINFO_GET_LINKRATE(devInfo) \
1184 ((devInfo)->devType_S_Rate & 0x0F)
1187 #define DEVINFO_GET_EXT_SMP(devInfo) \
1188 (((devInfo)->ext & 0x100) >> 8)
1190 #define DEVINFO_GET_EXT_EXPANDER_TYPE(devInfo) \
1191 (((devInfo)->ext & 0x600) >> 9)
1193 #define DEVINFO_GET_EXT_MCN(devInfo) \
1194 (((devInfo)->ext & 0x7800) >> 11)
1197 #define DEVINFO_PUT_SMPTO(devInfo, smpto) \
1198 ((devInfo)->smpTimeout) = smpto
1200 #define DEVINFO_PUT_ITNEXUSTO(devInfo, itnexusto) \
1201 ((devInfo)->it_NexusTimeout) = itnexusto
1203 #define DEVINFO_PUT_FBS(devInfo, fbs) \
1204 ((devInfo)->firstBurstSize) = fbs
1206 #define DEVINFO_PUT_FLAG(devInfo, tlr) \
1207 ((devInfo)->flag) = tlr
1209 #define DEVINFO_PUT_DEV_S_RATE(devInfo, dev_s_rate) \
1210 ((devInfo)->devType_S_Rate) = dev_s_rate
1212 /* bit32 -> bit8 array[4] */
1213 #define DEVINFO_PUT_SAS_ADDRESSLO(devInfo, src32) \
1214 *(bit32 *)((devInfo)->sasAddressLo) = BIT32_TO_DMA_BEBIT32(src32)
1216 #define DEVINFO_PUT_SAS_ADDRESSHI(devInfo, src32) \
1217 *(bit32 *)((devInfo)->sasAddressHi) = BIT32_TO_DMA_BEBIT32(src32)
1219 #define DEVINFO_PUT_INITIATOR_SSP_STP_SMP(devInfo, ini_ssp_stp_smp) \
1220 ((devInfo)->initiator_ssp_stp_smp) = ini_ssp_stp_smp
1222 #define DEVINFO_PUT_TARGET_SSP_STP_SMP(devInfo, tgt_ssp_stp_smp) \
1223 ((devInfo)->target_ssp_stp_smp) = tgt_ssp_stp_smp
1225 #define DEVINFO_PUT_EXT(devInfo, extension) \
1226 ((devInfo)->ext) = extension
1228 #endif /* __DMDEFS_H__ */