xref: /freebsd/sys/dev/pms/RefTisa/sat/src/smdefs.h (revision 2ff63af9b88c7413b7d71715b5532625752a248e)
1*4e1bc9a0SAchim Leubner /*******************************************************************************
2*4e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*4e1bc9a0SAchim Leubner *
4*4e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*4e1bc9a0SAchim Leubner *that the following conditions are met:
6*4e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*4e1bc9a0SAchim Leubner *following disclaimer.
8*4e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
9*4e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*4e1bc9a0SAchim Leubner *with the distribution.
11*4e1bc9a0SAchim Leubner *
12*4e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*4e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*4e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*4e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*4e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*4e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*4e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*4e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*4e1bc9a0SAchim Leubner *
21*4e1bc9a0SAchim Leubner *
22*4e1bc9a0SAchim Leubner ********************************************************************************/
23*4e1bc9a0SAchim Leubner #ifndef __SMDEFS_H__
24*4e1bc9a0SAchim Leubner #define __SMDEFS_H__
25*4e1bc9a0SAchim Leubner 
26*4e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/ossa.h>
27*4e1bc9a0SAchim Leubner 
28*4e1bc9a0SAchim Leubner /* the index for memory requirement, must be continious */
29*4e1bc9a0SAchim Leubner #define SM_ROOT_MEM_INDEX                          0                       /**< the index of dm root memory */
30*4e1bc9a0SAchim Leubner #define SM_DEVICE_MEM_INDEX                        1                       /**< the index of Device descriptors memory */
31*4e1bc9a0SAchim Leubner #define SM_IO_MEM_INDEX                            2                       /**< the index of IO command descriptors memory */
32*4e1bc9a0SAchim Leubner 
33*4e1bc9a0SAchim Leubner 
34*4e1bc9a0SAchim Leubner #define SM_MAX_DEV                              256
35*4e1bc9a0SAchim Leubner #define SM_MAX_IO                               1024
36*4e1bc9a0SAchim Leubner 
37*4e1bc9a0SAchim Leubner #define SM_USECS_PER_TICK                       1000000                   /**< defines the heart beat of the LL layer 10ms */
38*4e1bc9a0SAchim Leubner 
39*4e1bc9a0SAchim Leubner enum sm_locks_e
40*4e1bc9a0SAchim Leubner {
41*4e1bc9a0SAchim Leubner   SM_TIMER_LOCK = 0,
42*4e1bc9a0SAchim Leubner   SM_DEVICE_LOCK,
43*4e1bc9a0SAchim Leubner   SM_INTERNAL_IO_LOCK,
44*4e1bc9a0SAchim Leubner   SM_EXTERNAL_IO_LOCK,
45*4e1bc9a0SAchim Leubner   SM_NCQ_TAG_LOCK,
46*4e1bc9a0SAchim Leubner   SM_TBD_LOCK,
47*4e1bc9a0SAchim Leubner   SM_MAX_LOCKS
48*4e1bc9a0SAchim Leubner };
49*4e1bc9a0SAchim Leubner 
50*4e1bc9a0SAchim Leubner /* ATA device type */
51*4e1bc9a0SAchim Leubner #define SATA_ATA_DEVICE                           0x01                       /**< ATA ATA device type */
52*4e1bc9a0SAchim Leubner #define SATA_ATAPI_DEVICE                         0x02                       /**< ATA ATAPI device type */
53*4e1bc9a0SAchim Leubner #define SATA_PM_DEVICE                            0x03                       /**< ATA PM device type */
54*4e1bc9a0SAchim Leubner #define SATA_SEMB_DEVICE                          0x04                       /**< ATA SEMB device type */
55*4e1bc9a0SAchim Leubner #define SATA_SEMB_WO_SEP_DEVICE                   0x05                       /**< ATA SEMB without SEP device type */
56*4e1bc9a0SAchim Leubner #define UNKNOWN_DEVICE                            0xFF
57*4e1bc9a0SAchim Leubner 
58*4e1bc9a0SAchim Leubner /*
59*4e1bc9a0SAchim Leubner  *  FIS type
60*4e1bc9a0SAchim Leubner  */
61*4e1bc9a0SAchim Leubner #define PIO_SETUP_DEV_TO_HOST_FIS   0x5F
62*4e1bc9a0SAchim Leubner #define REG_DEV_TO_HOST_FIS         0x34
63*4e1bc9a0SAchim Leubner #define SET_DEV_BITS_FIS            0xA1
64*4e1bc9a0SAchim Leubner 
65*4e1bc9a0SAchim Leubner /*
66*4e1bc9a0SAchim Leubner  * ATA Command code
67*4e1bc9a0SAchim Leubner  */
68*4e1bc9a0SAchim Leubner #define SAT_READ_FPDMA_QUEUED                 0x60
69*4e1bc9a0SAchim Leubner #define SAT_READ_DMA_EXT                      0x25
70*4e1bc9a0SAchim Leubner #define SAT_READ_DMA                          0xC8
71*4e1bc9a0SAchim Leubner #define SAT_WRITE_FPDMA_QUEUED                0x61
72*4e1bc9a0SAchim Leubner #define SAT_WRITE_DMA_EXT                     0x35
73*4e1bc9a0SAchim Leubner #define SAT_WRITE_DMA_FUA_EXT                 0x3D
74*4e1bc9a0SAchim Leubner #define SAT_WRITE_DMA                         0xCA
75*4e1bc9a0SAchim Leubner #define SAT_CHECK_POWER_MODE                  0xE5
76*4e1bc9a0SAchim Leubner #define SAT_READ_LOG_EXT                      0x2F
77*4e1bc9a0SAchim Leubner #define SAT_READ_VERIFY_SECTORS               0x40
78*4e1bc9a0SAchim Leubner #define SAT_READ_VERIFY_SECTORS_EXT           0x42
79*4e1bc9a0SAchim Leubner #define SAT_SMART                             0xB0
80*4e1bc9a0SAchim Leubner #define SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE   0xD4
81*4e1bc9a0SAchim Leubner #define SAT_SMART_RETURN_STATUS               0xDA
82*4e1bc9a0SAchim Leubner #define SAT_SMART_READ_LOG                    0xD5
83*4e1bc9a0SAchim Leubner #define SAT_SMART_ENABLE_OPERATIONS           0xD8
84*4e1bc9a0SAchim Leubner #define SAT_SMART_DISABLE_OPERATIONS          0xD9
85*4e1bc9a0SAchim Leubner #define SAT_FLUSH_CACHE                       0xE7
86*4e1bc9a0SAchim Leubner #define SAT_FLUSH_CACHE_EXT                   0xEA
87*4e1bc9a0SAchim Leubner #define SAT_STANDBY                           0xE2
88*4e1bc9a0SAchim Leubner #define SAT_MEDIA_EJECT                       0xED
89*4e1bc9a0SAchim Leubner #define SAT_WRITE_SECTORS                     0x30
90*4e1bc9a0SAchim Leubner #define SAT_WRITE_SECTORS_EXT                 0x34
91*4e1bc9a0SAchim Leubner #define SAT_READ_SECTORS                      0x20
92*4e1bc9a0SAchim Leubner #define SAT_READ_SECTORS_EXT                  0x24
93*4e1bc9a0SAchim Leubner #define SAT_GET_MEDIA_STATUS                  0xDA
94*4e1bc9a0SAchim Leubner #define SAT_SET_FEATURES                      0xEF
95*4e1bc9a0SAchim Leubner #define SAT_IDENTIFY_DEVICE                   0xEC
96*4e1bc9a0SAchim Leubner #define SAT_READ_BUFFER                       0xE4
97*4e1bc9a0SAchim Leubner #define SAT_WRITE_BUFFER                      0xE8
98*4e1bc9a0SAchim Leubner 
99*4e1bc9a0SAchim Leubner /*
100*4e1bc9a0SAchim Leubner  * ATAPI Command code
101*4e1bc9a0SAchim Leubner */
102*4e1bc9a0SAchim Leubner #define SAT_IDENTIFY_PACKET_DEVICE            0xA1
103*4e1bc9a0SAchim Leubner #define SAT_PACKET                            0xA0
104*4e1bc9a0SAchim Leubner #define SAT_DEVICE_RESET                      0x08
105*4e1bc9a0SAchim Leubner #define SAT_EXECUTE_DEVICE_DIAGNOSTIC         0x90
106*4e1bc9a0SAchim Leubner 
107*4e1bc9a0SAchim Leubner 
108*4e1bc9a0SAchim Leubner /*
109*4e1bc9a0SAchim Leubner  * ATA Status Register Mask
110*4e1bc9a0SAchim Leubner  */
111*4e1bc9a0SAchim Leubner #define ERR_ATA_STATUS_MASK                   0x01    /* Error/check bit  */
112*4e1bc9a0SAchim Leubner #define DRQ_ATA_STATUS_MASK                   0x08    /* Data Request bit */
113*4e1bc9a0SAchim Leubner #define DF_ATA_STATUS_MASK                    0x20    /* Device Fault bit */
114*4e1bc9a0SAchim Leubner #define DRDY_ATA_STATUS_MASK                  0x40    /* Device Ready bit */
115*4e1bc9a0SAchim Leubner #define BSY_ATA_STATUS_MASK                   0x80    /* Busy bit         */
116*4e1bc9a0SAchim Leubner 
117*4e1bc9a0SAchim Leubner /*
118*4e1bc9a0SAchim Leubner  * ATA Error Register Mask
119*4e1bc9a0SAchim Leubner  */
120*4e1bc9a0SAchim Leubner #define NM_ATA_ERROR_MASK                     0x02    /* No media present bit         */
121*4e1bc9a0SAchim Leubner #define ABRT_ATA_ERROR_MASK                   0x04    /* Command aborted bit          */
122*4e1bc9a0SAchim Leubner #define MCR_ATA_ERROR_MASK                    0x08    /* Media change request bit     */
123*4e1bc9a0SAchim Leubner #define IDNF_ATA_ERROR_MASK                   0x10    /* Address not found bit        */
124*4e1bc9a0SAchim Leubner #define MC_ATA_ERROR_MASK                     0x20    /* Media has changed bit        */
125*4e1bc9a0SAchim Leubner #define UNC_ATA_ERROR_MASK                    0x40    /* Uncorrectable data error bit */
126*4e1bc9a0SAchim Leubner #define ICRC_ATA_ERROR_MASK                   0x80    /* Interface CRC error bit      */
127*4e1bc9a0SAchim Leubner 
128*4e1bc9a0SAchim Leubner 
129*4e1bc9a0SAchim Leubner 
130*4e1bc9a0SAchim Leubner 
131*4e1bc9a0SAchim Leubner /*
132*4e1bc9a0SAchim Leubner  *  transfer length and LBA limit 2^28 See identify device data word 61:60
133*4e1bc9a0SAchim Leubner  *  ATA spec p125
134*4e1bc9a0SAchim Leubner  *  7 zeros
135*4e1bc9a0SAchim Leubner  */
136*4e1bc9a0SAchim Leubner #define SAT_TR_LBA_LIMIT                      0x10000000
137*4e1bc9a0SAchim Leubner 
138*4e1bc9a0SAchim Leubner /*
139*4e1bc9a0SAchim Leubner  *  transfer length and LBA limit 2^48 See identify device data word 61:60
140*4e1bc9a0SAchim Leubner  *  ATA spec p125
141*4e1bc9a0SAchim Leubner  *  12 zeros
142*4e1bc9a0SAchim Leubner  */
143*4e1bc9a0SAchim Leubner #define SAT_EXT_TR_LBA_LIMIT                  0x1000000000000
144*4e1bc9a0SAchim Leubner 
145*4e1bc9a0SAchim Leubner 
146*4e1bc9a0SAchim Leubner /*
147*4e1bc9a0SAchim Leubner  * ATA command type. This is for setting LBA, Sector Count
148*4e1bc9a0SAchim Leubner  */
149*4e1bc9a0SAchim Leubner #define SAT_NON_EXT_TYPE                      0
150*4e1bc9a0SAchim Leubner #define SAT_EXT_TYPE                          1
151*4e1bc9a0SAchim Leubner #define SAT_FP_TYPE                           2
152*4e1bc9a0SAchim Leubner 
153*4e1bc9a0SAchim Leubner 
154*4e1bc9a0SAchim Leubner /*
155*4e1bc9a0SAchim Leubner  * Report LUNs response data.
156*4e1bc9a0SAchim Leubner  */
157*4e1bc9a0SAchim Leubner typedef struct smScsiReportLun_s
158*4e1bc9a0SAchim Leubner {
159*4e1bc9a0SAchim Leubner   bit8              len[4];
160*4e1bc9a0SAchim Leubner   bit32             reserved;
161*4e1bc9a0SAchim Leubner   tiLUN_t           lunList[1];
162*4e1bc9a0SAchim Leubner } smScsiReportLun_t;
163*4e1bc9a0SAchim Leubner 
164*4e1bc9a0SAchim Leubner /* Inquiry vendor string */
165*4e1bc9a0SAchim Leubner #define AG_SAT_VENDOR_ID_STRING               "ATA     "
166*4e1bc9a0SAchim Leubner 
167*4e1bc9a0SAchim Leubner /*
168*4e1bc9a0SAchim Leubner  * Simple form of SATA Identify Device Data, similar definition is defined by
169*4e1bc9a0SAchim Leubner  * LL Layer as agsaSATAIdentifyData_t.
170*4e1bc9a0SAchim Leubner  */
171*4e1bc9a0SAchim Leubner typedef struct satSimpleSATAIdentifyData_s
172*4e1bc9a0SAchim Leubner {
173*4e1bc9a0SAchim Leubner   bit16   word[256];
174*4e1bc9a0SAchim Leubner } satSimpleSATAIdentifyData_t;
175*4e1bc9a0SAchim Leubner 
176*4e1bc9a0SAchim Leubner 
177*4e1bc9a0SAchim Leubner /*
178*4e1bc9a0SAchim Leubner  * READ LOG EXT page 10h
179*4e1bc9a0SAchim Leubner  */
180*4e1bc9a0SAchim Leubner typedef struct satReadLogExtPage10h_s
181*4e1bc9a0SAchim Leubner {
182*4e1bc9a0SAchim Leubner   bit8   byte[512];
183*4e1bc9a0SAchim Leubner } satReadLogExtPage10h_t;
184*4e1bc9a0SAchim Leubner 
185*4e1bc9a0SAchim Leubner /*
186*4e1bc9a0SAchim Leubner  * READ LOG EXT Extended Self-test log
187*4e1bc9a0SAchim Leubner  * ATA Table27 p196
188*4e1bc9a0SAchim Leubner  */
189*4e1bc9a0SAchim Leubner typedef struct satReadLogExtSelfTest_s
190*4e1bc9a0SAchim Leubner {
191*4e1bc9a0SAchim Leubner   bit8   byte[512];
192*4e1bc9a0SAchim Leubner } satReadLogExtSelfTest_t;
193*4e1bc9a0SAchim Leubner 
194*4e1bc9a0SAchim Leubner /*
195*4e1bc9a0SAchim Leubner  * SMART READ LOG Self-test log
196*4e1bc9a0SAchim Leubner  * ATA Table60 p296
197*4e1bc9a0SAchim Leubner  */
198*4e1bc9a0SAchim Leubner typedef struct satSmartReadLogSelfTest_s
199*4e1bc9a0SAchim Leubner {
200*4e1bc9a0SAchim Leubner   bit8   byte[512];
201*4e1bc9a0SAchim Leubner } satSmartReadLogSelfTest_t;
202*4e1bc9a0SAchim Leubner 
203*4e1bc9a0SAchim Leubner 
204*4e1bc9a0SAchim Leubner /*
205*4e1bc9a0SAchim Leubner  * Flag definition for satIntFlag field in smSatInternalIo_t.
206*4e1bc9a0SAchim Leubner  */
207*4e1bc9a0SAchim Leubner 
208*4e1bc9a0SAchim Leubner /* Original NCQ I/O already completed, so at the completion of READ LOG EXT
209*4e1bc9a0SAchim Leubner  *  page 10h, ignore the TAG tranaltion to get the failed I/O
210*4e1bc9a0SAchim Leubner  */
211*4e1bc9a0SAchim Leubner #define AG_SAT_INT_IO_FLAG_ORG_IO_COMPLETED   0x00000001
212*4e1bc9a0SAchim Leubner 
213*4e1bc9a0SAchim Leubner #define INQUIRY_SUPPORTED_VPD_PAGE                          0x00
214*4e1bc9a0SAchim Leubner #define INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE                 0x80
215*4e1bc9a0SAchim Leubner #define INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE              0x83
216*4e1bc9a0SAchim Leubner #define INQUIRY_ATA_INFORMATION_VPD_PAGE                    0x89
217*4e1bc9a0SAchim Leubner #define INQUIRY_BLOCK_DEVICE_CHARACTERISTICS_VPD_PAGE       0xB1
218*4e1bc9a0SAchim Leubner 
219*4e1bc9a0SAchim Leubner #define MODESENSE_CONTROL_PAGE                            0x0A
220*4e1bc9a0SAchim Leubner #define MODESENSE_READ_WRITE_ERROR_RECOVERY_PAGE          0x01
221*4e1bc9a0SAchim Leubner #define MODESENSE_CACHING                                 0x08
222*4e1bc9a0SAchim Leubner #define MODESENSE_INFORMATION_EXCEPTION_CONTROL_PAGE      0x1C
223*4e1bc9a0SAchim Leubner #define MODESENSE_RETURN_ALL_PAGES                        0x3F
224*4e1bc9a0SAchim Leubner #define MODESENSE_VENDOR_SPECIFIC_PAGE                    0x00
225*4e1bc9a0SAchim Leubner 
226*4e1bc9a0SAchim Leubner #define MODESELECT_CONTROL_PAGE                           0x0A
227*4e1bc9a0SAchim Leubner #define MODESELECT_READ_WRITE_ERROR_RECOVERY_PAGE         0x01
228*4e1bc9a0SAchim Leubner #define MODESELECT_CACHING                                0x08
229*4e1bc9a0SAchim Leubner #define MODESELECT_INFORMATION_EXCEPTION_CONTROL_PAGE     0x1C
230*4e1bc9a0SAchim Leubner #define MODESELECT_RETURN_ALL_PAGES                       0x3F
231*4e1bc9a0SAchim Leubner #define MODESELECT_VENDOR_SPECIFIC_PAGE                   0x00
232*4e1bc9a0SAchim Leubner 
233*4e1bc9a0SAchim Leubner #define LOGSENSE_SUPPORTED_LOG_PAGES                      0x00
234*4e1bc9a0SAchim Leubner #define LOGSENSE_SELFTEST_RESULTS_PAGE                    0x10
235*4e1bc9a0SAchim Leubner #define LOGSENSE_INFORMATION_EXCEPTIONS_PAGE              0x2F
236*4e1bc9a0SAchim Leubner 
237*4e1bc9a0SAchim Leubner 
238*4e1bc9a0SAchim Leubner /*
239*4e1bc9a0SAchim Leubner  *  Bit mask definition
240*4e1bc9a0SAchim Leubner  */
241*4e1bc9a0SAchim Leubner #define SCSI_EVPD_MASK               0x01
242*4e1bc9a0SAchim Leubner #define SCSI_IMMED_MASK              0x01
243*4e1bc9a0SAchim Leubner #define SCSI_NACA_MASK               0x04
244*4e1bc9a0SAchim Leubner #define SCSI_LINK_MASK               0x01
245*4e1bc9a0SAchim Leubner #define SCSI_PF_MASK                 0x10
246*4e1bc9a0SAchim Leubner #define SCSI_DEVOFFL_MASK            0x02
247*4e1bc9a0SAchim Leubner #define SCSI_UNITOFFL_MASK           0x01
248*4e1bc9a0SAchim Leubner #define SCSI_START_MASK              0x01
249*4e1bc9a0SAchim Leubner #define SCSI_LOEJ_MASK               0x02
250*4e1bc9a0SAchim Leubner #define SCSI_NM_MASK                 0x02
251*4e1bc9a0SAchim Leubner #define SCSI_FLUSH_CACHE_IMMED_MASK              0x02
252*4e1bc9a0SAchim Leubner #define SCSI_FUA_NV_MASK                         0x02
253*4e1bc9a0SAchim Leubner #define SCSI_VERIFY_BYTCHK_MASK                  0x02
254*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_IMMED_MASK              0x02
255*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_FOV_MASK                0x80
256*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_DCRT_MASK               0x20
257*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_IP_MASK                 0x08
258*4e1bc9a0SAchim Leubner #define SCSI_WRITE_SAME_LBDATA_MASK              0x02
259*4e1bc9a0SAchim Leubner #define SCSI_WRITE_SAME_PBDATA_MASK              0x04
260*4e1bc9a0SAchim Leubner #define SCSI_SYNC_CACHE_IMMED_MASK               0x02
261*4e1bc9a0SAchim Leubner #define SCSI_WRITE_N_VERIFY_BYTCHK_MASK          0x02
262*4e1bc9a0SAchim Leubner #define SCSI_SEND_DIAGNOSTIC_SELFTEST_MASK       0x04
263*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_DEFECT_LIST_FORMAT_MASK 0x07
264*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_FMTDATA_MASK            0x10
265*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_DCRT_MASK               0x20
266*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_CMPLIST_MASK            0x08
267*4e1bc9a0SAchim Leubner #define SCSI_FORMAT_UNIT_LONGLIST_MASK           0x20
268*4e1bc9a0SAchim Leubner #define SCSI_READ10_FUA_MASK                     0x08
269*4e1bc9a0SAchim Leubner #define SCSI_READ12_FUA_MASK                     0x08
270*4e1bc9a0SAchim Leubner #define SCSI_READ16_FUA_MASK                     0x08
271*4e1bc9a0SAchim Leubner #define SCSI_WRITE10_FUA_MASK                    0x08
272*4e1bc9a0SAchim Leubner #define SCSI_WRITE12_FUA_MASK                    0x08
273*4e1bc9a0SAchim Leubner #define SCSI_WRITE16_FUA_MASK                    0x08
274*4e1bc9a0SAchim Leubner #define SCSI_READ_CAPACITY10_PMI_MASK            0x01
275*4e1bc9a0SAchim Leubner #define SCSI_READ_CAPACITY16_PMI_MASK            0x01
276*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE6_PC_MASK                 0xC0
277*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE6_PAGE_CODE_MASK          0x3F
278*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE10_PC_MASK                0xC0
279*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE10_LLBAA_MASK             0x10
280*4e1bc9a0SAchim Leubner #define SCSI_MODE_SENSE10_PAGE_CODE_MASK         0x3F
281*4e1bc9a0SAchim Leubner #define SCSI_SEND_DIAGNOSTIC_TEST_CODE_MASK      0xE0
282*4e1bc9a0SAchim Leubner #define SCSI_LOG_SENSE_PAGE_CODE_MASK            0x3F
283*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_PF_MASK                0x10
284*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_AWRE_MASK              0x80
285*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_RC_MASK                0x10
286*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_EER_MASK               0x08
287*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_PER_MASK               0x04
288*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DTE_MASK               0x02
289*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DCR_MASK               0x01
290*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_WCE_MASK               0x04
291*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DRA_MASK               0x20
292*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_PERF_MASK              0x80
293*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_TEST_MASK              0x04
294*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT6_DEXCPT_MASK            0x08
295*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_PF_MASK               0x10
296*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_LONGLBA_MASK          0x01
297*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_AWRE_MASK             0x80
298*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_RC_MASK               0x10
299*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_EER_MASK              0x08
300*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_PER_MASK              0x04
301*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DTE_MASK              0x02
302*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DCR_MASK              0x01
303*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_WCE_MASK              0x04
304*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DRA_MASK              0x20
305*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_PERF_MASK             0x80
306*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_TEST_MASK             0x04
307*4e1bc9a0SAchim Leubner #define SCSI_MODE_SELECT10_DEXCPT_MASK           0x08
308*4e1bc9a0SAchim Leubner #define SCSI_WRITE_N_VERIFY10_FUA_MASK           0x08
309*4e1bc9a0SAchim Leubner #define SCSI_REQUEST_SENSE_DESC_MASK             0x01
310*4e1bc9a0SAchim Leubner #define SCSI_READ_BUFFER_MODE_MASK               0x1F
311*4e1bc9a0SAchim Leubner 
312*4e1bc9a0SAchim Leubner #define ATA_REMOVABLE_MEDIA_DEVICE_MASK          0x80
313*4e1bc9a0SAchim Leubner #define SCSI_REASSIGN_BLOCKS_LONGLIST_MASK       0x01
314*4e1bc9a0SAchim Leubner #define SCSI_REASSIGN_BLOCKS_LONGLBA_MASK        0x02
315*4e1bc9a0SAchim Leubner 
316*4e1bc9a0SAchim Leubner 
317*4e1bc9a0SAchim Leubner #define SENSE_DATA_LENGTH                        0x12 /* 18 */
318*4e1bc9a0SAchim Leubner #define SELFTEST_RESULTS_LOG_PAGE_LENGTH         404
319*4e1bc9a0SAchim Leubner #define INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH   11
320*4e1bc9a0SAchim Leubner #define ZERO_MEDIA_SERIAL_NUMBER_LENGTH          8
321*4e1bc9a0SAchim Leubner 
322*4e1bc9a0SAchim Leubner #define LOG_SENSE_0 0
323*4e1bc9a0SAchim Leubner #define LOG_SENSE_1 1
324*4e1bc9a0SAchim Leubner #define LOG_SENSE_2 2
325*4e1bc9a0SAchim Leubner 
326*4e1bc9a0SAchim Leubner #define READ_BUFFER_DATA_MODE                    0x02
327*4e1bc9a0SAchim Leubner #define READ_BUFFER_DESCRIPTOR_MODE              0x03
328*4e1bc9a0SAchim Leubner #define READ_BUFFER_DESCRIPTOR_MODE_DATA_LEN     0x04
329*4e1bc9a0SAchim Leubner 
330*4e1bc9a0SAchim Leubner #define WRITE_BUFFER_DATA_MODE                   0x02
331*4e1bc9a0SAchim Leubner #define WRITE_BUFFER_DL_MICROCODE_SAVE_MODE      0x05
332*4e1bc9a0SAchim Leubner 
333*4e1bc9a0SAchim Leubner /* bit mask */
334*4e1bc9a0SAchim Leubner #define BIT0_MASK                                0x01
335*4e1bc9a0SAchim Leubner #define BIT1_MASK                                0x02
336*4e1bc9a0SAchim Leubner #define BIT2_MASK                                0x04
337*4e1bc9a0SAchim Leubner #define BIT3_MASK                                0x08
338*4e1bc9a0SAchim Leubner #define BIT4_MASK                                0x10
339*4e1bc9a0SAchim Leubner #define BIT5_MASK                                0x20
340*4e1bc9a0SAchim Leubner #define BIT6_MASK                                0x40
341*4e1bc9a0SAchim Leubner #define BIT7_MASK                                0x80
342*4e1bc9a0SAchim Leubner 
343*4e1bc9a0SAchim Leubner #define MODE_SENSE6_RETURN_ALL_PAGES_LEN         68
344*4e1bc9a0SAchim Leubner #define MODE_SENSE6_CONTROL_PAGE_LEN             24
345*4e1bc9a0SAchim Leubner #define MODE_SENSE6_READ_WRITE_ERROR_RECOVERY_PAGE_LEN 24
346*4e1bc9a0SAchim Leubner #define MODE_SENSE6_CACHING_LEN                  32
347*4e1bc9a0SAchim Leubner #define MODE_SENSE6_INFORMATION_EXCEPTION_CONTROL_PAGE_LEN 24
348*4e1bc9a0SAchim Leubner 
349*4e1bc9a0SAchim Leubner 
350*4e1bc9a0SAchim Leubner #define MODE_SENSE10_RETURN_ALL_PAGES_LEN         68 + 4
351*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CONTROL_PAGE_LEN             24 + 4
352*4e1bc9a0SAchim Leubner #define MODE_SENSE10_READ_WRITE_ERROR_RECOVERY_PAGE_LEN 24 + 4
353*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CACHING_LEN                  32 + 4
354*4e1bc9a0SAchim Leubner #define MODE_SENSE10_INFORMATION_EXCEPTION_CONTROL_PAGE_LEN 24 + 4
355*4e1bc9a0SAchim Leubner 
356*4e1bc9a0SAchim Leubner #define MODE_SENSE10_RETURN_ALL_PAGES_LLBAA_LEN         68 + 4 + 8
357*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CONTROL_PAGE_LLBAA_LEN             24 + 4 + 8
358*4e1bc9a0SAchim Leubner #define MODE_SENSE10_READ_WRITE_ERROR_RECOVERY_PAGE_LLBAA_LEN 24 + 4 + 8
359*4e1bc9a0SAchim Leubner #define MODE_SENSE10_CACHING_LLBAA_LEN                  32 + 4 + 8
360*4e1bc9a0SAchim Leubner #define MODE_SENSE10_INFORMATION_EXCEPTION_CONTROL_PAGE_LLBAA_LEN 24 + 4 + 8
361*4e1bc9a0SAchim Leubner 
362*4e1bc9a0SAchim Leubner /*****************************************************************************
363*4e1bc9a0SAchim Leubner ** SCSI SENSE KEY VALUES
364*4e1bc9a0SAchim Leubner *****************************************************************************/
365*4e1bc9a0SAchim Leubner 
366*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_NO_SENSE           0x00
367*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_RECOVERED_ERROR    0x01
368*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_NOT_READY          0x02
369*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_MEDIUM_ERROR       0x03
370*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_HARDWARE_ERROR     0x04
371*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_ILLEGAL_REQUEST    0x05
372*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_UNIT_ATTENTION     0x06
373*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_DATA_PROTECT       0x07
374*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_ABORTED_COMMAND    0x0B
375*4e1bc9a0SAchim Leubner #define SCSI_SNSKEY_MISCOMPARE         0x0E
376*4e1bc9a0SAchim Leubner 
377*4e1bc9a0SAchim Leubner /*****************************************************************************
378*4e1bc9a0SAchim Leubner ** SCSI Additional Sense Codes and Qualifiers combo two-bytes
379*4e1bc9a0SAchim Leubner *****************************************************************************/
380*4e1bc9a0SAchim Leubner 
381*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_NO_ADDITIONAL_INFO                         0x0000
382*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LUN_CRC_ERROR_DETECTED                     0x0803
383*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INVALID_COMMAND                            0x2000
384*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_BLOCK_OUT                          0x2100
385*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INVALID_FIELD_IN_CDB                       0x2400
386*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_NOT_SUPPORTED                      0x2500
387*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_POWERON_RESET                              0x2900
388*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_EVERLAPPED_CMDS                            0x4e00
389*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INTERNAL_TARGET_FAILURE                    0x4400
390*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_MEDIUM_NOT_PRESENT                         0x3a00
391*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_UNRECOVERED_READ_ERROR                     0x1100
392*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_RECORD_NOT_FOUND                           0x1401
393*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_NOT_READY_TO_READY_CHANGE                  0x2800
394*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_OPERATOR_MEDIUM_REMOVAL_REQUEST            0x5a01
395*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INFORMATION_UNIT_CRC_ERROR                 0x4703
396*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS  0x0404
397*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE                 0x5d10
398*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOW_POWER_CONDITION_ON                     0x5e00
399*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INIT_REQUIRED       0x0402
400*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_INVALID_FIELD_PARAMETER_LIST               0x2600
401*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_ATA_DEVICE_FAILED_SET_FEATURES             0x4471
402*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_ATA_DEVICE_FEATURE_NOT_ENABLED             0x670B
403*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST              0x3E03
404*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR                     0x2C00
405*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE         0x2100
406*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_FAILURE                       0x3E01
407*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED                 0x5300
408*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED 0x0402
409*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE          0x0400
410*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION           0x0500
411*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN         0x4000
412*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_COMMANDS_CLEARED_BY_ANOTHER_INITIATOR      0x2F00
413*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED       0x0C02
414*4e1bc9a0SAchim Leubner #define SCSI_SNSCODE_ATA_PASS_THROUGH_INFORMATION_AVAILABLE     0x001D
415*4e1bc9a0SAchim Leubner 
416*4e1bc9a0SAchim Leubner /*****************************************************************************
417*4e1bc9a0SAchim Leubner ** SCSI Additional Sense Codes and Qualifiers saparate bytes
418*4e1bc9a0SAchim Leubner *****************************************************************************/
419*4e1bc9a0SAchim Leubner 
420*4e1bc9a0SAchim Leubner #define SCSI_ASC_NOTREADY_INIT_CMD_REQ    0x04
421*4e1bc9a0SAchim Leubner #define SCSI_ASCQ_NOTREADY_INIT_CMD_REQ   0x02
422*4e1bc9a0SAchim Leubner 
423*4e1bc9a0SAchim Leubner 
424*4e1bc9a0SAchim Leubner /*****************************************************************************
425*4e1bc9a0SAchim Leubner ** Inquiry command fields and response sizes
426*4e1bc9a0SAchim Leubner *****************************************************************************/
427*4e1bc9a0SAchim Leubner #define SCSIOP_INQUIRY_CMDDT        0x02
428*4e1bc9a0SAchim Leubner #define SCSIOP_INQUIRY_EVPD         0x01
429*4e1bc9a0SAchim Leubner #define STANDARD_INQUIRY_SIZE       36
430*4e1bc9a0SAchim Leubner #define SATA_PAGE83_INQUIRY_WWN_SIZE       16      /* SAT, revision8, Table81, p78, 12 + 4 */
431*4e1bc9a0SAchim Leubner #define SATA_PAGE83_INQUIRY_NO_WWN_SIZE    76      /* SAT, revision8, Table81, p78, 72 + 4 */
432*4e1bc9a0SAchim Leubner #define SATA_PAGE89_INQUIRY_SIZE    572     /* SAT, revision8, Table87, p84 */
433*4e1bc9a0SAchim Leubner #define SATA_PAGE0_INQUIRY_SIZE     9       /* SPC-4, 7.6.9   Table331, p345 */
434*4e1bc9a0SAchim Leubner #define SATA_PAGE80_INQUIRY_SIZE    24     /* SAT, revision8, Table79, p77 */
435*4e1bc9a0SAchim Leubner #define SATA_PAGEB1_INQUIRY_SIZE    64     /* SBC-3, revision31, Table193, p273 */
436*4e1bc9a0SAchim Leubner 
437*4e1bc9a0SAchim Leubner /*****************************************************************************
438*4e1bc9a0SAchim Leubner ** SCSI Operation Codes (first byte in CDB)
439*4e1bc9a0SAchim Leubner *****************************************************************************/
440*4e1bc9a0SAchim Leubner 
441*4e1bc9a0SAchim Leubner 
442*4e1bc9a0SAchim Leubner #define SCSIOPC_TEST_UNIT_READY     0x00
443*4e1bc9a0SAchim Leubner #define SCSIOPC_INQUIRY             0x12
444*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SENSE_6        0x1A
445*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SENSE_10       0x5A
446*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SELECT_6       0x15
447*4e1bc9a0SAchim Leubner #define SCSIOPC_START_STOP_UNIT     0x1B
448*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_CAPACITY_10    0x25
449*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_CAPACITY_16    0x9E
450*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_6              0x08
451*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_10             0x28
452*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_12             0xA8
453*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_16             0x88
454*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_6             0x0A
455*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_10            0x2A
456*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_12            0xAA
457*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_16            0x8A
458*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_VERIFY        0x2E
459*4e1bc9a0SAchim Leubner #define SCSIOPC_VERIFY_10           0x2F
460*4e1bc9a0SAchim Leubner #define SCSIOPC_VERIFY_12           0xAF
461*4e1bc9a0SAchim Leubner #define SCSIOPC_VERIFY_16           0x8F
462*4e1bc9a0SAchim Leubner #define SCSIOPC_REQUEST_SENSE       0x03
463*4e1bc9a0SAchim Leubner #define SCSIOPC_REPORT_LUN          0xA0
464*4e1bc9a0SAchim Leubner #define SCSIOPC_FORMAT_UNIT         0x04
465*4e1bc9a0SAchim Leubner #define SCSIOPC_SEND_DIAGNOSTIC     0x1D
466*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_SAME_10       0x41
467*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_SAME_16       0x93
468*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_BUFFER         0x3C
469*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_BUFFER        0x3B
470*4e1bc9a0SAchim Leubner 
471*4e1bc9a0SAchim Leubner #define SCSIOPC_LOG_SENSE           0x4D
472*4e1bc9a0SAchim Leubner #define SCSIOPC_LOG_SELECT          0x4C
473*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SELECT_6       0x15
474*4e1bc9a0SAchim Leubner #define SCSIOPC_MODE_SELECT_10      0x55
475*4e1bc9a0SAchim Leubner #define SCSIOPC_SYNCHRONIZE_CACHE_10 0x35
476*4e1bc9a0SAchim Leubner #define SCSIOPC_SYNCHRONIZE_CACHE_16 0x91
477*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_AND_VERIFY_10 0x2E
478*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_AND_VERIFY_12 0xAE
479*4e1bc9a0SAchim Leubner #define SCSIOPC_WRITE_AND_VERIFY_16 0x8E
480*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_MEDIA_SERIAL_NUMBER 0xAB
481*4e1bc9a0SAchim Leubner #define SCSIOPC_REASSIGN_BLOCKS     0x07
482*4e1bc9a0SAchim Leubner 
483*4e1bc9a0SAchim Leubner #define SCSIOPC_GET_CONFIG          0x46
484*4e1bc9a0SAchim Leubner #define SCSIOPC_GET_EVENT_STATUS_NOTIFICATION        0x4a
485*4e1bc9a0SAchim Leubner #define SCSIOPC_REPORT_KEY          0xA4
486*4e1bc9a0SAchim Leubner #define SCSIOPC_SEND_KEY            0xA3
487*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_DVD_STRUCTURE  0xAD
488*4e1bc9a0SAchim Leubner #define SCSIOPC_TOC                 0x43
489*4e1bc9a0SAchim Leubner #define SCSIOPC_PREVENT_ALLOW_MEDIUM_REMOVAL         0x1E
490*4e1bc9a0SAchim Leubner #define SCSIOPC_READ_VERIFY         0x42
491*4e1bc9a0SAchim Leubner #define SCSIOPC_ATA_PASS_THROUGH12	0xA1
492*4e1bc9a0SAchim Leubner #define SCSIOPC_ATA_PASS_THROUGH16	0x85
493*4e1bc9a0SAchim Leubner 
494*4e1bc9a0SAchim Leubner 
495*4e1bc9a0SAchim Leubner /*! \def MIN(a,b)
496*4e1bc9a0SAchim Leubner * \brief MIN macro
497*4e1bc9a0SAchim Leubner *
498*4e1bc9a0SAchim Leubner * use to find MIN of two values
499*4e1bc9a0SAchim Leubner */
500*4e1bc9a0SAchim Leubner #ifndef MIN
501*4e1bc9a0SAchim Leubner #define MIN(a,b) ((a) < (b) ? (a) : (b))
502*4e1bc9a0SAchim Leubner #endif
503*4e1bc9a0SAchim Leubner 
504*4e1bc9a0SAchim Leubner /*! \def MAX(a,b)
505*4e1bc9a0SAchim Leubner * \brief MAX macro
506*4e1bc9a0SAchim Leubner *
507*4e1bc9a0SAchim Leubner * use to find MAX of two values
508*4e1bc9a0SAchim Leubner */
509*4e1bc9a0SAchim Leubner #ifndef MAX
510*4e1bc9a0SAchim Leubner #define MAX(a,b) ((a) < (b) ? (b) : (a))
511*4e1bc9a0SAchim Leubner #endif
512*4e1bc9a0SAchim Leubner 
513*4e1bc9a0SAchim Leubner /* for debugging print */
514*4e1bc9a0SAchim Leubner #if defined(SM_DEBUG)
515*4e1bc9a0SAchim Leubner 
516*4e1bc9a0SAchim Leubner /*
517*4e1bc9a0SAchim Leubner * for debugging purposes.
518*4e1bc9a0SAchim Leubner */
519*4e1bc9a0SAchim Leubner extern bit32 gSMDebugLevel;
520*4e1bc9a0SAchim Leubner 
521*4e1bc9a0SAchim Leubner #define SM_DBG0(format) tdsmLogDebugString(gSMDebugLevel, 0, format)
522*4e1bc9a0SAchim Leubner #define SM_DBG1(format) tdsmLogDebugString(gSMDebugLevel, 1, format)
523*4e1bc9a0SAchim Leubner #define SM_DBG2(format) tdsmLogDebugString(gSMDebugLevel, 2, format)
524*4e1bc9a0SAchim Leubner #define SM_DBG3(format) tdsmLogDebugString(gSMDebugLevel, 3, format)
525*4e1bc9a0SAchim Leubner #define SM_DBG4(format) tdsmLogDebugString(gSMDebugLevel, 4, format)
526*4e1bc9a0SAchim Leubner #define SM_DBG5(format) tdsmLogDebugString(gSMDebugLevel, 5, format)
527*4e1bc9a0SAchim Leubner #define SM_DBG6(format) tdsmLogDebugString(gSMDebugLevel, 6, format)
528*4e1bc9a0SAchim Leubner 
529*4e1bc9a0SAchim Leubner #else
530*4e1bc9a0SAchim Leubner 
531*4e1bc9a0SAchim Leubner #define SM_DBG0(format)
532*4e1bc9a0SAchim Leubner #define SM_DBG1(format)
533*4e1bc9a0SAchim Leubner #define SM_DBG2(format)
534*4e1bc9a0SAchim Leubner #define SM_DBG3(format)
535*4e1bc9a0SAchim Leubner #define SM_DBG4(format)
536*4e1bc9a0SAchim Leubner #define SM_DBG5(format)
537*4e1bc9a0SAchim Leubner #define SM_DBG6(format)
538*4e1bc9a0SAchim Leubner 
539*4e1bc9a0SAchim Leubner #endif /* SM_DEBUG */
540*4e1bc9a0SAchim Leubner 
541*4e1bc9a0SAchim Leubner //#define SM_ASSERT OS_ASSERT
542*4e1bc9a0SAchim Leubner //#define tdsmLogDebugString TIDEBUG_MSG
543*4e1bc9a0SAchim Leubner 
544*4e1bc9a0SAchim Leubner /*
545*4e1bc9a0SAchim Leubner  * SAT specific structure per SATA drive
546*4e1bc9a0SAchim Leubner  */
547*4e1bc9a0SAchim Leubner #define SAT_NONNCQ_MAX  1
548*4e1bc9a0SAchim Leubner #define SAT_NCQ_MAX     32
549*4e1bc9a0SAchim Leubner #define SAT_MAX_INT_IO  16
550*4e1bc9a0SAchim Leubner #define SAT_APAPI_CMDQ_MAX 2
551*4e1bc9a0SAchim Leubner 
552*4e1bc9a0SAchim Leubner /* Device state */
553*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_NORMAL                  0  /* Normal */
554*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_IN_RECOVERY             1  /* SAT in recovery mode */
555*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_FORMAT_IN_PROGRESS      2  /* Format unit in progress */
556*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_SMART_THRESHOLD         3  /* SMART Threshold Exceeded Condition*/
557*4e1bc9a0SAchim Leubner #define SAT_DEV_STATE_LOW_POWER               4  /* Low Power State*/
558*4e1bc9a0SAchim Leubner 
559*4e1bc9a0SAchim Leubner #ifndef agNULL
560*4e1bc9a0SAchim Leubner #define agNULL     ((void *)0)
561*4e1bc9a0SAchim Leubner #endif
562*4e1bc9a0SAchim Leubner 
563*4e1bc9a0SAchim Leubner #define SM_SET_ESGL_EXTEND(val) \
564*4e1bc9a0SAchim Leubner  ((val) = (val) | 0x80000000)
565*4e1bc9a0SAchim Leubner 
566*4e1bc9a0SAchim Leubner #define SM_CLEAR_ESGL_EXTEND(val) \
567*4e1bc9a0SAchim Leubner  ((val) = (val) & 0x7FFFFFFF)
568*4e1bc9a0SAchim Leubner 
569*4e1bc9a0SAchim Leubner #ifndef OPEN_RETRY_RETRIES
570*4e1bc9a0SAchim Leubner #define OPEN_RETRY_RETRIES	10
571*4e1bc9a0SAchim Leubner #endif
572*4e1bc9a0SAchim Leubner 
573*4e1bc9a0SAchim Leubner /*********************************************************************
574*4e1bc9a0SAchim Leubner * CPU buffer access macro                                            *
575*4e1bc9a0SAchim Leubner *                                                                    *
576*4e1bc9a0SAchim Leubner */
577*4e1bc9a0SAchim Leubner 
578*4e1bc9a0SAchim Leubner #define OSSA_OFFSET_OF(STRUCT_TYPE, FEILD)              \
579*4e1bc9a0SAchim Leubner         (bitptr)&(((STRUCT_TYPE *)0)->FEILD)
580*4e1bc9a0SAchim Leubner 
581*4e1bc9a0SAchim Leubner 
582*4e1bc9a0SAchim Leubner #if defined(SA_CPU_LITTLE_ENDIAN)
583*4e1bc9a0SAchim Leubner 
584*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
585*4e1bc9a0SAchim Leubner         (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16);
586*4e1bc9a0SAchim Leubner 
587*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
588*4e1bc9a0SAchim Leubner         (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32);
589*4e1bc9a0SAchim Leubner 
590*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
591*4e1bc9a0SAchim Leubner         (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET))))
592*4e1bc9a0SAchim Leubner 
593*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
594*4e1bc9a0SAchim Leubner         (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET))))
595*4e1bc9a0SAchim Leubner 
596*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
597*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)((((bit16)VALUE16)>>8)&0xFF);  \
598*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)(((bit16)VALUE16)&0xFF);
599*4e1bc9a0SAchim Leubner 
600*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
601*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)((((bit32)VALUE32)>>24)&0xFF); \
602*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>16)&0xFF); \
603*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>8)&0xFF);  \
604*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)(((bit32)VALUE32)&0xFF);
605*4e1bc9a0SAchim Leubner 
606*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
607*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
608*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR16)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1)));
609*4e1bc9a0SAchim Leubner 
610*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
611*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR32)+3)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
612*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR32)+2)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \
613*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR32)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \
614*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR32)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3)));
615*4e1bc9a0SAchim Leubner 
616*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN)                        \
617*4e1bc9a0SAchim Leubner         si_memcpy(DEST_ADDR, SRC_ADDR, LEN);
618*4e1bc9a0SAchim Leubner 
619*4e1bc9a0SAchim Leubner 
620*4e1bc9a0SAchim Leubner #elif defined(SA_CPU_BIG_ENDIAN)
621*4e1bc9a0SAchim Leubner 
622*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
623*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit16)VALUE16)>>8)&0xFF);   \
624*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)(((bit16)VALUE16)&0xFF);
625*4e1bc9a0SAchim Leubner 
626*4e1bc9a0SAchim Leubner #define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
627*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)((((bit32)VALUE32)>>24)&0xFF);  \
628*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>16)&0xFF);  \
629*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>8)&0xFF);   \
630*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)(((bit32)VALUE32)&0xFF);
631*4e1bc9a0SAchim Leubner 
632*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
633*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
634*4e1bc9a0SAchim Leubner         (*(bit8 *)(((bit8 *)ADDR16)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1)));
635*4e1bc9a0SAchim Leubner 
636*4e1bc9a0SAchim Leubner #define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
637*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)ADDR32)+3))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
638*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)ADDR32)+2))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \
639*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)ADDR32)+1))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \
640*4e1bc9a0SAchim Leubner         (*((bit8 *)(((bit8 *)ADDR32))))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3)));
641*4e1bc9a0SAchim Leubner 
642*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)         \
643*4e1bc9a0SAchim Leubner         (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16);
644*4e1bc9a0SAchim Leubner 
645*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)         \
646*4e1bc9a0SAchim Leubner         (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32);
647*4e1bc9a0SAchim Leubner 
648*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)           \
649*4e1bc9a0SAchim Leubner         (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET))));
650*4e1bc9a0SAchim Leubner 
651*4e1bc9a0SAchim Leubner #define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)           \
652*4e1bc9a0SAchim Leubner         (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET))));
653*4e1bc9a0SAchim Leubner 
654*4e1bc9a0SAchim Leubner #define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN)    \
655*4e1bc9a0SAchim Leubner         si_memcpy(DEST_ADDR, SRC_ADDR, LEN);
656*4e1bc9a0SAchim Leubner 
657*4e1bc9a0SAchim Leubner #else
658*4e1bc9a0SAchim Leubner 
659*4e1bc9a0SAchim Leubner #error (Host CPU endianess undefined!!)
660*4e1bc9a0SAchim Leubner 
661*4e1bc9a0SAchim Leubner #endif
662*4e1bc9a0SAchim Leubner 
663*4e1bc9a0SAchim Leubner 
664*4e1bc9a0SAchim Leubner #if defined(SA_CPU_LITTLE_ENDIAN)
665*4e1bc9a0SAchim Leubner 
666*4e1bc9a0SAchim Leubner #ifndef LEBIT16_TO_BIT16
667*4e1bc9a0SAchim Leubner #define LEBIT16_TO_BIT16(_x)   (_x)
668*4e1bc9a0SAchim Leubner #endif
669*4e1bc9a0SAchim Leubner 
670*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_LEBIT16
671*4e1bc9a0SAchim Leubner #define BIT16_TO_LEBIT16(_x)   (_x)
672*4e1bc9a0SAchim Leubner #endif
673*4e1bc9a0SAchim Leubner 
674*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_BEBIT16
675*4e1bc9a0SAchim Leubner #define BIT16_TO_BEBIT16(_x)   AGSA_FLIP_2_BYTES(_x)
676*4e1bc9a0SAchim Leubner #endif
677*4e1bc9a0SAchim Leubner 
678*4e1bc9a0SAchim Leubner #ifndef BEBIT16_TO_BIT16
679*4e1bc9a0SAchim Leubner #define BEBIT16_TO_BIT16(_x)   AGSA_FLIP_2_BYTES(_x)
680*4e1bc9a0SAchim Leubner #endif
681*4e1bc9a0SAchim Leubner 
682*4e1bc9a0SAchim Leubner #ifndef LEBIT32_TO_BIT32
683*4e1bc9a0SAchim Leubner #define LEBIT32_TO_BIT32(_x)   (_x)
684*4e1bc9a0SAchim Leubner #endif
685*4e1bc9a0SAchim Leubner 
686*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_LEBIT32
687*4e1bc9a0SAchim Leubner #define BIT32_TO_LEBIT32(_x)   (_x)
688*4e1bc9a0SAchim Leubner #endif
689*4e1bc9a0SAchim Leubner 
690*4e1bc9a0SAchim Leubner 
691*4e1bc9a0SAchim Leubner #ifndef BEBIT32_TO_BIT32
692*4e1bc9a0SAchim Leubner #define BEBIT32_TO_BIT32(_x)   AGSA_FLIP_4_BYTES(_x)
693*4e1bc9a0SAchim Leubner #endif
694*4e1bc9a0SAchim Leubner 
695*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_BEBIT32
696*4e1bc9a0SAchim Leubner #define BIT32_TO_BEBIT32(_x)   AGSA_FLIP_4_BYTES(_x)
697*4e1bc9a0SAchim Leubner #endif
698*4e1bc9a0SAchim Leubner 
699*4e1bc9a0SAchim Leubner #elif defined(SA_CPU_BIG_ENDIAN)
700*4e1bc9a0SAchim Leubner 
701*4e1bc9a0SAchim Leubner #ifndef LEBIT16_TO_BIT16
702*4e1bc9a0SAchim Leubner #define LEBIT16_TO_BIT16(_x)   AGSA_FLIP_2_BYTES(_x)
703*4e1bc9a0SAchim Leubner #endif
704*4e1bc9a0SAchim Leubner 
705*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_LEBIT16
706*4e1bc9a0SAchim Leubner #define BIT16_TO_LEBIT16(_x)   AGSA_FLIP_2_BYTES(_x)
707*4e1bc9a0SAchim Leubner #endif
708*4e1bc9a0SAchim Leubner 
709*4e1bc9a0SAchim Leubner #ifndef BIT16_TO_BEBIT16
710*4e1bc9a0SAchim Leubner #define BIT16_TO_BEBIT16(_x)   (_x)
711*4e1bc9a0SAchim Leubner #endif
712*4e1bc9a0SAchim Leubner 
713*4e1bc9a0SAchim Leubner #ifndef BEBIT16_TO_BIT16
714*4e1bc9a0SAchim Leubner #define BEBIT16_TO_BIT16(_x)   (_x)
715*4e1bc9a0SAchim Leubner #endif
716*4e1bc9a0SAchim Leubner 
717*4e1bc9a0SAchim Leubner #ifndef LEBIT32_TO_BIT32
718*4e1bc9a0SAchim Leubner #define LEBIT32_TO_BIT32(_x)   AGSA_FLIP_4_BYTES(_x)
719*4e1bc9a0SAchim Leubner #endif
720*4e1bc9a0SAchim Leubner 
721*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_LEBIT32
722*4e1bc9a0SAchim Leubner #define BIT32_TO_LEBIT32(_x)   AGSA_FLIP_4_BYTES(_x)
723*4e1bc9a0SAchim Leubner #endif
724*4e1bc9a0SAchim Leubner 
725*4e1bc9a0SAchim Leubner #ifndef BEBIT32_TO_BIT32
726*4e1bc9a0SAchim Leubner #define BEBIT32_TO_BIT32(_x)   (_x)
727*4e1bc9a0SAchim Leubner #endif
728*4e1bc9a0SAchim Leubner 
729*4e1bc9a0SAchim Leubner #ifndef BIT32_TO_BEBIT32
730*4e1bc9a0SAchim Leubner #define BIT32_TO_BEBIT32(_x)   (_x)
731*4e1bc9a0SAchim Leubner #endif
732*4e1bc9a0SAchim Leubner 
733*4e1bc9a0SAchim Leubner #else
734*4e1bc9a0SAchim Leubner 
735*4e1bc9a0SAchim Leubner #error No definition of SA_CPU_BIG_ENDIAN or SA_CPU_LITTLE_ENDIAN
736*4e1bc9a0SAchim Leubner 
737*4e1bc9a0SAchim Leubner #endif
738*4e1bc9a0SAchim Leubner 
739*4e1bc9a0SAchim Leubner 
740*4e1bc9a0SAchim Leubner /*
741*4e1bc9a0SAchim Leubner  * Task Management task used in tiINITaskManagement()
742*4e1bc9a0SAchim Leubner  *
743*4e1bc9a0SAchim Leubner  * 1 SM_ABORT TASK - aborts the task identified by the Referenced  Task Tag field.
744*4e1bc9a0SAchim Leubner  * 2 SM_ABORT TASK SET - aborts all Tasks issued by this initiator on the Logical Unit
745*4e1bc9a0SAchim Leubner  * 3 SM_CLEAR ACA - clears the Auto Contingent Allegiance condition.
746*4e1bc9a0SAchim Leubner  * 4 SM_CLEAR TASK SET - Aborts all Tasks (from all initiators) for the Logical Unit.
747*4e1bc9a0SAchim Leubner  * 5 SM_LOGICAL UNIT RESET
748*4e1bc9a0SAchim Leubner  * 6 SM_TARGET WARM RESET  - iSCSI only
749*4e1bc9a0SAchim Leubner  * 7 SM_TARGET_COLD_RESET  - iSCSI only
750*4e1bc9a0SAchim Leubner  * 8 SM_TASK_REASSIGN      - iSCSI only
751*4e1bc9a0SAchim Leubner  * 9 SM_QUERY_TASK         - SAS only
752*4e1bc9a0SAchim Leubner  */
753*4e1bc9a0SAchim Leubner 
754*4e1bc9a0SAchim Leubner #define SM_ABORT_TASK          1
755*4e1bc9a0SAchim Leubner #define SM_ABORT_TASK_SET      2
756*4e1bc9a0SAchim Leubner #define SM_CLEAR_ACA           3
757*4e1bc9a0SAchim Leubner #define SM_CLEAR_TASK_SET      4
758*4e1bc9a0SAchim Leubner #define SM_LOGICAL_UNIT_RESET  5
759*4e1bc9a0SAchim Leubner #define SM_TARGET_WARM_RESET   6    /* iSCSI only */
760*4e1bc9a0SAchim Leubner #define SM_TARGET_COLD_RESET   7    /* iSCSI only */
761*4e1bc9a0SAchim Leubner #define SM_TASK_REASSIGN       8    /* iSCSI only */
762*4e1bc9a0SAchim Leubner #define SM_QUERY_TASK          9    /* SAS only   */
763*4e1bc9a0SAchim Leubner 
764*4e1bc9a0SAchim Leubner /* SMP PHY CONTROL OPERATION */
765*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_NOP                        0x00
766*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_LINK_RESET                 0x01
767*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_HARD_RESET                 0x02
768*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_DISABLE                    0x03
769*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_ERROR_LOG            0x05
770*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_CLEAR_AFFILIATION          0x06
771*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL        0x07
772*4e1bc9a0SAchim Leubner 
773*4e1bc9a0SAchim Leubner /****************************************************************
774*4e1bc9a0SAchim Leubner  *            Phy Control request
775*4e1bc9a0SAchim Leubner  ****************************************************************/
776*4e1bc9a0SAchim Leubner typedef struct smpReqPhyControl_s
777*4e1bc9a0SAchim Leubner {
778*4e1bc9a0SAchim Leubner   bit8   reserved1[4];
779*4e1bc9a0SAchim Leubner   bit8   reserved2;
780*4e1bc9a0SAchim Leubner   bit8   phyIdentifier;
781*4e1bc9a0SAchim Leubner   bit8   phyOperation;
782*4e1bc9a0SAchim Leubner   bit8   updatePartialPathwayTOValue;
783*4e1bc9a0SAchim Leubner     /* b7-1 : reserved */
784*4e1bc9a0SAchim Leubner     /* b0   : update partial pathway timeout value */
785*4e1bc9a0SAchim Leubner   bit8   reserved3[20];
786*4e1bc9a0SAchim Leubner   bit8   programmedMinPhysicalLinkRate;
787*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Minimum Physical Link Rate*/
788*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
789*4e1bc9a0SAchim Leubner   bit8   programmedMaxPhysicalLinkRate;
790*4e1bc9a0SAchim Leubner     /* b7-4 : programmed Maximum Physical Link Rate*/
791*4e1bc9a0SAchim Leubner     /* b3-0 : reserved */
792*4e1bc9a0SAchim Leubner   bit8   reserved4[2];
793*4e1bc9a0SAchim Leubner   bit8   partialPathwayTOValue;
794*4e1bc9a0SAchim Leubner     /* b7-4 : reserved */
795*4e1bc9a0SAchim Leubner     /* b3-0 : partial Pathway TO Value */
796*4e1bc9a0SAchim Leubner   bit8   reserved5[3];
797*4e1bc9a0SAchim Leubner } smpReqPhyControl_t;
798*4e1bc9a0SAchim Leubner 
799*4e1bc9a0SAchim Leubner 
800*4e1bc9a0SAchim Leubner typedef struct smSMPFrameHeader_s
801*4e1bc9a0SAchim Leubner {
802*4e1bc9a0SAchim Leubner     bit8   smpFrameType;      /* The first byte of SMP frame represents the SMP FRAME TYPE */
803*4e1bc9a0SAchim Leubner     bit8   smpFunction;       /* The second byte of the SMP frame represents the SMP FUNCTION */
804*4e1bc9a0SAchim Leubner     bit8   smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */
805*4e1bc9a0SAchim Leubner     bit8   smpReserved;       /* reserved */
806*4e1bc9a0SAchim Leubner } smSMPFrameHeader_t;
807*4e1bc9a0SAchim Leubner 
808*4e1bc9a0SAchim Leubner /* SMP direct payload size limit: IOMB direct payload size = 48 */
809*4e1bc9a0SAchim Leubner #define SMP_DIRECT_PAYLOAD_LIMIT 44
810*4e1bc9a0SAchim Leubner 
811*4e1bc9a0SAchim Leubner #define SMP_REQUEST        0x40
812*4e1bc9a0SAchim Leubner #define SMP_RESPONSE       0x41
813*4e1bc9a0SAchim Leubner 
814*4e1bc9a0SAchim Leubner #define SMP_PHY_CONTROL                            0x91
815*4e1bc9a0SAchim Leubner 
816*4e1bc9a0SAchim Leubner /* SMP function results */
817*4e1bc9a0SAchim Leubner #define SMP_FUNCTION_ACCEPTED                      0x00
818*4e1bc9a0SAchim Leubner 
819*4e1bc9a0SAchim Leubner /* bit8 array[4] -> bit32 */
820*4e1bc9a0SAchim Leubner #define SM_GET_SAS_ADDRESSLO(sasAddressLo)                  \
821*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo)
822*4e1bc9a0SAchim Leubner 
823*4e1bc9a0SAchim Leubner #define SM_GET_SAS_ADDRESSHI(sasAddressHi)                  \
824*4e1bc9a0SAchim Leubner     DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi)
825*4e1bc9a0SAchim Leubner 
826*4e1bc9a0SAchim Leubner /* SATA sector size 512 bytes = 0x200 bytes */
827*4e1bc9a0SAchim Leubner #define SATA_SECTOR_SIZE                          0x200
828*4e1bc9a0SAchim Leubner /* TL limit in sector */
829*4e1bc9a0SAchim Leubner /* for SAT_READ/WRITE_DMA and SAT_READ/WRITE_SECTORS ATA command */
830*4e1bc9a0SAchim Leubner #define NON_BIT48_ADDRESS_TL_LIMIT                0x100
831*4e1bc9a0SAchim Leubner /* for SAT_READ/WRITE_DMA_EXT and SAT_READ/WRITE_SECTORS_EXT and  SAT_READ/WRITE_FPDMA_QUEUEDATA command */
832*4e1bc9a0SAchim Leubner #define BIT48_ADDRESS_TL_LIMIT                    0xFFFF
833*4e1bc9a0SAchim Leubner 
834*4e1bc9a0SAchim Leubner #define VEN_DEV_SPC                               0x800111f8
835*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCv                              0x800811f8
836*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCve                             0x800911f8
837*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCvplus                          0x801811f8
838*4e1bc9a0SAchim Leubner #define VEN_DEV_SPCveplus                         0x801911f8
839*4e1bc9a0SAchim Leubner 
840*4e1bc9a0SAchim Leubner #define SMIsSPC(agr) (VEN_DEV_SPC  == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPC */
841*4e1bc9a0SAchim Leubner #define SMIsSPCv(agr)  (VEN_DEV_SPCv == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCv */
842*4e1bc9a0SAchim Leubner #define SMIsSPCve(agr) (VEN_DEV_SPCve  == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCve */
843*4e1bc9a0SAchim Leubner #define SMIsSPCvplus(agr)  (VEN_DEV_SPCvplus == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCv+ */
844*4e1bc9a0SAchim Leubner #define SMIsSPCveplus(agr)  (VEN_DEV_SPCveplus == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCve+ */
845*4e1bc9a0SAchim Leubner 
846*4e1bc9a0SAchim Leubner #define DEFAULT_KEY_BUFFER_SIZE     64
847*4e1bc9a0SAchim Leubner 
848*4e1bc9a0SAchim Leubner 
849*4e1bc9a0SAchim Leubner #endif /* __SMDEFS_H__ */
850*4e1bc9a0SAchim Leubner 
851