]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/dev/pms/RefTisa/sat/src/smtypes.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / dev / pms / RefTisa / sat / src / smtypes.h
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 */
53 typedef 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  */
60 typedef 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
73 typedef 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
88 typedef 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
160 typedef 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  */
178 typedef 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  */
196 typedef 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 */
207 typedef 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  */
219 typedef 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
268 typedef 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
303 typedef 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
320 typedef 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
326 typedef 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
351 typedef 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