1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*
21* $FreeBSD$
22*
23********************************************************************************/
24/*******************************************************************************/
25/** \file
26 *
27 * The file contains defines and data structures for SAS/SATA TD layer
28 *
29 */
30
31#ifndef __TDDEFS_H__
32#define __TDDEFS_H__
33
34
35
36#ifndef agTRUE
37#define agTRUE          1
38#endif
39
40#ifndef agFALSE
41#define agFALSE         0
42#endif
43
44#ifndef agNULL
45#define agNULL     ((void *)0)
46#endif
47
48#ifndef IN
49#define IN
50#endif
51
52#ifndef OUT
53#define OUT
54#endif
55
56#ifndef IN_OUT
57#define IN_OUT
58#endif
59
60#ifndef os_bit8
61#define os_bit8     bit8
62#endif
63
64#ifndef os_bit16
65#define os_bit16    bit16
66#endif
67
68#ifndef os_bit32
69#define os_bit32    bit32
70#endif
71
72#ifndef OFF
73#define OFF     0
74#endif
75
76#ifndef ON
77#define ON      1
78#endif
79
80#ifndef MIN
81#define MIN(a,b) ((a) < (b) ? (a) : (b))
82#endif
83
84#ifndef MAX
85#define MAX(a,b) ((a) < (b) ? (b) : (a))
86#endif
87
88#define TD_OPERATION_INITIATOR    0x1
89#define TD_OPERATION_TARGET       0x2
90
91/* indices for mem_t structures */
92#define DEK_MEM_INDEX_1             15
93#define DEK_MEM_INDEX_2             16
94
95/* some useful macros */
96#ifndef AG_ALIGNSIZE
97#define AG_ALIGNSIZE(count, alignment) (bit32) ( (bitptr)(count)+(bitptr)(alignment) )
98#endif
99
100#define DEFAULT_KEY_BUFFER_SIZE             64
101
102/**< the default maximum number of phys */
103#ifdef FPGA_CARD
104
105#define TD_MAX_NUM_PHYS 2
106
107#else
108#define TD_MAX_NUM_PHYS 16
109#define TD_MAX_CARD_NUM 20
110#endif
111
112#define TD_CARD_ID_FREE     0
113#define TD_CARD_ID_ALLOC    1
114#define TD_CARD_ID_LEN      128
115
116/**< the maximum number of port context */
117/* should be the number of phyical phys in chip + 1 */
118#define TD_MAX_PORT_CONTEXT 16
119/**< the maximum number of target device */
120/* For Initiator and Target
121   this is initial value for MaxTargets in the configuration(adj) file */
122#define DEFAULT_MAX_DEV 256
123/* the maximum number of interrupt coalesce context */
124#define TD_MAX_INT_COALESCE 512
125
126#if (defined(__FreeBSD__))
127#define MAX_OUTSTANDING_IO_PER_LUN   64
128#else
129#define MAX_OUTSTANDING_IO_PER_LUN  254  //64
130#endif
131
132/* default values */
133#define DEFAULT_MAX_ACTIVE_IOS  128
134#define DEFAULT_NUM_REG_CLIENTS 256
135#define DEFAULT_NUM_INBOUND_QUEUE 1
136#define DEFAULT_NUM_OUTBOUND_QUEUE 1
137#define DEFAULT_INBOUND_QUEUE_SIZE 512
138#define DEFAULT_INBOUND_QUEUE_ELE_SIZE 128
139#define DEFAULT_OUTBOUND_QUEUE_SIZE 512
140#define DEFAULT_OUTBOUND_QUEUE_ELE_SIZE 128
141#define DEFAULT_OUTBOUND_QUEUE_INTERRUPT_DELAY 0
142#define DEFAULT_OUTBOUND_QUEUE_INTERRUPT_COUNT 1
143#define DEFAULT_OUTBOUND_INTERRUPT_ENABLE 1
144#define DEFAULT_INBOUND_QUEUE_PRIORITY         0
145#define DEFAULT_QUEUE_OPTION         0
146#define DEFAULT_FW_MAX_PORTS         8
147
148
149
150/* SAS device type definition. SAS spec(r.7) p206  */
151#define SAS_NO_DEVICE                    0
152#define SAS_END_DEVICE                   1
153#define SAS_EDGE_EXPANDER_DEVICE         2
154#define SAS_FANOUT_EXPANDER_DEVICE       3
155
156/* routing attributes */
157#define SAS_ROUTING_DIRECT                             0x00
158#define SAS_ROUTING_SUBTRACTIVE                        0x01
159#define SAS_ROUTING_TABLE                              0x02
160
161#define SAS_CONNECTION_RATE_1_5G                       0x08
162#define SAS_CONNECTION_RATE_3_0G                       0x09
163#define SAS_CONNECTION_RATE_6_0G                       0x0A
164#define SAS_CONNECTION_RATE_12_0G                      0x0B
165
166/**< defines the maximum number of expanders */
167#define TD_MAX_EXPANDER_PHYS                         256
168/**< the maximum number of expanders at TD */
169#define TD_MAX_EXPANDER 128
170
171/*****************************************************************************
172** SCSI Operation Codes (first byte in CDB)
173*****************************************************************************/
174
175
176#define SCSIOPC_TEST_UNIT_READY     0x00
177#define SCSIOPC_INQUIRY             0x12
178#define SCSIOPC_MODE_SENSE_6        0x1A
179#define SCSIOPC_MODE_SENSE_10       0x5A
180#define SCSIOPC_MODE_SELECT_6       0x15
181#define SCSIOPC_START_STOP_UNIT     0x1B
182#define SCSIOPC_READ_CAPACITY_10    0x25
183#define SCSIOPC_READ_CAPACITY_16    0x9E
184#define SCSIOPC_READ_6              0x08
185#define SCSIOPC_READ_10             0x28
186#define SCSIOPC_READ_12             0xA8
187#define SCSIOPC_READ_16             0x88
188#define SCSIOPC_WRITE_6             0x0A
189#define SCSIOPC_WRITE_10            0x2A
190#define SCSIOPC_WRITE_12            0xAA
191#define SCSIOPC_WRITE_16            0x8A
192#define SCSIOPC_WRITE_VERIFY        0x2E
193#define SCSIOPC_VERIFY_10           0x2F
194#define SCSIOPC_VERIFY_12           0xAF
195#define SCSIOPC_VERIFY_16           0x8F
196#define SCSIOPC_REQUEST_SENSE       0x03
197#define SCSIOPC_REPORT_LUN          0xA0
198#define SCSIOPC_FORMAT_UNIT         0x04
199#define SCSIOPC_SEND_DIAGNOSTIC     0x1D
200#define SCSIOPC_WRITE_SAME_10       0x41
201#define SCSIOPC_WRITE_SAME_16       0x93
202#define SCSIOPC_READ_BUFFER         0x3C
203#define SCSIOPC_WRITE_BUFFER        0x3B
204
205#define SCSIOPC_GET_CONFIG          0x46
206#define SCSIOPC_GET_EVENT_STATUS_NOTIFICATION        0x4a
207#define SCSIOPC_REPORT_KEY          0xA4
208#define SCSIOPC_SEND_KEY            0xA3
209#define SCSIOPC_READ_DVD_STRUCTURE  0xAD
210#define SCSIOPC_TOC                 0x43
211#define SCSIOPC_PREVENT_ALLOW_MEDIUM_REMOVAL         0x1E
212#define SCSIOPC_READ_VERIFY         0x42
213
214#define SCSIOPC_LOG_SENSE           0x4D
215#define SCSIOPC_LOG_SELECT          0x4C
216#define SCSIOPC_MODE_SELECT_6       0x15
217#define SCSIOPC_MODE_SELECT_10      0x55
218#define SCSIOPC_SYNCHRONIZE_CACHE_10 0x35
219#define SCSIOPC_SYNCHRONIZE_CACHE_16 0x91
220#define SCSIOPC_WRITE_AND_VERIFY_10 0x2E
221#define SCSIOPC_WRITE_AND_VERIFY_12 0xAE
222#define SCSIOPC_WRITE_AND_VERIFY_16 0x8E
223#define SCSIOPC_READ_MEDIA_SERIAL_NUMBER 0xAB
224#define SCSIOPC_REASSIGN_BLOCKS     0x07
225
226
227
228
229
230/*****************************************************************************
231** SCSI GENERIC 6 BYTE CDB
232*****************************************************************************/
233typedef struct CBD6_s {
234  bit8  opcode;
235  bit8  rsv; /* not 100% correct */
236  bit8  lba[2]; /* not 100% correct */
237  bit8  len;
238  bit8  control;
239} CDB6_t;
240
241
242
243/*****************************************************************************
244** SCSI GENERIC 10 BYTE CDB
245*****************************************************************************/
246typedef struct CBD10_s {
247  bit8  opcode;
248  bit8  rsv_service;
249  bit8  lba[4];
250  bit8  rsv;
251  bit8  len[2];
252  bit8  control;
253} CDB10_t;
254
255/*****************************************************************************
256** SCSI GENERIC 12 BYTE CDB
257*****************************************************************************/
258typedef struct CBD12_s {
259  bit8  opcode;
260  bit8  rsv_service;
261  bit8  lba[4];
262  bit8  len[4];
263  bit8  rsv;
264  bit8  control;
265} CDB12_t;
266
267
268/*****************************************************************************
269** SCSI GENERIC 16 BYTE CDB
270*****************************************************************************/
271typedef struct CBD16_s {
272  bit8  opcode;
273  bit8  rsv_service;
274  bit8  lba[4];
275  bit8  add_cdb[4];
276  bit8  len[4];
277  bit8  rsv;
278  bit8  control;
279} CDB16_t;
280
281#define BLOCK_BYTE_LENGTH             512
282
283/*****************************************************************************
284** SCSI STATUS BYTES
285*****************************************************************************/
286
287#define SCSI_STATUS_GOOD               0x00
288#define SCSI_STATUS_CHECK_CONDITION    0x02
289#define SCSI_STATUS_BUSY               0x08
290#define SCSI_STATUS_COMMAND_TERMINATED 0x22
291#define SCSI_STATUS_TASK_SET_FULL      0x28
292
293/*****************************************************************************
294** SAS TM Function data present see SAS spec p311 Table 109 (Revision 7)
295*****************************************************************************/
296#define NO_DATA            0
297#define RESPONSE_DATA      1
298#define SENSE_DATA         2
299
300/* 4 bytes, SAS spec p312 Table 110 (Revision 7) */
301#define RESPONSE_DATA_LEN  4
302
303#define SAS_CMND 0
304#define SAS_TM   1
305
306/* SMP frame type */
307#define SMP_REQUEST        0x40
308#define SMP_RESPONSE       0x41
309
310#define SMP_INITIATOR     0x01
311#define SMP_TARGET        0x02
312
313/* default SMP timeout: 0xFFFF is the Maximum Allowed */
314#define DEFAULT_SMP_TIMEOUT       0xFFFF
315
316/* SMP direct payload size limit: IOMB direct payload size = 48 */
317#define SMP_DIRECT_PAYLOAD_LIMIT 44
318
319/* SMP function */
320#define SMP_REPORT_GENERAL                         0x00
321#define SMP_REPORT_MANUFACTURE_INFORMATION         0x01
322#define SMP_READ_GPIO_REGISTER                     0x02
323#define SMP_DISCOVER                               0x10
324#define SMP_REPORT_PHY_ERROR_LOG                   0x11
325#define SMP_REPORT_PHY_SATA                        0x12
326#define SMP_REPORT_ROUTING_INFORMATION             0x13
327#define SMP_WRITE_GPIO_REGISTER                    0x82
328#define SMP_CONFIGURE_ROUTING_INFORMATION          0x90
329#define SMP_PHY_CONTROL                            0x91
330#define SMP_PHY_TEST_FUNCTION                      0x92
331#define SMP_PMC_SPECIFIC                           0xC0
332
333
334/* SMP function results */
335#define SMP_FUNCTION_ACCEPTED                      0x00
336#define UNKNOWN_SMP_FUNCTION                       0x01
337#define SMP_FUNCTION_FAILED                        0x02
338#define INVALID_REQUEST_FRAME_LENGTH               0x03
339#define INVALID_EXPANDER_CHANGE_COUNT              0x04
340#define SMP_FN_BUSY                                0x05
341#define INCOMPLETE_DESCRIPTOR_LIST                 0x06
342#define PHY_DOES_NOT_EXIST                         0x10
343#define INDEX_DOES_NOT_EXIST                       0x11
344#define PHY_DOES_NOT_SUPPORT_SATA                  0x12
345#define UNKNOWN_PHY_OPERATION                      0x13
346#define UNKNOWN_PHY_TEST_FUNCTION                  0x14
347#define PHY_TEST_FUNCTION_IN_PROGRESS              0x15
348#define PHY_VACANT                                 0x16
349#define UNKNOWN_PHY_EVENT_SOURCE                   0x17
350#define UNKNOWN_DESCRIPTOT_TYPE                    0x18
351#define UNKNOWN_PHY_FILETER                        0x19
352#define AFFILIATION_VIOLATION                      0x1A
353#define SMP_ZONE_VIOLATION                         0x20
354#define NO_MANAGEMENT_ACCESS_RIGHTS                0x21
355#define UNKNOWN_ENABLE_DISABLE_ZONING_VALUE        0x22
356#define ZONE_LOCK_VIOLATION                        0x23
357#define NOT_ACTIVATED                              0x24
358#define ZONE_GROUP_OUT_OF_RANGE                    0x25
359#define NO_PHYSICAL_PRESENCE                       0x26
360#define SAVING_NOT_SUPPORTED                       0x27
361#define SOURCE_ZONE_GROUP_DOES_NOT_EXIST           0x28
362#define DISABLED_PASSWORD_NOT_SUPPORTED            0x29
363
364/* SMP PHY CONTROL OPERATION */
365#define SMP_PHY_CONTROL_NOP                        0x00
366#define SMP_PHY_CONTROL_LINK_RESET                 0x01
367#define SMP_PHY_CONTROL_HARD_RESET                 0x02
368#define SMP_PHY_CONTROL_DISABLE                    0x03
369#define SMP_PHY_CONTROL_CLEAR_ERROR_LOG            0x05
370#define SMP_PHY_CONTROL_CLEAR_AFFILIATION          0x06
371#define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL        0x07
372
373
374#define IT_NEXUS_TIMEOUT    0x7D0 /* 2000 ms; old value was 0xFFFF */
375
376#define PORT_RECOVERY_TIMEOUT  ((IT_NEXUS_TIMEOUT/100) + 30)   /* 5000 ms; in 100ms; should be large than IT_NEXUS_TIMEOUT */
377
378#define STP_IDLE_TIME           5 /* 5 us; the defaulf of the controller */
379
380#define SET_ESGL_EXTEND(val) \
381 ((val) = (val) | 0x80000000)
382
383#define CLEAR_ESGL_EXTEND(val) \
384 ((val) = (val) & 0x7FFFFFFF)
385
386#define DEVINFO_GET_SAS_ADDRESSLO(devInfo) \
387  DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressLo)
388
389#define DEVINFO_GET_SAS_ADDRESSHI(devInfo) \
390  DMA_BEBIT32_TO_BIT32(*(bit32 *)(devInfo)->sasAddressHi)
391
392/* this macro is based on SAS spec, not sTSDK 0xC0 */
393#define DEVINFO_GET_DEVICETTYPE(devInfo) \
394  (((devInfo)->devType_S_Rate & 0xC0) >> 6)
395
396#define DEVINFO_GET_LINKRATE(devInfo) \
397  ((devInfo)->devType_S_Rate & 0x0F)
398
399#define DEVINFO_GET_EXT_MCN(devInfo) \
400  (((devInfo)->ext & 0x7800) >> 11)
401
402
403#define DEVINFO_PUT_SMPTO(devInfo, smpto) \
404  ((devInfo)->smpTimeout) = smpto
405
406#define DEVINFO_PUT_ITNEXUSTO(devInfo, itnexusto) \
407  ((devInfo)->it_NexusTimeout) = itnexusto
408
409#define DEVINFO_PUT_FBS(devInfo, fbs) \
410  ((devInfo)->firstBurstSize) = fbs
411
412#define DEVINFO_PUT_FLAG(devInfo, tlr) \
413  ((devInfo)->flag) = tlr
414
415#define DEVINFO_PUT_DEV_S_RATE(devInfo, dev_s_rate) \
416  ((devInfo)->devType_S_Rate) = dev_s_rate
417
418#define DEVINFO_PUT_SAS_ADDRESSLO(devInfo, src32) \
419  *(bit32 *)((devInfo)->sasAddressLo) = BIT32_TO_DMA_BEBIT32(src32)
420
421#define DEVINFO_PUT_SAS_ADDRESSHI(devInfo, src32) \
422  *(bit32 *)((devInfo)->sasAddressHi) = BIT32_TO_DMA_BEBIT32(src32)
423
424#define DEVICE_SSP_BIT         0x8   /* SSP Initiator port */
425#define DEVICE_STP_BIT         0x4   /* STP Initiator port */
426#define DEVICE_SMP_BIT         0x2   /* SMP Initiator port */
427#define DEVICE_SATA_BIT        0x1   /* SATA device, valid in the discovery response only */
428
429#define DEVICE_IS_SSP_INITIATOR(DeviceData) \
430  (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
431
432#define DEVICE_IS_STP_INITIATOR(DeviceData) \
433  (((DeviceData)->initiator_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
434
435#define DEVICE_IS_SMP_INITIATOR(DeviceData) \
436  (((DeviceData)->initiator_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
437
438#define DEVICE_IS_SSP_TARGET(DeviceData) \
439  (((DeviceData)->target_ssp_stp_smp & DEVICE_SSP_BIT) == DEVICE_SSP_BIT)
440
441#define DEVICE_IS_STP_TARGET(DeviceData) \
442  (((DeviceData)->target_ssp_stp_smp & DEVICE_STP_BIT) == DEVICE_STP_BIT)
443
444#define DEVICE_IS_SMP_TARGET(DeviceData) \
445  (((DeviceData)->target_ssp_stp_smp & DEVICE_SMP_BIT) == DEVICE_SMP_BIT)
446
447#define DEVICE_IS_SATA_DEVICE(DeviceData) \
448  (((DeviceData)->target_ssp_stp_smp & DEVICE_SATA_BIT) == DEVICE_SATA_BIT)
449
450
451
452
453/* Negotiated Phyical Link Rate
454#define Phy_ENABLED_UNKNOWN
455*/
456/* old SMP header definition */
457typedef struct tdssSMPFrameHeader_s
458{
459    bit8   smpFrameType;      /* The first byte of SMP frame represents the SMP FRAME TYPE */
460    bit8   smpFunction;       /* The second byte of the SMP frame represents the SMP FUNCTION */
461    bit8   smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */
462    bit8   smpReserved;       /* reserved */
463} tdssSMPFrameHeader_t;
464
465/****************************************************************
466 *            report general request
467 ****************************************************************/
468#ifdef FOR_COMPLETENESS
469typedef struct smpReqReportGeneral_s
470{
471  /* nothing. some compiler disallowed structure with no member */
472} smpReqReportGeneral_t;
473#endif
474
475/****************************************************************
476 *            report general response
477 ****************************************************************/
478#define REPORT_GENERAL_CONFIGURING_BIT     0x2
479#define REPORT_GENERAL_CONFIGURABLE_BIT    0x1
480
481typedef struct smpRespReportGeneral_s
482{
483  bit8   expanderChangeCount16[2];
484  bit8   expanderRouteIndexes16[2];
485  bit8   reserved1;
486  bit8   numOfPhys;
487  bit8   configuring_configurable;
488    /* B7-2 : reserved */
489    /* B1   : configuring */
490    /* B0   : configurable */
491  bit8   reserved4[17];
492} smpRespReportGeneral_t;
493
494#define REPORT_GENERAL_IS_CONFIGURING(pResp) \
495  (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURING_BIT) == \
496      REPORT_GENERAL_CONFIGURING_BIT)
497
498#define REPORT_GENERAL_IS_CONFIGURABLE(pResp) \
499  (((pResp)->configuring_configurable & REPORT_GENERAL_CONFIGURABLE_BIT) == \
500      REPORT_GENERAL_CONFIGURABLE_BIT)
501
502#define REPORT_GENERAL_GET_ROUTEINDEXES(pResp) \
503  DMA_BEBIT16_TO_BIT16(*(bit16 *)((pResp)->expanderRouteIndexes16))
504
505
506/****************************************************************
507 *            report manufacturer info response
508 ****************************************************************/
509typedef struct smpRespReportManufactureInfo_s
510{
511  bit8    reserved1[8];
512  bit8    vendorIdentification[8];
513  bit8    productIdentification[16];
514  bit8    productRevisionLevel[4];
515  bit8    vendorSpecific[20];
516} smpRespReportManufactureInfo_t;
517
518/****************************************************************
519 *           discover request
520 ****************************************************************/
521typedef struct smpReqDiscover_s
522{
523  bit32   reserved1;
524  bit8    reserved2;
525  bit8    phyIdentifier;
526  bit8    ignored;
527  bit8    reserved3;
528} smpReqDiscover_t;
529
530/****************************************************************
531 *           discover response
532 ****************************************************************/
533typedef struct smpRespDiscover_s
534{
535  bit8   reserved1[4];
536  bit8   reserved2;
537  bit8   phyIdentifier;
538  bit8   reserved3[2];
539  bit8   attachedDeviceType;
540    /* B7   : reserved */
541    /* B6-4 : attachedDeviceType */
542    /* B3-0 : reserved */
543  bit8   negotiatedPhyLinkRate;
544    /* B7-4 : reserved */
545    /* B3-0 : negotiatedPhyLinkRate */
546  bit8   attached_Ssp_Stp_Smp_Sata_Initiator;
547    /* B7-4 : reserved */
548    /* B3   : attachedSspInitiator */
549    /* B2   : attachedStpInitiator */
550    /* B1   : attachedSmpInitiator */
551    /* B0   : attachedSataHost */
552  bit8   attached_SataPS_Ssp_Stp_Smp_Sata_Target;
553    /* B7   : attachedSataPortSelector */
554    /* B6-4 : reserved */
555    /* B3   : attachedSspTarget */
556    /* B2   : attachedStpTarget */
557    /* B1   : attachedSmpTarget */
558    /* B0   : attachedSatadevice */
559  bit8   sasAddressHi[4];
560  bit8   sasAddressLo[4];
561  bit8   attachedSasAddressHi[4];
562  bit8   attachedSasAddressLo[4];
563  bit8   attachedPhyIdentifier;
564  bit8   reserved9[7];
565  bit8   programmedAndHardware_MinPhyLinkRate;
566    /* B7-4 : programmedMinPhyLinkRate */
567    /* B3-0 : hardwareMinPhyLinkRate */
568  bit8   programmedAndHardware_MaxPhyLinkRate;
569    /* B7-4 : programmedMaxPhyLinkRate */
570    /* B3-0 : hardwareMaxPhyLinkRate */
571  bit8   phyChangeCount;
572  bit8   virtualPhy_partialPathwayTimeout;
573    /* B7   : virtualPhy*/
574    /* B6-4 : reserved */
575    /* B3-0 : partialPathwayTimeout */
576  bit8   routingAttribute;
577    /* B7-4 : reserved */
578    /* B3-0 : routingAttribute */
579  bit8   reserved13[5];
580  bit8   vendorSpecific[2];
581} smpRespDiscover_t;
582
583#define DISCRSP_SSP_BIT    0x08
584#define DISCRSP_STP_BIT    0x04
585#define DISCRSP_SMP_BIT    0x02
586#define DISCRSP_SATA_BIT   0x01
587
588#define DISCRSP_SATA_PS_BIT   0x80
589
590#define DISCRSP_GET_ATTACHED_DEVTYPE(pResp) \
591  (((pResp)->attachedDeviceType & 0x70) >> 4)
592#define DISCRSP_GET_LINKRATE(pResp) \
593  ((bit8)((pResp)->negotiatedPhyLinkRate & 0x0F))
594
595#define DISCRSP_IS_SSP_INITIATOR(pResp) \
596  (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
597#define DISCRSP_IS_STP_INITIATOR(pResp) \
598  (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
599#define DISCRSP_IS_SMP_INITIATOR(pResp) \
600  (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
601#define DISCRSP_IS_SATA_HOST(pResp) \
602  (((pResp)->attached_Ssp_Stp_Smp_Sata_Initiator & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
603
604#define DISCRSP_IS_SSP_TARGET(pResp) \
605  (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SSP_BIT) == DISCRSP_SSP_BIT)
606#define DISCRSP_IS_STP_TARGET(pResp) \
607  (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_STP_BIT) == DISCRSP_STP_BIT)
608#define DISCRSP_IS_SMP_TARGET(pResp) \
609  (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SMP_BIT) == DISCRSP_SMP_BIT)
610#define DISCRSP_IS_SATA_DEVICE(pResp) \
611  (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_BIT) == DISCRSP_SATA_BIT)
612#define DISCRSP_IS_SATA_PORTSELECTOR(pResp) \
613  (((pResp)->attached_SataPS_Ssp_Stp_Smp_Sata_Target & DISCRSP_SATA_PS_BIT) == DISCRSP_SATA_PS_BIT)
614
615#define DISCRSP_GET_SAS_ADDRESSHI(pResp) \
616  DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressHi)
617#define DISCRSP_GET_SAS_ADDRESSLO(pResp) \
618  DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->sasAddressLo)
619
620#define DISCRSP_GET_ATTACHED_SAS_ADDRESSHI(pResp) \
621  DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressHi)
622#define DISCRSP_GET_ATTACHED_SAS_ADDRESSLO(pResp) \
623  DMA_BEBIT32_TO_BIT32(*(bit32 *)(pResp)->attachedSasAddressLo)
624
625#define DISCRSP_VIRTUALPHY_BIT 0x80
626#define DISCRSP_IS_VIRTUALPHY(pResp) \
627  (((pResp)->virtualPhy_partialPathwayTimeout & DISCRSP_VIRTUALPHY_BIT) == DISCRSP_VIRTUALPHY_BIT)
628
629#define DISCRSP_GET_ROUTINGATTRIB(pResp) \
630 ((bit8)((pResp)->routingAttribute & 0x0F))
631
632/****************************************************************
633 *            report route table request
634 ****************************************************************/
635typedef struct smpReqReportRouteTable_s
636{
637  bit8   reserved1[2];
638  bit8   expanderRouteIndex16[20];
639  bit8   reserved2;
640  bit8   phyIdentifier;
641  bit8   reserved3[2];
642} smpReqReportRouteTable_t;
643
644/****************************************************************
645 *            report route response
646 ****************************************************************/
647typedef struct smpRespReportRouteTable_s
648{
649  bit8   reserved1[2];
650  bit8   expanderRouteIndex16[2];
651  bit8   reserved2;
652  bit8   phyIdentifier;
653  bit8   reserved3[2];
654  bit8   disabled;
655    /* B7   : expander route entry disabled */
656    /* B6-0 : reserved */
657  bit8   reserved5[3];
658  bit8   routedSasAddressHi32[4];
659  bit8   routedSasAddressLo32[4];
660  bit8   reserved6[16];
661} smpRespReportRouteTable_t;
662
663/****************************************************************
664 *            configure route information request
665 ****************************************************************/
666typedef struct smpReqConfigureRouteInformation_s
667{
668  bit8   reserved1[2];
669  bit8   expanderRouteIndex[2];
670  bit8   reserved2;
671  bit8   phyIdentifier;
672  bit8   reserved3[2];
673  bit8   disabledBit_reserved4;
674  bit8   reserved5[3];
675  bit8   routedSasAddressHi[4];
676  bit8   routedSasAddressLo[4];
677  bit8   reserved6[16];
678} smpReqConfigureRouteInformation_t;
679
680/****************************************************************
681 *            configure route response
682 ****************************************************************/
683#ifdef FOR_COMPLETENESS
684typedef struct smpRespConfigureRouteInformation_s
685{
686  /* nothing. some compiler disallowed structure with no member */
687} smpRespConfigureRouteInformation_t;
688#endif
689
690/****************************************************************
691 *            report Phy Sata request
692 ****************************************************************/
693typedef struct smpReqReportPhySata_s
694{
695  bit8   reserved1[4];
696  bit8   reserved2;
697  bit8   phyIdentifier;
698  bit8   reserved3[2];
699} smpReqReportPhySata_t;
700
701/****************************************************************
702 *            report Phy Sata response
703 ****************************************************************/
704typedef struct smpRespReportPhySata_s
705{
706  bit8   reserved1[4];
707  bit8   reserved2;
708  bit8   phyIdentifier;
709  bit8   reserved3;
710  bit8   affiliations_sup_valid;
711    /* b7-2 : reserved */
712    /* b1   : Affiliations supported */
713    /* b0   : Affiliation valid */
714  bit8   reserved5[4];
715  bit8   stpSasAddressHi[4];
716  bit8   stpSasAddressLo[4];
717  bit8   regDevToHostFis[20];
718  bit8   reserved6[4];
719  bit8   affiliatedStpInitiatorSasAddressHi[4];
720  bit8   affiliatedStpInitiatorSasAddressLo[4];
721} smpRespReportPhySata_t;
722
723
724/****************************************************************
725 *            Phy Control request
726 ****************************************************************/
727typedef struct smpReqPhyControl_s
728{
729  bit8   reserved1[4];
730  bit8   reserved2;
731  bit8   phyIdentifier;
732  bit8   phyOperation;
733  bit8   updatePartialPathwayTOValue;
734    /* b7-1 : reserved */
735    /* b0   : update partial pathway timeout value */
736  bit8   reserved3[20];
737  bit8   programmedMinPhysicalLinkRate;
738    /* b7-4 : programmed Minimum Physical Link Rate*/
739    /* b3-0 : reserved */
740  bit8   programmedMaxPhysicalLinkRate;
741    /* b7-4 : programmed Maximum Physical Link Rate*/
742    /* b3-0 : reserved */
743  bit8   reserved4[2];
744  bit8   partialPathwayTOValue;
745    /* b7-4 : reserved */
746    /* b3-0 : partial Pathway TO Value */
747  bit8   reserved5[3];
748} smpReqPhyControl_t;
749
750/****************************************************************
751 *            Phy Control response
752 ****************************************************************/
753#ifdef FOR_COMPLETENESS
754typedef struct smpRespPhyControl_s
755{
756  /* nothing. some compiler disallowed structure with no member */
757} smpRespPhyControl_t;
758#endif
759
760
761/*****************************************************************************
762** SCSI SENSE KEY VALUES
763*****************************************************************************/
764
765#define SCSI_SNSKEY_NO_SENSE           0x00
766#define SCSI_SNSKEY_RECOVERED_ERROR    0x01
767#define SCSI_SNSKEY_NOT_READY          0x02
768#define SCSI_SNSKEY_MEDIUM_ERROR       0x03
769#define SCSI_SNSKEY_HARDWARE_ERROR     0x04
770#define SCSI_SNSKEY_ILLEGAL_REQUEST    0x05
771#define SCSI_SNSKEY_UNIT_ATTENTION     0x06
772#define SCSI_SNSKEY_DATA_PROTECT       0x07
773#define SCSI_SNSKEY_ABORTED_COMMAND    0x0B
774#define SCSI_SNSKEY_MISCOMPARE         0x0E
775
776/*****************************************************************************
777** SCSI Additional Sense Codes and Qualifiers combo two-bytes
778*****************************************************************************/
779
780#define SCSI_SNSCODE_NO_ADDITIONAL_INFO                         0x0000
781#define SCSI_SNSCODE_LUN_CRC_ERROR_DETECTED                     0x0803
782#define SCSI_SNSCODE_INVALID_COMMAND                            0x2000
783#define SCSI_SNSCODE_LOGICAL_BLOCK_OUT                          0x2100
784#define SCSI_SNSCODE_INVALID_FIELD_IN_CDB                       0x2400
785#define SCSI_SNSCODE_LOGICAL_NOT_SUPPORTED                      0x2500
786#define SCSI_SNSCODE_POWERON_RESET                              0x2900
787#define SCSI_SNSCODE_EVERLAPPED_CMDS                            0x4e00
788#define SCSI_SNSCODE_INTERNAL_TARGET_FAILURE                    0x4400
789#define SCSI_SNSCODE_MEDIUM_NOT_PRESENT                         0x3a00
790#define SCSI_SNSCODE_UNRECOVERED_READ_ERROR                     0x1100
791#define SCSI_SNSCODE_RECORD_NOT_FOUND                           0x1401
792#define SCSI_SNSCODE_NOT_READY_TO_READY_CHANGE                  0x2800
793#define SCSI_SNSCODE_OPERATOR_MEDIUM_REMOVAL_REQUEST            0x5a01
794#define SCSI_SNSCODE_INFORMATION_UNIT_CRC_ERROR                 0x4703
795#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS  0x0404
796#define SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE                 0x5d10
797#define SCSI_SNSCODE_LOW_POWER_CONDITION_ON                     0x5e00
798#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INIT_REQUIRED       0x0402
799#define SCSI_SNSCODE_INVALID_FIELD_PARAMETER_LIST               0x2600
800#define SCSI_SNSCODE_ATA_DEVICE_FAILED_SET_FEATURES             0x4471
801#define SCSI_SNSCODE_ATA_DEVICE_FEATURE_NOT_ENABLED             0x670B
802#define SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST              0x3E03
803#define SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR                     0x2C00
804#define SCSI_SNSCODE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE         0x2100
805#define SCSI_SNSCODE_LOGICAL_UNIT_FAILURE                       0x3E01
806#define SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED                 0x5300
807#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED 0x0402
808#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE          0x0400
809#define SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION           0x0500
810#define SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN         0x4000
811#define SCSI_SNSCODE_COMMANDS_CLEARED_BY_ANOTHER_INITIATOR      0x2F00
812#define SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED       0x0C02
813/*****************************************************************************
814** SCSI Additional Sense Codes and Qualifiers saparate bytes
815*****************************************************************************/
816
817#define SCSI_ASC_NOTREADY_INIT_CMD_REQ    0x04
818#define SCSI_ASCQ_NOTREADY_INIT_CMD_REQ   0x02
819
820
821/*****************************************************************************
822** Inquiry command fields and response sizes
823*****************************************************************************/
824#define SCSIOP_INQUIRY_CMDDT        0x02
825#define SCSIOP_INQUIRY_EVPD         0x01
826#define STANDARD_INQUIRY_SIZE       36
827#define SATA_PAGE83_INQUIRY_WWN_SIZE       16      /* SAT, revision8, Table81, p78, 12 + 4 */
828#define SATA_PAGE83_INQUIRY_NO_WWN_SIZE    76      /* SAT, revision8, Table81, p78, 72 + 4 */
829#define SATA_PAGE89_INQUIRY_SIZE    572     /* SAT, revision8, Table87, p84 */
830#define SATA_PAGE0_INQUIRY_SIZE     8       /* SPC-4, 7.6.9   Table331, p345 */
831#define SATA_PAGE80_INQUIRY_SIZE    24     /* SAT, revision8, Table79, p77 */
832
833
834/* not sure here */
835/* define byte swap macro */
836#define AGSA_FLIP_2_BYTES(_x) ((bit16)(((((bit16)(_x))&0x00FF)<<8)|  \
837                                     ((((bit16)(_x))&0xFF00)>>8)))
838
839#define AGSA_FLIP_4_BYTES(_x) ((bit32)(((((bit32)(_x))&0x000000FF)<<24)|  \
840                                     ((((bit32)(_x))&0x0000FF00)<<8)|   \
841                                     ((((bit32)(_x))&0x00FF0000)>>8)|   \
842                                     ((((bit32)(_x))&0xFF000000)>>24)))
843
844
845/*********************************************************************
846** BUFFER CONVERTION MACROS
847*********************************************************************/
848
849/*********************************************************************
850* CPU buffer access macro                                            *
851*                                                                    *
852*/
853
854#define OSSA_OFFSET_OF(STRUCT_TYPE, FEILD)              \
855        (bitptr)&(((STRUCT_TYPE *)0)->FEILD)
856
857
858#if defined(SA_CPU_LITTLE_ENDIAN)
859
860#define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
861        (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16);
862
863#define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
864        (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32);
865
866#define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
867        (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET))))
868
869#define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
870        (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET))))
871
872#define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
873        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)((((bit16)VALUE16)>>8)&0xFF);  \
874        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)(((bit16)VALUE16)&0xFF);
875
876#define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
877        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)((((bit32)VALUE32)>>24)&0xFF); \
878        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>16)&0xFF); \
879        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>8)&0xFF);  \
880        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)(((bit32)VALUE32)&0xFF);
881
882#define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
883        (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
884        (*(bit8 *)(((bit8 *)ADDR16)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1)));
885
886#define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
887        (*(bit8 *)(((bit8 *)ADDR32)+3)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
888        (*(bit8 *)(((bit8 *)ADDR32)+2)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \
889        (*(bit8 *)(((bit8 *)ADDR32)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \
890        (*(bit8 *)(((bit8 *)ADDR32)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3)));
891
892#define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN)                        \
893        si_memcpy(DEST_ADDR, SRC_ADDR, LEN);
894
895
896#elif defined(SA_CPU_BIG_ENDIAN)
897
898#define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
899        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit16)VALUE16)>>8)&0xFF);   \
900        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)(((bit16)VALUE16)&0xFF);
901
902#define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
903        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)((((bit32)VALUE32)>>24)&0xFF);  \
904        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>16)&0xFF);  \
905        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>8)&0xFF);   \
906        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)(((bit32)VALUE32)&0xFF);
907
908#define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
909        (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
910        (*(bit8 *)(((bit8 *)ADDR16)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1)));
911
912#define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
913        (*((bit8 *)(((bit8 *)ADDR32)+3))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
914        (*((bit8 *)(((bit8 *)ADDR32)+2))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \
915        (*((bit8 *)(((bit8 *)ADDR32)+1))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \
916        (*((bit8 *)(((bit8 *)ADDR32))))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3)));
917
918#define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)         \
919        (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16);
920
921#define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)         \
922        (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32);
923
924#define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)           \
925        (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET))));
926
927#define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)           \
928        (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET))));
929
930#define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN)    \
931        si_memcpy(DEST_ADDR, SRC_ADDR, LEN);
932
933#else
934
935#error (Host CPU endianess undefined!!)
936
937#endif
938
939
940#if defined(SA_CPU_LITTLE_ENDIAN)
941
942#ifndef LEBIT16_TO_BIT16
943#define LEBIT16_TO_BIT16(_x)   (_x)
944#endif
945
946#ifndef BIT16_TO_LEBIT16
947#define BIT16_TO_LEBIT16(_x)   (_x)
948#endif
949
950#ifndef BIT16_TO_BEBIT16
951#define BIT16_TO_BEBIT16(_x)   AGSA_FLIP_2_BYTES(_x)
952#endif
953
954#ifndef BEBIT16_TO_BIT16
955#define BEBIT16_TO_BIT16(_x)   AGSA_FLIP_2_BYTES(_x)
956#endif
957
958#ifndef LEBIT32_TO_BIT32
959#define LEBIT32_TO_BIT32(_x)   (_x)
960#endif
961
962#ifndef BIT32_TO_LEBIT32
963#define BIT32_TO_LEBIT32(_x)   (_x)
964#endif
965
966
967#ifndef BEBIT32_TO_BIT32
968#define BEBIT32_TO_BIT32(_x)   AGSA_FLIP_4_BYTES(_x)
969#endif
970
971#ifndef BIT32_TO_BEBIT32
972#define BIT32_TO_BEBIT32(_x)   AGSA_FLIP_4_BYTES(_x)
973#endif
974
975#elif defined(SA_CPU_BIG_ENDIAN)
976
977#ifndef LEBIT16_TO_BIT16
978#define LEBIT16_TO_BIT16(_x)   AGSA_FLIP_2_BYTES(_x)
979#endif
980
981#ifndef BIT16_TO_LEBIT16
982#define BIT16_TO_LEBIT16(_x)   AGSA_FLIP_2_BYTES(_x)
983#endif
984
985#ifndef BIT16_TO_BEBIT16
986#define BIT16_TO_BEBIT16(_x)   (_x)
987#endif
988
989#ifndef BEBIT16_TO_BIT16
990#define BEBIT16_TO_BIT16(_x)   (_x)
991#endif
992
993#ifndef LEBIT32_TO_BIT32
994#define LEBIT32_TO_BIT32(_x)   AGSA_FLIP_4_BYTES(_x)
995#endif
996
997#ifndef BIT32_TO_LEBIT32
998#define BIT32_TO_LEBIT32(_x)   AGSA_FLIP_4_BYTES(_x)
999#endif
1000
1001#ifndef BEBIT32_TO_BIT32
1002#define BEBIT32_TO_BIT32(_x)   (_x)
1003#endif
1004
1005#ifndef BIT32_TO_BEBIT32
1006#define BIT32_TO_BEBIT32(_x)   (_x)
1007#endif
1008
1009#else
1010
1011#error No definition of SA_CPU_BIG_ENDIAN or SA_CPU_LITTLE_ENDIAN
1012
1013#endif
1014
1015
1016#define TargetUnknown   0
1017#define TargetRead      1
1018#define TargetWrite     2
1019
1020
1021#define CDB_GRP_MASK    0xE0   /* 1110 0000 */
1022#define CDB_6BYTE       0x00
1023#define CDB_10BYTE1     0x20
1024#define CDB_10BYTE2     0x40
1025#define CDB_12BYTE      0xA0
1026#define CDB_16BYTE      0x80
1027
1028/* ATA device type */
1029#define SATA_ATA_DEVICE                           0x01                       /**< ATA ATA device type */
1030#define SATA_ATAPI_DEVICE                         0x02                       /**< ATA ATAPI device type */
1031#define SATA_PM_DEVICE                            0x03                       /**< ATA PM device type */
1032#define SATA_SEMB_DEVICE                          0x04                       /**< ATA SEMB device type */
1033#define SATA_SEMB_WO_SEP_DEVICE                   0x05                       /**< ATA SEMB without SEP device type */
1034#define UNKNOWN_DEVICE                            0xFF
1035
1036/****************************************************************
1037 *            SATA Specification related defines                *
1038 ****************************************************************/
1039#define SATA_MAX_QUEUED_COMMANDS                      32
1040#define SATA_MAX_PM_PORTS                             15
1041
1042
1043/* PMC IOCTL signature */
1044#define PMC_IOCTL_SIGNATURE   0x1234
1045
1046
1047
1048/*
1049 *  FIS type
1050 */
1051#define PIO_SETUP_DEV_TO_HOST_FIS   0x5F
1052#define REG_DEV_TO_HOST_FIS         0x34
1053#define SET_DEV_BITS_FIS            0xA1
1054
1055#define TD_ASSERT OS_ASSERT
1056
1057#ifdef TD_DISCOVER
1058#define TDSA_DISCOVERY_OPTION_FULL_START 0
1059#define TDSA_DISCOVERY_OPTION_INCREMENTAL_START 1
1060#define TDSA_DISCOVERY_OPTION_ABORT 2
1061
1062#define TDSA_DISCOVERY_TYPE_SAS 0
1063#define TDSA_DISCOVERY_TYPE_SATA 1
1064
1065
1066#define DISCOVERY_TIMER_VALUE (2 * 1000 * 1000)       /* 2 seconds */
1067#define DISCOVERY_RETRIES     3
1068#define CONFIGURE_ROUTE_TIMER_VALUE (1 * 1000 * 1000)       /* 1 seconds */
1069#define DEVICE_REGISTRATION_TIMER_VALUE (2 * 1000 * 1000)       /* 2 seconds */
1070#define SMP_RETRIES     5
1071#define SMP_BUSY_TIMER_VALUE (1 * 1000 * 1000)       /* 1 second */
1072#define SMP_BUSY_RETRIES     5
1073#define SATA_ID_DEVICE_DATA_TIMER_VALUE (3 * 1000 * 1000)       /* 3 second */
1074#define SATA_ID_DEVICE_DATA_RETRIES     3
1075#define BC_TIMER_VALUE (5 * 1000 * 1000 )      /* 5 second */
1076#define SMP_TIMER_VALUE (10 * 1000 * 1000)       /* 10 second */
1077
1078#endif
1079#define STP_DEVICE_TYPE 0     /* SATA behind expander 00*/
1080#define SAS_DEVICE_TYPE 1     /* SSP or SMP 01 */
1081#define SATA_DEVICE_TYPE 2    /* direct SATA 10 */
1082
1083#define ATAPI_DEVICE_FLAG 0x200000   /* ATAPI device flag*/
1084
1085#define TD_INTERNAL_TM_RESET 0xFF
1086
1087/* in terms of Kbytes*/
1088#define HOST_EVENT_LOG_SIZE  128
1089#define DEFAULT_EVENT_LOG_OPTION 3
1090
1091/* Device state */
1092#define SAT_DEV_STATE_NORMAL                  0  /* Normal */
1093#define SAT_DEV_STATE_IN_RECOVERY             1  /* SAT in recovery mode */
1094#define SAT_DEV_STATE_FORMAT_IN_PROGRESS      2  /* Format unit in progress */
1095#define SAT_DEV_STATE_SMART_THRESHOLD         3  /* SMART Threshold Exceeded Condition*/
1096#define SAT_DEV_STATE_LOW_POWER               4  /* Low Power State*/
1097
1098#define TD_GET_PHY_ID(input) (input & 0x0F)
1099#define TD_GET_PHY_NUMS(input) ((input & 0xF0) >> 4)
1100#define TD_GET_LINK_RATE(input) ((input & 0xFF00) >> 8)
1101#define TD_GET_PORT_STATE(input) ((input & 0xF0000) >> 16)
1102#define TD_GET_PHY_STATUS(input) ((input & 0xFF00) >> 8)
1103#define TD_GET_RESET_STATUS(input) ((input & 0xFF00) >> 8)
1104
1105#define TD_MAX_NUM_NOTIFY_SPINUP 20
1106
1107#define SPC_VPD_SIGNATURE     0xFEDCBA98
1108
1109#define TD_GET_FRAME_TYPE(input)    (input & 0xFF)
1110#define TD_GET_TLR(input)           ((input & 0x300) >> 8)
1111
1112/* PORT RESET TMO is in 100ms */
1113#define SAS_PORT_RESET_TMO          3 /* 300 ms */
1114#define SATA_PORT_RESET_TMO         80 /* 8000 ms = 8 sec */
1115#define SAS_12G_PORT_RESET_TMO      8 /* 800 ms */
1116
1117/* task attribute based on sTSDK API */
1118#define TD_TASK_SIMPLE         0x0       /* Simple        */
1119#define TD_TASK_ORDERED        0x2       /* Ordered       */
1120#define TD_TASK_HEAD_OF_QUEUE  0x1       /* Head of Queue */
1121#define TD_TASK_ACA            0x4       /* ACA           */
1122
1123/* compiler flag for direct smp */
1124#define DIRECT_SMP
1125//#undef DIRECT_SMP
1126
1127#define CONFIGURE_FW_MAX_PORTS 0x20000000
1128
1129#define NO_ACK  0xFFFF
1130
1131#define OPEN_RETRY_RETRIES  10
1132
1133#ifdef AGTIAPI_CTL
1134/* scsi command/page */
1135#define MODE_SELECT          0x15
1136#define PAGE_FORMAT          0x10
1137#define DR_MODE_PG_SZ        16
1138#define DR_MODE_PG_CODE      0x02
1139#define DR_MODE_PG_LENGTH    0x0e
1140#endif /* AGTIAPI_CTL */
1141
1142enum td_locks_e
1143{
1144  /* for tdsaAllShared->FreeDeviceList, tdsaAllShared->MainDeviceList,
1145    oneDeviceData->MainLink, oneDeviceData->FreeLink */
1146  TD_DEVICE_LOCK,
1147  /* for tdsaAllShared->FreePortContextList, tdsaAllShared->MainPortContextList,
1148    onePortContext->MainLink, onePortContext->FreeLink */
1149  TD_PORT_LOCK,
1150  /* for onePortContext->discovery.discoveringExpanderList,
1151    onePortContext->discovery.UpdiscoveringExpanderList,
1152    tdsaAllShared->freeExpanderList */
1153  TD_DISC_LOCK,
1154  /* for onePortContext->discovery.DiscoverySMPTimer,
1155   oneDeviceData->SATAIDDeviceTimer, discovery->discoveryTimer,
1156   discovery->SMPBusyTimer, discovery->BCTimer,
1157   discovery->deviceRegistrationTimer, discovery->configureRouteTimer,
1158   tdsaAllShared->itdsaIni->timerlist, tdsaAllShared->timerlist */
1159  TD_TIMER_LOCK,
1160#ifdef INITIATOR_DRIVER
1161  /* for     tdsaAllShared->pEsglAllInfo->freelist
1162    tdsaAllShared->pEsglAllInfo->NumFreeEsglPages
1163    tdsaAllShared->pEsglPageInfo->tdlist */
1164  TD_ESGL_LOCK,
1165  /* for satIOContext->pSatDevData->satVerifyState,
1166    satIOContext->pSatDevData->satSectorDone,
1167    satIOContext->pSatDevData->satPendingNCQIO,
1168    satIOContext->pSatDevData->satPendingIO,
1169    satIOContext->pSatDevData->satPendingNONNCQIO,
1170    satIOContext->pSatDevData->satFreeIntIoLinkList,
1171    satIOContext->pSatDevData->satActiveIntIoLinkList,
1172    satIOContext->pSatDevData->freeSATAFDMATagBitmap,
1173    satIOContext->satIoContextLink,
1174    oneDeviceData->satDevData.satIoLinkList */
1175  TD_SATA_LOCK,
1176#ifdef TD_INT_COALESCE
1177  /* for tdsaIntCoalCxt->FreeLink, tdsaIntCoalCxt->MainLink,
1178    tdsaIntCoalCxtHead->FreeLink, tdsaIntCoalCxtHead->MainLink */
1179  TD_INTCOAL_LOCK,
1180#endif
1181#endif
1182#ifdef TARGET_DRIVER
1183  /* for tdsaAllShared->ttdsaTgt->ttdsaXchgData.xchgFreeList,
1184    tdsaAllShared->ttdsaTgt->ttdsaXchgData.xchgBusyList */
1185  TD_TGT_LOCK,
1186#endif
1187  TD_MAX_LOCKS
1188};
1189
1190#define TD_GET_SAS_ADDRESSLO(sasAddressLo)                  \
1191    DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo)
1192
1193#define TD_GET_SAS_ADDRESSHI(sasAddressHi)                  \
1194    DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi)
1195
1196#define TD_XFER_RDY_PRIORTY_DEVICE_FLAG (1 << 22)
1197
1198
1199#ifdef FDS_DM
1200/* bit32 -> bit8 array[4] */
1201#define PORTINFO_PUT_SAS_LOCAL_ADDRESSLO(portInfo, src32) \
1202  *(bit32 *)((portInfo)->sasLocalAddressLo) = BIT32_TO_DMA_BEBIT32(src32)
1203
1204#define PORTINFO_PUT_SAS_LOCAL_ADDRESSHI(portInfo, src32) \
1205  *(bit32 *)((portInfo)->sasLocalAddressHi) = BIT32_TO_DMA_BEBIT32(src32)
1206/* bit32 -> bit8 array[4] */
1207#define PORTINFO_PUT_SAS_REMOTE_ADDRESSLO(portInfo, src32) \
1208  *(bit32 *)((portInfo)->sasRemoteAddressLo) = BIT32_TO_DMA_BEBIT32(src32)
1209#define PORTINFO_PUT_SAS_REMOTE_ADDRESSHI(portInfo, src32) \
1210  *(bit32 *)((portInfo)->sasRemoteAddressHi) = BIT32_TO_DMA_BEBIT32(src32)
1211#endif /* FDS_DM */
1212
1213#ifdef FDS_SM
1214/* this applies to ID data and all other SATA IOs */
1215#define SM_RETRIES 10
1216#endif
1217
1218#define TI_TIROOT_TO_tdsaRoot(t_r)        (((tdsaRoot_t *)((tiRoot_t *)t_r)->tdData) )
1219
1220#define TI_TIROOT_TO_tdsaAllShared(t_r1)  (tdsaContext_t *)&(t_r1->tdsaAllShared)
1221
1222#define TI_TIROOT_TO_agroot(t_r2)  (agsaRoot_t *)&((t_r2)->agRootNonInt)
1223
1224
1225#define TI_TIROOT_TO_AGROOT(t_root) (TI_TIROOT_TO_agroot(TI_TIROOT_TO_tdsaAllShared(TI_TIROOT_TO_tdsaRoot(t_root)) ))
1226
1227#define TI_VEN_DEV_SPC                            0x80010000
1228#define TI_VEN_DEV_SPCADAP                        0x80810000
1229#define TI_VEN_DEV_SPCv                           0x80080000
1230#define TI_VEN_DEV_SPCve                          0x80090000
1231#define TI_VEN_DEV_SPCvplus                       0x80180000
1232#define TI_VEN_DEV_SPCveplus                      0x80190000
1233#define TI_VEN_DEV_SPCADAPvplus                   0x80880000
1234#define TI_VEN_DEV_SPCADAPveplus                  0x80890000
1235
1236#define TI_VEN_DEV_SPC12Gv                        0x80700000
1237#define TI_VEN_DEV_SPC12Gve                       0x80710000
1238#define TI_VEN_DEV_SPC12Gvplus                    0x80720000
1239#define TI_VEN_DEV_SPC12Gveplus                   0x80730000
1240#define TI_VEN_DEV_9015                           0x90150000
1241#define TI_VEN_DEV_SPC12ADP                       0x80740000 /* 8 ports KBP added*/
1242#define TI_VEN_DEV_SPC12ADPP                      0x80760000 /* 16 ports  */
1243#define TI_VEN_DEV_SPC12SATA                      0x80060000 /* SATA HBA */
1244#define TI_VEN_DEV_9060                           0x90600000
1245
1246#define tIsSPC(agr)           (TI_VEN_DEV_SPC           == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */
1247#define tIsSPCHIL(agr)        (TI_VEN_DEV_SPCADAP       == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC */
1248#define tIsSPCv(agr)          (TI_VEN_DEV_SPCv          == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv */
1249#define tIsSPCve(agr)         (TI_VEN_DEV_SPCve         == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve */
1250#define tIsSPCvplus(agr)      (TI_VEN_DEV_SPCvplus      == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */
1251#define tIsSPCveplus(agr)     (TI_VEN_DEV_SPCveplus     == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */
1252#define tIsSPCADAPvplus(agr)  (TI_VEN_DEV_SPCADAPvplus  == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCv+ */
1253#define tIsSPCADAPveplus(agr) (TI_VEN_DEV_SPCADAPveplus == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPCve+ */
1254
1255#define tIsSPC12Gv(agr)       (TI_VEN_DEV_SPC12Gv       == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gv */
1256#define tIsSPC12Gve(agr)      (TI_VEN_DEV_SPC12Gve      == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve */
1257#define tIsSPC12Gvplus(agr)   (TI_VEN_DEV_SPC12Gvplus   == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gv+ */
1258#define tIsSPC12Gveplus(agr)  (TI_VEN_DEV_SPC12Gveplus  == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve+ */
1259#define tIsSPC9015(agr)       (TI_VEN_DEV_9015          == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve+ */
1260#define tIsSPC9060(agr)       (TI_VEN_DEV_9060          == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0) /* returns true config space read is SPC12Gve+ */
1261#define tIsSPC12ADP(agr)      (TI_VEN_DEV_SPC12ADP      == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
1262#define tIsSPC12ADPP(agr)     (TI_VEN_DEV_SPC12ADPP     == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
1263#define tIsSPC12SATA(agr)     (TI_VEN_DEV_SPC12SATA     == (ossaHwRegReadConfig32(agr,0 ) & 0xFFFF0000) ? 1 : 0)
1264
1265#define tiIS_SPC(agr) (( tIsSPC((agr))    == 1) ? 1 : \
1266                       ( tIsSPCHIL((agr)) == 1) ? 1 : 0 )
1267
1268#define tiIS_HIL(agr) ((tIsSPCHIL ((agr))       == 1) ? 1 : \
1269                       (tIsSPCADAPvplus((agr))  == 1) ? 1 : \
1270                       (tIsSPCADAPveplus((agr)) == 1) ? 1 : 0 )
1271
1272#define tiIS_SPC6V(agr) ((tIsSPCv((agr))          == 1) ? 1 : \
1273                         (tIsSPCve((agr))         == 1) ? 1 : \
1274                         (tIsSPCvplus((agr))      == 1) ? 1 : \
1275                         (tIsSPCveplus((agr))     == 1) ? 1 : \
1276                         (tIsSPCADAPvplus((agr))  == 1) ? 1 : \
1277                         (tIsSPCADAPveplus((agr)) == 1) ? 1 : 0 )
1278
1279#define tIsSPCV12G(agr)   ((tIsSPC12Gv(agr) == 1)     ? 1 : \
1280                           (tIsSPC12Gve(agr) == 1)    ? 1 : \
1281                           (tIsSPC12Gvplus(agr)== 1)  ? 1 : \
1282                           (tIsSPC12Gveplus(agr)== 1) ? 1 : \
1283                           (tIsSPC9015(agr)== 1)      ? 1 : \
1284                           (tIsSPC12ADP(agr)== 1)     ? 1 : \
1285                           (tIsSPC12ADPP(agr)== 1)    ? 1 : \
1286                           (tIsSPC12SATA(agr)   == 1) ? 1 : \
1287                           (tIsSPC9060(agr)     == 1) ? 1 : 0)
1288
1289#define tiIS_8PHY(agr) ((tIsSPCv((agr))     == 1) ? 1 : \
1290                        (tIsSPCve((agr))    == 1) ? 1 : \
1291                        (tIsSPC12Gv((agr))  == 1) ? 1 : \
1292                        (tIsSPC12Gve((agr)) == 1) ? 1 : \
1293                        (tIsSPC12ADP(agr)   == 1) ? 1 : 0 )
1294
1295#define tiIS_16PHY(agr) ((tIsSPCvplus((agr))      == 1) ? 1 : \
1296                         (tIsSPCveplus((agr))     == 1) ? 1 : \
1297                         (tIsSPCADAPvplus((agr))  == 1) ? 1 : \
1298                         (tIsSPCADAPveplus((agr)) == 1) ? 1 : \
1299                         (tIsSPC12ADPP(agr)       == 1) ? 1 : \
1300                         (tIsSPC12SATA(agr)       == 1) ? 1 : 0 )
1301
1302#define tiIS_SPC_ENC(agr)((tIsSPCve((agr))         == 1) ? 1 : \
1303                          (tIsSPCveplus((agr))     == 1) ? 1 : \
1304                          (tIsSPCADAPveplus((agr)) == 1) ? 1 : 0 )
1305
1306#define tIsSPCV12or6G(agr)  ((tiIS_SPC6V(agr) == 1) ? 1 : \
1307                             (tIsSPCV12G(agr) == 1) ? 1 :  0)
1308
1309#endif /* __TDDEFS_H__ */
1310