dmtypes.h revision 285662
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: head/sys/dev/pms/RefTisa/discovery/dm/dmtypes.h 285242 2015-07-07 13:17:02Z achim $
22*
23********************************************************************************/
24#ifndef __DMTYPES_H__
25#define __DMTYPES_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/discovery/api/dm.h>
36#include <dev/pms/RefTisa/discovery/api/dmapi.h>
37#include <dev/pms/RefTisa/discovery/api/tddmapi.h>
38
39#include <dev/pms/RefTisa/discovery/dm/dmlist.h>
40#ifdef TBD
41#include <dev/pms/RefTisa/tisa/api/tiscsi.h>
42#endif
43
44
45/* for SMP only */
46typedef void (*dmSMPCompleted_t) (
47                                    agsaRoot_t            *,
48                                    agsaIORequest_t       *,
49                                    bit32                 ,
50                                    bit32                 ,
51                                    agsaFrameHandle_t
52                                    );
53
54
55/* timer functions ; both I and T */
56typedef void (*dmTimerCBFunc_t)(dmRoot_t *dmRoot, void *timerData1, void *timerData2, void *timerData3);
57
58
59/** \brief data structure for timer request
60 *  Timer requests are enqueued and dequeued using dmList_t
61 *  and have a callback function
62 */
63typedef struct dmTimerRequest_s {
64  /* the number of ticks */
65  bit32             timeout;
66  void              *timerData1;
67  void              *timerData2;
68  void              *timerData3;
69  dmTimerCBFunc_t   timerCBFunc;
70  dmList_t          timerLink;
71  bit32             timerRunning;
72}  dmTimerRequest_t;
73
74typedef struct dmRootOsData_s {
75  dmRoot_t  *dmRoot;            /**< Pointer back to dmRoot                 */
76  void      *dmAllShared;       /**< Pointer to dmContext_t               */
77  void      *dmIni;             /**< Pointer to SAS/SATA initiator               */
78}  dmRootOsData_t;
79
80typedef struct DMSASAddressID_s
81{
82  bit32   sasAddressLo;     /**< HOST SAS address lower part */
83  bit32   sasAddressHi;     /**< HOST SAS address higher part */
84  bit8    phyIdentifier;    /**< PHY IDENTIFIER of the PHY */
85} DMSASAddressID_t;
86
87struct dmExpander_s;
88
89typedef struct dmDiscovery_s
90{
91  dmList_t                   discoveringExpanderList;
92  dmList_t                   UpdiscoveringExpanderList;
93  //  tdList_t                   freeExpanderList;
94  bit32                   status;
95  DMSASAddressID_t        sasAddressIDDiscoverError;
96  agsaSATAIdentifyData_t  *pSataIdentifyData;
97  struct dmExpander_s     *RootExp; /* Root expander of discovery */
98  bit32                   NumOfUpExp;
99  bit32                   type; /* discovery type: TDSA_DISCOVERY_OPTION_FULL_START
100                                   or TDSA_DISCOVERY_OPTION_INCREMENTAL_START*/
101  bit32                   retries;
102  bit32                   configureRouteRetries;
103  bit32                   deviceRetistrationRetries;
104  dmTimerRequest_t        discoveryTimer;
105  dmTimerRequest_t        configureRouteTimer;
106  dmTimerRequest_t        deviceRegistrationTimer;
107  dmTimerRequest_t        BCTimer; /* Broadcast Change timer for ResetTriggerred */
108  smpRespDiscover_t       SMPDiscoverResp;
109  smpRespDiscover2_t      SMPDiscover2Resp;
110  bit32                   pendingSMP; /* the number of pending SMP for this discovery */
111  bit32                   SeenBC; /* received Broadcast change */
112  bit32                   forcedOK; /* report DiscOK when chance is missed */
113  dmTimerRequest_t        SMPBusyTimer; /* SMP retry timer for saSMPStart busy */
114  bit32                   SMPRetries; /* number of SMP retries when LL returns busy for saSMPStart*/
115  bit32                   ResetTriggerred; /* Hard/Link reset triggerred by discovery */
116  dmTimerRequest_t        DiscoverySMPTimer; /* discovery-related SMP application Timer */
117  /* For SAS 2 */
118  bit32                   DeferredError; /* Deferred Error for SAS 2 */
119  bit32                   ConfiguresOthers; /* exp configures others; no routing configuration */
120} dmDiscovery_t;
121
122typedef struct dmSASSubID_s
123{
124  bit32        sasAddressHi;
125  bit32        sasAddressLo;
126  bit8         initiator_ssp_stp_smp;
127  bit8         target_ssp_stp_smp;
128
129} dmSASSubID_t;
130
131struct dmDeviceData_s;
132
133typedef struct dmIntPortContext_s
134{
135  /**< current number of devices in this PortContext */
136  bit32                         Count;
137  bit32                   DiscoveryState;
138  bit32                   DiscoveryAbortInProgress;
139  /* passed by tiINIDiscoverTargets()
140     eg) discovery or rediscovery ....
141  */
142  bit32                   discoveryOptions;
143  /* Discovery ready is given? */
144  bit32                   DiscoveryRdyGiven;
145  /* Port has received link up */
146  bit32                   SeenLinkUp;
147  /* statistics */
148  bit32                   numAvailableTargets;
149  /* flag: indicates that discovery is trigggered by tiINIDiscoverTargets */
150  bit32                   osInitiatedDiscovery;
151
152  bit32                         id; /* for debugging only */
153  dmList_t                      FreeLink; /**< free portcontext list */
154  dmList_t                      MainLink; /**< in-use portcontext list */
155  /**< SAS address of the remote device */
156  bit32                         sasRemoteAddressHi; /**< SAS address high part */
157  bit32                         sasRemoteAddressLo; /**< SAS address low part */
158  /**< SAS ID frame of the remote device */
159  agsaSASIdentify_t             sasIDframe;
160
161  /**< SAS address of the local device*/
162  bit32                         sasLocalAddressHi; /**< SAS address high part */
163  bit32                         sasLocalAddressLo; /**< SAS address low part */
164#ifdef TBD
165  /**< the list of PhyID belonging to this port */
166  bit8                          PhyIDList[DM_MAX_NUM_PHYS];
167#endif
168  dmPortContext_t               *dmPortContext;
169  dmRoot_t                      *dmRoot;
170
171#ifdef TBD
172  /* used in tiINIDiscoverTarget() */
173  agsaRoot_t                    *agRoot;
174  agsaPortContext_t             *agPortContext;
175  /* maybe needs timers for saPhyStart() */
176
177  bit8                  nativeSATAMode; /* boolean flag: whether the port is in Native SATA mode */
178  bit8                remoteSignature[8]; /* the remote signature of the port is the port is in native SATA mode */
179#endif
180  bit8                 directAttatchedSAS; /* boolean flag: whether the port connected directly to SAS end device*/
181  /* SAS/SATA discovery information such as discoveringExpanderList */
182  dmDiscovery_t              discovery;
183  bit32                      valid;
184  bit8                       LinkRate;
185  bit32                      RegisteredDevNums; /* registered number of devices */
186  bit32                      eventPhyID; /* used for saHwEventAck() */
187  bit32                      Transient; /* transient period between link up and link down/port recovery */
188  bit32                      RegFailed; /* Registration of expander belonging to this port failure */
189
190}  dmIntPortContext_t;
191
192typedef struct dmDeviceData_s  {
193
194  dmList_t                FreeLink; /* free dev list */
195  dmList_t                MainLink; /* main(in use) dev list */
196  dmList_t                IncDisLink; /* Used for incremental Discovery only */
197  bit32                   id; /* for debugging only */
198  bit8                    DeviceType;
199  /* used in tiINIIOStart() */
200  dmRoot_t                *dmRoot;
201//  agsaDevHandle_t         *agDevHandle;
202
203  /* for SAS; remote device */
204  //  agsaSASDeviceInfo_t     agSASDeviceInfo;
205  /* device's sas address */
206  DMSASAddressID_t        SASAddressID;
207  bit8                    initiator_ssp_stp_smp;
208  bit8                    target_ssp_stp_smp;
209  bit8                    numOfPhys;
210
211  /* SATA specific data */
212  bit8                    satSignature[8];          /* SATA device Signature*/
213
214  /**< pointer to tdsaPortcontext which the device belongs to */
215  struct dmIntPortContext_s *dmPortContext;
216  /* validity of device */
217  bit8                    valid;
218  bit8                    valid2;
219  bit8                    processed; /* used in TD discovery */
220#ifdef AGTIAPI_CTL
221  bit8                    discovered;
222#endif
223  agsaDeviceInfo_t        agDeviceInfo;
224  dmDeviceInfo_t          dmDeviceInfo;
225  agsaContext_t           agContext; /* used in saRegisterNewDevice()*/
226  /**< pointer to dmExpander if Device is expander */
227  struct dmExpander_s     *dmExpander;
228  struct dmDeviceData_s   *ExpDevice; /* Expander device which this device is attached to */
229
230  bit8                    phyID;      /* PhyID this device is attached to SPC or expander */
231  agsaSASIdentify_t     sasIdentify; /* used only in TD discovery */
232  bit8                  connectionRate;
233//  bit8                  registered;
234  bit8                  directlyAttached;
235  bit8                  SASSpecDeviceType; /* 0 - 3; SAS_NO_DEVICE - SAS_FANOUT_EXPANDER_DEVICE */
236  bit32                 IOStart;
237  bit32                 IOResponse;
238  agsaContext_t         agDeviceResetContext; /* used in saLocalPhyControl() */
239  bit32                 TRflag; /* transport recovery flag; used only for tiINITransportRecovery */
240  bit32                 ResetCnt; /* number of reset to the device */
241  bit32                 registered; /* registered to LL */
242  bit32                 reported; /* reproted to TDM */
243  bit32                 MCN; /* MCN; initialized to 0; current value in discovery */
244  bit32                 MCNDone; /* done in updating MCN */
245  bit32                 PrevMCN; /* MCN; initialized to 0; previous value in discovery */
246
247}  dmDeviceData_t;
248
249
250typedef struct dmExpander_s
251{
252  /* start of dmDeviceData */
253#ifdef TBD
254  dmList_t                FreeLink; /* free dev list */
255  dmList_t                MainLink; /* main(in use) dev list */
256#endif
257  bit32                   id; /* for debugging only */
258  bit32                   InQID; /* Inbound queue ID */
259  bit32                   OutQID; /* Outbound queue ID */
260  bit8                    DeviceType;
261  /* used in tiINIIOStart() */
262  dmRoot_t                *dmRoot;
263  agsaDevHandle_t         *agDevHandle;
264
265  dmList_t                  linkNode; /**< the link node data structure of the expander */
266  dmList_t                  upNode; /**< the link node data structure of the expander */
267  dmDeviceData_t            *dmDevice; /**< the pointer to the device data */
268  struct dmExpander_s       *dmUpStreamExpander; /**< the pointer to the upstream expander device */
269  bit8                      hasUpStreamDevice;
270  bit8                      discoveringPhyId;
271  bit16                     routingIndex; /* maximum routing table index reported by expander */
272  bit16                     currentIndex[DM_MAX_EXPANDER_PHYS]; /* routing table index in use */
273  /*ReportPhySataSend in DM */
274  dmDeviceData_t            *dmDeviceToProcess;    /* on some callbacks, this is a link to the device of interest */
275
276  bit32                     configSASAddressHi;
277  bit32                     configSASAddressLo;
278  struct dmExpander_s       *dmCurrentDownStreamExpander;
279  bit8                      upStreamPhys[DM_MAX_EXPANDER_PHYS];
280  bit16                     numOfUpStreamPhys;
281  bit16                     currentUpStreamPhyIndex;
282  bit32                     upStreamSASAddressHi;
283  bit32                     upStreamSASAddressLo;
284  bit32                     underDiscovering;
285  bit32                     configRouteTable: 1;
286  bit32                     configuring: 1;
287  bit32                     configReserved: 30;
288#ifdef TBD
289  bit32                   id; /* for debugging */
290#endif
291  struct dmExpander_s       *dmReturnginExpander;
292  bit8                      downStreamPhys[DM_MAX_EXPANDER_PHYS];
293  bit16                     numOfDownStreamPhys;
294  bit8                      currentDownStreamPhyIndex;
295  bit32                     discoverSMPAllowed; /* used only for configurable routers */
296  bit8                      routingAttribute[DM_MAX_EXPANDER_PHYS];
297  bit32                     configSASAddressHiTable[DM_MAX_DEV];
298  bit32                     configSASAddressLoTable[DM_MAX_DEV];
299  bit32                     configSASAddrTableIndex;
300  /* for SAS 2 */
301  bit32                     SAS2; /* supports SAS2 spec of not. The value of LONG RESPONSE
302                                     in report general response */
303  bit32                     TTTSupported; /* Table to Table is supported */
304  bit32                     UndoDueToTTTSupported; /* flag that indicates undo exp, device, route
305                                                      configuration due to TTT */
306
307} dmExpander_t;
308
309typedef struct dmIndirectSMPRequestBody_s {
310  dmList_t                     Link;
311  bit32                        id;
312
313}  dmIndirectSMPRequestBody_t;
314
315/*
316  should DM allocate a pool of SMP and manages it
317  or
318  depend on ostiAllocMemory()
319*/
320typedef struct dmSMPRequestBody_s {
321  dmList_t                     Link;
322  dmSMPCompleted_t             SMPCompletionFunc;/* must be the second */
323
324#ifdef TBD
325  tiDeviceHandle_t               *tiDevHandle;    /* not used for TD generated SMP */
326#endif
327  agsaIORequest_t                agIORequest;
328  agsaSASRequestBody_t           agSASRequestBody;
329  agsaSATAInitiatorRequest_t     agSATARequestBody;
330  /**< SMP response */
331  //agsaSMPFrame_t                 SMPRsp;
332  dmDeviceData_t                 *dmDevice;
333
334#ifdef TBD
335  void                           *osMemHandle;
336  // can this be simply dmExpander_t
337  dmDeviceData_t                 *dmDevice;
338  tiIORequest_t                  *CurrentTaskTag; /* SMP is used for simulate target reset */
339#endif
340  dmRoot_t                       *dmRoot;
341//  dmExpander_t                   *dmExpander;
342  dmIntPortContext_t             *dmPortContext; /* portcontext where SMP is sent from */
343  bit8                           smpPayload[SMP_DIRECT_PAYLOAD_LIMIT]; /* for smp retries;
344                                                                          only for direct SMP */
345  bit32                          retries; /* number of retries */
346  /* for indirect SMP req/rsp */
347  void                           *IndirectSMP;
348  bit32                          IndirectSMPUpper32;
349  bit32                          IndirectSMPLower32;
350  /* used only when SMP is INDIRECT SMP request. On SMP completion,
351     this is used to free up INDIRECT SMP response
352  */
353  void                           *IndirectSMPResponse; /* dmSMPRequestBody_t */
354
355
356
357#ifdef TBD
358  void                           *IndirectSMPReqosMemHandle;
359  void                           *IndirectSMPReq;
360  bit32                          IndirectSMPReqLen;
361  bit32                          IndirectSMPReqUpper32;
362  bit32                          IndirectSMPReqLower32;
363  void                           *IndirectSMPResposMemHandle;
364  void                           *IndirectSMPResp;
365  bit32                          IndirectSMPRespLen;
366  bit32                          IndirectSMPRespUpper32;
367  bit32                          IndirectSMPRespLower32;
368#endif
369  bit32                          id;
370  agsaContext_t                  agContext;
371}  dmSMPRequestBody_t;
372
373
374typedef struct dmIntContext_s {
375  /**< agsaRoot_t->osData points to this */
376  struct dmRootOsData_s      dmRootOsData;
377
378  bit32               usecsPerTick;
379#ifdef TBD
380  dmRoot_t            dmRootInt;          /* for interrupt */
381  dmRoot_t            dmRootNonInt;       /* for non-interrupt */
382#endif
383
384  agsaRoot_t          *agRoot;
385
386  /**< software-related initialization params used in saInitialize() */
387  dmSwConfig_t        SwConfig;
388
389  /**< timers used commonly in SAS/SATA */
390  dmList_t                      timerlist;
391  /**< pointer to PortContext memory;  */
392  dmIntPortContext_t          *PortContextMem;
393
394  dmList_t                   FreePortContextList;
395  dmList_t                   MainPortContextList;
396
397  /**< pointer to Device memory */
398  dmDeviceData_t             *DeviceMem;
399  dmList_t                   FreeDeviceList;
400  dmList_t                   MainDeviceList;
401
402  /**< pointer to Expander memory */
403  dmExpander_t               *ExpanderMem;
404  dmList_t                   freeExpanderList;
405  dmList_t                   mainExpanderList;
406
407  /**< pointer to SMP command memory */
408  dmSMPRequestBody_t         *SMPMem;
409  dmList_t                   freeSMPList;
410
411  /**< pointer to Indirect SMP request/repsonse memory */
412  bit8                       *IndirectSMPMem;
413  bit32                      IndirectSMPUpper32;
414  bit32                      IndirectSMPLower32;
415  bit32                      itNexusTimeout;
416  bit32                      MaxRetryDiscovery;
417  bit32                      RateAdjust;
418
419}  dmIntContext_t;
420
421typedef struct dmIntRoot_s
422{
423  /**<< common data structure for SAS/SATA */
424  dmIntContext_t          dmAllShared;
425} dmIntRoot_t;
426
427#endif                          /* __DMTYPES_H__ */
428
429