]> CyberLeo.Net >> Repos - FreeBSD/releng/10.2.git/blob - sys/dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h
- Copy stable/10@285827 to releng/10.2 in preparation for 10.2-RC1
[FreeBSD/releng/10.2.git] / sys / dev / pms / RefTisa / tisa / sassata / sas / common / tdtypes.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 /*******************************************************************************/
25 /** \file
26  *
27  * The file defines data structures for SAS/SATA TD layer
28  *
29  */
30 #ifndef __TDTYPES_H__
31 #define __TDTYPES_H__
32
33 #include <dev/pms/freebsd/driver/common/osenv.h>
34 #include <dev/pms/freebsd/driver/common/ostypes.h>
35 #include <dev/pms/freebsd/driver/common/osdebug.h>
36
37 #include <dev/pms/RefTisa/sallsdk/api/sa.h>
38 #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
39 #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
40
41 #ifdef FDS_SM
42 #include <dev/pms/RefTisa/sat/api/sm.h>
43 #include <dev/pms/RefTisa/sat/src/smtypes.h>
44 #endif
45
46 #ifdef FDS_DM
47 #include <dev/pms/RefTisa/discovery/api/dm.h>
48 #endif
49
50 #include <dev/pms/RefTisa/tisa/sassata/common/tddefs.h>
51 #include <dev/pms/RefTisa/tisa/sassata/common/tdlist.h>
52 #include <dev/pms/RefTisa/tisa/api/tiscsi.h>
53
54
55 /* function definitions */
56 typedef void (*tdssSSPReqReceived_t) (
57                                       agsaRoot_t *,
58                                       agsaDevHandle_t *,
59                                       agsaFrameHandle_t,
60                                       bit32,
61                                       bit32,
62                                       bit32
63                                       );
64 typedef void (*tdssSMPReqReceived_t) (
65                                       agsaRoot_t            *,
66                                       agsaDevHandle_t       *,
67                                       agsaSMPFrameHeader_t  *,
68                                       agsaFrameHandle_t,
69                                       bit32,
70                                       bit32
71                                       );
72                                       
73 typedef bit32 (*tdssGetSGLChunk_t) (agsaRoot_t      *agRoot,
74                                     agsaIORequest_t *agIORequest,
75                                     bit32           agChunkOffset,
76                                     bit32           *agChunkUpper32,
77                                     bit32           *agChunkLower32,
78                                     bit32           *agChunkLen);
79 /* for SSP only */
80 typedef void (*tdssIOCompleted_t) (agsaRoot_t *,
81                                    agsaIORequest_t *,
82                                    bit32,
83                                    bit32,
84                                    agsaFrameHandle_t,
85                                    bit32);
86 /* for SMP only */
87 typedef void (*tdssSMPCompleted_t) (
88                                     agsaRoot_t            *,
89                                     agsaIORequest_t       *,
90                                     bit32                 ,
91                                     bit32                 ,
92                                     agsaFrameHandle_t     
93                                     );
94
95
96 /** \brief data structure for callback function jumptableESLG page
97  *
98  * This data structure defines callback fucntions for SSP, SMP and SATA
99  * This is used for jump table used for instance specific function callback jump
100  *
101  */
102 typedef struct tdsaJumpTable_s {
103   /**< function that called to process received SSP frame */
104   tdssSSPReqReceived_t pSSPReqReceived;
105   /**< function that called to process received SSP frame */
106   tdssSMPReqReceived_t pSMPReqReceived;
107   /**< SSP IO completion callback function eg) ossaSSPcompleted() */
108   tdssIOCompleted_t         pSSPIOCompleted;
109   /**< SMP IO completion callback function eg) ossaSMPcompleted() */
110   tdssSMPCompleted_t        pSMPCompleted;
111   /* callback function for LL getSGL. Simple place holder for now */
112   tdssGetSGLChunk_t         pGetSGLChunk;
113 }  tdsaJumpTable_t;
114
115 /* timer functions ; both I and T */
116 typedef void (*tdsaTimerCBFunc_t)(tiRoot_t *tiRoot, void *timerData1, void *timerData2, void *timerData3);
117
118 /** \brief data structure for timer request
119  *  Timer requests are enqueued and dequeued using tdList_t
120  *  and have a callback function
121  */
122 typedef struct tdsaTimerRequest_s {
123   /* the number of ticks */
124   bit32             timeout;
125   void              *timerData1;
126   void              *timerData2;
127   void              *timerData3;
128   tdsaTimerCBFunc_t timerCBFunc;
129   tdList_t          timerLink;
130   bit32             timerRunning;
131 }  tdsaTimerRequest_t;
132
133
134 /** \brief data structure for IO request data
135  *  used at target only in ttdtxchg_t structure
136  *  just a place holder for now
137  */
138 typedef struct tdssIORequestData_s {
139   /* jump table has to be the first */
140   tdsaJumpTable_t *pJumpTable;    /* this is just a pointer */
141 }  tdssIORequestData_t;
142
143
144
145 /** \brief data structure OS root from the view of lower layer.
146  * TD Layer interrupt/non-interrupt context support structure for agsaRoot_t.
147  * The osData part of agsaRoot points to this tdsaRootOsData_t structure.
148  * In other words, agsaRoot_t->osData points to this structure and used for
149  * both SAS and SATA
150  */
151 typedef struct tdsaRootOsData_s {
152   tiRoot_t  *tiRoot;            /**< Pointer back to tiRoot                 */
153   void      *tdsaAllShared;     /**< Pointer to tdsaContext_t               */
154   void      *itdsaIni;           /**< Pointer to SAS/SATA initiator               */
155   void      *ttdsaTgt;           /**< Pointer to SAS/SATA target                  */
156   /* for sata */
157   void      *tdstHost;          /**< Pointer to SATA Host                   */
158   void      *tdstDevice;        /**< Pointer to SATA Device                 */
159   agBOOLEAN IntContext;         /**< Interrupt context                      */
160 }  tdsaRootOsData_t;
161
162 /** \brief data structure for port/phy related flags
163  *  Some fields are just place holders and not used yet
164  */
165 typedef struct tdssPortFlags_s {
166   /**< port started flag */
167   agBOOLEAN             portStarted;
168
169   /**< port initialized flag */
170   agBOOLEAN             portInitialized;
171
172   agBOOLEAN             portReadyForDiscoverySent;
173
174   /**< port stopped by oslayer */
175   agBOOLEAN             portStoppedByOSLayer;
176
177   /**< fail portinit/start */
178   agBOOLEAN             failPortInit;
179   
180   agBOOLEAN             pseudoPortInitDone;
181   agBOOLEAN             pseudoPortStartDone;  
182 }  tdssPortFlags_t;
183
184 /** \brief data structure for both SAS/SATA related flags
185  *  Some fields are just place holders and not used yet
186  * 
187  */
188 typedef struct tdsaComMemFlags_s {
189   /**< current interrupt setting */
190   agBOOLEAN             sysIntsActive;      
191
192   /**< reset in progress */
193   agBOOLEAN             resetInProgress;
194
195   /**< reset status */
196   agBOOLEAN             resetFailed;
197
198 }  tdsaComMemFlags_t;
199
200
201 /* 
202  * SAT related structure 
203  */
204 typedef struct satInternalIo_s
205 {
206   tdList_t                    satIntIoLink;
207   tiIORequest_t               satIntTiIORequest;
208   void                        *satIntRequestBody;
209   tiScsiInitiatorRequest_t   satIntTiScsiXchg;
210   tiMem_t                     satIntDmaMem;
211   tiMem_t                     satIntReqBodyMem;
212   bit32                       satIntFlag;
213   tiIORequest_t               *satOrgTiIORequest;
214   bit32                       id;
215 } satInternalIo_t;
216
217
218
219 /*
220  * SAT specific structure per SATA drive 
221  */
222 #define SAT_NONNCQ_MAX  1
223 #define SAT_NCQ_MAX     32
224 #define SAT_MAX_INT_IO  16
225
226 typedef struct TDSASAddressID_s 
227 {
228   bit32   sasAddressLo;     /**< HOST SAS address lower part */
229   bit32   sasAddressHi;     /**< HOST SAS address higher part */
230   bit8    phyIdentifier;    /**< PHY IDENTIFIER of the PHY */
231 } TDSASAddressID_t;
232
233
234 struct tdsaExpander_s;
235
236
237 typedef struct tdsaDiscovery_s 
238 {
239   tdList_t                   discoveringExpanderList;
240   tdList_t                   UpdiscoveringExpanderList;
241   //  tdList_t                   freeExpanderList;
242   bit32                   status;
243   TDSASAddressID_t        sasAddressIDDiscoverError;
244   agsaSATAIdentifyData_t  *pSataIdentifyData;
245   struct tdsaExpander_s   *RootExp; /* Root expander of discovery */
246   bit32                   NumOfUpExp;
247   bit32                   type; /* discovery type: TDSA_DISCOVERY_OPTION_FULL_START 
248                                    or TDSA_DISCOVERY_OPTION_INCREMENTAL_START*/
249   bit32                   retries;                                   
250   bit32                   configureRouteRetries; 
251   bit32                   deviceRetistrationRetries; 
252   tdsaTimerRequest_t      discoveryTimer;
253   tdsaTimerRequest_t      configureRouteTimer;
254   tdsaTimerRequest_t      deviceRegistrationTimer;
255   tdsaTimerRequest_t      BCTimer; /* Broadcast Change timer for ResetTriggerred */
256   smpRespDiscover_t       SMPDiscoverResp;
257   bit32                   pendingSMP; /* the number of pending SMP for this discovery */
258   bit32                   SeenBC; /* received Broadcast change */
259   bit32                   forcedOK; /* report DiscOK when chance is missed */ 
260   tdsaTimerRequest_t      SMPBusyTimer; /* SMP retry timer for saSMPStart busy */
261   bit32                   SMPRetries; /* number of SMP retries when LL returns busy for saSMPStart*/
262   bit32                   ResetTriggerred; /* Hard/Link reset triggerred by discovery */
263   tdsaTimerRequest_t      DiscoverySMPTimer; /* discovery-related SMP application Timer */
264 } tdsaDiscovery_t;
265
266
267 typedef struct 
268 {
269   tdList_t                satIoLinkList;            /* Normal I/O from TISA         */
270   tdList_t                satFreeIntIoLinkList;     /* SAT internal I/O free list   */
271   tdList_t                satActiveIntIoLinkList;   /* SAT internal I/O active list */
272   satInternalIo_t         satIntIo[SAT_MAX_INT_IO]; /* Internal I/O resource        */
273   agsaSATAIdentifyData_t  satIdentifyData;          /* Copy of SATA Id Dev data     */
274   bit8                    SN_id_limit[25];          /* temporary serial number id info */
275   bit32                   satNCQ;                   /* Flag for NCQ support         */ 
276   bit32                   sat48BitSupport;          /* Flag for 48-bit addressing   */
277   bit32                   satSMARTSelfTest;         /* Flag for SMART self test     */
278   bit32                   satSMARTFeatureSet;       /* Flag for SMART feature set   */
279   bit32                   satSMARTEnabled;          /* Flag for SMART enabled       */
280   bit32                   satRemovableMedia;        /* Flag for Removable Media     */
281   bit32                   satRemovableMediaEnabled; /* Flag for Removable Media Enabled */
282   bit32                   satDMASupport;            /* Flag for DMA Support         */
283   bit32                   satDMAEnabled;            /* Flag for DMA Enabled         */
284   bit32                   satDMADIRSupport;         /* Flag in PACKET command for DMA transfer */
285   bit32                   satWWNSupport;            /* Flag for DMA Enabled         */
286   bit32                   satPendingIO;             /* Number of pending I/O        */
287   bit32                   satPendingNCQIO;          /* Number of pending NCQ I/O    */
288   bit32                   satPendingNONNCQIO;       /* Number of pending NON NCW I/O*/
289   bit32                   satNCQMaxIO;              /* Max NCQ I/O in SAT or drive  */
290   bit32                   satDriveState;            /* State of SAT/drive           */
291   bit32                   satAbortAfterReset;       /* Flag: abort after SATA reset */
292   bit32                   satAbortCalled;           /* Flag: abort called indication*/
293   bit32                   satVerifyState;           /* Flag: Read Vrf state for diag*/
294   bit32                   satMaxUserAddrSectors;    /* max user addressable setctors*/
295   bit32                   satWriteCacheEnabled;     /* Flag for write cache enabled */
296   bit32                   satLookAheadEnabled;      /* Flag for look ahead enabled  */
297   bit32                   satDeviceFaultState;      /* State of DF                  */
298   bit32                   satStopState;             /* State of Start and Stop      */
299   bit32                   satFormatState;           /* State of format              */
300   bit32                   satPMField;               /* PM field, first 4 bits       */
301   bit8                    satSignature[8];          /* Signature                    */
302   bit32                   satDeviceType;            /* ATA device type              */
303   bit32                   satSectorDone;            /* Number of Sector done by Cmnd*/
304   bit32                   freeSATAFDMATagBitmap;    /* SATA NCQ tag bit map         */
305   bit32                   IDDeviceValid;            /* ID DeviceData valid bit      */
306   bit8                    satMaxLBA[8];             /* MAXLBA is from read capacity */
307   bit32                   satBGPendingDiag;         /* Pending Diagnostic in backgound */
308   bit32                   NumOfFCA;                 /* number of SMP HARD RESET on this device */   
309   bit32                   NumOfIDRetries;           /* number of SMP HARD RESET after ID retries */   
310   tiIORequest_t           *satTmTaskTag;            /* TM Task Tag                  */
311   void                    *satSaDeviceData;         /* Pointer back to sa dev data  */
312   bit32                   ID_Retries;               /* identify device data retries */
313   bit32                   IDPending;                /* number of pending identify device data */
314 } satDeviceData_t;
315
316
317 /** \brief data structure for SAS device list
318  *  This structure maintains the device as a list and information about
319  *  the device such as the device type and ID address frame.
320  *  agsaDeviceHandle_t->osData points to this structure.
321  */
322 typedef struct tdsaDeviceData_s  {
323   /* in tdtypes.h */
324   tdsaJumpTable_t        *pJumpTable; /**< a pointer to callback function jumptable */
325   tiDeviceHandle_t       tiDeviceHandle; 
326
327   tdList_t                FreeLink; /* free dev list */
328   tdList_t                MainLink; /* main(in use) dev list */
329   tdList_t                IncDisLink; /* Used for incremental Discovery only */
330   bit32                   id; /* for debugging only */
331   bit32                   InQID; /* Inbound queue ID */
332   bit32                   OutQID; /* Outbound queue ID */
333   bit8                    DeviceType;
334   /* used in tiINIIOStart() */
335   agsaRoot_t              *agRoot;
336   agsaDevHandle_t         *agDevHandle;
337   
338   /* for SAS; remote device */
339   //  agsaSASDeviceInfo_t     agSASDeviceInfo;
340   /* device's sas address */
341   TDSASAddressID_t        SASAddressID;
342   bit8                    initiator_ssp_stp_smp;
343   bit8                    target_ssp_stp_smp;
344   bit8                    numOfPhys;
345   /* SATA specific data */
346   satDeviceData_t         satDevData;
347
348   /**< pointer to tdsaPortcontext which the device belongs to */
349   struct tdsaPortContext_s *tdPortContext;
350   /* validity of device */
351   bit8                    valid;
352   bit8                    valid2;
353   bit8                    processed; /* used in TD discovery */
354 #ifdef AGTIAPI_CTL
355   bit8                    discovered;
356 #endif
357   agsaDeviceInfo_t        agDeviceInfo;
358   agsaContext_t           agContext; /* used in saRegisterNewDevice()*/
359   /**< pointer to tdsaExpander if Device is expander */
360   struct tdsaExpander_s   *tdExpander;
361   struct tdsaDeviceData_s *ExpDevice; /* Expander device which this device is attached to */
362   
363   bit8                    phyID;      /* PhyID this device is attached to SPC or expander */
364   agsaSASIdentify_t     sasIdentify; /* used only in TD discovery */
365   bit8                  connectionRate;
366   bit8                  registered;
367   bit8                  directlyAttached;
368   bit8                  SASSpecDeviceType; /* 0 - 3; SAS_NO_DEVICE - SAS_FANOUT_EXPANDER_DEVICE */
369   bit32                 IOStart;
370   bit32                 IOResponse;
371   agsaContext_t         agDeviceResetContext; /* used in saLocalPhyControl() */
372   tiIORequest_t         TransportRecoveryIO;
373   bit32                 TRflag; /* transport recovery flag; used only for tiINITransportRecovery */
374   bit32                 ResetCnt; /* number of reset to the device */  
375   tdsaTimerRequest_t    SATAIDDeviceTimer; /* ID Device Data timer for SATA device */
376   bit32                 OSAbortAll;
377 #ifdef FDS_DM
378   bit32                 devMCN; /* MCN reported by DM */
379   bit32                 finalMCN; /* final MCN using devMCN and local MCN */
380 #endif
381 #ifdef FDS_SM
382   smDeviceHandle_t      smDeviceHandle; /* for SATM */
383   bit32                 SMNumOfFCA;
384   bit32                 SMNumOfID;
385   tdsaTimerRequest_t    tdIDTimer; /* ID Device Data timer for SATA device */
386 #endif 
387 }  tdsaDeviceData_t;
388
389 /*
390   this field is used to add or remove SAS device from sharedcontext
391 */
392 typedef struct tdsaSASSubID_s
393 {
394   bit32        sasAddressHi;
395   bit32        sasAddressLo;
396   bit8         initiator_ssp_stp_smp;
397   bit8         target_ssp_stp_smp;
398
399 } tdsaSASSubID_t;
400
401
402 struct tdsaDeviceData_s;
403 //struct itdssDiscoveryData_s;
404
405 /** \brief data structure for TD port context
406  *  This structure maintains information about the port such as ID address frame
407  *  and the discovery status and the list of devices discovered by this port.
408  *  itdsaIni_t->PortContext[] points to this structure.
409  *  agsaPortContext->osData points to this structure, too.
410  */
411 typedef struct tdsaPortContext_s
412 {
413   /**< current number of devices in this PortContext */
414   bit32                         Count;
415  
416   bit32                   DiscoveryState;   
417   
418   bit32                   discoveryOptions;
419   /* Discovery ready is given? */ 
420   bit32                   DiscoveryRdyGiven; 
421   /* Port has received link up */
422   bit32                   SeenLinkUp;
423   /* statistics */
424   bit32                   numAvailableTargets;
425   /* flag: indicates that discovery is trigggered by tiINIDiscoverTargets */
426   bit32                   osInitiatedDiscovery;
427   
428   bit32                         id; /* for debugging only */
429   tdList_t                      FreeLink; /**< free portcontext list */
430   tdList_t                      MainLink; /**< in-use portcontext list */
431   /**< SAS address of the remote device */
432   bit32                         sasRemoteAddressHi; /**< SAS address high part */
433   bit32                         sasRemoteAddressLo; /**< SAS address low part */
434   /**< SAS ID frame of the remote device */
435   agsaSASIdentify_t             sasIDframe;
436   
437   /**< SAS address of the local device*/
438   bit32                         sasLocalAddressHi; /**< SAS address high part */
439   bit32                         sasLocalAddressLo; /**< SAS address low part */
440
441   /**< the list of PhyID belonging to this port */
442   bit8                          PhyIDList[TD_MAX_NUM_PHYS];
443   tiPortalContext_t             *tiPortalContext;
444   /* used in tiINIDiscoverTarget() */
445   agsaRoot_t                    *agRoot;
446   agsaPortContext_t             *agPortContext;
447   /* maybe needs timers for saPhyStart() */
448
449   bit8                  nativeSATAMode; /* boolean flag: whether the port is in Native SATA mode */
450   bit8                remoteSignature[8]; /* the remote signature of the port is the port is in native SATA mode */
451   bit8                 directAttatchedSAS; /* boolean flag: whether the port connected directly to SAS end device*/
452   /* SAS/SATA discovery information such as discoveringExpanderList */
453   tdsaDiscovery_t            discovery;
454   bit32                      valid;
455   bit8                       LinkRate;
456   bit32                      RegisteredDevNums; /* registered number of devices */
457   bit32                      eventPhyID; /* used for saHwEventAck() */
458   bit32                      Transient; /* transient period between link up and link down/port recovery */
459   agsaContext_t              agContext; /* used in tiCOMPortStop()*/
460   bit32                      PortRecoverPhyID; /* used to remember PhyID in Port_Recover event; used in ossaDeviceRegistrationCB() */
461   bit32                      DiscFailNSeenBC; /* used to remember broadcast change after discovery failure */
462   bit8                       remoteName[68];
463 #ifdef FDS_DM
464   dmPortContext_t            dmPortContext;
465   bit32                      DMDiscoveryState; /* DM discovery state returned by tddmDiscoverCB or tddmQueryDiscoveryCB */
466   bit32                      UseDM; /* set only when the directly attached target is SMP target(expander) */
467   bit32                      UpdateMCN; /* flag for inidicating update MCN */    
468 #endif  
469 }  tdsaPortContext_t;
470
471 /** \brief data structure for TD port information
472  *  This structure contains information in order to start the port
473  *  The most of fields are filled in by OS layer and there can be up to
474  *  8 of these structures
475  *  tiPortalContext_t->tdData points to this structure.
476  */
477 typedef struct tdsaPortStartInfo_s {
478   tiPortalContext_t  *tiPortalContext; 
479   tdsaPortContext_t  *portContext; /* tdsaportcontext */
480   agsaSASIdentify_t  SASID;        /* SAS ID of the local */
481   tdssPortFlags_t    flags;
482   agsaPhyConfig_t    agPhyConfig;
483 }  tdsaPortStartInfo_t;
484 /*
485   expander data structure
486 */
487
488 #define REPORT_LUN_LEN             16
489 #define REPORT_LUN_OPCODE          0xa0
490 typedef struct tdDeviceLUNInfo_s
491 {
492   unsigned long             tiDeviceHandle; 
493   bit32                  numOfLun; 
494 }tdDeviceLUNInfoIOCTL_t;
495
496 typedef struct tdsaExpander_s 
497 {
498   tdList_t                  linkNode; /**< the link node data structure of the expander */
499   tdList_t                  upNode; /**< the link node data structure of the expander */
500   tdsaDeviceData_t          *tdDevice; /**< the pointer to the device */
501   struct tdsaExpander_s     *tdUpStreamExpander; /**< the pointer to the upstream expander device */
502   bit8                      hasUpStreamDevice;
503   bit8                      discoveringPhyId;
504   bit16                     routingIndex; /* maximum routing table index reported by expander */
505   bit16                     currentIndex[TD_MAX_EXPANDER_PHYS]; /* routing table index in use */
506   tdsaDeviceData_t          *tdDeviceToProcess;    /* on some callbacks, this is a link to the device of interest */
507   bit32                     configSASAddressHi;
508   bit32                     configSASAddressLo;
509   struct tdsaExpander_s     *tdCurrentDownStreamExpander; 
510   bit8                      upStreamPhys[TD_MAX_EXPANDER_PHYS];
511   bit16                     numOfUpStreamPhys;
512   bit16                     currentUpStreamPhyIndex;
513   bit32                     upStreamSASAddressHi; 
514   bit32                     upStreamSASAddressLo;  
515   bit32                     underDiscovering;
516   bit32                     configRouteTable: 1;
517   bit32                     configuring: 1;
518   bit32                     configReserved: 30;
519   bit32                     id; /* for debugging */
520   struct tdsaExpander_s     *tdReturnginExpander;
521   bit8                      downStreamPhys[TD_MAX_EXPANDER_PHYS];
522   bit16                     numOfDownStreamPhys;
523   bit16                     currentDownStreamPhyIndex;
524   bit32                     discoverSMPAllowed; /* used only for configurable routers */
525   bit8                      routingAttribute[TD_MAX_EXPANDER_PHYS];
526   bit32                     configSASAddressHiTable[DEFAULT_MAX_DEV];
527   bit32                     configSASAddressLoTable[DEFAULT_MAX_DEV];
528   bit32                     configSASAddrTableIndex;  
529   
530 } tdsaExpander_t;
531
532 /* 
533  * SATA SAT specific function pointer for SATA completion for SAT commands.
534  */
535 typedef void (*satCompleteCbPtr_t  )(
536                           agsaRoot_t        *agRoot,
537                           agsaIORequest_t   *agIORequest,
538                           bit32             agIOStatus,
539                           agsaFisHeader_t   *agFirstDword,
540                           bit32             agIOInfoLen,
541                           agsaFrameHandle_t agFrameHandle,
542                           void              *satIOContext
543                        );
544
545 /* 
546  * SATA SAT specific function for I/O context
547  */
548 typedef struct satIOContext_s 
549 {
550   tdList_t                    satIoContextLink;
551   satDeviceData_t             *pSatDevData;
552   agsaFisRegHostToDevice_t    *pFis;
553   tiIniScsiCmnd_t             *pScsiCmnd;
554   scsiRspSense_t              *pSense;
555   tiSenseData_t               *pTiSenseData;
556   void                        *tiRequestBody;
557   void                        *tiScsiXchg; /* for writesame10() */
558   bit32                       reqType;
559   bit32                       interruptContext;
560   satCompleteCbPtr_t          satCompleteCB;
561   satInternalIo_t             *satIntIoContext;
562   tiDeviceHandle_t            *ptiDeviceHandle;
563   bit8                        sataTag;
564   bit8                        superIOFlag;/* Flag indicating type for tiScsiXchg */
565   bit8                        reserved1;  /* Padding for allignment */
566   bit8                        reserved2;  /* Padding for allignment */
567   bit32                       currentLBA; /* current LBA for read and write */
568   bit32                       ATACmd;     /* ATA command */
569   bit32                       OrgTL;      /* original tranfer length(tl) */
570   bit32                       LoopNum;    /* denominator tl */
571   bit32                       LoopNum2;    /* denominator tl */
572   bit8                        LBA[8];     /* for reassign blocks; current LBA */
573   bit32                       ParmIndex;  /* for reassign blocks;current idx in defective LBA LIST */
574   bit32                       ParmLen;    /* for reassign blocks; defective LBA list length */
575   bit32                       NotifyOS;   /* only for task management */
576   bit32                       TMF;        /* task management function */
577   struct satIOContext_s       *satToBeAbortedIOContext; 
578   struct satIOContext_s       *satOrgIOContext;
579   bit32                       pid;        /* port id; used to protect double completion */
580 } satIOContext_t;
581
582
583 /** \brief data structure for SAS SSP IO reuqest body
584  *  This structure contains IO related fields.
585  *  agsaIORequest->osData points to this 
586  */
587 typedef struct tdIORequestBody_s {
588   tdssIOCompleted_t              IOCompletionFunc; 
589   tiDeviceHandle_t               *tiDevHandle;
590   tiIORequest_t                  *tiIORequest; /* for ini */
591   agsaIORequest_t                agIORequest; /* for command and task and tm response and response */
592   tiIORequest_t                  *tiIOToBeAbortedRequest; /* IO to be aborted */
593   agsaContext_t                  agContext;  
594 #ifdef FDS_SM
595   smIORequestBody_t              smIORequestBody;    /*SATA IO request body*/
596   smIORequest_t                  smIORequest; /* for SATM */
597   void                           *osMemHandle; /* for ID data */
598   bit32                          pid;  /* port id for SATA completion */
599   bit32                          superIOFlag; /* Super IO or not */ 
600   union {
601     smScsiInitiatorRequest_t       smSCSIRequest;
602     smSuperScsiInitiatorRequest_t  smSuperSCSIRequest;      
603   } SM;
604 #endif 
605   union {
606     struct {
607       agsaSASRequestBody_t           agSASRequestBody;
608       //      agsaSASRequestBody_t           agSASResponseBody;
609       /* SSP response */
610       //      agsaSSPResponseInfoUnit_t      agSSPRspIU;
611     } SAS;
612     struct {
613       agsaSATAInitiatorRequest_t    agSATARequestBody;
614       scsiRspSense_t                sensePayload;
615       tiSenseData_t                 tiSenseData;
616       satIOContext_t                satIOContext;
617     } SATA;
618   } transport;  
619   bit32                          ioStarted;
620   bit32                          ioCompleted;
621   bit32                          reTries;
622   /**< for ESGL */
623   tdList_t                       EsglPageList;
624   bit32                          agRequestType;
625   union {
626     struct {
627       bit32                     expDataLength;
628       tiSgl_t                   tiSgl1;
629       tiSgl_t                   tiSgl2;
630       void                      *sglVirtualAddr;
631     } InitiatorRegIO;  /* regular IO */
632     struct {
633       void                      *osMemHandle;
634       tiIORequest_t             *CurrentTaskTag;
635       tiIORequest_t             *TaskTag;
636     } InitiatorTMIO;  /* task management */
637
638     struct {
639       tiIORequest_t   tiIORequest; /* for target */
640       
641       union {
642         struct {
643           tiSgl_t         tiSgl1;
644           void          * sglVirtualAddr;
645         } RegIO;
646         
647         struct {
648           tiSgl_t         tiSgl1;
649           void          * sglVirtualAddr;
650           tiSgl_t         tiSglMirror;
651           void          * sglMirrorVirtualAddr;
652           tdList_t        EsglMirrorPageList;
653         } MirrorIO;
654         
655       } TargetIOType;
656       
657     } TargetIO;    /* target regular IO */
658     
659     
660   } IOType;
661 }  tdIORequestBody_t;
662
663 /** \brief data structure for SAS SMP reuqest body
664  *  This structure contains IO related fields.
665  *  agsaIORequest->osData points to this
666  *  
667  */
668 typedef struct tdssSMPRequestBody_s {
669   tdIORequestBody_t              IORequestBody;    /* for combo, must be the first */
670   tdssSMPCompleted_t             SMPCompletionFunc;/* must be the second */
671   
672   tiDeviceHandle_t               *tiDevHandle;    /* not used for TD generated SMP */
673   agsaIORequest_t                agIORequest;
674   agsaSASRequestBody_t           agSASRequestBody;
675   agsaSATAInitiatorRequest_t     agSATARequestBody; 
676   void                           *osMemHandle;
677   tdsaDeviceData_t               *tdDevice;
678   tiIORequest_t                  *CurrentTaskTag; /* SMP is used for simulate target reset */
679   tdsaPortContext_t              *tdPortContext; /* portcontext where SMP is sent from */
680   bit8                           smpPayload[SMP_DIRECT_PAYLOAD_LIMIT]; /* for smp retries; 
681                                                                           only for direct SMP */
682   bit32                          retries; /* number of retries */
683   bit32                          queueNumber; /* number of retries */
684   /* for indirect SMP req/rsp */
685   void                           *IndirectSMPReqosMemHandle;
686   void                           *IndirectSMPReq;
687   bit32                          IndirectSMPReqLen;
688   void                           *IndirectSMPResposMemHandle;
689   void                           *IndirectSMPResp;
690   bit32                          IndirectSMPRespLen;
691   
692 }  tdssSMPRequestBody_t;
693
694 #ifdef AGTIAPI_CTL
695 typedef struct tdIORequest_s
696 {
697   tiIORequest_t             tiIORequest;
698   tdIORequestBody_t         tdIORequestBody;
699   void                      *osMemHandle;
700
701   void                      *osMemHandle2;
702   bit32                     physUpper32;
703   bit32                     physLower32;
704   void                      *virtAddr;
705
706   tiIntrEventType_t         eventType;
707   bit32                     eventStatus;
708 } tdIORequest_t;
709 #endif
710
711 #ifdef PASSTHROUGH
712 /* this is allocated by OS layer but used in TD layer just like tdIORequestBody */
713 typedef struct tdPassthroughCmndBody_s
714 {
715   ostiPassthroughCmndEvent_t     EventCB;
716   tiPassthroughRequest_t         *tiPassthroughRequest;
717   tiDeviceHandle_t           *tiDevHandle;
718   bit32                          tiPassthroughCmndType; /* used in local abort */
719   union {
720     struct {
721 #ifdef TO_DO      
722       tiSMPFunction_t            SMPFn;
723       tiSMPFunctionResult_t      SMPFnResult;  /* for SMP target only */
724       bit32                      IT; /* 0: initiator 1: target */
725       tiSMPFrameHeader_t         SMPHeader;
726 #endif      
727       tdssSMPRequestBody_t       SMPBody;
728     } SMP;
729     struct {
730       tiDataDirection_t          dataDirection;
731     } RMC;
732   } protocol;
733 } tdPassthroughCmndBody_t;
734
735 #endif
736
737 #endif                          /* __TDTYPES_H__ */