sm.h revision 285809
1/*******************************************************************************
2*Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
3*
4*Redistribution and use in source and binary forms, with or without modification, are permitted provided
5*that the following conditions are met:
6*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
7*following disclaimer.
8*2. Redistributions in binary form must reproduce the above copyright notice,
9*this list of conditions and the following disclaimer in the documentation and/or other materials provided
10*with the distribution.
11*
12*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
13*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
14*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
15*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
17*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
18*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
19*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
20*
21* $FreeBSD$
22*
23********************************************************************************/
24/********************************************************************************
25**
26*   sm.h
27*
28*   Abstract:   This module defines the contants, enum and #define definition used
29*               by SAT Moduled (SM).
30*
31********************************************************************************/
32
33#ifndef SM_H
34#define SM_H
35
36/*************************************************
37 *   constants for type field in smMem_t
38 *************************************************/
39#define SM_CACHED_MEM                             0x00     /**< CACHED memory type */
40#define SM_DMA_MEM                                0x01     /**< DMA memory type */
41#define SM_CACHED_DMA_MEM                         0x02     /**< CACHED DMA memory type */
42
43/*************************************************
44 *   constants for API return values
45 *************************************************/
46typedef enum
47{
48  SM_RC_SUCCESS,
49  SM_RC_FAILURE,
50  SM_RC_BUSY,
51  SM_RC_NODEVICE,
52  SM_RC_VERSION_INCOMPATIBLE,
53  SM_RC_VERSION_UNTESTED,
54  SM_RC_RSV1,
55  SM_RC_RSV2,
56  SM_RC_RSV3,
57  SM_RC_RSV4,
58  SM_RC_DEVICE_BUSY, /* must be the same as tiDeviceBusy */
59
60} smStatus_t;
61
62typedef enum
63{
64  smIOSuccess,
65  smIOOverRun,
66  smIOUnderRun,
67  smIOFailed,
68  smIODifError,
69  smIOEncryptError,
70  smIORetry,           /* open retry timeout */
71  smIOSTPResourceBusy, /* stp resource busy */
72} smIOStatus_t;
73
74typedef enum
75{
76  smDetailBusy,
77  smDetailNotValid,
78  smDetailNoLogin,
79  smDetailAbortLogin,
80  smDetailAbortReset,
81  smDetailAborted,
82  smDetailDifMismatch,
83  smDetailDifAppTagMismatch,
84  smDetailDifRefTagMismatch,
85  smDetailDifCrcMismatch,
86  smDetailDekKeyCacheMiss,
87  smDetailCipherModeInvalid,
88  smDetailDekIVMismatch,
89  smDetailDekRamInterfaceError,
90  smDetailDekIndexOutofBounds,
91  smDetailOtherError
92} smIOStatusDetail_t;
93
94/*
95 * Data direction for I/O request
96 */
97typedef enum
98{
99  smDirectionIn   = 0x0000,
100  smDirectionOut  = 0x0001
101}smDataDirection_t;
102
103/*
104 * Event types for tdsmEventCB()
105 * do not change: Needs to be in sync with TISA API
106 */
107typedef enum
108{
109  smIntrEventTypeCnxError,
110  smIntrEventTypeDiscovery,
111  smIntrEventTypeTransportRecovery,
112  smIntrEventTypeTaskManagement,
113  smIntrEventTypeDeviceChange,
114  smIntrEventTypeLogin,
115  smIntrEventTypeLocalAbort
116} smIntrEventType_t;
117
118typedef enum
119{
120  smTMOK,
121  smTMFailed
122} smTMEventStatus_t;
123
124/*
125 * Flags in smSuperScsiInitiatorRequest_t
126 */
127#define SM_SCSI_INITIATOR_DIF         0x00000001
128#define SM_SCSI_INITIATOR_ENCRYPT     0x00000002
129
130/*
131 * Flags in smSuperScsiInitiatorRequest_t
132 */
133#define SM_SCSI_TARGET_DIF         0x00000001
134#define SM_SCSI_TARGET_MIRROR      0x00000002
135#define SM_SCSI_TARGET_ENCRYPT     0x00000004
136
137typedef struct {
138                void		*tdData;
139                void		*smData;
140} smContext_t;
141
142
143typedef    smContext_t    smDeviceHandle_t;
144
145typedef    smContext_t    smIORequest_t;
146
147typedef    smContext_t    smRoot_t;
148
149typedef struct
150{
151	bit8  lun[8];               /* logical unit number  */
152} smLUN_t;
153
154typedef struct{
155		smLUN_t         lun;
156		bit32           expDataLength;
157		bit32           taskAttribute;
158		bit32           crn;
159		bit8            cdb[16];
160} smIniScsiCmnd_t;
161
162
163
164typedef struct{
165               void 	*virtPtr;
166               void 	*osHandle;
167               bit32 	physAddrUpper;
168               bit32 	physAddrLower;
169               bit32 	totalLength;
170               bit32 	numElements;
171               bit32 	singleElementLength;
172               bit32 	alignment;
173               bit32 	type;
174               bit32 	reserved;
175} smMem_t;
176
177#define SM_NUM_MEM_CHUNKS 8
178
179typedef struct{
180               bit32            count;
181               smMem_t          smMemory[SM_NUM_MEM_CHUNKS];
182} smMemoryRequirement_t;
183
184typedef struct{
185	       bit32 	lower;
186	       bit32 	upper;
187	       bit32 	len;
188	       bit32 	type;
189} smSgl_t;
190
191/*
192 * DIF operation
193 */
194#define DIF_INSERT                     0
195#define DIF_VERIFY_FORWARD             1
196#define DIF_VERIFY_DELETE              2
197#define DIF_VERIFY_REPLACE             3
198#define DIF_VERIFY_UDT_REPLACE_CRC     5
199#define DIF_REPLACE_UDT_REPLACE_CRC    7
200
201#define DIF_UDT_SIZE              6
202
203typedef struct smDif
204{
205  agBOOLEAN   enableDIFPerLA;
206  bit32       flag;
207  bit16       initialIOSeed;
208  bit16       reserved;
209  bit32       DIFPerLAAddrLo;
210  bit32       DIFPerLAAddrHi;
211  bit16       DIFPerLARegion0SecCount;
212  bit16       DIFPerLANumOfRegions;
213  bit8        udtArray[DIF_UDT_SIZE];
214  bit8        udrtArray[DIF_UDT_SIZE];
215} smDif_t;
216
217typedef struct smEncryptDek {
218    bit32          dekTable;
219    bit32          dekIndex;
220} smEncryptDek_t;
221
222typedef struct smEncrypt {
223  smEncryptDek_t     dekInfo;
224  bit32          kekIndex;
225  agBOOLEAN      keyTagCheck;
226  agBOOLEAN  	   enableEncryptionPerLA;
227  bit32          sectorSizeIndex;
228  bit32          encryptMode;
229  bit32          keyTag_W0;
230  bit32          keyTag_W1;
231  bit32          tweakVal_W0;
232  bit32          tweakVal_W1;
233  bit32          tweakVal_W2;
234  bit32          tweakVal_W3;
235  bit32          EncryptionPerLAAddrLo;
236  bit32          EncryptionPerLAAddrHi;
237  bit16          EncryptionPerLRegion0SecCount;
238  bit16          reserved;
239} smEncrypt_t;
240
241typedef struct smScsiInitiatorRequest {
242	      void                     *sglVirtualAddr;
243	      smIniScsiCmnd_t          scsiCmnd;
244	      smSgl_t                  smSgl1;
245	      smDataDirection_t        dataDirection;
246} smScsiInitiatorRequest_t;
247
248typedef struct smSuperScsiInitiatorRequest
249{
250  void                *sglVirtualAddr;
251  smIniScsiCmnd_t     scsiCmnd;
252  smSgl_t             smSgl1;
253  smDataDirection_t   dataDirection;
254  bit32               flags; /*
255                               bit 0-1: reserved
256                               bit 2: enable encryption
257                               bit 3: enable dif
258                               bit 4-7: reserved
259                               bit 8-23: DIF SKIP Bytes
260                               bit 24-31: Reserved
261                             */
262  smDif_t             Dif;
263  smEncrypt_t         Encrypt;
264} smSuperScsiInitiatorRequest_t;
265
266typedef struct{
267	       void     *senseData;
268	       bit8 	senseLen;
269} smSenseData_t;
270
271typedef struct{
272               bit32			maxActiveIOs;
273               bit32			numDevHandles;
274#ifdef SM_DEBUG
275               bit32			SMDebugLevel;
276#endif
277} smSwConfig_t;
278
279
280#define smBOOLEAN  bit32
281
282
283
284
285
286
287
288
289
290
291#endif  /* SM_H */
292
293