smtypes.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#ifndef __SMTYPES_H__
25#define __SMTYPES_H__
26
27#include <dev/pms/freebsd/driver/common/osenv.h>
28#include <dev/pms/freebsd/driver/common/ostypes.h>
29#include <dev/pms/freebsd/driver/common/osdebug.h>
30
31#include <dev/pms/RefTisa/sallsdk/api/sa.h>
32#include <dev/pms/RefTisa/sallsdk/api/saapi.h>
33#include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
34
35#include <dev/pms/RefTisa/sat/api/sm.h>
36#include <dev/pms/RefTisa/sat/api/smapi.h>
37#include <dev/pms/RefTisa/sat/api/tdsmapi.h>
38
39#include <dev/pms/RefTisa/sat/src/smlist.h>
40
41/*
42 * SAT specific structure per SATA drive
43 */
44#define SAT_NONNCQ_MAX  1
45#define SAT_NCQ_MAX     32
46#define SAT_MAX_INT_IO  16
47#define SAT_APAPI_CMDQ_MAX 2
48
49/* SMP direct payload size limit: IOMB direct payload size = 48 */
50#define SMP_DIRECT_PAYLOAD_LIMIT 44
51
52/* timer functions ; both I and T */
53typedef void (*smTimerCBFunc_t)(smRoot_t *smRoot, void *timerData1, void *timerData2, void *timerData3);
54
55
56/** \brief data structure for timer request
57 *  Timer requests are enqueued and dequeued using smList_t
58 *  and have a callback function
59 */
60typedef struct smTimerRequest_s {
61  /* the number of ticks */
62  bit32             timeout;
63  void              *timerData1;
64  void              *timerData2;
65  void              *timerData3;
66  smTimerCBFunc_t   timerCBFunc;
67  smList_t          timerLink;
68  bit32             timerRunning;
69}  smTimerRequest_t;
70
71
72
73typedef struct smSatInternalIo_s
74{
75  smList_t                    satIntIoLink;
76  smIORequest_t               satIntSmIORequest; /* old satIntTiIORequest */
77  void                        *satIntRequestBody; /* maps to smIOrequestBody */
78  smScsiInitiatorRequest_t    satIntSmScsiXchg; /* old satIntTiScsiXchg*/
79  smMem_t                     satIntDmaMem;
80  smMem_t                     satIntReqBodyMem;
81  bit32                       satIntFlag;
82  smIORequest_t               *satOrgSmIORequest; /* old satOrgTiIORequest */
83  bit32                       id;
84} smSatInternalIo_t;
85
86
87
88typedef struct smDeviceData_s  {
89  smList_t                FreeLink; /* free dev list */
90  smList_t                MainLink; /* main(in use) dev list */
91  bit32                   id; /* for debugging only */
92  smRoot_t                *smRoot;
93  agsaDevHandle_t         *agDevHandle;
94  bit32                   valid; /* valid or registered */
95  smTimerRequest_t        SATAIDDeviceTimer; /* ID Device Data timer for SATA device */
96  bit32                   SMAbortAll; /* flag for abortall case */
97  smDeviceHandle_t        *smDevHandle;
98  bit32                   directlyAttached;
99  agsaDevHandle_t         *agExpDevHandle; /* expander a device is attached to if expander attached */
100  bit32                   phyID;
101  agsaContext_t           agDeviceResetContext; /* used in saLocalPhyControl() */
102  bit32                   SMNumOfFCA;
103
104  /* from satDeviceData_t */
105  smList_t                satIoLinkList;            /* Normal I/O from TISA         */
106  smList_t                satFreeIntIoLinkList;     /* SAT internal I/O free list   */
107  smList_t                satActiveIntIoLinkList;   /* SAT internal I/O active list */
108  smSatInternalIo_t       satIntIo[SAT_MAX_INT_IO]; /* Internal I/O resource        */
109  agsaSATAIdentifyData_t  satIdentifyData;          /* Copy of SATA Id Dev data     */
110  bit32                   satNCQ;                   /* Flag for NCQ support         */
111  bit32                   sat48BitSupport;          /* Flag for 48-bit addressing   */
112  bit32                   satSMARTSelfTest;         /* Flag for SMART self test     */
113  bit32                   satSMARTFeatureSet;       /* Flag for SMART feature set   */
114  bit32                   satSMARTEnabled;          /* Flag for SMART enabled       */
115  bit32                   satRemovableMedia;        /* Flag for Removable Media     */
116  bit32                   satRemovableMediaEnabled; /* Flag for Removable Media Enabled */
117  bit32                   satDMASupport;            /* Flag for DMA Support         */
118  bit32                   satDMAEnabled;            /* Flag for DMA Enabled         */
119  bit32                   satUltraDMAMode;          /* Ultra DMA mode value        */
120  bit32                   satDMADIRSupport;         /* Flag for DMA direction       */
121  bit32                   satReadLookAheadSupport;  /* Flag for Read Look Ahead */
122  bit32                   satVolatileWriteCacheSupport; /* Flag for Volatile Write Cache support*/
123  bit32                   satWWNSupport;            /* Flag for DMA Enabled         */
124  bit32                   satDMASetupAA;            /* Flag for DMA Setup Auto-Activate */
125  bit32                   satNCQQMgntCmd;           /* Flag for NCQ Queue Management Command */
126  bit32 volatile          satPendingIO;             /* Number of pending I/O        */
127  bit32 volatile          satPendingNCQIO;          /* Number of pending NCQ I/O    */
128  bit32 volatile          satPendingNONNCQIO;       /* Number of pending NON NCW I/O*/
129  bit32                   satNCQMaxIO;              /* Max NCQ I/O in SAT or drive  */
130  bit32                   satDriveState;            /* State of SAT/drive           */
131  bit32                   satAbortAfterReset;       /* Flag: abort after SATA reset */
132  bit32                   satAbortCalled;           /* Flag: abort called indication*/
133  bit32                   satVerifyState;           /* Flag: Read Vrf state for diag*/
134  bit32                   satMaxUserAddrSectors;    /* max user addressable setctors*/
135  bit32                   satWriteCacheEnabled;     /* Flag for write cache enabled */
136  bit32                   satLookAheadEnabled;      /* Flag for look ahead enabled  */
137  bit32                   satDeviceFaultState;      /* State of DF                  */
138  bit32                   satStopState;             /* State of Start and Stop      */
139  bit32                   satFormatState;           /* State of format              */
140  bit32                   satPMField;               /* PM field, first 4 bits       */
141  bit8                    satSignature[8];          /* Signature                    */
142  bit32                   satDeviceType;            /* ATA device type              */
143  bit32                   satSectorDone;            /* Number of Sector done by Cmnd*/
144  bit32                   freeSATAFDMATagBitmap;    /* SATA NCQ tag bit map         */
145  bit32                   IDDeviceValid;            /* ID DeviceData valid bit      */
146  bit8                    satMaxLBA[8];             /* MAXLBA is from read capacity */
147  bit32                   satBGPendingDiag;         /* Pending Diagnostic in backgound */
148  bit32                   NumOfFCA;                 /* number of SMP HARD RESET on this device */
149  bit32                   NumOfIDRetries;           /* number of SMP HARD RESET after ID retries */
150  smIORequest_t           *satTmTaskTag;            /* TM Task Tag                  */
151  void                    *satSaDeviceData;         /* Pointer back to sa dev data  */
152  bit32                   ID_Retries;               /* identify device data retries */
153  bit32                   OSAbortAll;               /* OS calls abort all           */
154  bit32                   ReadCapacity;             /* Read Capacity Type; 10, 16   */
155  bit32                   sasAddressLo;             /**< HOST SAS address lower part */
156  bit32                   sasAddressHi;             /**< HOST SAS address higher part */
157
158}  smDeviceData_t;
159
160typedef struct smAtaPassThroughHdr_s
161{
162  bit8 opc;
163  bit8 mulCount : 3;
164  bit8 proto : 4;
165  bit8 extend : 1;
166  bit8 offline : 2;
167  bit8 ckCond : 1;
168  bit8 tType : 1;
169  bit8 tDir : 1;
170  bit8 byteBlock : 1;
171  bit8 tlength : 2;
172
173}smAtaPassThroughHdr_t;
174
175/*
176 * SCSI Sense Data
177 */
178typedef struct
179{
180  bit8       snsRespCode;
181  bit8       snsSegment;
182  bit8       senseKey;          /* sense key                                */
183  bit8       info[4];
184  bit8       addSenseLen;       /* 11 always                                */
185  bit8       cmdSpecific[4];
186  bit8       addSenseCode;      /* additional sense code                    */
187  bit8       senseQual;         /* additional sense code qualifier          */
188  bit8       fru;
189  bit8       skeySpecific[3];
190} smScsiRspSense_t;
191
192
193/*
194 * SATA SAT specific function pointer for SATA completion for SAT commands.
195 */
196typedef void (*smSatCompleteCbPtr_t  )(
197                          agsaRoot_t        *agRoot,
198                          agsaIORequest_t   *agIORequest,
199                          bit32             agIOStatus,
200                          agsaFisHeader_t   *agFirstDword,
201                          bit32             agIOInfoLen,
202                          agsaFrameHandle_t agFrameHandle,
203                          void              *satIOContext
204                       );
205
206/* for SMP only */
207typedef void (*smSMPCompleted_t)(
208                                  agsaRoot_t            *,
209                                  agsaIORequest_t       *,
210                                  bit32                 ,
211                                  bit32                 ,
212                                  agsaFrameHandle_t
213                                );
214
215
216/*
217 * SATA SAT specific function for I/O context
218 */
219typedef struct smSatIOContext_s
220{
221  smList_t                    satIoContextLink;
222  smDeviceData_t              *pSatDevData;
223  agsaFisRegHostToDevice_t    *pFis;
224  smIniScsiCmnd_t             *pScsiCmnd;
225  smScsiRspSense_t            *pSense;
226  smSenseData_t               *pSmSenseData; /* old pTiSenseData */
227  void                        *smRequestBody;  /* smIORequestBody_t; old tiRequestBody*/
228  void                        *smScsiXchg; /* for writesame10(); old tiScsiXchg */
229  bit32                       reqType;
230  bit32                       interruptContext;
231  smSatCompleteCbPtr_t        satCompleteCB;
232  smSatInternalIo_t           *satIntIoContext; /* SATM generated IOs */
233  smDeviceHandle_t            *psmDeviceHandle; /* old ptiDeviceHandle */
234  bit8                        sataTag;
235  bit8                        superIOFlag;/* Flag indicating type for smScsiXchg */
236  bit8                        reserved1;  /* Padding for allignment */
237  bit8                        reserved2;  /* Padding for allignment */
238  bit32                       currentLBA; /* current LBA for read and write */
239  bit32                       ATACmd;     /* ATA command */
240  bit32                       OrgTL;      /* original tranfer length(tl) */
241  bit32                       LoopNum;    /* denominator tl */
242  bit32                       LoopNum2;    /* denominator tl */
243  bit8                        LBA[8];     /* for reassign blocks; current LBA */
244  bit32                       ParmIndex;  /* for reassign blocks;current idx in defective LBA LIST */
245  bit32                       ParmLen;    /* for reassign blocks; defective LBA list length */
246  bit32                       NotifyOS;   /* only for task management */
247  bit32                       TMF;        /* task management function */
248  struct smSatIOContext_s     *satToBeAbortedIOContext;
249  struct smSatIOContext_s     *satOrgIOContext;
250  bit32                       UpperAddr;
251  bit32                       LowerAddr;
252  bit32                       SplitIdx;
253  bit32                       AdjustBytes;
254  bit32                       EsglLen;
255  /* For the SAT Passthrough */
256  bit8                        ck_cond;
257  bit8                        extend;
258  bit8                        sectorCnt07;
259  bit8                        LBAHigh07;
260  bit8                        LBAMid07;
261  bit8                        LBALow07;
262  bit8                        Sector_Cnt_Upper_Nonzero;
263  bit8                        LBA_Upper_Nonzero;
264  bit32                       pid;        /* port id; used to protect double completion */
265  bit32                       id;         /* for debugging */
266} smSatIOContext_t;
267
268typedef struct smIORequestBody_s {
269  smList_t                    satIoBodyLink;
270  smDeviceHandle_t            *smDevHandle;
271  smIORequest_t               *smIORequest;
272  agsaIORequest_t             agIORequest;
273  smIORequest_t               *smIOToBeAbortedRequest; /* IO to be aborted; old tiIOToBeAbortedRequest */
274  bit32                       id;
275  bit32                       InUse;
276  union {
277    struct {
278      agsaSATAInitiatorRequest_t    agSATARequestBody;
279      smScsiRspSense_t              sensePayload;
280      smSenseData_t                 smSenseData; /* old tiSenseData */
281      smSatIOContext_t              satIOContext;
282    } SATA;
283  } transport;
284  bit32                          ioStarted;
285  bit32                          ioCompleted;
286  bit32                          reTries;
287  union {
288    struct {
289      bit32                     expDataLength;
290      smSgl_t                   smSgl1; /* old tiSgl1 */
291      smSgl_t                   smSgl2; /* old tiSgl2 */
292      void                      *sglVirtualAddr;
293    } InitiatorRegIO;  /* regular IO */
294    struct {
295      void                      *osMemHandle;
296      smIORequest_t             *CurrentTaskTag;
297      smIORequest_t             *TaskTag;
298    } InitiatorTMIO;  /* task management */
299  } IOType;
300
301} smIORequestBody_t;
302
303typedef struct smSMPRequestBody_s {
304  smSMPCompleted_t               SMPCompletionFunc;/* must be the second */
305
306  smDeviceHandle_t               *smDevHandle;    /* not used for SM generated SMP */
307  agsaIORequest_t                agIORequest;
308  agsaSASRequestBody_t           agSASRequestBody;
309  void                           *osMemHandle;
310  smDeviceData_t                 *smDeviceData;
311  smIORequest_t                  *CurrentTaskTag; /* SMP is used for simulate target reset */
312//  tdsaPortContext_t              *tdPortContext; /* portcontext where SMP is sent from */
313  bit8                           smpPayload[SMP_DIRECT_PAYLOAD_LIMIT]; /* for smp retries;
314                                                                          only for direct SMP */
315  bit32                          retries; /* number of retries */
316
317}  smSMPRequestBody_t;
318
319
320typedef struct smRootOsData_s {
321  smRoot_t  *smRoot;            /**< Pointer back to smRoot                 */
322  void      *smAllShared;       /**< Pointer to smIntContext_t               */
323  void      *smIni;             /**< Pointer to SAS/SATA initiator               */
324}  smRootOsData_t;
325
326typedef struct smIntContext_s {
327  /**< agsaRoot_t->osData points to this */
328  struct smRootOsData_s      smRootOsData;
329
330  bit32               usecsPerTick;
331  agsaRoot_t          *agRoot;
332
333  /**< software-related initialization params used in saInitialize() */
334  smSwConfig_t        SwConfig;
335
336  /**< timers used commonly in SAS/SATA */
337  smList_t                      timerlist;
338
339  /**< pointer to Device memory */
340  smDeviceData_t             *DeviceMem;
341  smList_t                   FreeDeviceList;
342  smList_t                   MainDeviceList;
343
344  /**< pointer to IO memory */
345  smIORequestBody_t         *IOMem;
346  smList_t                   freeIOList;
347  smList_t                   mainIOList;
348  bit32                      FCA;
349}  smIntContext_t;
350
351typedef struct smIntRoot_s
352{
353  /**<< common data structure for SAS/SATA */
354  smIntContext_t          smAllShared;
355} smIntRoot_t;
356
357
358#endif                          /* __SMTYPES_H__ */
359
360