1285242Sachim/*******************************************************************************
2285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3285242Sachim*
4285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5285242Sachim*that the following conditions are met:
6285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7285242Sachim*following disclaimer.
8285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice,
9285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10285242Sachim*with the distribution.
11285242Sachim*
12285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20285242Sachim*
21285242Sachim* $FreeBSD: releng/11.0/sys/dev/pms/RefTisa/sat/src/smdefs.h 285242 2015-07-07 13:17:02Z achim $
22285242Sachim*
23285242Sachim********************************************************************************/
24285242Sachim#ifndef __SMDEFS_H__
25285242Sachim#define __SMDEFS_H__
26285242Sachim
27285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/ossa.h>
28285242Sachim
29285242Sachim/* the index for memory requirement, must be continious */
30285242Sachim#define SM_ROOT_MEM_INDEX                          0                       /**< the index of dm root memory */
31285242Sachim#define SM_DEVICE_MEM_INDEX                        1                       /**< the index of Device descriptors memory */
32285242Sachim#define SM_IO_MEM_INDEX                            2                       /**< the index of IO command descriptors memory */
33285242Sachim
34285242Sachim
35285242Sachim#define SM_MAX_DEV                              256
36285242Sachim#define SM_MAX_IO                               1024
37285242Sachim
38285242Sachim#define SM_USECS_PER_TICK                       1000000                   /**< defines the heart beat of the LL layer 10ms */
39285242Sachim
40285242Sachimenum sm_locks_e
41285242Sachim{
42285242Sachim  SM_TIMER_LOCK = 0,
43285242Sachim  SM_DEVICE_LOCK,
44285242Sachim  SM_INTERNAL_IO_LOCK,
45285242Sachim  SM_EXTERNAL_IO_LOCK,
46285242Sachim  SM_NCQ_TAG_LOCK,
47285242Sachim  SM_TBD_LOCK,
48285242Sachim  SM_MAX_LOCKS
49285242Sachim};
50285242Sachim
51285242Sachim/* ATA device type */
52285242Sachim#define SATA_ATA_DEVICE                           0x01                       /**< ATA ATA device type */
53285242Sachim#define SATA_ATAPI_DEVICE                         0x02                       /**< ATA ATAPI device type */
54285242Sachim#define SATA_PM_DEVICE                            0x03                       /**< ATA PM device type */
55285242Sachim#define SATA_SEMB_DEVICE                          0x04                       /**< ATA SEMB device type */
56285242Sachim#define SATA_SEMB_WO_SEP_DEVICE                   0x05                       /**< ATA SEMB without SEP device type */
57285242Sachim#define UNKNOWN_DEVICE                            0xFF
58285242Sachim
59285242Sachim/*
60285242Sachim *  FIS type
61285242Sachim */
62285242Sachim#define PIO_SETUP_DEV_TO_HOST_FIS   0x5F
63285242Sachim#define REG_DEV_TO_HOST_FIS         0x34
64285242Sachim#define SET_DEV_BITS_FIS            0xA1
65285242Sachim
66285242Sachim/*
67285242Sachim * ATA Command code
68285242Sachim */
69285242Sachim#define SAT_READ_FPDMA_QUEUED                 0x60
70285242Sachim#define SAT_READ_DMA_EXT                      0x25
71285242Sachim#define SAT_READ_DMA                          0xC8
72285242Sachim#define SAT_WRITE_FPDMA_QUEUED                0x61
73285242Sachim#define SAT_WRITE_DMA_EXT                     0x35
74285242Sachim#define SAT_WRITE_DMA_FUA_EXT                 0x3D
75285242Sachim#define SAT_WRITE_DMA                         0xCA
76285242Sachim#define SAT_CHECK_POWER_MODE                  0xE5
77285242Sachim#define SAT_READ_LOG_EXT                      0x2F
78285242Sachim#define SAT_READ_VERIFY_SECTORS               0x40
79285242Sachim#define SAT_READ_VERIFY_SECTORS_EXT           0x42
80285242Sachim#define SAT_SMART                             0xB0
81285242Sachim#define SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE   0xD4
82285242Sachim#define SAT_SMART_RETURN_STATUS               0xDA
83285242Sachim#define SAT_SMART_READ_LOG                    0xD5
84285242Sachim#define SAT_SMART_ENABLE_OPERATIONS           0xD8
85285242Sachim#define SAT_SMART_DISABLE_OPERATIONS          0xD9
86285242Sachim#define SAT_FLUSH_CACHE                       0xE7
87285242Sachim#define SAT_FLUSH_CACHE_EXT                   0xEA
88285242Sachim#define SAT_STANDBY                           0xE2
89285242Sachim#define SAT_MEDIA_EJECT                       0xED
90285242Sachim#define SAT_WRITE_SECTORS                     0x30
91285242Sachim#define SAT_WRITE_SECTORS_EXT                 0x34
92285242Sachim#define SAT_READ_SECTORS                      0x20
93285242Sachim#define SAT_READ_SECTORS_EXT                  0x24
94285242Sachim#define SAT_GET_MEDIA_STATUS                  0xDA
95285242Sachim#define SAT_SET_FEATURES                      0xEF
96285242Sachim#define SAT_IDENTIFY_DEVICE                   0xEC
97285242Sachim#define SAT_READ_BUFFER                       0xE4
98285242Sachim#define SAT_WRITE_BUFFER                      0xE8
99285242Sachim
100285242Sachim/*
101285242Sachim * ATAPI Command code
102285242Sachim*/
103285242Sachim#define SAT_IDENTIFY_PACKET_DEVICE            0xA1
104285242Sachim#define SAT_PACKET                            0xA0
105285242Sachim#define SAT_DEVICE_RESET                      0x08
106285242Sachim#define SAT_EXECUTE_DEVICE_DIAGNOSTIC         0x90
107285242Sachim
108285242Sachim
109285242Sachim/*
110285242Sachim * ATA Status Register Mask
111285242Sachim */
112285242Sachim#define ERR_ATA_STATUS_MASK                   0x01    /* Error/check bit  */
113285242Sachim#define DRQ_ATA_STATUS_MASK                   0x08    /* Data Request bit */
114285242Sachim#define DF_ATA_STATUS_MASK                    0x20    /* Device Fault bit */
115285242Sachim#define DRDY_ATA_STATUS_MASK                  0x40    /* Device Ready bit */
116285242Sachim#define BSY_ATA_STATUS_MASK                   0x80    /* Busy bit         */
117285242Sachim
118285242Sachim/*
119285242Sachim * ATA Error Register Mask
120285242Sachim */
121285242Sachim#define NM_ATA_ERROR_MASK                     0x02    /* No media present bit         */
122285242Sachim#define ABRT_ATA_ERROR_MASK                   0x04    /* Command aborted bit          */
123285242Sachim#define MCR_ATA_ERROR_MASK                    0x08    /* Media change request bit     */
124285242Sachim#define IDNF_ATA_ERROR_MASK                   0x10    /* Address not found bit        */
125285242Sachim#define MC_ATA_ERROR_MASK                     0x20    /* Media has changed bit        */
126285242Sachim#define UNC_ATA_ERROR_MASK                    0x40    /* Uncorrectable data error bit */
127285242Sachim#define ICRC_ATA_ERROR_MASK                   0x80    /* Interface CRC error bit      */
128285242Sachim
129285242Sachim
130285242Sachim
131285242Sachim
132285242Sachim/*
133285242Sachim *  transfer length and LBA limit 2^28 See identify device data word 61:60
134285242Sachim *  ATA spec p125
135285242Sachim *  7 zeros
136285242Sachim */
137285242Sachim#define SAT_TR_LBA_LIMIT                      0x10000000
138285242Sachim
139285242Sachim/*
140285242Sachim *  transfer length and LBA limit 2^48 See identify device data word 61:60
141285242Sachim *  ATA spec p125
142285242Sachim *  12 zeros
143285242Sachim */
144285242Sachim#define SAT_EXT_TR_LBA_LIMIT                  0x1000000000000
145285242Sachim
146285242Sachim
147285242Sachim/*
148285242Sachim * ATA command type. This is for setting LBA, Sector Count
149285242Sachim */
150285242Sachim#define SAT_NON_EXT_TYPE                      0
151285242Sachim#define SAT_EXT_TYPE                          1
152285242Sachim#define SAT_FP_TYPE                           2
153285242Sachim
154285242Sachim
155285242Sachim/*
156285242Sachim * Report LUNs response data.
157285242Sachim */
158285242Sachimtypedef struct smScsiReportLun_s
159285242Sachim{
160285242Sachim  bit8              len[4];
161285242Sachim  bit32             reserved;
162285242Sachim  tiLUN_t           lunList[1];
163285242Sachim} smScsiReportLun_t;
164285242Sachim
165285242Sachim/* Inquiry vendor string */
166285242Sachim#define AG_SAT_VENDOR_ID_STRING               "ATA     "
167285242Sachim
168285242Sachim/*
169285242Sachim * Simple form of SATA Identify Device Data, similar definition is defined by
170285242Sachim * LL Layer as agsaSATAIdentifyData_t.
171285242Sachim */
172285242Sachimtypedef struct satSimpleSATAIdentifyData_s
173285242Sachim{
174285242Sachim  bit16   word[256];
175285242Sachim} satSimpleSATAIdentifyData_t;
176285242Sachim
177285242Sachim
178285242Sachim/*
179285242Sachim * READ LOG EXT page 10h
180285242Sachim */
181285242Sachimtypedef struct satReadLogExtPage10h_s
182285242Sachim{
183285242Sachim  bit8   byte[512];
184285242Sachim} satReadLogExtPage10h_t;
185285242Sachim
186285242Sachim/*
187285242Sachim * READ LOG EXT Extended Self-test log
188285242Sachim * ATA Table27 p196
189285242Sachim */
190285242Sachimtypedef struct satReadLogExtSelfTest_s
191285242Sachim{
192285242Sachim  bit8   byte[512];
193285242Sachim} satReadLogExtSelfTest_t;
194285242Sachim
195285242Sachim/*
196285242Sachim * SMART READ LOG Self-test log
197285242Sachim * ATA Table60 p296
198285242Sachim */
199285242Sachimtypedef struct satSmartReadLogSelfTest_s
200285242Sachim{
201285242Sachim  bit8   byte[512];
202285242Sachim} satSmartReadLogSelfTest_t;
203285242Sachim
204285242Sachim
205285242Sachim/*
206285242Sachim * Flag definition for satIntFlag field in smSatInternalIo_t.
207285242Sachim */
208285242Sachim
209285242Sachim/* Original NCQ I/O already completed, so at the completion of READ LOG EXT
210285242Sachim *  page 10h, ignore the TAG tranaltion to get the failed I/O
211285242Sachim */
212285242Sachim#define AG_SAT_INT_IO_FLAG_ORG_IO_COMPLETED   0x00000001
213285242Sachim
214285242Sachim#define INQUIRY_SUPPORTED_VPD_PAGE                          0x00
215285242Sachim#define INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE                 0x80
216285242Sachim#define INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE              0x83
217285242Sachim#define INQUIRY_ATA_INFORMATION_VPD_PAGE                    0x89
218285242Sachim#define INQUIRY_BLOCK_DEVICE_CHARACTERISTICS_VPD_PAGE       0xB1
219285242Sachim
220285242Sachim#define MODESENSE_CONTROL_PAGE                            0x0A
221285242Sachim#define MODESENSE_READ_WRITE_ERROR_RECOVERY_PAGE          0x01
222285242Sachim#define MODESENSE_CACHING                                 0x08
223285242Sachim#define MODESENSE_INFORMATION_EXCEPTION_CONTROL_PAGE      0x1C
224285242Sachim#define MODESENSE_RETURN_ALL_PAGES                        0x3F
225285242Sachim#define MODESENSE_VENDOR_SPECIFIC_PAGE                    0x00
226285242Sachim
227285242Sachim#define MODESELECT_CONTROL_PAGE                           0x0A
228285242Sachim#define MODESELECT_READ_WRITE_ERROR_RECOVERY_PAGE         0x01
229285242Sachim#define MODESELECT_CACHING                                0x08
230285242Sachim#define MODESELECT_INFORMATION_EXCEPTION_CONTROL_PAGE     0x1C
231285242Sachim#define MODESELECT_RETURN_ALL_PAGES                       0x3F
232285242Sachim#define MODESELECT_VENDOR_SPECIFIC_PAGE                   0x00
233285242Sachim
234285242Sachim#define LOGSENSE_SUPPORTED_LOG_PAGES                      0x00
235285242Sachim#define LOGSENSE_SELFTEST_RESULTS_PAGE                    0x10
236285242Sachim#define LOGSENSE_INFORMATION_EXCEPTIONS_PAGE              0x2F
237285242Sachim
238285242Sachim
239285242Sachim/*
240285242Sachim *  Bit mask definition
241285242Sachim */
242285242Sachim#define SCSI_EVPD_MASK               0x01
243285242Sachim#define SCSI_IMMED_MASK              0x01
244285242Sachim#define SCSI_NACA_MASK               0x04
245285242Sachim#define SCSI_LINK_MASK               0x01
246285242Sachim#define SCSI_PF_MASK                 0x10
247285242Sachim#define SCSI_DEVOFFL_MASK            0x02
248285242Sachim#define SCSI_UNITOFFL_MASK           0x01
249285242Sachim#define SCSI_START_MASK              0x01
250285242Sachim#define SCSI_LOEJ_MASK               0x02
251285242Sachim#define SCSI_NM_MASK                 0x02
252285242Sachim#define SCSI_FLUSH_CACHE_IMMED_MASK              0x02
253285242Sachim#define SCSI_FUA_NV_MASK                         0x02
254285242Sachim#define SCSI_VERIFY_BYTCHK_MASK                  0x02
255285242Sachim#define SCSI_FORMAT_UNIT_IMMED_MASK              0x02
256285242Sachim#define SCSI_FORMAT_UNIT_FOV_MASK                0x80
257285242Sachim#define SCSI_FORMAT_UNIT_DCRT_MASK               0x20
258285242Sachim#define SCSI_FORMAT_UNIT_IP_MASK                 0x08
259285242Sachim#define SCSI_WRITE_SAME_LBDATA_MASK              0x02
260285242Sachim#define SCSI_WRITE_SAME_PBDATA_MASK              0x04
261285242Sachim#define SCSI_SYNC_CACHE_IMMED_MASK               0x02
262285242Sachim#define SCSI_WRITE_N_VERIFY_BYTCHK_MASK          0x02
263285242Sachim#define SCSI_SEND_DIAGNOSTIC_SELFTEST_MASK       0x04
264285242Sachim#define SCSI_FORMAT_UNIT_DEFECT_LIST_FORMAT_MASK 0x07
265285242Sachim#define SCSI_FORMAT_UNIT_FMTDATA_MASK            0x10
266285242Sachim#define SCSI_FORMAT_UNIT_DCRT_MASK               0x20
267285242Sachim#define SCSI_FORMAT_UNIT_CMPLIST_MASK            0x08
268285242Sachim#define SCSI_FORMAT_UNIT_LONGLIST_MASK           0x20
269285242Sachim#define SCSI_READ10_FUA_MASK                     0x08
270285242Sachim#define SCSI_READ12_FUA_MASK                     0x08
271285242Sachim#define SCSI_READ16_FUA_MASK                     0x08
272285242Sachim#define SCSI_WRITE10_FUA_MASK                    0x08
273285242Sachim#define SCSI_WRITE12_FUA_MASK                    0x08
274285242Sachim#define SCSI_WRITE16_FUA_MASK                    0x08
275285242Sachim#define SCSI_READ_CAPACITY10_PMI_MASK            0x01
276285242Sachim#define SCSI_READ_CAPACITY16_PMI_MASK            0x01
277285242Sachim#define SCSI_MODE_SENSE6_PC_MASK                 0xC0
278285242Sachim#define SCSI_MODE_SENSE6_PAGE_CODE_MASK          0x3F
279285242Sachim#define SCSI_MODE_SENSE10_PC_MASK                0xC0
280285242Sachim#define SCSI_MODE_SENSE10_LLBAA_MASK             0x10
281285242Sachim#define SCSI_MODE_SENSE10_PAGE_CODE_MASK         0x3F
282285242Sachim#define SCSI_SEND_DIAGNOSTIC_TEST_CODE_MASK      0xE0
283285242Sachim#define SCSI_LOG_SENSE_PAGE_CODE_MASK            0x3F
284285242Sachim#define SCSI_MODE_SELECT6_PF_MASK                0x10
285285242Sachim#define SCSI_MODE_SELECT6_AWRE_MASK              0x80
286285242Sachim#define SCSI_MODE_SELECT6_RC_MASK                0x10
287285242Sachim#define SCSI_MODE_SELECT6_EER_MASK               0x08
288285242Sachim#define SCSI_MODE_SELECT6_PER_MASK               0x04
289285242Sachim#define SCSI_MODE_SELECT6_DTE_MASK               0x02
290285242Sachim#define SCSI_MODE_SELECT6_DCR_MASK               0x01
291285242Sachim#define SCSI_MODE_SELECT6_WCE_MASK               0x04
292285242Sachim#define SCSI_MODE_SELECT6_DRA_MASK               0x20
293285242Sachim#define SCSI_MODE_SELECT6_PERF_MASK              0x80
294285242Sachim#define SCSI_MODE_SELECT6_TEST_MASK              0x04
295285242Sachim#define SCSI_MODE_SELECT6_DEXCPT_MASK            0x08
296285242Sachim#define SCSI_MODE_SELECT10_PF_MASK               0x10
297285242Sachim#define SCSI_MODE_SELECT10_LONGLBA_MASK          0x01
298285242Sachim#define SCSI_MODE_SELECT10_AWRE_MASK             0x80
299285242Sachim#define SCSI_MODE_SELECT10_RC_MASK               0x10
300285242Sachim#define SCSI_MODE_SELECT10_EER_MASK              0x08
301285242Sachim#define SCSI_MODE_SELECT10_PER_MASK              0x04
302285242Sachim#define SCSI_MODE_SELECT10_DTE_MASK              0x02
303285242Sachim#define SCSI_MODE_SELECT10_DCR_MASK              0x01
304285242Sachim#define SCSI_MODE_SELECT10_WCE_MASK              0x04
305285242Sachim#define SCSI_MODE_SELECT10_DRA_MASK              0x20
306285242Sachim#define SCSI_MODE_SELECT10_PERF_MASK             0x80
307285242Sachim#define SCSI_MODE_SELECT10_TEST_MASK             0x04
308285242Sachim#define SCSI_MODE_SELECT10_DEXCPT_MASK           0x08
309285242Sachim#define SCSI_WRITE_N_VERIFY10_FUA_MASK           0x08
310285242Sachim#define SCSI_REQUEST_SENSE_DESC_MASK             0x01
311285242Sachim#define SCSI_READ_BUFFER_MODE_MASK               0x1F
312285242Sachim
313285242Sachim#define ATA_REMOVABLE_MEDIA_DEVICE_MASK          0x80
314285242Sachim#define SCSI_REASSIGN_BLOCKS_LONGLIST_MASK       0x01
315285242Sachim#define SCSI_REASSIGN_BLOCKS_LONGLBA_MASK        0x02
316285242Sachim
317285242Sachim
318285242Sachim#define SENSE_DATA_LENGTH                        0x12 /* 18 */
319285242Sachim#define SELFTEST_RESULTS_LOG_PAGE_LENGTH         404
320285242Sachim#define INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH   11
321285242Sachim#define ZERO_MEDIA_SERIAL_NUMBER_LENGTH          8
322285242Sachim
323285242Sachim#define LOG_SENSE_0 0
324285242Sachim#define LOG_SENSE_1 1
325285242Sachim#define LOG_SENSE_2 2
326285242Sachim
327285242Sachim#define READ_BUFFER_DATA_MODE                    0x02
328285242Sachim#define READ_BUFFER_DESCRIPTOR_MODE              0x03
329285242Sachim#define READ_BUFFER_DESCRIPTOR_MODE_DATA_LEN     0x04
330285242Sachim
331285242Sachim#define WRITE_BUFFER_DATA_MODE                   0x02
332285242Sachim#define WRITE_BUFFER_DL_MICROCODE_SAVE_MODE      0x05
333285242Sachim
334285242Sachim/* bit mask */
335285242Sachim#define BIT0_MASK                                0x01
336285242Sachim#define BIT1_MASK                                0x02
337285242Sachim#define BIT2_MASK                                0x04
338285242Sachim#define BIT3_MASK                                0x08
339285242Sachim#define BIT4_MASK                                0x10
340285242Sachim#define BIT5_MASK                                0x20
341285242Sachim#define BIT6_MASK                                0x40
342285242Sachim#define BIT7_MASK                                0x80
343285242Sachim
344285242Sachim#define MODE_SENSE6_RETURN_ALL_PAGES_LEN         68
345285242Sachim#define MODE_SENSE6_CONTROL_PAGE_LEN             24
346285242Sachim#define MODE_SENSE6_READ_WRITE_ERROR_RECOVERY_PAGE_LEN 24
347285242Sachim#define MODE_SENSE6_CACHING_LEN                  32
348285242Sachim#define MODE_SENSE6_INFORMATION_EXCEPTION_CONTROL_PAGE_LEN 24
349285242Sachim
350285242Sachim
351285242Sachim#define MODE_SENSE10_RETURN_ALL_PAGES_LEN         68 + 4
352285242Sachim#define MODE_SENSE10_CONTROL_PAGE_LEN             24 + 4
353285242Sachim#define MODE_SENSE10_READ_WRITE_ERROR_RECOVERY_PAGE_LEN 24 + 4
354285242Sachim#define MODE_SENSE10_CACHING_LEN                  32 + 4
355285242Sachim#define MODE_SENSE10_INFORMATION_EXCEPTION_CONTROL_PAGE_LEN 24 + 4
356285242Sachim
357285242Sachim#define MODE_SENSE10_RETURN_ALL_PAGES_LLBAA_LEN         68 + 4 + 8
358285242Sachim#define MODE_SENSE10_CONTROL_PAGE_LLBAA_LEN             24 + 4 + 8
359285242Sachim#define MODE_SENSE10_READ_WRITE_ERROR_RECOVERY_PAGE_LLBAA_LEN 24 + 4 + 8
360285242Sachim#define MODE_SENSE10_CACHING_LLBAA_LEN                  32 + 4 + 8
361285242Sachim#define MODE_SENSE10_INFORMATION_EXCEPTION_CONTROL_PAGE_LLBAA_LEN 24 + 4 + 8
362285242Sachim
363285242Sachim/*****************************************************************************
364285242Sachim** SCSI SENSE KEY VALUES
365285242Sachim*****************************************************************************/
366285242Sachim
367285242Sachim#define SCSI_SNSKEY_NO_SENSE           0x00
368285242Sachim#define SCSI_SNSKEY_RECOVERED_ERROR    0x01
369285242Sachim#define SCSI_SNSKEY_NOT_READY          0x02
370285242Sachim#define SCSI_SNSKEY_MEDIUM_ERROR       0x03
371285242Sachim#define SCSI_SNSKEY_HARDWARE_ERROR     0x04
372285242Sachim#define SCSI_SNSKEY_ILLEGAL_REQUEST    0x05
373285242Sachim#define SCSI_SNSKEY_UNIT_ATTENTION     0x06
374285242Sachim#define SCSI_SNSKEY_DATA_PROTECT       0x07
375285242Sachim#define SCSI_SNSKEY_ABORTED_COMMAND    0x0B
376285242Sachim#define SCSI_SNSKEY_MISCOMPARE         0x0E
377285242Sachim
378285242Sachim/*****************************************************************************
379285242Sachim** SCSI Additional Sense Codes and Qualifiers combo two-bytes
380285242Sachim*****************************************************************************/
381285242Sachim
382285242Sachim#define SCSI_SNSCODE_NO_ADDITIONAL_INFO                         0x0000
383285242Sachim#define SCSI_SNSCODE_LUN_CRC_ERROR_DETECTED                     0x0803
384285242Sachim#define SCSI_SNSCODE_INVALID_COMMAND                            0x2000
385285242Sachim#define SCSI_SNSCODE_LOGICAL_BLOCK_OUT                          0x2100
386285242Sachim#define SCSI_SNSCODE_INVALID_FIELD_IN_CDB                       0x2400
387285242Sachim#define SCSI_SNSCODE_LOGICAL_NOT_SUPPORTED                      0x2500
388285242Sachim#define SCSI_SNSCODE_POWERON_RESET                              0x2900
389285242Sachim#define SCSI_SNSCODE_EVERLAPPED_CMDS                            0x4e00
390285242Sachim#define SCSI_SNSCODE_INTERNAL_TARGET_FAILURE                    0x4400
391285242Sachim#define SCSI_SNSCODE_MEDIUM_NOT_PRESENT                         0x3a00
392285242Sachim#define SCSI_SNSCODE_UNRECOVERED_READ_ERROR                     0x1100
393285242Sachim#define SCSI_SNSCODE_RECORD_NOT_FOUND                           0x1401
394285242Sachim#define SCSI_SNSCODE_NOT_READY_TO_READY_CHANGE                  0x2800
395285242Sachim#define SCSI_SNSCODE_OPERATOR_MEDIUM_REMOVAL_REQUEST            0x5a01
396285242Sachim#define SCSI_SNSCODE_INFORMATION_UNIT_CRC_ERROR                 0x4703
397285242Sachim#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS  0x0404
398285242Sachim#define SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE                 0x5d10
399285242Sachim#define SCSI_SNSCODE_LOW_POWER_CONDITION_ON                     0x5e00
400285242Sachim#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INIT_REQUIRED       0x0402
401285242Sachim#define SCSI_SNSCODE_INVALID_FIELD_PARAMETER_LIST               0x2600
402285242Sachim#define SCSI_SNSCODE_ATA_DEVICE_FAILED_SET_FEATURES             0x4471
403285242Sachim#define SCSI_SNSCODE_ATA_DEVICE_FEATURE_NOT_ENABLED             0x670B
404285242Sachim#define SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST              0x3E03
405285242Sachim#define SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR                     0x2C00
406285242Sachim#define SCSI_SNSCODE_LOGICAL_BLOCK_ADDRESS_OUT_OF_RANGE         0x2100
407285242Sachim#define SCSI_SNSCODE_LOGICAL_UNIT_FAILURE                       0x3E01
408285242Sachim#define SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED                 0x5300
409285242Sachim#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_INITIALIZING_COMMAND_REQUIRED 0x0402
410285242Sachim#define SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE          0x0400
411285242Sachim#define SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION           0x0500
412285242Sachim#define SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN         0x4000
413285242Sachim#define SCSI_SNSCODE_COMMANDS_CLEARED_BY_ANOTHER_INITIATOR      0x2F00
414285242Sachim#define SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED       0x0C02
415285242Sachim#define SCSI_SNSCODE_ATA_PASS_THROUGH_INFORMATION_AVAILABLE     0x001D
416285242Sachim
417285242Sachim/*****************************************************************************
418285242Sachim** SCSI Additional Sense Codes and Qualifiers saparate bytes
419285242Sachim*****************************************************************************/
420285242Sachim
421285242Sachim#define SCSI_ASC_NOTREADY_INIT_CMD_REQ    0x04
422285242Sachim#define SCSI_ASCQ_NOTREADY_INIT_CMD_REQ   0x02
423285242Sachim
424285242Sachim
425285242Sachim/*****************************************************************************
426285242Sachim** Inquiry command fields and response sizes
427285242Sachim*****************************************************************************/
428285242Sachim#define SCSIOP_INQUIRY_CMDDT        0x02
429285242Sachim#define SCSIOP_INQUIRY_EVPD         0x01
430285242Sachim#define STANDARD_INQUIRY_SIZE       36
431285242Sachim#define SATA_PAGE83_INQUIRY_WWN_SIZE       16      /* SAT, revision8, Table81, p78, 12 + 4 */
432285242Sachim#define SATA_PAGE83_INQUIRY_NO_WWN_SIZE    76      /* SAT, revision8, Table81, p78, 72 + 4 */
433285242Sachim#define SATA_PAGE89_INQUIRY_SIZE    572     /* SAT, revision8, Table87, p84 */
434285242Sachim#define SATA_PAGE0_INQUIRY_SIZE     9       /* SPC-4, 7.6.9   Table331, p345 */
435285242Sachim#define SATA_PAGE80_INQUIRY_SIZE    24     /* SAT, revision8, Table79, p77 */
436285242Sachim#define SATA_PAGEB1_INQUIRY_SIZE    64     /* SBC-3, revision31, Table193, p273 */
437285242Sachim
438285242Sachim/*****************************************************************************
439285242Sachim** SCSI Operation Codes (first byte in CDB)
440285242Sachim*****************************************************************************/
441285242Sachim
442285242Sachim
443285242Sachim#define SCSIOPC_TEST_UNIT_READY     0x00
444285242Sachim#define SCSIOPC_INQUIRY             0x12
445285242Sachim#define SCSIOPC_MODE_SENSE_6        0x1A
446285242Sachim#define SCSIOPC_MODE_SENSE_10       0x5A
447285242Sachim#define SCSIOPC_MODE_SELECT_6       0x15
448285242Sachim#define SCSIOPC_START_STOP_UNIT     0x1B
449285242Sachim#define SCSIOPC_READ_CAPACITY_10    0x25
450285242Sachim#define SCSIOPC_READ_CAPACITY_16    0x9E
451285242Sachim#define SCSIOPC_READ_6              0x08
452285242Sachim#define SCSIOPC_READ_10             0x28
453285242Sachim#define SCSIOPC_READ_12             0xA8
454285242Sachim#define SCSIOPC_READ_16             0x88
455285242Sachim#define SCSIOPC_WRITE_6             0x0A
456285242Sachim#define SCSIOPC_WRITE_10            0x2A
457285242Sachim#define SCSIOPC_WRITE_12            0xAA
458285242Sachim#define SCSIOPC_WRITE_16            0x8A
459285242Sachim#define SCSIOPC_WRITE_VERIFY        0x2E
460285242Sachim#define SCSIOPC_VERIFY_10           0x2F
461285242Sachim#define SCSIOPC_VERIFY_12           0xAF
462285242Sachim#define SCSIOPC_VERIFY_16           0x8F
463285242Sachim#define SCSIOPC_REQUEST_SENSE       0x03
464285242Sachim#define SCSIOPC_REPORT_LUN          0xA0
465285242Sachim#define SCSIOPC_FORMAT_UNIT         0x04
466285242Sachim#define SCSIOPC_SEND_DIAGNOSTIC     0x1D
467285242Sachim#define SCSIOPC_WRITE_SAME_10       0x41
468285242Sachim#define SCSIOPC_WRITE_SAME_16       0x93
469285242Sachim#define SCSIOPC_READ_BUFFER         0x3C
470285242Sachim#define SCSIOPC_WRITE_BUFFER        0x3B
471285242Sachim
472285242Sachim#define SCSIOPC_LOG_SENSE           0x4D
473285242Sachim#define SCSIOPC_LOG_SELECT          0x4C
474285242Sachim#define SCSIOPC_MODE_SELECT_6       0x15
475285242Sachim#define SCSIOPC_MODE_SELECT_10      0x55
476285242Sachim#define SCSIOPC_SYNCHRONIZE_CACHE_10 0x35
477285242Sachim#define SCSIOPC_SYNCHRONIZE_CACHE_16 0x91
478285242Sachim#define SCSIOPC_WRITE_AND_VERIFY_10 0x2E
479285242Sachim#define SCSIOPC_WRITE_AND_VERIFY_12 0xAE
480285242Sachim#define SCSIOPC_WRITE_AND_VERIFY_16 0x8E
481285242Sachim#define SCSIOPC_READ_MEDIA_SERIAL_NUMBER 0xAB
482285242Sachim#define SCSIOPC_REASSIGN_BLOCKS     0x07
483285242Sachim
484285242Sachim#define SCSIOPC_GET_CONFIG          0x46
485285242Sachim#define SCSIOPC_GET_EVENT_STATUS_NOTIFICATION        0x4a
486285242Sachim#define SCSIOPC_REPORT_KEY          0xA4
487285242Sachim#define SCSIOPC_SEND_KEY            0xA3
488285242Sachim#define SCSIOPC_READ_DVD_STRUCTURE  0xAD
489285242Sachim#define SCSIOPC_TOC                 0x43
490285242Sachim#define SCSIOPC_PREVENT_ALLOW_MEDIUM_REMOVAL         0x1E
491285242Sachim#define SCSIOPC_READ_VERIFY         0x42
492285242Sachim#define SCSIOPC_ATA_PASS_THROUGH12	0xA1
493285242Sachim#define SCSIOPC_ATA_PASS_THROUGH16	0x85
494285242Sachim
495285242Sachim
496285242Sachim/*! \def MIN(a,b)
497285242Sachim* \brief MIN macro
498285242Sachim*
499285242Sachim* use to find MIN of two values
500285242Sachim*/
501285242Sachim#ifndef MIN
502285242Sachim#define MIN(a,b) ((a) < (b) ? (a) : (b))
503285242Sachim#endif
504285242Sachim
505285242Sachim/*! \def MAX(a,b)
506285242Sachim* \brief MAX macro
507285242Sachim*
508285242Sachim* use to find MAX of two values
509285242Sachim*/
510285242Sachim#ifndef MAX
511285242Sachim#define MAX(a,b) ((a) < (b) ? (b) : (a))
512285242Sachim#endif
513285242Sachim
514285242Sachim/* for debugging print */
515285242Sachim#if defined(SM_DEBUG)
516285242Sachim
517285242Sachim/*
518285242Sachim* for debugging purposes.
519285242Sachim*/
520285242Sachimextern bit32 gSMDebugLevel;
521285242Sachim
522285242Sachim#define SM_DBG0(format) tdsmLogDebugString(gSMDebugLevel, 0, format)
523285242Sachim#define SM_DBG1(format) tdsmLogDebugString(gSMDebugLevel, 1, format)
524285242Sachim#define SM_DBG2(format) tdsmLogDebugString(gSMDebugLevel, 2, format)
525285242Sachim#define SM_DBG3(format) tdsmLogDebugString(gSMDebugLevel, 3, format)
526285242Sachim#define SM_DBG4(format) tdsmLogDebugString(gSMDebugLevel, 4, format)
527285242Sachim#define SM_DBG5(format) tdsmLogDebugString(gSMDebugLevel, 5, format)
528285242Sachim#define SM_DBG6(format) tdsmLogDebugString(gSMDebugLevel, 6, format)
529285242Sachim
530285242Sachim#else
531285242Sachim
532285242Sachim#define SM_DBG0(format)
533285242Sachim#define SM_DBG1(format)
534285242Sachim#define SM_DBG2(format)
535285242Sachim#define SM_DBG3(format)
536285242Sachim#define SM_DBG4(format)
537285242Sachim#define SM_DBG5(format)
538285242Sachim#define SM_DBG6(format)
539285242Sachim
540285242Sachim#endif /* SM_DEBUG */
541285242Sachim
542285242Sachim//#define SM_ASSERT OS_ASSERT
543285242Sachim//#define tdsmLogDebugString TIDEBUG_MSG
544285242Sachim
545285242Sachim/*
546285242Sachim * SAT specific structure per SATA drive
547285242Sachim */
548285242Sachim#define SAT_NONNCQ_MAX  1
549285242Sachim#define SAT_NCQ_MAX     32
550285242Sachim#define SAT_MAX_INT_IO  16
551285242Sachim#define SAT_APAPI_CMDQ_MAX 2
552285242Sachim
553285242Sachim/* Device state */
554285242Sachim#define SAT_DEV_STATE_NORMAL                  0  /* Normal */
555285242Sachim#define SAT_DEV_STATE_IN_RECOVERY             1  /* SAT in recovery mode */
556285242Sachim#define SAT_DEV_STATE_FORMAT_IN_PROGRESS      2  /* Format unit in progress */
557285242Sachim#define SAT_DEV_STATE_SMART_THRESHOLD         3  /* SMART Threshold Exceeded Condition*/
558285242Sachim#define SAT_DEV_STATE_LOW_POWER               4  /* Low Power State*/
559285242Sachim
560285242Sachim#ifndef agNULL
561285242Sachim#define agNULL     ((void *)0)
562285242Sachim#endif
563285242Sachim
564285242Sachim#define SM_SET_ESGL_EXTEND(val) \
565285242Sachim ((val) = (val) | 0x80000000)
566285242Sachim
567285242Sachim#define SM_CLEAR_ESGL_EXTEND(val) \
568285242Sachim ((val) = (val) & 0x7FFFFFFF)
569285242Sachim
570285242Sachim#ifndef OPEN_RETRY_RETRIES
571285242Sachim#define OPEN_RETRY_RETRIES	10
572285242Sachim#endif
573285242Sachim
574285242Sachim/*********************************************************************
575285242Sachim* CPU buffer access macro                                            *
576285242Sachim*                                                                    *
577285242Sachim*/
578285242Sachim
579285242Sachim#define OSSA_OFFSET_OF(STRUCT_TYPE, FEILD)              \
580285242Sachim        (bitptr)&(((STRUCT_TYPE *)0)->FEILD)
581285242Sachim
582285242Sachim
583285242Sachim#if defined(SA_CPU_LITTLE_ENDIAN)
584285242Sachim
585285242Sachim#define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
586285242Sachim        (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16);
587285242Sachim
588285242Sachim#define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
589285242Sachim        (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32);
590285242Sachim
591285242Sachim#define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
592285242Sachim        (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET))))
593285242Sachim
594285242Sachim#define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
595285242Sachim        (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET))))
596285242Sachim
597285242Sachim#define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
598285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)((((bit16)VALUE16)>>8)&0xFF);  \
599285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)(((bit16)VALUE16)&0xFF);
600285242Sachim
601285242Sachim#define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
602285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)((((bit32)VALUE32)>>24)&0xFF); \
603285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>16)&0xFF); \
604285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>8)&0xFF);  \
605285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)(((bit32)VALUE32)&0xFF);
606285242Sachim
607285242Sachim#define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
608285242Sachim        (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
609285242Sachim        (*(bit8 *)(((bit8 *)ADDR16)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1)));
610285242Sachim
611285242Sachim#define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
612285242Sachim        (*(bit8 *)(((bit8 *)ADDR32)+3)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
613285242Sachim        (*(bit8 *)(((bit8 *)ADDR32)+2)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \
614285242Sachim        (*(bit8 *)(((bit8 *)ADDR32)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \
615285242Sachim        (*(bit8 *)(((bit8 *)ADDR32)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3)));
616285242Sachim
617285242Sachim#define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN)                        \
618285242Sachim        si_memcpy(DEST_ADDR, SRC_ADDR, LEN);
619285242Sachim
620285242Sachim
621285242Sachim#elif defined(SA_CPU_BIG_ENDIAN)
622285242Sachim
623285242Sachim#define OSSA_WRITE_LE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)     \
624285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit16)VALUE16)>>8)&0xFF);   \
625285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)(((bit16)VALUE16)&0xFF);
626285242Sachim
627285242Sachim#define OSSA_WRITE_LE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)     \
628285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3))) = (bit8)((((bit32)VALUE32)>>24)&0xFF);  \
629285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))) = (bit8)((((bit32)VALUE32)>>16)&0xFF);  \
630285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))) = (bit8)((((bit32)VALUE32)>>8)&0xFF);   \
631285242Sachim        (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))))   = (bit8)(((bit32)VALUE32)&0xFF);
632285242Sachim
633285242Sachim#define OSSA_READ_LE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)       \
634285242Sachim        (*(bit8 *)(((bit8 *)ADDR16)+1)) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
635285242Sachim        (*(bit8 *)(((bit8 *)ADDR16)))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1)));
636285242Sachim
637285242Sachim#define OSSA_READ_LE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)       \
638285242Sachim        (*((bit8 *)(((bit8 *)ADDR32)+3))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET))));   \
639285242Sachim        (*((bit8 *)(((bit8 *)ADDR32)+2))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+1))); \
640285242Sachim        (*((bit8 *)(((bit8 *)ADDR32)+1))) = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+2))); \
641285242Sachim        (*((bit8 *)(((bit8 *)ADDR32))))   = (*((bit8 *)(((bit8 *)DMA_ADDR)+(OFFSET)+3)));
642285242Sachim
643285242Sachim#define OSSA_WRITE_BE_16(AGROOT, DMA_ADDR, OFFSET, VALUE16)         \
644285242Sachim        (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit16)(VALUE16);
645285242Sachim
646285242Sachim#define OSSA_WRITE_BE_32(AGROOT, DMA_ADDR, OFFSET, VALUE32)         \
647285242Sachim        (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET)))) = (bit32)(VALUE32);
648285242Sachim
649285242Sachim#define OSSA_READ_BE_16(AGROOT, ADDR16, DMA_ADDR, OFFSET)           \
650285242Sachim        (*((bit16 *)ADDR16)) = (*((bit16 *)(((bit8 *)DMA_ADDR)+(OFFSET))));
651285242Sachim
652285242Sachim#define OSSA_READ_BE_32(AGROOT, ADDR32, DMA_ADDR, OFFSET)           \
653285242Sachim        (*((bit32 *)ADDR32)) = (*((bit32 *)(((bit8 *)DMA_ADDR)+(OFFSET))));
654285242Sachim
655285242Sachim#define OSSA_WRITE_BYTE_STRING(AGROOT, DEST_ADDR, SRC_ADDR, LEN)    \
656285242Sachim        si_memcpy(DEST_ADDR, SRC_ADDR, LEN);
657285242Sachim
658285242Sachim#else
659285242Sachim
660285242Sachim#error (Host CPU endianess undefined!!)
661285242Sachim
662285242Sachim#endif
663285242Sachim
664285242Sachim
665285242Sachim#if defined(SA_CPU_LITTLE_ENDIAN)
666285242Sachim
667285242Sachim#ifndef LEBIT16_TO_BIT16
668285242Sachim#define LEBIT16_TO_BIT16(_x)   (_x)
669285242Sachim#endif
670285242Sachim
671285242Sachim#ifndef BIT16_TO_LEBIT16
672285242Sachim#define BIT16_TO_LEBIT16(_x)   (_x)
673285242Sachim#endif
674285242Sachim
675285242Sachim#ifndef BIT16_TO_BEBIT16
676285242Sachim#define BIT16_TO_BEBIT16(_x)   AGSA_FLIP_2_BYTES(_x)
677285242Sachim#endif
678285242Sachim
679285242Sachim#ifndef BEBIT16_TO_BIT16
680285242Sachim#define BEBIT16_TO_BIT16(_x)   AGSA_FLIP_2_BYTES(_x)
681285242Sachim#endif
682285242Sachim
683285242Sachim#ifndef LEBIT32_TO_BIT32
684285242Sachim#define LEBIT32_TO_BIT32(_x)   (_x)
685285242Sachim#endif
686285242Sachim
687285242Sachim#ifndef BIT32_TO_LEBIT32
688285242Sachim#define BIT32_TO_LEBIT32(_x)   (_x)
689285242Sachim#endif
690285242Sachim
691285242Sachim
692285242Sachim#ifndef BEBIT32_TO_BIT32
693285242Sachim#define BEBIT32_TO_BIT32(_x)   AGSA_FLIP_4_BYTES(_x)
694285242Sachim#endif
695285242Sachim
696285242Sachim#ifndef BIT32_TO_BEBIT32
697285242Sachim#define BIT32_TO_BEBIT32(_x)   AGSA_FLIP_4_BYTES(_x)
698285242Sachim#endif
699285242Sachim
700285242Sachim#elif defined(SA_CPU_BIG_ENDIAN)
701285242Sachim
702285242Sachim#ifndef LEBIT16_TO_BIT16
703285242Sachim#define LEBIT16_TO_BIT16(_x)   AGSA_FLIP_2_BYTES(_x)
704285242Sachim#endif
705285242Sachim
706285242Sachim#ifndef BIT16_TO_LEBIT16
707285242Sachim#define BIT16_TO_LEBIT16(_x)   AGSA_FLIP_2_BYTES(_x)
708285242Sachim#endif
709285242Sachim
710285242Sachim#ifndef BIT16_TO_BEBIT16
711285242Sachim#define BIT16_TO_BEBIT16(_x)   (_x)
712285242Sachim#endif
713285242Sachim
714285242Sachim#ifndef BEBIT16_TO_BIT16
715285242Sachim#define BEBIT16_TO_BIT16(_x)   (_x)
716285242Sachim#endif
717285242Sachim
718285242Sachim#ifndef LEBIT32_TO_BIT32
719285242Sachim#define LEBIT32_TO_BIT32(_x)   AGSA_FLIP_4_BYTES(_x)
720285242Sachim#endif
721285242Sachim
722285242Sachim#ifndef BIT32_TO_LEBIT32
723285242Sachim#define BIT32_TO_LEBIT32(_x)   AGSA_FLIP_4_BYTES(_x)
724285242Sachim#endif
725285242Sachim
726285242Sachim#ifndef BEBIT32_TO_BIT32
727285242Sachim#define BEBIT32_TO_BIT32(_x)   (_x)
728285242Sachim#endif
729285242Sachim
730285242Sachim#ifndef BIT32_TO_BEBIT32
731285242Sachim#define BIT32_TO_BEBIT32(_x)   (_x)
732285242Sachim#endif
733285242Sachim
734285242Sachim#else
735285242Sachim
736285242Sachim#error No definition of SA_CPU_BIG_ENDIAN or SA_CPU_LITTLE_ENDIAN
737285242Sachim
738285242Sachim#endif
739285242Sachim
740285242Sachim
741285242Sachim/*
742285242Sachim * Task Management task used in tiINITaskManagement()
743285242Sachim *
744285242Sachim * 1 SM_ABORT TASK - aborts the task identified by the Referenced  Task Tag field.
745285242Sachim * 2 SM_ABORT TASK SET - aborts all Tasks issued by this initiator on the Logical Unit
746285242Sachim * 3 SM_CLEAR ACA - clears the Auto Contingent Allegiance condition.
747285242Sachim * 4 SM_CLEAR TASK SET - Aborts all Tasks (from all initiators) for the Logical Unit.
748285242Sachim * 5 SM_LOGICAL UNIT RESET
749285242Sachim * 6 SM_TARGET WARM RESET  - iSCSI only
750285242Sachim * 7 SM_TARGET_COLD_RESET  - iSCSI only
751285242Sachim * 8 SM_TASK_REASSIGN      - iSCSI only
752285242Sachim * 9 SM_QUERY_TASK         - SAS only
753285242Sachim */
754285242Sachim
755285242Sachim#define SM_ABORT_TASK          1
756285242Sachim#define SM_ABORT_TASK_SET      2
757285242Sachim#define SM_CLEAR_ACA           3
758285242Sachim#define SM_CLEAR_TASK_SET      4
759285242Sachim#define SM_LOGICAL_UNIT_RESET  5
760285242Sachim#define SM_TARGET_WARM_RESET   6    /* iSCSI only */
761285242Sachim#define SM_TARGET_COLD_RESET   7    /* iSCSI only */
762285242Sachim#define SM_TASK_REASSIGN       8    /* iSCSI only */
763285242Sachim#define SM_QUERY_TASK          9    /* SAS only   */
764285242Sachim
765285242Sachim/* SMP PHY CONTROL OPERATION */
766285242Sachim#define SMP_PHY_CONTROL_NOP                        0x00
767285242Sachim#define SMP_PHY_CONTROL_LINK_RESET                 0x01
768285242Sachim#define SMP_PHY_CONTROL_HARD_RESET                 0x02
769285242Sachim#define SMP_PHY_CONTROL_DISABLE                    0x03
770285242Sachim#define SMP_PHY_CONTROL_CLEAR_ERROR_LOG            0x05
771285242Sachim#define SMP_PHY_CONTROL_CLEAR_AFFILIATION          0x06
772285242Sachim#define SMP_PHY_CONTROL_XMIT_SATA_PS_SIGNAL        0x07
773285242Sachim
774285242Sachim/****************************************************************
775285242Sachim *            Phy Control request
776285242Sachim ****************************************************************/
777285242Sachimtypedef struct smpReqPhyControl_s
778285242Sachim{
779285242Sachim  bit8   reserved1[4];
780285242Sachim  bit8   reserved2;
781285242Sachim  bit8   phyIdentifier;
782285242Sachim  bit8   phyOperation;
783285242Sachim  bit8   updatePartialPathwayTOValue;
784285242Sachim    /* b7-1 : reserved */
785285242Sachim    /* b0   : update partial pathway timeout value */
786285242Sachim  bit8   reserved3[20];
787285242Sachim  bit8   programmedMinPhysicalLinkRate;
788285242Sachim    /* b7-4 : programmed Minimum Physical Link Rate*/
789285242Sachim    /* b3-0 : reserved */
790285242Sachim  bit8   programmedMaxPhysicalLinkRate;
791285242Sachim    /* b7-4 : programmed Maximum Physical Link Rate*/
792285242Sachim    /* b3-0 : reserved */
793285242Sachim  bit8   reserved4[2];
794285242Sachim  bit8   partialPathwayTOValue;
795285242Sachim    /* b7-4 : reserved */
796285242Sachim    /* b3-0 : partial Pathway TO Value */
797285242Sachim  bit8   reserved5[3];
798285242Sachim} smpReqPhyControl_t;
799285242Sachim
800285242Sachim
801285242Sachimtypedef struct smSMPFrameHeader_s
802285242Sachim{
803285242Sachim    bit8   smpFrameType;      /* The first byte of SMP frame represents the SMP FRAME TYPE */
804285242Sachim    bit8   smpFunction;       /* The second byte of the SMP frame represents the SMP FUNCTION */
805285242Sachim    bit8   smpFunctionResult; /* The third byte of SMP frame represents FUNCTION RESULT of the SMP response. */
806285242Sachim    bit8   smpReserved;       /* reserved */
807285242Sachim} smSMPFrameHeader_t;
808285242Sachim
809285242Sachim/* SMP direct payload size limit: IOMB direct payload size = 48 */
810285242Sachim#define SMP_DIRECT_PAYLOAD_LIMIT 44
811285242Sachim
812285242Sachim#define SMP_REQUEST        0x40
813285242Sachim#define SMP_RESPONSE       0x41
814285242Sachim
815285242Sachim#define SMP_PHY_CONTROL                            0x91
816285242Sachim
817285242Sachim/* SMP function results */
818285242Sachim#define SMP_FUNCTION_ACCEPTED                      0x00
819285242Sachim
820285242Sachim/* bit8 array[4] -> bit32 */
821285242Sachim#define SM_GET_SAS_ADDRESSLO(sasAddressLo)                  \
822285242Sachim    DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressLo)
823285242Sachim
824285242Sachim#define SM_GET_SAS_ADDRESSHI(sasAddressHi)                  \
825285242Sachim    DMA_BEBIT32_TO_BIT32(*(bit32 *)sasAddressHi)
826285242Sachim
827285242Sachim/* SATA sector size 512 bytes = 0x200 bytes */
828285242Sachim#define SATA_SECTOR_SIZE                          0x200
829285242Sachim/* TL limit in sector */
830285242Sachim/* for SAT_READ/WRITE_DMA and SAT_READ/WRITE_SECTORS ATA command */
831285242Sachim#define NON_BIT48_ADDRESS_TL_LIMIT                0x100
832285242Sachim/* for SAT_READ/WRITE_DMA_EXT and SAT_READ/WRITE_SECTORS_EXT and  SAT_READ/WRITE_FPDMA_QUEUEDATA command */
833285242Sachim#define BIT48_ADDRESS_TL_LIMIT                    0xFFFF
834285242Sachim
835285242Sachim#define VEN_DEV_SPC                               0x800111f8
836285242Sachim#define VEN_DEV_SPCv                              0x800811f8
837285242Sachim#define VEN_DEV_SPCve                             0x800911f8
838285242Sachim#define VEN_DEV_SPCvplus                          0x801811f8
839285242Sachim#define VEN_DEV_SPCveplus                         0x801911f8
840285242Sachim
841285242Sachim#define SMIsSPC(agr) (VEN_DEV_SPC  == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPC */
842285242Sachim#define SMIsSPCv(agr)  (VEN_DEV_SPCv == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCv */
843285242Sachim#define SMIsSPCve(agr) (VEN_DEV_SPCve  == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCve */
844285242Sachim#define SMIsSPCvplus(agr)  (VEN_DEV_SPCvplus == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCv+ */
845285242Sachim#define SMIsSPCveplus(agr)  (VEN_DEV_SPCveplus == ossaHwRegReadConfig32(agr,0 ) ? 1 : 0) /* returns true config space read is SPCve+ */
846285242Sachim
847285242Sachim#define DEFAULT_KEY_BUFFER_SIZE     64
848285242Sachim
849285242Sachim
850285242Sachim#endif /* __SMDEFS_H__ */
851285242Sachim
852