#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>
#ifdef INITIATOR_DRIVER
osGLOBAL bit32
tiINIIOAbort(
tiRoot_t *tiRoot,
tiIORequest_t *taskTag
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
agsaRoot_t *agRoot = agNULL;
tdIORequestBody_t *tdIORequestBody = agNULL;
agsaIORequest_t *agIORequest = agNULL;
bit32 sasStatus = AGSA_RC_FAILURE;
tdsaDeviceData_t *oneDeviceData;
bit32 status= tiError;
agsaIORequest_t *agAbortIORequest;
tdIORequestBody_t *tdAbortIORequestBody;
bit32 PhysUpper32;
bit32 PhysLower32;
bit32 memAllocStatus;
void *osMemHandle;
agsaDevHandle_t *agDevHandle = agNULL;
#ifdef FDS_SM
smRoot_t *smRoot;
tdIORequestBody_t *ToBeAbortedtdIORequestBody;
smIORequest_t *ToBeAborted = agNULL;
#endif
TI_DBG2(("tiINIIOAbort: start\n"));
if(taskTag == agNULL)
{
TI_DBG1(("tiINIIOAbort: taskTag is NULL\n"));
return tiError;
}
agRoot = &(tdsaAllShared->agRootNonInt);
tdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
agIORequest = &(tdIORequestBody->agIORequest);
oneDeviceData = tdIORequestBody->tiDevHandle->tdData;
if(oneDeviceData == agNULL)
{
TI_DBG1(("tiINIIOAbort: DeviceData is NULL\n"));
return tiSuccess;
}
agDevHandle = oneDeviceData->agDevHandle;
TI_DBG2(("tiINIIOAbort: did %d\n", oneDeviceData->id));
if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
oneDeviceData->tdPortContext == agNULL )
{
TI_DBG1(("tiINIIOAbort: NO Device did %d\n", oneDeviceData->id ));
TI_DBG1(("tiINIIOAbort: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG1(("tiINIIOAbort: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
return tiError;
}
memAllocStatus = ostiAllocMemory(
tiRoot,
&osMemHandle,
(void **)&tdAbortIORequestBody,
&PhysUpper32,
&PhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (memAllocStatus != tiSuccess)
{
TI_DBG1(("tiINIIOAbort: ostiAllocMemory failed...\n"));
return tiError;
}
if (tdAbortIORequestBody == agNULL)
{
TI_DBG1(("tiINIIOAbort: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
return tiError;
}
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
tdAbortIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
agAbortIORequest->osData = (void *) tdAbortIORequestBody;
agAbortIORequest->sdkData = agNULL;
tdAbortIORequestBody->tiIOToBeAbortedRequest = taskTag;
if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
{
sasStatus = saSSPAbort(agRoot,
agAbortIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
agDevHandle,
0,
agIORequest,
agNULL);
if (sasStatus == AGSA_RC_SUCCESS)
{
return tiSuccess;
}
else
{
return tiError;
}
}
else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
{
TI_DBG2(("tiINIIOAbort: calling satIOAbort() oneDeviceData=%p\n", oneDeviceData));
#ifdef FDS_SM
smRoot = &(tdsaAllShared->smRoot);
if ( taskTag != agNULL)
{
ToBeAbortedtdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
ToBeAborted = &(ToBeAbortedtdIORequestBody->smIORequest);
status = smIOAbort(smRoot, ToBeAborted);
return status;
}
else
{
TI_DBG1(("tiINIIOAbort: taskTag is NULL!!!\n"));
return tiError;
}
#else
#ifdef SATA_ENABLE
status = satIOAbort(tiRoot, taskTag );
#endif
return status;
#endif
}
else
{
return tiError;
}
}
osGLOBAL bit32
tiINIIOAbortAll(
tiRoot_t *tiRoot,
tiDeviceHandle_t *tiDeviceHandle
)
{
agsaRoot_t *agRoot = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
bit32 status = tiError;
#ifdef FDS_SM
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
smRoot_t *smRoot = &(tdsaAllShared->smRoot);
smDeviceHandle_t *smDeviceHandle;
#endif
TI_DBG1(("tiINIIOAbortAll: start\n"));
if (tiDeviceHandle == agNULL)
{
TI_DBG1(("tiINIIOAbortAll: tiDeviceHandle is NULL!!!\n"));
return tiError;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("tiINIIOAbortAll: oneDeviceData is NULL!!!\n"));
return tiError;
}
if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
oneDeviceData->tdPortContext == agNULL )
{
TI_DBG1(("tiINIIOAbortAll: NO Device did %d\n", oneDeviceData->id ));
TI_DBG1(("tiINIIOAbortAll: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG1(("tiINIIOAbortAll: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
return tiError;
}
agRoot = oneDeviceData->agRoot;
if (agRoot == agNULL)
{
TI_DBG1(("tiINIIOAbortAll: agRoot is NULL!!!\n"));
return tiError;
}
if (oneDeviceData->OSAbortAll == agTRUE)
{
TI_DBG1(("tiINIIOAbortAll: already pending!!!\n"));
return tiBusy;
}
else
{
oneDeviceData->OSAbortAll = agTRUE;
}
#ifdef FDS_SM
if ( DEVICE_IS_SSP_TARGET(oneDeviceData) || DEVICE_IS_SMP_TARGET(oneDeviceData))
{
status = tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
}
else if (DEVICE_IS_SATA_DEVICE(oneDeviceData) ||
DEVICE_IS_STP_TARGET(oneDeviceData)
)
{
TI_DBG2(("tiINIIOAbortAll: calling smIOAbortAll\n"));
smDeviceHandle = (smDeviceHandle_t *)&(oneDeviceData->smDeviceHandle);
smDeviceHandle->tdData = oneDeviceData;
status = smIOAbortAll(smRoot, smDeviceHandle);
}
else
{
TI_DBG1(("tiINIIOAbortAll: unknow device type!!! 0x%x\n", oneDeviceData->target_ssp_stp_smp));
status = AGSA_RC_FAILURE;
}
#else
status = tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
#endif
return status;
}
#endif
osGLOBAL bit32
tdsaAbortAll(
tiRoot_t *tiRoot,
agsaRoot_t *agRoot,
tdsaDeviceData_t *oneDeviceData
)
{
agsaIORequest_t *agAbortIORequest = agNULL;
tdIORequestBody_t *tdAbortIORequestBody = agNULL;
bit32 PhysUpper32;
bit32 PhysLower32;
bit32 memAllocStatus;
void *osMemHandle;
bit32 status = AGSA_RC_FAILURE;
TI_DBG1(("tdsaAbortAll: did %d\n", oneDeviceData->id));
memAllocStatus = ostiAllocMemory(
tiRoot,
&osMemHandle,
(void **)&tdAbortIORequestBody,
&PhysUpper32,
&PhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (memAllocStatus != tiSuccess)
{
TI_DBG1(("tdsaAbortAll: ostiAllocMemory failed...\n"));
return tiError;
}
if (tdAbortIORequestBody == agNULL)
{
TI_DBG1(("tdsaAbortAll: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
return tiError;
}
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
tdAbortIORequestBody->IOCompletionFunc = agNULL;
tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(oneDeviceData->tiDeviceHandle);
agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
agAbortIORequest->osData = (void *) tdAbortIORequestBody;
agAbortIORequest->sdkData = agNULL;
if ( DEVICE_IS_SSP_TARGET(oneDeviceData))
{
status = saSSPAbort(agRoot,
agAbortIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
oneDeviceData->agDevHandle,
1,
agNULL,
agNULL
);
}
else if (DEVICE_IS_SATA_DEVICE(oneDeviceData) ||
DEVICE_IS_STP_TARGET(oneDeviceData)
)
{
if (oneDeviceData->satDevData.IDDeviceValid == agFALSE)
{
TI_DBG2(("tdsaAbortAll: saSATAAbort\n"));
status = saSATAAbort(agRoot,
agAbortIORequest,
0,
oneDeviceData->agDevHandle,
1,
agNULL,
agNULL
);
}
else
{
TI_DBG2(("tdsaAbortAll: saSATAAbort IDDeviceValid\n"));
status = saSATAAbort(agRoot,
agAbortIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
oneDeviceData->agDevHandle,
1,
agNULL,
agNULL
);
}
}
else if (DEVICE_IS_SMP_TARGET(oneDeviceData))
{
TI_DBG2(("tdsaAbortAll: saSMPAbort \n"));
status = saSMPAbort(agRoot,
agAbortIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
oneDeviceData->agDevHandle,
1,
agNULL,
agNULL
);
}
else
{
TI_DBG1(("tdsaAbortAll: unknown device type!!! 0x%x\n", oneDeviceData->target_ssp_stp_smp));
status = AGSA_RC_FAILURE;
}
if (status == AGSA_RC_SUCCESS)
{
return tiSuccess;
}
else
{
TI_DBG1(("tdsaAbortAll: failed status=%d\n", status));
ostiFreeMemory(
tiRoot,
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return tiError;
}
}
osGLOBAL void
tiCOMReset(
tiRoot_t *tiRoot,
bit32 option
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
agsaRoot_t *agRoot = agNULL;
#ifdef TI_GETFOR_ONRESET
agsaControllerStatus_t controllerStatus;
agsaForensicData_t forensicData;
bit32 once = 1;
bit32 status;
#endif
TI_DBG1(("tiCOMReset: start option 0x%x\n",option));
tdsaAllShared->resetCount++;
TI_DBG2(("tiCOMReset: reset count %d\n", tdsaAllShared->resetCount));
agRoot = &(tdsaAllShared->agRootNonInt);
if (tdsaAllShared->flags.resetInProgress == agTRUE)
{
TI_DBG1(("tiCOMReset : Reset is already in progress : \n"));
return;
}
tdsaAllShared->flags.resetInProgress = agTRUE;
#ifdef TI_GETFOR_ONRESET
saGetControllerStatus(agRoot, &controllerStatus);
if(controllerStatus.fatalErrorInfo.errorInfo1)
{
bit8 * DirectData = (bit8 * )tdsaAllShared->FatalErrorData;
forensicData.DataType = TYPE_FATAL;
forensicData.dataBuf.directLen = (8 * 1024);
forensicData.dataBuf.directOffset = 0;
forensicData.dataBuf.readLen = 0;
getmoreData:
forensicData.dataBuf.directData = DirectData;
status = saGetForensicData( agRoot, agNULL, &forensicData);
TI_DBG1(("tiCOMReset:status %d readLen 0x%x directLen 0x%x directOffset 0x%x\n",
status,
forensicData.dataBuf.readLen,
forensicData.dataBuf.directLen,
forensicData.dataBuf.directOffset));
if( forensicData.dataBuf.readLen == forensicData.dataBuf.directLen && !status && once)
{
DirectData += forensicData.dataBuf.readLen;
goto getmoreData;
}
TI_DBG1(("tiCOMReset:saGetForensicData type %d read 0x%x bytes\n", forensicData.DataType, forensicData.dataBuf.directOffset ));
}
#endif
if (option == tiSoftReset)
{
TI_DBG6(("tiCOMReset: soft reset\n"));
saHwReset(agRoot, AGSA_SOFT_RESET, 0);
return;
}
else
{
saHwReset(agRoot, AGSA_SOFT_RESET, 0);
#ifdef NOT_YET
saHwReset(agRoot, AGSA_CHIP_RESET, 0);
#endif
}
return;
}
#ifdef INITIATOR_DRIVER
osGLOBAL bit32
tiINIReportErrorToEventLog(
tiRoot_t *tiRoot,
tiEVTData_t *agEventData
)
{
TI_DBG6(("tiINIReportErrorToEventLog: start\n"));
return tiError;
}
#endif
#ifndef ossaReenableInterrupts
osGLOBAL void
ossaReenableInterrupts(
agsaRoot_t *agRoot,
bit32 outboundChannelNum
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
ostiInterruptEnable(
osData->tiRoot,
outboundChannelNum
);
return;
}
#endif
#ifdef INITIATOR_DRIVER
osGLOBAL bit32
tiINITaskManagement (
tiRoot_t *tiRoot,
tiDeviceHandle_t *tiDeviceHandle,
bit32 task,
tiLUN_t *lun,
tiIORequest_t *taskTag,
tiIORequest_t *currentTaskTag
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
agsaRoot_t *agRoot = agNULL;
bit32 tiStatus = tiError;
bit32 notImplemented = agFALSE;
tdsaDeviceData_t *oneDeviceData = agNULL;
void *osMemHandle;
tdIORequestBody_t *TMtdIORequestBody;
bit32 PhysUpper32;
bit32 PhysLower32;
bit32 memAllocStatus;
bit32 agRequestType;
agsaIORequest_t *agIORequest = agNULL;
agsaIORequest_t *agTMRequest = agNULL;
agsaDevHandle_t *agDevHandle = agNULL;
agsaSASRequestBody_t *agSASRequestBody = agNULL;
agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest;
bit32 saStatus;
tdIORequestBody_t *tdIORequestBody;
#ifdef FDS_SM
smRoot_t *smRoot;
smDeviceHandle_t *smDeviceHandle;
smIORequest_t *ToBeAborted = agNULL;
smIORequest_t *TaskManagement;
tdIORequestBody_t *ToBeAbortedtdIORequestBody;
tdIORequestBody_t *SMTMtdIORequestBody;
void *SMosMemHandle;
bit32 SMPhysUpper32;
bit32 SMPhysLower32;
bit32 SMmemAllocStatus;
#endif
TI_DBG2(("tiINITaskManagement: start\n"));
#ifdef REMOVED
if(tiDeviceHandle == agNULL)
{
TI_DBG1(("tiINITaskManagement: tiDeviceHandle is NULL\n"));
return tiError;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if(oneDeviceData == agNULL)
{
TI_DBG1(("tiINITaskManagement: tiDeviceHandle=%p DeviceData is NULL\n", tiDeviceHandle));
return tiError;
}
TI_DBG1(("tiINITaskManagement: did %d\n", oneDeviceData->id ));
return tiError;
if (task == AG_LOGICAL_UNIT_RESET)
{
TI_DBG1(("tiINITaskManagement: failing LUN RESET for testing\n"));
return tiError;
}
#endif
switch(task)
{
case AG_ABORT_TASK:
TI_DBG6(("tiINITaskManagement: ABORT_TASK\n"));
break;
case AG_ABORT_TASK_SET:
TI_DBG6(("tiINITaskManagement: ABORT_TASK_SET\n"));
break;
case AG_CLEAR_ACA:
TI_DBG6(("tiINITaskManagement: CLEAR_ACA\n"));
break;
case AG_CLEAR_TASK_SET:
TI_DBG6(("tiINITaskManagement: CLEAR_TASK_SET\n"));
break;
case AG_LOGICAL_UNIT_RESET:
TI_DBG6(("tiINITaskManagement: LOGICAL_UNIT_RESET\n"));
break;
case AG_TARGET_WARM_RESET:
TI_DBG6(("tiINITaskManagement: TARGET_WARM_RESET\n"));
break;
case AG_QUERY_TASK:
TI_DBG6(("tiINITaskManagement: QUERY_TASK\n"));
break;
default:
TI_DBG1(("tiINITaskManagement: notImplemented 0x%0x !!!\n",task));
notImplemented = agTRUE;
break;
}
if (notImplemented)
{
TI_DBG1(("tiINITaskManagement: not implemented 0x%0x !!!\n",task));
return tiStatus;
}
if(tiDeviceHandle == agNULL)
{
TI_DBG1(("tiINITaskManagement: tiDeviceHandle is NULL\n"));
return tiError;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if(oneDeviceData == agNULL)
{
TI_DBG1(("tiINITaskManagement: tiDeviceHandle=%p DeviceData is NULL\n", tiDeviceHandle));
return tiIONoDevice;
}
if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
oneDeviceData->tdPortContext == agNULL )
{
TI_DBG1(("tiINITaskManagement: NO Device did %d Addr 0x%08x:0x%08x\n", oneDeviceData->id , oneDeviceData->SASAddressID.sasAddressHi, oneDeviceData->SASAddressID.sasAddressLo));
return tiIONoDevice;
}
if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
{
agRoot = oneDeviceData->agRoot;
agDevHandle = oneDeviceData->agDevHandle;
TI_DBG1(("tiINITaskManagement: SAS Device\n"));
if (task == AG_TARGET_WARM_RESET)
{
agsaContext_t *agContext;
tdsaDeviceData_t *tdsaDeviceData;
tdsaDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
currentTaskTag->tdData = tdsaDeviceData;
agContext = &(tdsaDeviceData->agDeviceResetContext);
agContext->osData = currentTaskTag;
TI_DBG2(("tiINITaskManagement: did %d device reset for SAS\n", oneDeviceData->id));
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_IN_RECOVERY);
if (oneDeviceData->directlyAttached == agTRUE)
{
TI_DBG2(("tiINITaskManagement: device reset directly attached\n"));
saLocalPhyControl(agRoot,
agContext,
tdsaRotateQnumber(tiRoot, oneDeviceData),
oneDeviceData->phyID,
AGSA_PHY_HARD_RESET,
agNULL
);
return tiSuccess;
}
else
{
TI_DBG2(("tiINITaskManagement: device reset expander attached\n"));
saStatus = tdsaPhyControlSend(tiRoot,
oneDeviceData,
SMP_PHY_CONTROL_HARD_RESET,
currentTaskTag,
tdsaRotateQnumber(tiRoot, oneDeviceData)
);
return saStatus;
}
}
else
{
TI_DBG6(("tiINITaskManagement: making task management frame \n"));
memAllocStatus = ostiAllocMemory(
tiRoot,
&osMemHandle,
(void **)&TMtdIORequestBody,
&PhysUpper32,
&PhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (memAllocStatus != tiSuccess)
{
TI_DBG1(("tiINITaskManagement: ostiAllocMemory failed...\n"));
return tiError;
}
if (TMtdIORequestBody == agNULL)
{
TI_DBG1(("tiINITaskManagement: ostiAllocMemory returned NULL TMIORequestBody\n"));
return tiError;
}
osti_memset(TMtdIORequestBody, 0, sizeof(tdIORequestBody_t));
TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
TMtdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = currentTaskTag;
TMtdIORequestBody->IOType.InitiatorTMIO.TaskTag = taskTag;
TMtdIORequestBody->IOCompletionFunc = itdssTaskCompleted;
TMtdIORequestBody->tiDevHandle = tiDeviceHandle;
TMtdIORequestBody->tiIORequest = currentTaskTag;
currentTaskTag->tdData = TMtdIORequestBody;
agIORequest = &(TMtdIORequestBody->agIORequest);
agIORequest->osData = (void *) TMtdIORequestBody;
agIORequest->sdkData = agNULL;
agRequestType = AGSA_SSP_TASK_MGNT_REQ;
TMtdIORequestBody->agRequestType = AGSA_SSP_TASK_MGNT_REQ;
agSASRequestBody = &(TMtdIORequestBody->transport.SAS.agSASRequestBody);
agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
TI_DBG2(("tiINITaskManagement: did %d LUN reset for SAS\n", oneDeviceData->id));
if (lun == agNULL)
{
osti_memset(agSSPTaskMgntRequest->lun, 0, 8);
}
else
{
osti_memcpy(agSSPTaskMgntRequest->lun, lun->lun, 8);
}
agSSPTaskMgntRequest->tmOption = 2;
switch(task)
{
case AG_ABORT_TASK:
agSSPTaskMgntRequest->taskMgntFunction = AGSA_ABORT_TASK;
agSSPTaskMgntRequest->tmOption = 3;
break;
case AG_ABORT_TASK_SET:
agSSPTaskMgntRequest->taskMgntFunction = AGSA_ABORT_TASK_SET;
break;
case AG_CLEAR_ACA:
agSSPTaskMgntRequest->taskMgntFunction = AGSA_CLEAR_ACA;
break;
case AG_CLEAR_TASK_SET:
agSSPTaskMgntRequest->taskMgntFunction = AGSA_CLEAR_TASK_SET;
break;
case AG_LOGICAL_UNIT_RESET:
agSSPTaskMgntRequest->taskMgntFunction = AGSA_LOGICAL_UNIT_RESET;
break;
case AG_QUERY_TASK:
agSSPTaskMgntRequest->taskMgntFunction = AGSA_QUERY_TASK;
break;
default:
TI_DBG1(("tiINITaskManagement: notImplemented task\n"));
break;
}
if (task == AGSA_ABORT_TASK || task == AGSA_QUERY_TASK)
{
tdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
if (tdIORequestBody == agNULL)
{
TI_DBG1(("tiINITaskManagement: IO has been completed\n"));
ostiFreeMemory(
tiRoot,
osMemHandle,
sizeof(tdIORequestBody_t)
);
return tiIONoDevice;
}
else
{
agTMRequest = &(tdIORequestBody->agIORequest);
}
}
else
{
agSSPTaskMgntRequest->tagOfTaskToBeManaged = 0;
agTMRequest = agNULL;
}
TDLIST_INIT_HDR(&TMtdIORequestBody->EsglPageList);
if (TMtdIORequestBody->IOCompletionFunc == agNULL)
{
TI_DBG1(("tiINITaskManagement: Error!!!!! IOCompletionFunc is NULL\n"));
}
saStatus = saSSPStart(agRoot,
agIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
agDevHandle,
agRequestType,
agSASRequestBody,
agTMRequest,
&ossaSSPCompleted);
if (saStatus == AGSA_RC_SUCCESS)
{
Initiator->NumIOsActive++;
tiStatus = tiSuccess;
}
else
{
TI_DBG1(("tiINITaskManagement: saSSPStart failed 0x%x\n",saStatus));
ostiFreeMemory(
tiRoot,
TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
if (saStatus == AGSA_RC_FAILURE)
{
tiStatus = tiError;
}
else
{
tiStatus = tiBusy;
}
}
}
}
#ifdef FDS_SM
else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
{
agsaContext_t *agContext = agNULL;
agContext = &(oneDeviceData->agDeviceResetContext);
agContext->osData = currentTaskTag;
#ifdef REMOVED
if (oneDeviceData->directlyAttached == agTRUE &&
(task == AG_LOGICAL_UNIT_RESET || task == AG_TARGET_WARM_RESET))
{
agRoot = oneDeviceData->agRoot;
agDevHandle = oneDeviceData->agDevHandle;
currentTaskTag->tdData = oneDeviceData;
if (task == AG_LOGICAL_UNIT_RESET)
{
if ( (lun->lun[0] | lun->lun[1] | lun->lun[2] | lun->lun[3] |
lun->lun[4] | lun->lun[5] | lun->lun[6] | lun->lun[7] ) != 0 )
{
TI_DBG1(("tiINITaskManagement: *** REJECT *** LUN not zero, tiDeviceHandle=%p\n",
tiDeviceHandle));
return tiError;
}
}
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_IN_RECOVERY);
tiStatus = saLocalPhyControl(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
}
else
#endif
{
smRoot = &(tdsaAllShared->smRoot);
smDeviceHandle = &(oneDeviceData->smDeviceHandle);
TI_DBG1(("tiINITaskManagement: FDS_SM SATA Device\n"));
if ( taskTag != agNULL)
{
ToBeAbortedtdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
ToBeAborted = &(ToBeAbortedtdIORequestBody->smIORequest);
}
SMmemAllocStatus = ostiAllocMemory(
tiRoot,
&SMosMemHandle,
(void **)&SMTMtdIORequestBody,
&SMPhysUpper32,
&SMPhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (SMmemAllocStatus != tiSuccess)
{
TI_DBG1(("tiINITaskManagement: ostiAllocMemory failed... loc 2\n"));
return tiError;
}
if (SMTMtdIORequestBody == agNULL)
{
TI_DBG1(("tiINITaskManagement: ostiAllocMemory returned NULL TMIORequestBody loc 2\n"));
return tiError;
}
osti_memset(SMTMtdIORequestBody, 0, sizeof(tdIORequestBody_t));
SMTMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle = SMosMemHandle;
SMTMtdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = currentTaskTag;
SMTMtdIORequestBody->IOType.InitiatorTMIO.TaskTag = taskTag;
SMTMtdIORequestBody->tiDevHandle = tiDeviceHandle;
SMTMtdIORequestBody->tiIORequest = currentTaskTag;
currentTaskTag->tdData = SMTMtdIORequestBody;
TaskManagement = &(SMTMtdIORequestBody->smIORequest);
TaskManagement->tdData = SMTMtdIORequestBody;
TaskManagement->smData = &SMTMtdIORequestBody->smIORequestBody;
tiStatus = smTaskManagement(smRoot,
smDeviceHandle,
task,
(smLUN_t*)lun,
ToBeAborted,
TaskManagement
);
if (tiStatus != SM_RC_SUCCESS)
{
TI_DBG1(("tiINITaskManagement: smTaskManagement failed... loc 2\n"));
ostiFreeMemory(
tiRoot,
SMTMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
}
}
}
#else
else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
{
agRoot = oneDeviceData->agRoot;
agDevHandle = oneDeviceData->agDevHandle;
TI_DBG1(("tiINITaskManagement: not FDS_SM SATA Device\n"));
if (task == AG_LOGICAL_UNIT_RESET || task == AG_TARGET_WARM_RESET)
{
agsaContext_t *agContext;
satDeviceData_t *satDevData;
tdsaDeviceData_t *tdsaDeviceData;
TI_DBG2(("tiINITaskManagement: did %d LUN reset or device reset for SATA\n", oneDeviceData->id));
tdsaDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
satDevData = &tdsaDeviceData->satDevData;
currentTaskTag->tdData = tdsaDeviceData;
agContext = &(tdsaDeviceData->agDeviceResetContext);
agContext->osData = currentTaskTag;
if (task == AG_LOGICAL_UNIT_RESET)
{
if ( (lun->lun[0] | lun->lun[1] | lun->lun[2] | lun->lun[3] |
lun->lun[4] | lun->lun[5] | lun->lun[6] | lun->lun[7] ) != 0 )
{
TI_DBG1(("tiINITaskManagement: *** REJECT *** LUN not zero, tiDeviceHandle=%p\n",
tiDeviceHandle));
return tiError;
}
if (satDevData->satTmTaskTag != agNULL)
{
TI_DBG1(("tiINITaskManagement: *** REJECT *** other TM pending, tiDeviceHandle=%p\n",
tiDeviceHandle));
return tiError;
}
}
satDevData->satDriveState = SAT_DEV_STATE_IN_RECOVERY;
satDevData->satAbortAfterReset = agFALSE;
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_IN_RECOVERY);
if (oneDeviceData->directlyAttached == agTRUE)
{
TI_DBG1(("tiINITaskManagement: LUN reset or device reset directly attached\n"));
saLocalPhyControl(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
return tiSuccess;
}
else
{
TI_DBG1(("tiINITaskManagement: LUN reset or device reset expander attached\n"));
saStatus = tdsaPhyControlSend(tiRoot,
oneDeviceData,
SMP_PHY_CONTROL_HARD_RESET,
currentTaskTag,
tdsaRotateQnumber(tiRoot, oneDeviceData)
);
return saStatus;
}
}
else
{
TI_DBG2(("tiINITaskManagement: calling satTM().\n"));
memAllocStatus = ostiAllocMemory(
tiRoot,
&osMemHandle,
(void **)&TMtdIORequestBody,
&PhysUpper32,
&PhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (memAllocStatus != tiSuccess)
{
TI_DBG1(("tiINITaskManagement: ostiAllocMemory failed... loc 2\n"));
return tiError;
}
if (TMtdIORequestBody == agNULL)
{
TI_DBG1(("tiINITaskManagement: ostiAllocMemory returned NULL TMIORequestBody loc 2\n"));
return tiError;
}
osti_memset(TMtdIORequestBody, 0, sizeof(tdIORequestBody_t));
TMtdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
TMtdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = currentTaskTag;
TMtdIORequestBody->IOType.InitiatorTMIO.TaskTag = taskTag;
TMtdIORequestBody->tiDevHandle = tiDeviceHandle;
TMtdIORequestBody->tiIORequest = currentTaskTag;
currentTaskTag->tdData = TMtdIORequestBody;
agIORequest = &(TMtdIORequestBody->agIORequest);
agIORequest->osData = (void *) TMtdIORequestBody;
agIORequest->sdkData = agNULL;
#ifdef SATA_ENABLE
tiStatus = satTM( tiRoot,
tiDeviceHandle,
task,
lun,
taskTag,
currentTaskTag,
TMtdIORequestBody,
agTRUE
);
#endif
}
}
#endif
return tiStatus;
}
#endif
#ifdef PASSTHROUGH
osGLOBAL bit32
tiCOMPassthroughCmndStart(
tiRoot_t *tiRoot,
tiPassthroughRequest_t *tiPassthroughRequest,
tiDeviceHandle_t *tiDeviceHandle,
tiPassthroughCmnd_t *tiPassthroughCmnd,
void *tiPassthroughBody,
tiPortalContext_t *tiportalContext,
ostiPassthroughCmndEvent_t agEventCB
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
tdsaDeviceData_t *oneDeviceData;
agsaRoot_t *agRoot = agNULL;
agsaIORequest_t *agIORequest = agNULL;
agsaDevHandle_t *agDevHandle = agNULL;
bit32 agRequestType;
agsaSASRequestBody_t *agSASRequestBody = agNULL;
tdPassthroughCmndBody_t *tdPTCmndBody;
tdssSMPRequestBody_t *tdssSMPRequestBody;
agsaSMPFrame_t *agSMPFrame;
agsaSSPVSFrame_t *agSSPVendorFrame;
bit32 SMPFn, SMPFnResult, SMPFrameLen;
bit32 tiStatus = tiError;
bit32 saStatus = AGSA_RC_FAILURE;
tdsaPortStartInfo_t *tdsaPortStartInfo;
tdsaPortContext_t *tdsaPortContext;
TI_DBG2(("tiCOMPassthroughCmndStart: start\n"));
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
TI_DBG6(("tiCOMPassthroughCmndStart: onedevicedata %p\n", oneDeviceData));
tdPTCmndBody = (tdPassthroughCmndBody_t *)tiPassthroughBody;
if (tiPassthroughCmnd->passthroughCmnd != tiSMPCmnd ||
tiPassthroughCmnd->passthroughCmnd != tiRMCCmnd)
{
return tiNotSupported;
}
if (oneDeviceData == agNULL && tiPassthroughCmnd->passthroughCmnd != tiSMPCmnd)
{
TI_DBG1(("tiCOMPassthroughCmndStart: tiDeviceHandle=%p DeviceData is NULL\n", tiDeviceHandle ));
return tiIONoDevice;
}
if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
{
if (tiPassthroughCmnd->passthroughCmnd == tiSMPCmnd)
{
TI_DBG2(("tiCOMPassthroughCmndStart: SMP\n"));
if (oneDeviceData == agNULL)
{
tdsaPortStartInfo = (tdsaPortStartInfo_t *)tiportalContext->tdData;
tdsaPortContext = tdsaPortStartInfo->portContext;
agRoot = tdsaPortContext->agRoot;
}
else
{
agRoot = oneDeviceData->agRoot;
agDevHandle = oneDeviceData->agDevHandle;
}
tdssSMPRequestBody = &(tdPTCmndBody->protocol.SMP.SMPBody);
agSASRequestBody = &(tdssSMPRequestBody->agSASRequestBody);
agSMPFrame = &(agSASRequestBody->smpFrame);
tdPTCmndBody->EventCB = agEventCB;
tdPTCmndBody->tiPassthroughCmndType = tiSMPCmnd;
tdPTCmndBody->tiPassthroughRequest = tiPassthroughRequest;
tiPassthroughRequest->tdData = tdPTCmndBody;
tdPTCmndBody->tiDevHandle = tiDeviceHandle;
agSMPFrame->frameHeader.smpFrameType
= tiPassthroughCmnd->protocol.SMP.SMPHeader.smpFrameType;
agSMPFrame->frameHeader.smpFunction
= tiPassthroughCmnd->protocol.SMP.SMPHeader.smpFunction;
agSMPFrame->frameHeader.smpFunctionResult
= tiPassthroughCmnd->protocol.SMP.SMPHeader.smpFunctionResult;
agSMPFrame->frameHeader.smpReserved
= tiPassthroughCmnd->protocol.SMP.SMPHeader.smpReserved;
if (tiPassthroughCmnd->protocol.SMP.IT == SMP_INITIATOR)
{
agRequestType = AGSA_SMP_INIT_REQ;
}
else
{
agRequestType = AGSA_SMP_TGT_RESPONSE;
agSMPFrame->phyId = tiPassthroughCmnd->protocol.SMP.phyID;
}
agSMPFrame->frameAddrUpper32 = tiPassthroughCmnd->tiSgl.upper;
agSMPFrame->frameAddrLower32 = tiPassthroughCmnd->tiSgl.lower;
agSMPFrame->frameLen = tiPassthroughCmnd->tiSgl.len;
agIORequest = &(tdssSMPRequestBody->agIORequest);
agIORequest->osData = (void *) tdPTCmndBody;
agIORequest->sdkData = agNULL;
saStatus = saSMPStart(
agRoot,
agIORequest,
agDevHandle,
agRequestType,
agSASRequestBody,
&ossaSMPCompleted
);
if (saStatus == AGSA_RC_SUCCESS)
{
tiStatus = tiSuccess;
}
else if (saStatus == AGSA_RC_FAILURE)
{
TI_DBG1(("tiCOMPassthroughCmndStart: saSMPStart failed\n"));
tiStatus = tiError;
}
else
{
TI_DBG1(("tiCOMPassthroughCmndStart: saSMPStart busy\n"));
tiStatus = tiBusy;
}
return tiStatus;
#ifdef TO_DO
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
agSMPFrame->frameHeader.smpFrameType = SMP_REQUEST;
agRequestType = AGSA_SMP_INIT_REQ;
}
else
{
agSMPFrame->frameHeader.smpFrameType = SMP_RESPONSE;
agRequestType = AGSA_SMP_TGT_RESPONSE;
switch (tdPTCmndBody->protocol.SMP.SMPFnResult)
{
case tiSMPFunctionAccepted:
SMPFnResult = SMP_FUNCTION_ACCEPTED;
break;
case tiUnknownSMPFunction:
SMPFnResult = UNKNOWN_SMP_FUNCTION;
break;
case tiSMPFunctionFailed:
SMPFnResult = SMP_FUNCTION_FAILED;
break;
case tiInvalidRequestFrameLength:
SMPFnResult = INVALID_REQUEST_FRAME_LENGTH;
break;
case tiPhyDoesNotExist:
SMPFnResult =PHY_DOES_NOT_EXIST;
break;
case tiIndexDoesNotExist:
SMPFnResult = INDEX_DOES_NOT_EXIST;
break;
case tiPhyDoesNotSupportSATA:
SMPFnResult = PHY_DOES_NOT_SUPPORT_SATA;
break;
case tiUnknownPhyOperation:
SMPFnResult = UNKNOWN_PHY_OPERATION;
break;
case tiUnknownPhyTestFunction:
SMPFnResult = UNKNOWN_PHY_TEST_FUNCTION;
break;
case tiPhyTestFunctionInProgress:
SMPFnResult = PHY_TEST_FUNCTION_IN_PROGRESS;
break;
case tiPhyVacant:
SMPFnResult = PHY_VACANT;
break;
default:
TI_DBG1(("tiCOMPassthroughCmndStart: unknown SMP function result %d\n", tdPTCmndBody->protocol.SMP.SMPFnResult));
return tiError;
}
agSMPFrame->frameHeader.smpFunctionResult = SMPFnResult;
}
switch (tdPTCmndBody->protocol.SMP.SMPFn)
{
case tiGeneral:
SMPFn = SMP_REPORT_GENERAL;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = 0;
}
else
{
SMPFrameLen = sizeof(smpRespReportGeneral_t);
}
break;
case tiManufacturerInfo:
SMPFn = SMP_REPORT_MANUFACTURE_INFORMATION;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = 0;
}
else
{
SMPFrameLen = sizeof(smpRespReportManufactureInfo_t);
}
break;
case tiDiscover:
SMPFn = SMP_DISCOVER;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = sizeof(smpReqDiscover_t);
}
else
{
SMPFrameLen = sizeof(smpRespDiscover_t);
}
break;
case tiReportPhyErrLog:
SMPFn = SMP_REPORT_PHY_ERROR_LOG;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = 8;
}
else
{
SMPFrameLen = 24;
}
break;
case tiReportPhySATA:
SMPFn = SMP_REPORT_PHY_SATA;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = sizeof(SmpReqReportPhySata_t);
}
else
{
SMPFrameLen = sizeof(SmpRespReportPhySata_t);
}
break;
case tiReportRteInfo:
SMPFn = SMP_REPORT_ROUTING_INFORMATION;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = sizeof(SmpReqReportRouteTable_t);
}
else
{
SMPFrameLen = sizeof(SmpRespReportRouteTable_t);
}
break;
case tiConfigureRteInfo:
SMPFn = SMP_CONFIGURE_ROUTING_INFORMATION;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = sizeof(SmpReqConfigureRouteInformation_t);
}
else
{
SMPFrameLen = 0;
}
break;
case tiPhyCtrl:
SMPFn = SMP_PHY_CONTROL;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = sizeof(SmpReqPhyControl_t);
}
else
{
SMPFrameLen = 0;
}
break;
case tiPhyTestFn:
SMPFn = SMP_PHY_TEST_FUNCTION;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = 36;
}
else
{
SMPFrameLen = 0;
}
break;
case tiPMC:
SMPFn = SMP_PMC_SPECIFIC;
if (tdPTCmndBody->protocol.SMP.IT == SMP_INITIATOR)
{
SMPFrameLen = 0;
}
else
{
SMPFrameLen = 0;
}
break;
default:
TI_DBG1(("tiCOMPassthroughCmndStart: unknown SMP function %d\n", tdPTCmndBody->protocol.SMP.SMPFn));
return tiError;
}
agSMPFrame->frameHeader.smpFunction = SMPFn;
agSMPFrame->frameAddrUpper32 = tdPTCmndBody->tiSgl.upper;
agSMPFrame->frameAddrLower32 = tdPTCmndBody->tiSgl.lower;
agSMPFrame->frameLen = SMPFrameLen;
#endif
}
else if (tiPassthroughCmnd->passthroughCmnd == tiRMCCmnd)
{
TI_DBG2(("tiCOMPassthroughCmndStart: RMC\n"));
}
else
{
TI_DBG1(("tiCOMPassthroughCmndStart: unknown protocol %d\n", tiPassthroughCmnd->passthroughCmnd));
}
}
else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
{
TI_DBG1(("tiCOMPassthroughCmndStart: error !!! no SATA support\n"));
return tiError;
}
else
{
TI_DBG1(("tiCOMPassthroughCmndStart: error !!! unknown devietype %d\n", oneDeviceData->DeviceType));
return tiError;
}
return tiSuccess;
}
osGLOBAL bit32
tiCOMPassthroughCmndAbort(
tiRoot_t *tiRoot,
tiPassthroughRequest_t *taskTag
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
agsaRoot_t *agRoot = agNULL;
tdPassthroughCmndBody_t *tdPTCmndBody = agNULL;
tdssSMPRequestBody_t *tdssSMPRequestBody = agNULL;
agsaIORequest_t *agIORequest = agNULL;
bit32 saStatus, tiStatus = tiError;
TI_DBG2(("tiCOMPassthroughCmndAbort: start\n"));
agRoot = &(tdsaAllShared->agRootNonInt);
tdPTCmndBody = (tdPassthroughCmndBody_t *)taskTag->tdData;
if (tdPTCmndBody->tiPassthroughCmndType == tiSMPCmnd)
{
tdssSMPRequestBody = &(tdPTCmndBody->protocol.SMP.SMPBody);
agIORequest = &(tdssSMPRequestBody->agIORequest);
saStatus = saSMPAbort(agRoot, agIORequest);
if (saStatus == AGSA_RC_SUCCESS)
{
tiStatus = tiSuccess;
}
else if (saStatus == AGSA_RC_FAILURE)
{
TI_DBG1(("tiCOMPassthroughCmndAbort: saSMPAbort failed\n"));
tiStatus = tiError;
}
else
{
TI_DBG1(("tiCOMPassthroughCmndAbort: saSMPAbort busy\n"));
tiStatus = tiBusy;
}
return tiStatus;
}
else if (tdPTCmndBody->tiPassthroughCmndType == tiRMCCmnd)
{
TI_DBG1(("tiCOMPassthroughCmndAbort: RMC passthrough command type, not yet\n"));
}
else
{
TI_DBG1(("tiCOMPassthroughCmndAbort: unknown passthrough command type %d\n", tdPTCmndBody->tiPassthroughCmndType));
return tiStatus;
}
}
osGLOBAL bit32
tiINIPassthroughCmndRemoteAbort(
tiRoot_t *tiRoot,
tiDeviceHandle_t *tiDeviceHandle,
tiPassthroughRequest_t *taskTag,
tiPassthroughRequest_t *currentTaskTag,
tiPortalContext_t *tiportalContext
)
{
TI_DBG2(("tiINIPassthroughCmndRemoteAbort: start\n"));
return tiSuccess;
}
#endif
osGLOBAL void
tiCOMShutDown( tiRoot_t *tiRoot)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
#ifdef TI_GETFOR_ONSHUTDOWN
agsaForensicData_t forensicData;
bit32 once = 1;
bit32 status;
#endif
agsaRoot_t *agRoot = agNULL;
TI_DBG1(("tiCOMShutDown: start\n"));
agRoot = &(tdsaAllShared->agRootNonInt);
tdsaFreeCardID(tiRoot, tdsaAllShared->CardID);
#ifdef TI_GETFOR_ONSHUTDOWN
forensicData.DataType = TYPE_NON_FATAL;
forensicData.dataBuf.directLen = (8 * 1024);
forensicData.dataBuf.directOffset = 0;
forensicData.dataBuf.directData = agNULL;
forensicData.dataBuf.readLen = 0;
getmoreData:
status = saGetForensicData( agRoot, agNULL, &forensicData);
TI_DBG1(("tiCOMShutDown:readLen 0x%x directLen 0x%x directOffset 0x%x\n",
forensicData.dataBuf.readLen,
forensicData.dataBuf.directLen,
forensicData.dataBuf.directOffset));
if( forensicData.dataBuf.readLen == forensicData.dataBuf.directLen && !status && once)
{
goto getmoreData;
}
TI_DBG1(("tiCOMShutDown:saGetForensicData type %d read 0x%x bytes\n", forensicData.DataType, forensicData.dataBuf.directOffset ));
#endif
saHwShutdown(agRoot);
tdsaResetComMemFlags(tiRoot);
ostiPortEvent (
tiRoot,
tiPortShutdown,
tiSuccess,
agNULL
);
return;
}
#ifdef INITIATOR_DRIVER
osGLOBAL void
tiINITimerTick( tiRoot_t *tiRoot )
{
return;
}
#endif
#ifndef ossaDisableInterrupts
osGLOBAL void
ossaDisableInterrupts(
agsaRoot_t *agRoot,
bit32 outboundChannelNum
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *) (agRoot->osData);
ostiInterruptDisable(
osData->tiRoot,
outboundChannelNum
);
return;
}
#endif
osGLOBAL void
tiCOMFrameReadBlock(
tiRoot_t *tiRoot,
void *agFrame,
bit32 FrameOffset,
void *FrameBuffer,
bit32 FrameBufLen )
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
agsaRoot_t *agRoot = agNULL;
TI_DBG6(("tiCOMFrameReadBlock: start\n"));
agRoot = &(tdsaAllShared->agRootNonInt);
TI_DBG6(("tiCOMFrameReadBlock: start\n"));
saFrameReadBlock(agRoot, agFrame, FrameOffset, FrameBuffer, FrameBufLen);
return;
}
#ifdef INITIATOR_DRIVER
osGLOBAL void
tiINITransportRecovery (
tiRoot_t *tiRoot,
tiDeviceHandle_t *tiDeviceHandle
)
{
agsaRoot_t *agRoot = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
tdsaPortContext_t *onePortContext = agNULL;
tiPortalContext_t *tiPortalContext = agNULL;
tiIORequest_t *currentTaskTag;
agsaDevHandle_t *agDevHandle = agNULL;
TI_DBG1(("tiINITransportRecovery: start\n"));
if (tiDeviceHandle == agNULL)
{
TI_DBG1(("tiINITransportRecovery: tiDeviceHandle is NULL\n"));
return;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("tiINITransportRecovery: oneDeviceData is NULL\n"));
return;
}
if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
oneDeviceData->tdPortContext == agNULL )
{
TI_DBG1(("tiINITransportRecovery: NO Device did %d\n", oneDeviceData->id ));
TI_DBG1(("tiINITransportRecovery: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG1(("tiINITransportRecovery: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
return;
}
onePortContext = oneDeviceData->tdPortContext;
if (onePortContext == agNULL)
{
TI_DBG1(("tiINITransportRecovery: onePortContext is NULL\n"));
return;
}
tiPortalContext = onePortContext->tiPortalContext;
currentTaskTag = &(oneDeviceData->TransportRecoveryIO);
currentTaskTag->osData = agNULL;
agRoot = oneDeviceData->agRoot;
agDevHandle = oneDeviceData->agDevHandle;
if (oneDeviceData->DeviceType == TD_SAS_DEVICE)
{
agsaContext_t *agContext;
currentTaskTag->tdData = oneDeviceData;
agContext = &(oneDeviceData->agDeviceResetContext);
agContext->osData = currentTaskTag;
oneDeviceData->TRflag = agTRUE;
TI_DBG2(("tiINITransportRecovery: SAS device\n"));
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_IN_RECOVERY);
if (oneDeviceData->directlyAttached == agTRUE)
{
TI_DBG2(("tiINITransportRecovery: saLocalPhyControl\n"));
saLocalPhyControl(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), oneDeviceData->phyID, AGSA_PHY_HARD_RESET, agNULL);
ostiInitiatorEvent(tiRoot,
tiPortalContext,
tiDeviceHandle,
tiIntrEventTypeTransportRecovery,
tiRecStarted,
agNULL
);
return;
}
else
{
TI_DBG2(("tiINITransportRecovery: device reset expander attached\n"));
tdsaPhyControlSend(tiRoot,
oneDeviceData,
SMP_PHY_CONTROL_HARD_RESET,
currentTaskTag,
tdsaRotateQnumber(tiRoot, oneDeviceData)
);
ostiInitiatorEvent(tiRoot,
tiPortalContext,
tiDeviceHandle,
tiIntrEventTypeTransportRecovery,
tiRecStarted,
agNULL
);
return;
}
}
else if (oneDeviceData->DeviceType == TD_SATA_DEVICE)
{
agsaContext_t *agContext;
currentTaskTag->tdData = oneDeviceData;
agContext = &(oneDeviceData->agDeviceResetContext);
agContext->osData = currentTaskTag;
oneDeviceData->TRflag = agTRUE;
TI_DBG2(("tiINITransportRecovery: SATA device\n"));
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_IN_RECOVERY);
if (oneDeviceData->directlyAttached == agTRUE)
{
TI_DBG2(("tiINITransportRecovery: saLocalPhyControl\n"));
saLocalPhyControl(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), oneDeviceData->phyID, AGSA_PHY_LINK_RESET, agNULL);
ostiInitiatorEvent(tiRoot,
tiPortalContext,
tiDeviceHandle,
tiIntrEventTypeTransportRecovery,
tiRecStarted,
agNULL
);
return;
}
else
{
TI_DBG2(("tiINITransportRecovery: device reset expander attached\n"));
tdsaPhyControlSend(tiRoot,
oneDeviceData,
SMP_PHY_CONTROL_LINK_RESET,
currentTaskTag,
tdsaRotateQnumber(tiRoot, oneDeviceData)
);
ostiInitiatorEvent(tiRoot,
tiPortalContext,
tiDeviceHandle,
tiIntrEventTypeTransportRecovery,
tiRecStarted,
agNULL
);
return;
}
}
else
{
TI_DBG1(("tiINITransportRecovery: wrong device type %d\n", oneDeviceData->DeviceType));
}
return;
}
#endif
#if defined (INITIATOR_DRIVER) && defined (TARGET_DRIVER)
osGLOBAL bit32
tdsaPhyControlSend(
tiRoot_t *tiRoot,
tdsaDeviceData_t *oneDeviceData,
bit8 phyOp,
tiIORequest_t *CurrentTaskTag,
bit32 queueNumber
)
{
return 0;
}
#endif
#ifdef TARGET_DRIVER
osGLOBAL bit32
tdsaPhyControlSend(
tiRoot_t *tiRoot,
tdsaDeviceData_t *oneDeviceData,
bit8 phyOp,
tiIORequest_t *CurrentTaskTag,
bit32 queueNumber
)
{
return 0;
}
#endif
#ifdef INITIATOR_DRIVER
osGLOBAL bit32
tdsaPhyControlSend(
tiRoot_t *tiRoot,
tdsaDeviceData_t *oneDeviceData,
bit8 phyOp,
tiIORequest_t *CurrentTaskTag,
bit32 queueNumber
)
{
agsaRoot_t *agRoot;
tdsaDeviceData_t *oneExpDeviceData;
tdsaPortContext_t *onePortContext;
smpReqPhyControl_t smpPhyControlReq;
bit8 phyID;
bit32 status;
TI_DBG3(("tdsaPhyControlSend: start\n"));
agRoot = oneDeviceData->agRoot;
onePortContext = oneDeviceData->tdPortContext;
oneExpDeviceData = oneDeviceData->ExpDevice;
phyID = oneDeviceData->phyID;
if (oneDeviceData->directlyAttached == agTRUE)
{
TI_DBG1(("tdsaPhyControlSend: Error!!! deivce is directly attached\n"));
return AGSA_RC_FAILURE;
}
if (onePortContext == agNULL)
{
TI_DBG1(("tdsaPhyControlSend: Error!!! portcontext is NULL\n"));
return AGSA_RC_FAILURE;
}
if (oneExpDeviceData == agNULL)
{
TI_DBG1(("tdsaPhyControlSend: Error!!! expander is NULL\n"));
return AGSA_RC_FAILURE;
}
if (phyOp == SMP_PHY_CONTROL_HARD_RESET)
{
TI_DBG3(("tdsaPhyControlSend: SMP_PHY_CONTROL_HARD_RESET\n"));
}
if (phyOp == SMP_PHY_CONTROL_LINK_RESET)
{
TI_DBG3(("tdsaPhyControlSend: SMP_PHY_CONTROL_LINK_RESET\n"));
}
if (phyOp == SMP_PHY_CONTROL_CLEAR_AFFILIATION)
{
TI_DBG3(("tdsaPhyControlSend: SMP_PHY_CONTROL_CLEAR_AFFILIATION\n"));
}
TI_DBG3(("tdsaPhyControlSend: target device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG3(("tdsaPhyControlSend: target device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
TI_DBG3(("tdsaPhyControlSend: expander AddrHi 0x%08x\n", oneExpDeviceData->SASAddressID.sasAddressHi));
TI_DBG3(("tdsaPhyControlSend: expander AddrLo 0x%08x\n", oneExpDeviceData->SASAddressID.sasAddressLo));
TI_DBG3(("tdsaPhyControlSend: did %d expander did %d phyid %d\n", oneDeviceData->id, oneExpDeviceData->id, phyID));
osti_memset(&smpPhyControlReq, 0, sizeof(smpReqPhyControl_t));
smpPhyControlReq.phyIdentifier = phyID;
smpPhyControlReq.phyOperation = phyOp;
status = tdSMPStart(
tiRoot,
agRoot,
oneExpDeviceData,
SMP_PHY_CONTROL,
(bit8 *)&smpPhyControlReq,
sizeof(smpReqPhyControl_t),
AGSA_SMP_INIT_REQ,
CurrentTaskTag,
queueNumber
);
return status;
}
#endif
osGLOBAL void
tdsaPhyControlFailureRespRcvd(
tiRoot_t *tiRoot,
agsaRoot_t *agRoot,
tdsaDeviceData_t *oneDeviceData,
tdssSMPFrameHeader_t *frameHeader,
agsaFrameHandle_t frameHandle,
tiIORequest_t *CurrentTaskTag
)
{
#if defined(INITIATOR_DRIVER) || defined(TD_DEBUG_ENABLE)
tdsaDeviceData_t *TargetDeviceData = agNULL;
#endif
#ifdef TD_DEBUG_ENABLE
satDeviceData_t *pSatDevData = agNULL;
#endif
TI_DBG1(("tdsaPhyControlFailureRespRcvd: start\n"));
TI_DBG3(("tdsaPhyControlFailureRespRcvd: expander device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG3(("tdsaPhyControlFailureRespRcvd: expander device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
if (CurrentTaskTag != agNULL )
{
#if defined(INITIATOR_DRIVER) || defined(TD_DEBUG_ENABLE)
TargetDeviceData = (tdsaDeviceData_t *)CurrentTaskTag->tdData;
#endif
#ifdef TD_DEBUG_ENABLE
pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
#endif
TI_DBG2(("tdsaPhyControlFailureRespRcvd: target AddrHi 0x%08x\n", TargetDeviceData->SASAddressID.sasAddressHi));
TI_DBG2(("tdsaPhyControlFailureRespRcvd: target AddrLo 0x%08x\n", TargetDeviceData->SASAddressID.sasAddressLo));
#ifdef TD_DEBUG_ENABLE
TI_DBG2(("tdsaPhyControlFailureRespRcvd: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
TI_DBG2(("tdsaPhyControlFailureRespRcvd: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
#endif
}
#ifdef INITIATOR_DRIVER
if (CurrentTaskTag != agNULL )
{
TI_DBG1(("tdsaPhyControlRespRcvd: callback to OS layer with failure\n"));
if (TargetDeviceData->TRflag == agTRUE)
{
TargetDeviceData->TRflag = agFALSE;
ostiInitiatorEvent(tiRoot,
TargetDeviceData->tdPortContext->tiPortalContext,
&(TargetDeviceData->tiDeviceHandle),
tiIntrEventTypeTransportRecovery,
tiRecFailed ,
agNULL
);
}
else
{
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
CurrentTaskTag );
}
}
#endif
return;
}
osGLOBAL void
tdsaPhyControlRespRcvd(
tiRoot_t *tiRoot,
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
tdsaDeviceData_t *oneDeviceData,
tdssSMPFrameHeader_t *frameHeader,
agsaFrameHandle_t frameHandle,
tiIORequest_t *CurrentTaskTag
)
{
#if defined(INITIATOR_DRIVER) || defined(TD_DEBUG_ENABLE)
tdsaDeviceData_t *TargetDeviceData = agNULL;
#endif
#ifdef INITIATOR_DRIVER
satDeviceData_t *pSatDevData = agNULL;
agsaDevHandle_t *agDevHandle = agNULL;
#endif
TI_DBG3(("tdsaPhyControlRespRcvd: start\n"));
TI_DBG3(("tdsaPhyControlRespRcvd: expander device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG3(("tdsaPhyControlRespRcvd: expander device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
if (CurrentTaskTag != agNULL )
{
#if defined(INITIATOR_DRIVER) || defined(TD_DEBUG_ENABLE)
TargetDeviceData = (tdsaDeviceData_t *)CurrentTaskTag->tdData;
#endif
#ifdef INITIATOR_DRIVER
pSatDevData = (satDeviceData_t *)&(TargetDeviceData->satDevData);
agDevHandle = TargetDeviceData->agDevHandle;
#endif
TI_DBG2(("tdsaPhyControlRespRcvd: target AddrHi 0x%08x\n", TargetDeviceData->SASAddressID.sasAddressHi));
TI_DBG2(("tdsaPhyControlRespRcvd: target AddrLo 0x%08x\n", TargetDeviceData->SASAddressID.sasAddressLo));
#ifdef INITIATOR_DRIVER
TI_DBG2(("tdsaPhyControlRespRcvd: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO ));
TI_DBG2(("tdsaPhyControlRespRcvd: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO));
#endif
}
#ifdef INITIATOR_DRIVER
if (frameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
{
TI_DBG3(("tdsaPhyControlRespRcvd: SMP success\n"));
if (CurrentTaskTag != agNULL )
{
TI_DBG3(("tdsaPhyControlRespRcvd: callback to OS layer with success\n"));
pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL;
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, TargetDeviceData), agDevHandle, SA_DS_OPERATIONAL);
if (TargetDeviceData->TRflag == agTRUE)
{
TargetDeviceData->TRflag = agFALSE;
ostiInitiatorEvent(tiRoot,
TargetDeviceData->tdPortContext->tiPortalContext,
&(TargetDeviceData->tiDeviceHandle),
tiIntrEventTypeTransportRecovery,
tiRecOK,
agNULL
);
}
else
{
agDevHandle = TargetDeviceData->agDevHandle;
if (agDevHandle == agNULL)
{
TI_DBG1(("tdsaPhyControlRespRcvd: wrong, agDevHandle is NULL\n"));
}
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMOK,
CurrentTaskTag );
}
}
}
else
{
TI_DBG1(("tdsaPhyControlRespRcvd: SMP failure; result %d\n", frameHeader->smpFunctionResult));
if (CurrentTaskTag != agNULL )
{
TI_DBG1(("tdsaPhyControlRespRcvd: callback to OS layer with failure\n"));
if (TargetDeviceData->TRflag == agTRUE)
{
TargetDeviceData->TRflag = agFALSE;
ostiInitiatorEvent(tiRoot,
TargetDeviceData->tdPortContext->tiPortalContext,
&(TargetDeviceData->tiDeviceHandle),
tiIntrEventTypeTransportRecovery,
tiRecFailed ,
agNULL
);
}
else
{
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
CurrentTaskTag );
}
}
}
#endif
return;
}
#ifdef TARGET_DRIVER
osGLOBAL void
ttdsaAbortAll(
tiRoot_t *tiRoot,
agsaRoot_t *agRoot,
tdsaDeviceData_t *oneDeviceData
)
{
agsaIORequest_t *agAbortIORequest = agNULL;
tdIORequestBody_t *tdAbortIORequestBody = agNULL;
bit32 PhysUpper32;
bit32 PhysLower32;
bit32 memAllocStatus;
void *osMemHandle;
TI_DBG3(("tdsaAbortAll: start\n"));
TI_DBG3(("tdsaAbortAll: did %d\n", oneDeviceData->id));
memAllocStatus = ostiAllocMemory(
tiRoot,
&osMemHandle,
(void **)&tdAbortIORequestBody,
&PhysUpper32,
&PhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (memAllocStatus != tiSuccess)
{
TI_DBG1(("tdsaAbortAll: ostiAllocMemory failed...\n"));
return;
}
if (tdAbortIORequestBody == agNULL)
{
TI_DBG1(("tdsaAbortAll: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
return;
}
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
tdAbortIORequestBody->IOCompletionFunc = ttdssIOAbortedHandler;
tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(oneDeviceData->tiDeviceHandle);
agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
agAbortIORequest->osData = (void *) tdAbortIORequestBody;
agAbortIORequest->sdkData = agNULL;
saSSPAbort(agRoot,
agAbortIORequest,
0,
oneDeviceData->agDevHandle,
1,
agNULL,
agNULL
);
return;
}
#endif
osGLOBAL void
tdsaDeregisterDevicesInPort(
tiRoot_t *tiRoot,
tdsaPortContext_t *onePortContext
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
tdsaDeviceData_t *oneDeviceData = agNULL;
tdList_t *DeviceListList;
agsaRoot_t *agRoot = agNULL;
agRoot = &(tdsaAllShared->agRootNonInt);
TI_DBG1(("tdsaDeregisterDevicesInPort: start\n"));
DeviceListList = tdsaAllShared->MainDeviceList.flink;
while (DeviceListList != &(tdsaAllShared->MainDeviceList))
{
oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
if (oneDeviceData == agNULL)
{
TI_DBG1(("tdsaDeregisterDevicesInPort: oneDeviceData is NULL!!!\n"));
return;
}
if (oneDeviceData->tdPortContext == onePortContext)
{
TI_DBG3(("tdsaDeregisterDevicesInPort: Found pid %d did %d\n", onePortContext->id, oneDeviceData->id));
if ( !( DEVICE_IS_SMP_TARGET(oneDeviceData) && oneDeviceData->directlyAttached == agTRUE))
{
saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData));
}
else
{
TI_DBG1(("tdsaDeregisterDevicesInPort: keeping\n"));
oneDeviceData->registered = agTRUE;
}
}
DeviceListList = DeviceListList->flink;
}
TI_DBG3(("tdsaDeregisterDevicesInPort: end\n"));
return;
}
osGLOBAL void
tdsaPrintSwConfig(
agsaSwConfig_t *SwConfig
)
{
if (SwConfig == agNULL)
{
TI_DBG6(("tdsaPrintSwConfig: SwConfig is NULL\n"));
return;
}
else
{
TI_DBG6(("SwConfig->maxActiveIOs %d\n", SwConfig->maxActiveIOs));
TI_DBG6(("SwConfig->smpReqTimeout %d\n", SwConfig->smpReqTimeout));
}
return;
}
osGLOBAL void
tdsaPrintHwConfig(
agsaHwConfig_t *HwConfig
)
{
if (HwConfig == agNULL)
{
TI_DBG6(("tdsaPrintHwConfig: HwConfig is NULL\n"));
return;
}
else
{
TI_DBG6(("HwConfig->phyCount %d\n", HwConfig->phyCount));
}
return;
}
osGLOBAL void
tdssPrintSASIdentify(
agsaSASIdentify_t *id
)
{
if (id == agNULL)
{
TI_DBG1(("tdsaPrintSASIdentify: ID is NULL\n"));
return;
}
else
{
TI_DBG6(("SASID->sspTargetPort %d\n", SA_IDFRM_IS_SSP_TARGET(id)?1:0));
TI_DBG6(("SASID->stpTargetPort %d\n", SA_IDFRM_IS_STP_TARGET(id)?1:0));
TI_DBG6(("SASID->smpTargetPort %d\n", SA_IDFRM_IS_SMP_TARGET(id)?1:0));
TI_DBG6(("SASID->sspInitiatorPort %d\n", SA_IDFRM_IS_SSP_INITIATOR(id)?1:0));
TI_DBG6(("SASID->stpInitiatorPort %d\n", SA_IDFRM_IS_STP_INITIATOR(id)?1:0));
TI_DBG6(("SASID->smpInitiatorPort %d\n", SA_IDFRM_IS_SMP_INITIATOR(id)?1:0));
TI_DBG6(("SASID->deviceType %d\n", SA_IDFRM_GET_DEVICETTYPE(id)));
TI_DBG6(("SASID->sasAddressHi 0x%x\n", SA_IDFRM_GET_SAS_ADDRESSHI(id)));
TI_DBG6(("SASID->sasAddressLo 0x%x\n", SA_IDFRM_GET_SAS_ADDRESSLO(id)));
TI_DBG6(("SASID->phyIdentifier 0x%x\n", id->phyIdentifier));
}
return;
}
osGLOBAL void
tdsaInitTimerHandler(
tiRoot_t *tiRoot,
void *timerData
)
{
TI_DBG6(("tdsaInitTimerHandler: start\n"));
return;
}
osGLOBAL void
print_tdlist_flink(tdList_t *hdr, int type, int flag)
{
tdList_t *hdr_tmp1 = NULL;
#ifdef TD_DEBUG_ENABLE
tdsaPortContext_t *ele1;
#endif
#ifdef REMOVED
tdsaDeviceData_t *ele2;
#endif
hdr_tmp1 = hdr;
if (type == 1 && flag == 1)
{
TI_DBG6(("PortContext and FreeLink\n"));
}
else if (type != 1 && flag == 1)
{
TI_DBG6(("DeviceData and FreeLink\n"));
}
else if (type == 1 && flag != 1)
{
TI_DBG6(("PortContext and MainLink\n"));
}
else
{
TI_DBG6(("DeviceData and MainLink\n"));
}
if (type == 1)
{
do
{
if (flag == 1)
{
#ifdef TD_DEBUG_ENABLE
ele1 = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, hdr_tmp1);
#endif
}
else
{
#ifdef TD_DEBUG_ENABLE
ele1 = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, hdr_tmp1);
#endif
}
TI_DBG6(("flist ele %d\n", ele1->id));
TI_DBG6(("flist ele %p\n", ele1));
hdr_tmp1 = hdr_tmp1->flink;
} while (hdr_tmp1 != hdr);
}
else
{
do
{
#ifdef REMOVED
if (flag == 1)
{
ele2 = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, hdr_tmp1);
}
else
{
ele2 = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, hdr_tmp1);
}
TI_DBG6(("flist ele %d\n", ele2->id));
TI_DBG6(("flist ele %p\n", ele2));
#endif
hdr_tmp1 = hdr_tmp1->flink;
} while (hdr_tmp1 != hdr);
}
TI_DBG6(("\n"));
}
osGLOBAL void
print_tdlist_blink(tdList_t *hdr, int flag)
{
tdList_t *hdr_tmp1 = NULL;
#ifdef REMOVED
tdsaPortContext_t *ele1;
#endif
hdr_tmp1 = hdr;
do
{
#ifdef REMOVED
if (flag == 1)
{
ele1 = TDLIST_OBJECT_BASE(tdsaPortContext_t, FreeLink, hdr_tmp1);
}
else
{
ele1 = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, hdr_tmp1);
}
TI_DBG6(("blist ele %d\n", ele1->id));
#endif
hdr_tmp1 = hdr_tmp1->blink;
} while (hdr_tmp1 != hdr);
}
void tdhexdump(const char *ptitle, bit8 *pbuf, int len)
{
int i;
TI_DBG2(("%s - hexdump(len=%d):\n", ptitle, (int)len));
if (!pbuf)
{
TI_DBG1(("pbuf is NULL\n"));
return;
}
for (i = 0; i < len; )
{
if (len - i > 4)
{
TI_DBG2((" 0x%02x, 0x%02x, 0x%02x, 0x%02x,\n", pbuf[i], pbuf[i+1], pbuf[i+2], pbuf[i+3]));
i += 4;
}
else
{
TI_DBG2((" 0x%02x,", pbuf[i]));
i++;
}
}
TI_DBG2(("\n"));
}
void
tdsaSingleThreadedEnter(tiRoot_t *ptiRoot, bit32 queueId)
{
tdsaRoot_t * tiroot = agNULL;
bit32 offset = 0;
TD_ASSERT(ptiRoot,"ptiRoot");
tiroot = ptiRoot->tdData;
offset = tiroot->tdsaAllShared.MaxNumLLLocks + tiroot->tdsaAllShared.MaxNumOSLocks;
ostiSingleThreadedEnter(ptiRoot, queueId + offset);
}
void
tdsaSingleThreadedLeave(tiRoot_t *ptiRoot, bit32 queueId)
{
tdsaRoot_t * tiroot = agNULL;
bit32 offset = 0;
TD_ASSERT(ptiRoot,"ptiRoot");
tiroot = ptiRoot->tdData;
offset = tiroot->tdsaAllShared.MaxNumLLLocks + tiroot->tdsaAllShared.MaxNumOSLocks;
ostiSingleThreadedLeave(ptiRoot, queueId + offset);
}
#ifdef PERF_COUNT
void
tdsaEnter(tiRoot_t *ptiRoot, int io)
{
ostiEnter(ptiRoot, 1, io);
}
void
tdsaLeave(tiRoot_t *ptiRoot, int io)
{
ostiLeave(ptiRoot, 1, io);
}
#endif