#include <sys/cdefs.h>
#include <dev/pms/config.h>
#include <dev/pms/freebsd/driver/common/osenv.h>
#include <dev/pms/freebsd/driver/common/ostypes.h>
#include <dev/pms/freebsd/driver/common/osdebug.h>
#include <dev/pms/RefTisa/sallsdk/api/sa.h>
#include <dev/pms/RefTisa/sallsdk/api/saapi.h>
#include <dev/pms/RefTisa/sallsdk/api/saosapi.h>
#include <dev/pms/RefTisa/tisa/api/titypes.h>
#include <dev/pms/RefTisa/tisa/api/ostiapi.h>
#include <dev/pms/RefTisa/tisa/api/tiapi.h>
#include <dev/pms/RefTisa/tisa/api/tiglobal.h>
#ifdef FDS_SM
#include <dev/pms/RefTisa/sat/api/sm.h>
#include <dev/pms/RefTisa/sat/api/smapi.h>
#include <dev/pms/RefTisa/sat/api/tdsmapi.h>
#endif
#ifdef FDS_DM
#include <dev/pms/RefTisa/discovery/api/dm.h>
#include <dev/pms/RefTisa/discovery/api/dmapi.h>
#include <dev/pms/RefTisa/discovery/api/tddmapi.h>
#endif
#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h>
#include <dev/pms/freebsd/driver/common/osstring.h>
#include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h>
#ifdef INITIATOR_DRIVER
#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h>
#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h>
#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h>
#endif
#ifdef TARGET_DRIVER
#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h>
#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h>
#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h>
#endif
#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h>
#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h>
osGLOBAL void
itdssGetResource(
tiRoot_t * tiRoot,
tiInitiatorResource_t * initiatorResource
)
{
itdssOperatingOption_t OperatingOption;
tiInitiatorMem_t *iniMem;
bit32 i;
iniMem = &initiatorResource->initiatorMem;
iniMem->count = 1;
TI_DBG6(("itdssGetResource: start\n"));
itdssGetOperatingOptionParams(tiRoot, &OperatingOption);
iniMem->tdCachedMem[0].singleElementLength = sizeof(itdsaIni_t);
iniMem->tdCachedMem[0].numElements = 1;
iniMem->tdCachedMem[0].totalLength =
iniMem->tdCachedMem[0].singleElementLength *
iniMem->tdCachedMem[0].numElements;
iniMem->tdCachedMem[0].alignment = sizeof (void *);
iniMem->tdCachedMem[0].type = TI_CACHED_MEM;
iniMem->tdCachedMem[0].reserved = 0;
iniMem->tdCachedMem[0].virtPtr = agNULL;
iniMem->tdCachedMem[0].osHandle = agNULL;
iniMem->tdCachedMem[0].physAddrUpper = 0;
iniMem->tdCachedMem[0].physAddrLower = 0;
for (i = iniMem->count; i < 6; i++)
{
iniMem->tdCachedMem[i].singleElementLength = 0;
iniMem->tdCachedMem[i].numElements = 0;
iniMem->tdCachedMem[i].totalLength = 0;
iniMem->tdCachedMem[i].alignment = 0;
iniMem->tdCachedMem[i].type = TI_CACHED_MEM;
iniMem->tdCachedMem[i].reserved = 0;
iniMem->tdCachedMem[i].virtPtr = agNULL;
iniMem->tdCachedMem[i].osHandle = agNULL;
iniMem->tdCachedMem[i].physAddrUpper = 0;
iniMem->tdCachedMem[i].physAddrLower = 0;
}
initiatorResource->initiatorOption.usecsPerTick = OperatingOption.UsecsPerTick;
initiatorResource->initiatorOption.pageSize = 0;
initiatorResource->initiatorOption.dynamicDmaMem.numElements = 0;
initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength = 0;
initiatorResource->initiatorOption.dynamicDmaMem.totalLength = 0;
initiatorResource->initiatorOption.dynamicDmaMem.alignment = 0;
initiatorResource->initiatorOption.dynamicCachedMem.numElements = 0;
initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = 0;
initiatorResource->initiatorOption.dynamicCachedMem.totalLength = 0;
initiatorResource->initiatorOption.dynamicCachedMem.alignment = 0;
#ifdef CCBUILD_EncryptionDriver
initiatorResource->initiatorOption.dynamicDmaMem.numElements = 128 + DEK_MAX_TABLE_ENTRIES / 2;
#else
initiatorResource->initiatorOption.dynamicDmaMem.numElements = 128;
#endif
initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength = 512;
initiatorResource->initiatorOption.dynamicDmaMem.totalLength =
initiatorResource->initiatorOption.dynamicDmaMem.numElements *
initiatorResource->initiatorOption.dynamicDmaMem.singleElementLength;
initiatorResource->initiatorOption.dynamicDmaMem.alignment = sizeof(void *);
initiatorResource->initiatorOption.dynamicCachedMem.numElements = 1024 + 256;
initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength = 512;
initiatorResource->initiatorOption.dynamicCachedMem.totalLength =
initiatorResource->initiatorOption.dynamicCachedMem.numElements *
initiatorResource->initiatorOption.dynamicCachedMem.singleElementLength;
initiatorResource->initiatorOption.dynamicCachedMem.alignment = sizeof(void *);
initiatorResource->initiatorOption.ioRequestBodySize = sizeof(tdIORequestBody_t);
TI_DBG6(("itdssGetResource: sizeof(tdssSMPRequestBody_t) %d\n", (int)sizeof(tdssSMPRequestBody_t)));
TI_DBG6(("itdssGetResource: end\n"));
return;
}
osGLOBAL void
itdssGetOperatingOptionParams(
tiRoot_t *tiRoot,
itdssOperatingOption_t *OperatingOption
)
{
char *key = agNULL;
char *subkey1 = agNULL;
char *subkey2 = agNULL;
char *buffer;
bit32 buffLen;
bit32 lenRecv = 0;
char *pLastUsedChar = agNULL;
char tmpBuffer[DEFAULT_KEY_BUFFER_SIZE];
char globalStr[] = "Global";
char iniParmsStr[] = "InitiatorParms";
TI_DBG6(("itdssGetOperatingOptionParams: start\n"));
pLastUsedChar = pLastUsedChar;
lenRecv = lenRecv;
subkey2 = subkey2;
subkey1 = subkey1;
key = key;
buffer = &tmpBuffer[0];
buffLen = sizeof (tmpBuffer);
osti_memset(buffer, 0, buffLen);
OperatingOption->MaxTargets = DEFAULT_MAX_DEV;
OperatingOption->UsecsPerTick = DEFAULT_INI_TIMER_TICK;
osti_memset(buffer, 0, buffLen);
lenRecv = 0;
if ((ostiGetTransportParam(
tiRoot,
globalStr,
iniParmsStr,
agNULL,
agNULL,
agNULL,
agNULL,
"MaxTargets",
buffer,
buffLen,
&lenRecv
) == tiSuccess) && (lenRecv != 0))
{
if (osti_strncmp(buffer, "0x", 2) == 0)
{
OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 0);
}
else
{
OperatingOption->MaxTargets = osti_strtoul (buffer, &pLastUsedChar, 10);
}
TI_DBG2(("itdssGetOperatingOptionParams: MaxTargets %d\n", OperatingOption->MaxTargets ));
}
#ifdef REMOVED
if ((ostiGetTransportParam(
tiRoot,
globalStr,
iniParmsStr,
agNULL,
agNULL,
agNULL,
agNULL,
"UsecsPerTick",
buffer,
buffLen,
&lenRecv
) == tiSuccess) && (lenRecv != 0))
{
if (osti_strncmp(buffer, "0x", 2) == 0)
{
OperatingOption->UsecsPerTick = osti_strtoul (buffer, &pLastUsedChar, 0);
}
else
{
OperatingOption->UsecsPerTick = osti_strtoul (buffer, &pLastUsedChar, 10);
}
}
osti_memset(buffer, 0, buffLen);
lenRecv = 0;
#endif
return;
}
osGLOBAL bit32
itdssInit(
tiRoot_t *tiRoot,
tiInitiatorResource_t *initiatorResource,
tiTdSharedMem_t *tdSharedMem
)
{
tiInitiatorMem_t *iniMem;
itdsaIni_t *Initiator;
itdssOperatingOption_t *OperatingOption;
tdsaRoot_t *tdsaRoot;
TI_DBG6(("itdssInit: start\n"));
iniMem = &initiatorResource->initiatorMem;
tdsaRoot = (tdsaRoot_t *)tiRoot->tdData;
Initiator = iniMem->tdCachedMem[0].virtPtr;
OperatingOption = &Initiator->OperatingOption;
itdssGetOperatingOptionParams(tiRoot, OperatingOption);
OperatingOption->UsecsPerTick =
initiatorResource->initiatorOption.usecsPerTick;
Initiator->NumIOsActive = 0;
itdssInitTimers(tiRoot);
Initiator->tdsaAllShared = &(tdsaRoot->tdsaAllShared);
TI_DBG6(("itdssInit: end\n"));
return (tiSuccess);
}
osGLOBAL void
itdssInitTimers(
tiRoot_t *tiRoot
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *)(tiRoot->tdData);
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
TDLIST_INIT_HDR(&(Initiator->timerlist));
return;
}