14e1bc9a0SAchim Leubner /*******************************************************************************
24e1bc9a0SAchim Leubner *Copyright (c) 2014 PMC-Sierra, Inc.  All rights reserved.
34e1bc9a0SAchim Leubner *
44e1bc9a0SAchim Leubner *Redistribution and use in source and binary forms, with or without modification, are permitted provided
54e1bc9a0SAchim Leubner *that the following conditions are met:
64e1bc9a0SAchim Leubner *1. Redistributions of source code must retain the above copyright notice, this list of conditions and the
74e1bc9a0SAchim Leubner *following disclaimer.
84e1bc9a0SAchim Leubner *2. Redistributions in binary form must reproduce the above copyright notice,
94e1bc9a0SAchim Leubner *this list of conditions and the following disclaimer in the documentation and/or other materials provided
104e1bc9a0SAchim Leubner *with the distribution.
114e1bc9a0SAchim Leubner *
124e1bc9a0SAchim Leubner *THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED
134e1bc9a0SAchim Leubner *WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
144e1bc9a0SAchim Leubner *FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
154e1bc9a0SAchim Leubner *FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
164e1bc9a0SAchim Leubner *NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
174e1bc9a0SAchim Leubner *BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
184e1bc9a0SAchim Leubner *LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
194e1bc9a0SAchim Leubner *SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
204e1bc9a0SAchim Leubner 
214e1bc9a0SAchim Leubner ********************************************************************************/
224e1bc9a0SAchim Leubner /*******************************************************************************/
234e1bc9a0SAchim Leubner /** \file
244e1bc9a0SAchim Leubner  *
254e1bc9a0SAchim Leubner  *
264e1bc9a0SAchim Leubner  * This file contains initiator initialization functions
274e1bc9a0SAchim Leubner  *
284e1bc9a0SAchim Leubner  */
294e1bc9a0SAchim Leubner #include <sys/cdefs.h>
304e1bc9a0SAchim Leubner #include <dev/pms/config.h>
314e1bc9a0SAchim Leubner 
324e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osenv.h>
334e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/ostypes.h>
344e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osdebug.h>
354e1bc9a0SAchim Leubner 
364e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/sa.h>
374e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saapi.h>
384e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
394e1bc9a0SAchim Leubner 
404e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/titypes.h>
414e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/ostiapi.h>
424e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiapi.h>
434e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/api/tiglobal.h>
444e1bc9a0SAchim Leubner 
454e1bc9a0SAchim Leubner #ifdef FDS_SM
464e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/sm.h>
474e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/smapi.h>
484e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/sat/api/tdsmapi.h>
494e1bc9a0SAchim Leubner #endif
504e1bc9a0SAchim Leubner 
514e1bc9a0SAchim Leubner #ifdef FDS_DM
524e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dm.h>
534e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/dmapi.h>
544e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/discovery/api/tddmapi.h>
554e1bc9a0SAchim Leubner #endif
564e1bc9a0SAchim Leubner 
574e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
584e1bc9a0SAchim Leubner #include <dev/pms/freebsd/driver/common/osstring.h>
594e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
604e1bc9a0SAchim Leubner 
614e1bc9a0SAchim Leubner #ifdef INITIATOR_DRIVER
624e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
634e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
644e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
654e1bc9a0SAchim Leubner #endif
664e1bc9a0SAchim Leubner 
674e1bc9a0SAchim Leubner #ifdef TARGET_DRIVER
684e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
694e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
704e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
714e1bc9a0SAchim Leubner #endif
724e1bc9a0SAchim Leubner 
734e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
744e1bc9a0SAchim Leubner #include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
754e1bc9a0SAchim Leubner 
764e1bc9a0SAchim Leubner /*****************************************************************************
774e1bc9a0SAchim Leubner *! \brief itdssGetResource
784e1bc9a0SAchim Leubner *
794e1bc9a0SAchim Leubner *  Purpose:  This function is called to determine the Transport
804e1bc9a0SAchim Leubner *            Dependent Layer internal resource requirement for the initiator
814e1bc9a0SAchim Leubner *            side.
824e1bc9a0SAchim Leubner *
834e1bc9a0SAchim Leubner *  /param   tiRoot:            Pointer to driver/port instance.
844e1bc9a0SAchim Leubner *  /param   initiatorResource: Pointer to initiator functionality memory and
854e1bc9a0SAchim Leubner *                              option requirement.
864e1bc9a0SAchim Leubner *
874e1bc9a0SAchim Leubner *  /return: None
884e1bc9a0SAchim Leubner *
894e1bc9a0SAchim Leubner *  /note - This function only return the memory requirement in the tiMem_t
904e1bc9a0SAchim Leubner *          structure in initiatorResource. It does not allocated memory, so the
914e1bc9a0SAchim Leubner *          address fields in tiMem_t are not used.
924e1bc9a0SAchim Leubner *
934e1bc9a0SAchim Leubner *****************************************************************************/
944e1bc9a0SAchim Leubner osGLOBAL void
itdssGetResource(tiRoot_t * tiRoot,tiInitiatorResource_t * initiatorResource)954e1bc9a0SAchim Leubner itdssGetResource(
964e1bc9a0SAchim Leubner                  tiRoot_t * tiRoot,
974e1bc9a0SAchim Leubner                  tiInitiatorResource_t * initiatorResource
984e1bc9a0SAchim Leubner                  )
994e1bc9a0SAchim Leubner {
1004e1bc9a0SAchim Leubner   itdssOperatingOption_t    OperatingOption;
1014e1bc9a0SAchim Leubner   tiInitiatorMem_t          *iniMem;
1024e1bc9a0SAchim Leubner   bit32 i;
1034e1bc9a0SAchim Leubner 
1044e1bc9a0SAchim Leubner   iniMem                  = &initiatorResource->initiatorMem;
1054e1bc9a0SAchim Leubner   iniMem->count           = 1;          /* Only 1 memory descriptors are used */
1064e1bc9a0SAchim Leubner 
1074e1bc9a0SAchim Leubner   TI_DBG6(("itdssGetResource: start\n"));
1084e1bc9a0SAchim Leubner 
1094e1bc9a0SAchim Leubner   /*  other than [0], nothing is used
1104e1bc9a0SAchim Leubner    *  tdCachedMem[0]: cached mem for initiator TD Layer main functionality :
1114e1bc9a0SAchim Leubner    *                  itdssIni_t
1124e1bc9a0SAchim Leubner    *  tdCachedMem[1-5]: is availalbe
1134e1bc9a0SAchim Leubner   */
1144e1bc9a0SAchim Leubner 
1154e1bc9a0SAchim Leubner   /*
1164e1bc9a0SAchim Leubner    * Get default parameters from the OS Specific area
1174e1bc9a0SAchim Leubner    * and reads parameters from the configuration file
1184e1bc9a0SAchim Leubner    */
1194e1bc9a0SAchim Leubner   itdssGetOperatingOptionParams(tiRoot, &OperatingOption);
1204e1bc9a0SAchim Leubner 
1214e1bc9a0SAchim Leubner   /*
1224e1bc9a0SAchim Leubner    * Cached mem for initiator Transport Dependent Layer main functionality
1234e1bc9a0SAchim Leubner    */
1244e1bc9a0SAchim Leubner 
1254e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].singleElementLength  = sizeof(itdsaIni_t);
1264e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].numElements          = 1;
1274e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].totalLength          =
1284e1bc9a0SAchim Leubner     iniMem->tdCachedMem[0].singleElementLength *
1294e1bc9a0SAchim Leubner     iniMem->tdCachedMem[0].numElements;
1304e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].alignment            = sizeof (void *); /* 4 bytes */
1314e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].type                 = TI_CACHED_MEM;
1324e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].reserved             = 0;
1334e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].virtPtr               = agNULL;
1344e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].osHandle              = agNULL;
1354e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].physAddrUpper         = 0;
1364e1bc9a0SAchim Leubner   iniMem->tdCachedMem[0].physAddrLower         = 0;
1374e1bc9a0SAchim Leubner 
1384e1bc9a0SAchim Leubner 
1394e1bc9a0SAchim Leubner   /*
1404e1bc9a0SAchim Leubner    * Not used mem structure. Initialize them.
1414e1bc9a0SAchim Leubner    */
1424e1bc9a0SAchim Leubner   for (i = iniMem->count; i < 6; i++)
1434e1bc9a0SAchim Leubner   {
1444e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].singleElementLength  = 0;
1454e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].numElements          = 0;
1464e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].totalLength          = 0;
1474e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].alignment            = 0;
1484e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].type                 = TI_CACHED_MEM;
1494e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].reserved             = 0;
1504e1bc9a0SAchim Leubner 
1514e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].virtPtr               = agNULL;
1524e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].osHandle              = agNULL;
1534e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].physAddrUpper         = 0;
1544e1bc9a0SAchim Leubner     iniMem->tdCachedMem[i].physAddrLower         = 0;
1554e1bc9a0SAchim Leubner 
1564e1bc9a0SAchim Leubner   }
1574e1bc9a0SAchim Leubner 
1584e1bc9a0SAchim Leubner   /*
1594e1bc9a0SAchim Leubner    * Operating option of TISA
1604e1bc9a0SAchim Leubner    * fills in tiInitiatorOption
1614e1bc9a0SAchim Leubner    */
1624e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.usecsPerTick       = OperatingOption.UsecsPerTick;  /* default value 1 sec*/
1634e1bc9a0SAchim Leubner 
1644e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.pageSize           = 0;
1654e1bc9a0SAchim Leubner 
1664e1bc9a0SAchim Leubner   /* initialization */
1674e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.numElements          = 0;
1684e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength  = 0;
1694e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.totalLength          = 0;
1704e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.alignment            = 0;
1714e1bc9a0SAchim Leubner 
1724e1bc9a0SAchim Leubner   /* initialization */
1734e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.numElements         = 0;
1744e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = 0;
1754e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.totalLength         = 0;
1764e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.alignment           = 0;
1774e1bc9a0SAchim Leubner 
1784e1bc9a0SAchim Leubner 
1794e1bc9a0SAchim Leubner   /* This is not used in OS like Linux which supports dynamic memeory allocation
1804e1bc9a0SAchim Leubner      In short, this is for Windows, which does not support dynamic memory allocation */
1814e1bc9a0SAchim Leubner   /* ostiallocmemory(..... ,agFALSE) is supported by the following code eg) sat.c
1824e1bc9a0SAchim Leubner      The memory is DMA capable(uncached)
1834e1bc9a0SAchim Leubner    */
1844e1bc9a0SAchim Leubner #ifdef CCBUILD_EncryptionDriver
1854e1bc9a0SAchim Leubner   /* extend the DMA memory for supporting two encryption DEK tables */
1864e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.numElements          = 128 + DEK_MAX_TABLE_ENTRIES / 2;
1874e1bc9a0SAchim Leubner #else
1884e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.numElements          = 128;
1894e1bc9a0SAchim Leubner #endif
1904e1bc9a0SAchim Leubner   /* worked
1914e1bc9a0SAchim Leubner      initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength  = sizeof(tdIORequestBody_t);
1924e1bc9a0SAchim Leubner   */
1934e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength  = 512;
1944e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.totalLength          =
1954e1bc9a0SAchim Leubner     initiatorResource->initiatorOption.dynamicDmaMem.numElements *
1964e1bc9a0SAchim Leubner     initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength;
1974e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicDmaMem.alignment            = sizeof(void *);
1984e1bc9a0SAchim Leubner 
1994e1bc9a0SAchim Leubner 
2004e1bc9a0SAchim Leubner   /* This is not used in OS like Linux which supports dynamic memeory allocation
2014e1bc9a0SAchim Leubner      In short, this is for Windows, which does not support dynamic memory allocation */
2024e1bc9a0SAchim Leubner   /* ostiallocmemory(..... ,agTRUE) is supported by the following code eg) sat.c
2034e1bc9a0SAchim Leubner      The memory is DMA incapable(cached)
2044e1bc9a0SAchim Leubner    */
2054e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.numElements = 1024 + 256;
2064e1bc9a0SAchim Leubner   /* worked
2074e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = sizeof(tdIORequestBody_t);
2084e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = sizeof(tdssSMPRequestBody_t);
2094e1bc9a0SAchim Leubner   */
2104e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = 512;
2114e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.totalLength         =
2124e1bc9a0SAchim Leubner         initiatorResource->initiatorOption.dynamicCachedMem.numElements *
2134e1bc9a0SAchim Leubner         initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength;
2144e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.dynamicCachedMem.alignment           = sizeof(void *);
2154e1bc9a0SAchim Leubner 
2164e1bc9a0SAchim Leubner   /*
2174e1bc9a0SAchim Leubner    * set the I/O request body size
2184e1bc9a0SAchim Leubner    */
2194e1bc9a0SAchim Leubner   initiatorResource->initiatorOption.ioRequestBodySize  = sizeof(tdIORequestBody_t);
2204e1bc9a0SAchim Leubner   TI_DBG6(("itdssGetResource: sizeof(tdssSMPRequestBody_t) %d\n", (int)sizeof(tdssSMPRequestBody_t)));
2214e1bc9a0SAchim Leubner   TI_DBG6(("itdssGetResource: end\n"));
2224e1bc9a0SAchim Leubner 
2234e1bc9a0SAchim Leubner   return;
2244e1bc9a0SAchim Leubner }
2254e1bc9a0SAchim Leubner 
2264e1bc9a0SAchim Leubner 
2274e1bc9a0SAchim Leubner /*****************************************************************************
2284e1bc9a0SAchim Leubner *! \brief  itdssGetOperatingOptionParams
2294e1bc9a0SAchim Leubner *
2304e1bc9a0SAchim Leubner *  Purpose: This function is called to get default parameters from the
2314e1bc9a0SAchim Leubner *           OS Specific area. This function is called in the context of
2324e1bc9a0SAchim Leubner *           tiCOMGetResource() and tiCOMInit().
2334e1bc9a0SAchim Leubner *
2344e1bc9a0SAchim Leubner *
2354e1bc9a0SAchim Leubner *  \param  tiRoot:   Pointer to initiator driver/port instance.
2364e1bc9a0SAchim Leubner *  \param  option:   Pointer to the Transport Dependent options.
2374e1bc9a0SAchim Leubner *
2384e1bc9a0SAchim Leubner *  \return: None
2394e1bc9a0SAchim Leubner *
2404e1bc9a0SAchim Leubner *  \note -
2414e1bc9a0SAchim Leubner *
2424e1bc9a0SAchim Leubner *****************************************************************************/
2434e1bc9a0SAchim Leubner osGLOBAL void
itdssGetOperatingOptionParams(tiRoot_t * tiRoot,itdssOperatingOption_t * OperatingOption)2444e1bc9a0SAchim Leubner itdssGetOperatingOptionParams(
2454e1bc9a0SAchim Leubner                       tiRoot_t                *tiRoot,
2464e1bc9a0SAchim Leubner                       itdssOperatingOption_t  *OperatingOption
2474e1bc9a0SAchim Leubner                       )
2484e1bc9a0SAchim Leubner {
2494e1bc9a0SAchim Leubner   char    *key = agNULL;
2504e1bc9a0SAchim Leubner   char    *subkey1 = agNULL;
2514e1bc9a0SAchim Leubner   char    *subkey2 = agNULL;
2524e1bc9a0SAchim Leubner   char    *buffer;
2534e1bc9a0SAchim Leubner   bit32   buffLen;
2544e1bc9a0SAchim Leubner   bit32   lenRecv = 0;
2554e1bc9a0SAchim Leubner   char    *pLastUsedChar = agNULL;
2564e1bc9a0SAchim Leubner   char    tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
2574e1bc9a0SAchim Leubner   char    globalStr[]     = "Global";
2584e1bc9a0SAchim Leubner   char    iniParmsStr[]   = "InitiatorParms";
2594e1bc9a0SAchim Leubner 
2604e1bc9a0SAchim Leubner   TI_DBG6(("itdssGetOperatingOptionParams: start\n"));
2614e1bc9a0SAchim Leubner 
2624e1bc9a0SAchim Leubner   /*
2634e1bc9a0SAchim Leubner      first set the values to Default values
2644e1bc9a0SAchim Leubner      Then, overwrite them using ostiGetTransportParam()
2654e1bc9a0SAchim Leubner   */
2664e1bc9a0SAchim Leubner 
2674e1bc9a0SAchim Leubner 
2684e1bc9a0SAchim Leubner   /* to remove compiler warnings */
2694e1bc9a0SAchim Leubner   pLastUsedChar   = pLastUsedChar;
2704e1bc9a0SAchim Leubner   lenRecv         = lenRecv;
2714e1bc9a0SAchim Leubner   subkey2         = subkey2;
2724e1bc9a0SAchim Leubner   subkey1         = subkey1;
2734e1bc9a0SAchim Leubner   key             = key;
2744e1bc9a0SAchim Leubner   buffer          = &tmpBuffer[0];
2754e1bc9a0SAchim Leubner   buffLen         = sizeof (tmpBuffer);
2764e1bc9a0SAchim Leubner 
2774e1bc9a0SAchim Leubner   osti_memset(buffer, 0, buffLen);
2784e1bc9a0SAchim Leubner 
2794e1bc9a0SAchim Leubner 
2804e1bc9a0SAchim Leubner 
2814e1bc9a0SAchim Leubner   /* default values */
2824e1bc9a0SAchim Leubner   OperatingOption->MaxTargets = DEFAULT_MAX_DEV; /* DEFAULT_MAX_TARGETS; */ /* 256 */
2834e1bc9a0SAchim Leubner   OperatingOption->UsecsPerTick = DEFAULT_INI_TIMER_TICK; /* 1 sec */
2844e1bc9a0SAchim Leubner 
2854e1bc9a0SAchim Leubner   osti_memset(buffer, 0, buffLen);
2864e1bc9a0SAchim Leubner   lenRecv = 0;
2874e1bc9a0SAchim Leubner 
2884e1bc9a0SAchim Leubner   /* defaults are overwritten in the following */
2894e1bc9a0SAchim Leubner   /* Get MaxTargets */
2904e1bc9a0SAchim Leubner   if ((ostiGetTransportParam(
2914e1bc9a0SAchim Leubner                              tiRoot,
2924e1bc9a0SAchim Leubner                              globalStr,
2934e1bc9a0SAchim Leubner                              iniParmsStr,
2944e1bc9a0SAchim Leubner                              agNULL,
2954e1bc9a0SAchim Leubner                              agNULL,
2964e1bc9a0SAchim Leubner                              agNULL,
2974e1bc9a0SAchim Leubner                              agNULL,
2984e1bc9a0SAchim Leubner                              "MaxTargets",
2994e1bc9a0SAchim Leubner                              buffer,
3004e1bc9a0SAchim Leubner                              buffLen,
3014e1bc9a0SAchim Leubner                              &lenRecv
3024e1bc9a0SAchim Leubner                              ) == tiSuccess) && (lenRecv != 0))
3034e1bc9a0SAchim Leubner   {
3044e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
3054e1bc9a0SAchim Leubner     {
3064e1bc9a0SAchim Leubner       OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 0);
3074e1bc9a0SAchim Leubner     }
3084e1bc9a0SAchim Leubner     else
3094e1bc9a0SAchim Leubner     {
3104e1bc9a0SAchim Leubner       OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 10);
3114e1bc9a0SAchim Leubner     }
3124e1bc9a0SAchim Leubner     TI_DBG2(("itdssGetOperatingOptionParams: MaxTargets  %d\n",  OperatingOption->MaxTargets ));
3134e1bc9a0SAchim Leubner   }
3144e1bc9a0SAchim Leubner 
3154e1bc9a0SAchim Leubner #ifdef REMOVED
3164e1bc9a0SAchim Leubner   /* get UsecsPerTick */
3174e1bc9a0SAchim Leubner   if ((ostiGetTransportParam(
3184e1bc9a0SAchim Leubner                              tiRoot,
3194e1bc9a0SAchim Leubner                              globalStr,
3204e1bc9a0SAchim Leubner                              iniParmsStr,
3214e1bc9a0SAchim Leubner                              agNULL,
3224e1bc9a0SAchim Leubner                              agNULL,
3234e1bc9a0SAchim Leubner                              agNULL,
3244e1bc9a0SAchim Leubner                              agNULL,
3254e1bc9a0SAchim Leubner                              "UsecsPerTick",
3264e1bc9a0SAchim Leubner                              buffer,
3274e1bc9a0SAchim Leubner                              buffLen,
3284e1bc9a0SAchim Leubner                              &lenRecv
3294e1bc9a0SAchim Leubner                              ) == tiSuccess) && (lenRecv != 0))
3304e1bc9a0SAchim Leubner   {
3314e1bc9a0SAchim Leubner     if (osti_strncmp(buffer, "0x", 2) == 0)
3324e1bc9a0SAchim Leubner     {
3334e1bc9a0SAchim Leubner       OperatingOption->UsecsPerTick = osti_strtoul (buffer, &pLastUsedChar, 0);
3344e1bc9a0SAchim Leubner     }
3354e1bc9a0SAchim Leubner     else
3364e1bc9a0SAchim Leubner     {
3374e1bc9a0SAchim Leubner       OperatingOption->UsecsPerTick = osti_strtoul (buffer, &pLastUsedChar, 10);
3384e1bc9a0SAchim Leubner     }
3394e1bc9a0SAchim Leubner   }
3404e1bc9a0SAchim Leubner   osti_memset(buffer, 0, buffLen);
3414e1bc9a0SAchim Leubner   lenRecv = 0;
3424e1bc9a0SAchim Leubner #endif
3434e1bc9a0SAchim Leubner 
3444e1bc9a0SAchim Leubner   return;
3454e1bc9a0SAchim Leubner }
3464e1bc9a0SAchim Leubner 
3474e1bc9a0SAchim Leubner 
3484e1bc9a0SAchim Leubner /*****************************************************************************
3494e1bc9a0SAchim Leubner *! \brief  itdssInit
3504e1bc9a0SAchim Leubner *
3514e1bc9a0SAchim Leubner *  Purpose: This function is called to initialize the initiator specific
3524e1bc9a0SAchim Leubner *           Transport Dependent Layer.
3534e1bc9a0SAchim Leubner *           This function is not directly called by OS Specific module,
3544e1bc9a0SAchim Leubner *           as it is internally called by tiCOMInit().
3554e1bc9a0SAchim Leubner *
3564e1bc9a0SAchim Leubner *  /param tiRoot:            Pointer to driver/port instance.
3574e1bc9a0SAchim Leubner *  /param initiatorResource: Pointer to initiator functionality memory
3584e1bc9a0SAchim Leubner *                            and option requirement.
3594e1bc9a0SAchim Leubner *  /param tdSharedMem:       Pointer to cached memory required by the
3604e1bc9a0SAchim Leubner *                            target/initiator shared functionality.
3614e1bc9a0SAchim Leubner *
3624e1bc9a0SAchim Leubner *  /return:
3634e1bc9a0SAchim Leubner *   tiSuccess   OK
3644e1bc9a0SAchim Leubner *   others      not OK
3654e1bc9a0SAchim Leubner *
3664e1bc9a0SAchim Leubner *  /note -
3674e1bc9a0SAchim Leubner *
3684e1bc9a0SAchim Leubner *****************************************************************************/
3694e1bc9a0SAchim Leubner osGLOBAL bit32
itdssInit(tiRoot_t * tiRoot,tiInitiatorResource_t * initiatorResource,tiTdSharedMem_t * tdSharedMem)3704e1bc9a0SAchim Leubner itdssInit(
3714e1bc9a0SAchim Leubner           tiRoot_t              *tiRoot,
3724e1bc9a0SAchim Leubner           tiInitiatorResource_t *initiatorResource,
3734e1bc9a0SAchim Leubner           tiTdSharedMem_t       *tdSharedMem
3744e1bc9a0SAchim Leubner           )
3754e1bc9a0SAchim Leubner {
3764e1bc9a0SAchim Leubner   tiInitiatorMem_t          *iniMem;
3774e1bc9a0SAchim Leubner   itdsaIni_t                *Initiator;
3784e1bc9a0SAchim Leubner   itdssOperatingOption_t    *OperatingOption;
3794e1bc9a0SAchim Leubner   tdsaRoot_t                *tdsaRoot;
3804e1bc9a0SAchim Leubner 
3814e1bc9a0SAchim Leubner   TI_DBG6(("itdssInit: start\n"));
3824e1bc9a0SAchim Leubner   iniMem = &initiatorResource->initiatorMem;
3834e1bc9a0SAchim Leubner   tdsaRoot = (tdsaRoot_t *)tiRoot->tdData;
3844e1bc9a0SAchim Leubner   /*
3854e1bc9a0SAchim Leubner    * Cached mem for initiator Transport Dependent Layer main functionality
3864e1bc9a0SAchim Leubner    */
3874e1bc9a0SAchim Leubner   Initiator = iniMem->tdCachedMem[0].virtPtr;
3884e1bc9a0SAchim Leubner 
3894e1bc9a0SAchim Leubner   /*
3904e1bc9a0SAchim Leubner    * Get default parameters from the OS Specific area
3914e1bc9a0SAchim Leubner    */
3924e1bc9a0SAchim Leubner   OperatingOption = &Initiator->OperatingOption;
3934e1bc9a0SAchim Leubner 
3944e1bc9a0SAchim Leubner   /*
3954e1bc9a0SAchim Leubner    * Get default parameters from the OS Specific area
3964e1bc9a0SAchim Leubner    * and reads parameters from the configuration file
3974e1bc9a0SAchim Leubner    */
3984e1bc9a0SAchim Leubner 
3994e1bc9a0SAchim Leubner   itdssGetOperatingOptionParams(tiRoot, OperatingOption);
4004e1bc9a0SAchim Leubner   /*
4014e1bc9a0SAchim Leubner    * Update TD operating options with OS-layer-saved value
4024e1bc9a0SAchim Leubner    * Only UsecsPerTick is updated
4034e1bc9a0SAchim Leubner    */
4044e1bc9a0SAchim Leubner   OperatingOption->UsecsPerTick =
4054e1bc9a0SAchim Leubner     initiatorResource->initiatorOption.usecsPerTick;
4064e1bc9a0SAchim Leubner 
4074e1bc9a0SAchim Leubner   Initiator->NumIOsActive             = 0;
4084e1bc9a0SAchim Leubner 
4094e1bc9a0SAchim Leubner   /*
4104e1bc9a0SAchim Leubner    *  tdCachedMem[0]: cached mem for initiator TD Layer main functionality :
4114e1bc9a0SAchim Leubner    *                   itdssIni_t
4124e1bc9a0SAchim Leubner    *  tdCachedMem[1-5]: not in use
4134e1bc9a0SAchim Leubner   */
4144e1bc9a0SAchim Leubner 
4154e1bc9a0SAchim Leubner   /* initialize the timerlist */
4164e1bc9a0SAchim Leubner   itdssInitTimers(tiRoot);
4174e1bc9a0SAchim Leubner 
4184e1bc9a0SAchim Leubner 
4194e1bc9a0SAchim Leubner   /* Initialize the tdsaAllShared, tdssSASShared pointers */
4204e1bc9a0SAchim Leubner 
4214e1bc9a0SAchim Leubner   Initiator->tdsaAllShared = &(tdsaRoot->tdsaAllShared);
4224e1bc9a0SAchim Leubner 
4234e1bc9a0SAchim Leubner   TI_DBG6(("itdssInit: end\n"));
4244e1bc9a0SAchim Leubner   return (tiSuccess);
4254e1bc9a0SAchim Leubner 
4264e1bc9a0SAchim Leubner }
4274e1bc9a0SAchim Leubner 
4284e1bc9a0SAchim Leubner /*****************************************************************************
4294e1bc9a0SAchim Leubner *! \brief
4304e1bc9a0SAchim Leubner *  itdssInitTimers
4314e1bc9a0SAchim Leubner *
4324e1bc9a0SAchim Leubner *  Purpose: This function is called to initialize the timers
4334e1bc9a0SAchim Leubner *           for initiator
4344e1bc9a0SAchim Leubner *
4354e1bc9a0SAchim Leubner *  \param   tiRoot: pointer to the driver instance
4364e1bc9a0SAchim Leubner *
4374e1bc9a0SAchim Leubner *  \return: None
4384e1bc9a0SAchim Leubner *
4394e1bc9a0SAchim Leubner *  \note -
4404e1bc9a0SAchim Leubner *
4414e1bc9a0SAchim Leubner *****************************************************************************/
4424e1bc9a0SAchim Leubner osGLOBAL void
itdssInitTimers(tiRoot_t * tiRoot)4434e1bc9a0SAchim Leubner itdssInitTimers(
4444e1bc9a0SAchim Leubner                 tiRoot_t *tiRoot
4454e1bc9a0SAchim Leubner                 )
4464e1bc9a0SAchim Leubner {
4474e1bc9a0SAchim Leubner   tdsaRoot_t     *tdsaRoot = (tdsaRoot_t *)(tiRoot->tdData);
4484e1bc9a0SAchim Leubner   tdsaContext_t  *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
4494e1bc9a0SAchim Leubner   itdsaIni_t     *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
4504e1bc9a0SAchim Leubner 
4514e1bc9a0SAchim Leubner   /* initialize the timerlist */
4524e1bc9a0SAchim Leubner   TDLIST_INIT_HDR(&(Initiator->timerlist));
4534e1bc9a0SAchim Leubner 
4544e1bc9a0SAchim Leubner   return;
4554e1bc9a0SAchim Leubner }
456