The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/pms/RefTisa/discovery/dm/dmtypes.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    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 __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 */
   46 typedef 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 */
   56 typedef 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  */
   63 typedef 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 
   74 typedef 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 
   80 typedef 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 
   87 struct dmExpander_s;
   88 
   89 typedef 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 
  122 typedef 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 
  131 struct dmDeviceData_s;
  132 
  133 typedef 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 
  192 typedef 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 
  250 typedef 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 
  309 typedef 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 */
  320 typedef 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 
  374 typedef 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 
  421 typedef struct dmIntRoot_s
  422 {
  423   /**<< common data structure for SAS/SATA */
  424   dmIntContext_t          dmAllShared;
  425 } dmIntRoot_t;
  426 
  427 #endif                          /* __DMTYPES_H__ */
  428 

Cache object: 24bac3be3be3440e9430708a5cae7a4f


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.