#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
itdssTaskCompleted(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
tiIORequest_t *taskTag = agNULL, *currentTaskTag = agNULL;
tdIORequestBody_t *tdIORequestBody = agNULL;
tdIORequestBody_t *TMtdIORequestBody = agNULL;
tdIORequestBody_t *AborttdIORequestBody = agNULL;
agsaIORequest_t *agTaskedIORequest;
agsaSSPResponseInfoUnit_t agSSPRespIU;
bit8 respData[128];
bit32 respLen;
#ifdef TD_DEBUG_ENABLE
bit32 data_status;
#endif
agsaSASRequestBody_t *agSASRequestBody = agNULL;
agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest = agNULL;
agsaIORequest_t *agAbortIORequest;
tdIORequestBody_t *tdAbortIORequestBody;
bit32 PhysUpper32;
bit32 PhysLower32;
bit32 memAllocStatus;
void *osMemHandle;
bit32 abortOrquery = agTRUE;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
agsaDevHandle_t *agDevHandle = agNULL;
bit32 status = AGSA_RC_FAILURE;
TI_DBG2(("itdssTaskCompleted: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag;
if (currentTaskTag == agNULL)
{
TI_DBG1(("itdssTaskCompleted: currentTaskTag is NULL \n"));
#if 0
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
#endif
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
if (agIOStatus != OSSA_IO_SUCCESS)
{
TI_DBG1(("itdssTaskCompleted: agIOStatus failed and tiTMFailed\n"));
if (agIOStatus == OSSA_IO_TM_TAG_NOT_FOUND)
{
TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_TM_TAG_NOT_FOUND\n"));
}
else
if (agIOStatus == OSSA_IO_ABORTED)
{
TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_ABORTED\n"));
}
else
{
TI_DBG1(("itdssTaskCompleted: agIOStatus 0x%x\n", agIOStatus));
}
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
#ifdef TD_DEBUG_ENABLE
data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
#endif
respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
TI_DBG6(("itdssTaskCompleted: dataPres %d. should be 1\n", data_status));
saFrameReadBlock(agRoot, agParam,
sizeof(agsaSSPResponseInfoUnit_t),
respData, respLen);
TI_DBG6(("itdssTaskCompleted: res code %d. should be 0\n", respData[3]));
taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
if (taskTag == agNULL)
{
TI_DBG1(("itdssTaskCompleted: taskTag is NULL\n"));
abortOrquery = agFALSE;
TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
}
else
{
TI_DBG2(("itdssTaskCompleted: taskTag is NOT NULL\n"));
abortOrquery = agTRUE;
TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData;
}
TI_DBG2(("itdssTaskCompleted: TMtdIORequestBody %p\n", TMtdIORequestBody));
if (TMtdIORequestBody == agNULL)
{
TI_DBG1(("itdssTaskCompleted: TMtdIORequestBody is NULL \n"));
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
{
TI_DBG1(("itdssTaskCompleted: agIOInfoLen is zero, wrong\n"));
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
agSASRequestBody = (agsaSASRequestBody_t *)&(TMtdIORequestBody->transport.SAS.agSASRequestBody);
agSSPTaskMgntRequest = (agsaSSPScsiTaskMgntReq_t *)&(agSASRequestBody->sspTaskMgntReq);
TI_DBG2(("itdssTaskCompleted: agSSPTaskMgntRequest->taskMgntFunction 0x%x\n", agSSPTaskMgntRequest->taskMgntFunction));
if ( (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK ||
agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK) &&
abortOrquery == agFALSE
)
{
TI_DBG1(("itdssTaskCompleted: incorrect tasktag, first\n"));
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
if ((agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK_SET ||
agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_TASK_SET ||
agSSPTaskMgntRequest->taskMgntFunction == AGSA_LOGICAL_UNIT_RESET ||
agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_ACA ) &&
abortOrquery == agTRUE
)
{
TI_DBG1(("itdssTaskCompleted: incorrect tasktag, second\n"));
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK)
{
TI_DBG2(("itdssTaskCompleted: calling saSSPAbort()\n"));
AborttdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
if (AborttdIORequestBody == agNULL)
{
TI_DBG1(("itdssTaskCompleted: wrong, AborttdIORequestBody is NULL\n"));
return;
}
tiDeviceHandle = AborttdIORequestBody->tiDevHandle;
if (tiDeviceHandle == agNULL)
{
TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
return;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
return;
}
agDevHandle = oneDeviceData->agDevHandle;
if (agDevHandle == agNULL)
{
TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
}
agTaskedIORequest = (agsaIORequest_t *)&(AborttdIORequestBody->agIORequest);
if (agTaskedIORequest == agNULL)
{
TI_DBG1(("itdssTaskCompleted: agTaskedIORequest is NULL \n"));
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
memAllocStatus = ostiAllocMemory(
tiRoot,
&osMemHandle,
(void **)&tdAbortIORequestBody,
&PhysUpper32,
&PhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (memAllocStatus != tiSuccess)
{
TI_DBG1(("itdssTaskCompleted: ostiAllocMemory failed...\n"));
return;
}
if (tdAbortIORequestBody == agNULL)
{
TI_DBG1(("itdssTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
return;
}
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
tdAbortIORequestBody->tiDevHandle = tiDeviceHandle;
tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL;
agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
agAbortIORequest->osData = (void *) tdAbortIORequestBody;
agAbortIORequest->sdkData = agNULL;
status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL);
if (status != AGSA_RC_SUCCESS)
{
TI_DBG1(("itdssTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
ostiFreeMemory(
tiRoot,
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
}
}
if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE ||
respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
{
TI_DBG2(("itdssTaskCompleted: tiTMOK\n"));
tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
if (tiDeviceHandle == agNULL)
{
TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
return;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n"));
return;
}
agDevHandle = oneDeviceData->agDevHandle;
if (agDevHandle == agNULL)
{
TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n"));
}
TI_DBG2(("itdssTaskCompleted: setting Device state to SA_DS_OPERATIONAL\n"));
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMOK,
currentTaskTag );
}
else
{
TI_DBG1(("itdssTaskCompleted: tiTMFailed\n"));
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
currentTaskTag );
}
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
#ifdef INITIATOR_DRIVER
osGLOBAL void
itdssQueryTaskCompleted(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
tiIORequest_t *taskTag = agNULL;
tdIORequestBody_t *tdIORequestBody = agNULL;
tdIORequestBody_t *TMtdIORequestBody = agNULL;
agsaIORequest_t *agTaskedIORequest = agNULL;
agsaSSPResponseInfoUnit_t agSSPRespIU;
bit8 respData[128];
bit32 respLen;
#ifdef TD_DEBUG_ENABLE
bit32 data_status;
#endif
agsaSASRequestBody_t *agSASRequestBody = agNULL;
agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest = agNULL;
bit32 status;
agsaIORequest_t *agAbortIORequest = agNULL;
tdIORequestBody_t *tdAbortIORequestBody = agNULL;
bit32 PhysUpper32;
bit32 PhysLower32;
bit32 memAllocStatus;
void *osMemHandle = agNULL;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
agsaDevHandle_t *agDevHandle = agNULL;
TI_DBG2(("itdssQueryTaskComplted: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
if (agIOStatus != OSSA_IO_SUCCESS)
{
TI_DBG1(("itdssQueryTaskComplted: agIOStatus failed and tiTMFailed\n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
#ifdef TD_DEBUG_ENABLE
data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
#endif
respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
TI_DBG6(("itdssQueryTaskCompleted: dataPres %d. should be 1\n", data_status));
saFrameReadBlock(agRoot, agParam,
sizeof(agsaSSPResponseInfoUnit_t),
respData, respLen);
TI_DBG6(("itdssQueryTaskCompleted: res code %d. should be 0\n", respData[3]));
taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag;
if (taskTag == agNULL)
{
TI_DBG1(("itdssQueryTaskComplted: taskTag is NULL \n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
TMtdIORequestBody = (tdIORequestBody_t *)taskTag->tdData;
if (TMtdIORequestBody == agNULL)
{
TI_DBG1(("itdssQueryTaskComplted: TMtdIORequestBody is NULL \n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
agTaskedIORequest = &(TMtdIORequestBody->agIORequest);
if (agTaskedIORequest == agNULL)
{
TI_DBG1(("itdssQueryTaskComplted: agTaskedIORequest is NULL \n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0)
{
TI_DBG1(("itdssQueryTaskCompleted: agIOInfoLen is zero, wrong\n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq);
if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK)
{
if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED)
{
}
else if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE)
{
tiDeviceHandle = TMtdIORequestBody->tiDevHandle;
if (tiDeviceHandle == agNULL)
{
TI_DBG1(("itdssQueryTaskCompleted: wrong, tiDeviceHandle is NULL\n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("itdssQueryTaskCompleted: wrong, oneDeviceData is NULL\n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
agDevHandle = oneDeviceData->agDevHandle;
if (agDevHandle == agNULL)
{
TI_DBG1(("itdssQueryTaskCompleted: wrong, agDevHandle is NULL\n"));
}
if (TMtdIORequestBody->ioCompleted != agTRUE)
{
memAllocStatus = ostiAllocMemory(
tiRoot,
&osMemHandle,
(void **)&tdAbortIORequestBody,
&PhysUpper32,
&PhysLower32,
8,
sizeof(tdIORequestBody_t),
agTRUE
);
if (memAllocStatus != tiSuccess)
{
TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory failed...\n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
if (tdAbortIORequestBody == agNULL)
{
TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n"));
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle;
tdAbortIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle;
tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL;
tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler;
agAbortIORequest = &(tdAbortIORequestBody->agIORequest);
agAbortIORequest->osData = (void *) tdAbortIORequestBody;
agAbortIORequest->sdkData = agNULL;
TI_DBG2(("itdssQueryTaskCompleted: issuing saSSPAbort()\n"));
status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL);
if (status != AGSA_RC_SUCCESS)
{
TI_DBG1(("itdssQueryTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n"));
ostiFreeMemory(
tiRoot,
tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
}
}
}
else
{
TI_DBG1(("itdssQueryTaskComplted: not expected response 0x%x\n",respData[3]));
}
}
else
{
TI_DBG1(("itdssQueryTaskCompleted: not expected task management fn %d\n",agSSPTaskMgntRequest->taskMgntFunction));
}
ostiFreeMemory(
tiRoot,
tdIORequestBody->IOType.InitiatorTMIO.osMemHandle,
sizeof(tdIORequestBody_t)
);
return;
}
#endif
FORCEINLINE void
itdssIOCompleted(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
itdsaIni_t *Initiator = (itdsaIni_t *)osData->itdsaIni;
tdIORequestBody_t *tdIORequestBody = agNULL;
agsaSASRequestBody_t *agSASRequestBody = agNULL;
agsaSSPInitiatorRequest_t *agSSPInitiatorRequest = agNULL;
agsaSSPResponseInfoUnit_t agSSPRespIU;
bit32 scsi_status = 0;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
TI_DBG6(("itdssIOCompleted: start\n"));
TI_DBG6(("itdssIOCompleted: agIOInfoLen %d\n", agIOInfoLen));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
TD_ASSERT((NULL != tdIORequestBody), "itdssIOCompleted:tdIORequestBody NULL");
if ( NULL == tdIORequestBody )
{
return;
}
Initiator->NumIOsActive--;
#ifdef DBG
if (tdIORequestBody->ioCompleted == agTRUE)
{
#ifdef TD_DEBUG_ENABLE
tiDeviceHandle = tdIORequestBody->tiDevHandle;
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
#endif
TI_DBG1(("itdssIOCompleted: Error!!!!!! double completion\n"));
#ifdef TD_DEBUG_ENABLE
TI_DBG1(("itdssIOCompleted: did %d \n", oneDeviceData->id));
#endif
}
if (Initiator->NumIOsActive == 0)
{
TI_DBG6(("itdssIOCompleted: no acitve IO's. Kill timers\n"));
}
if (tdIORequestBody->tiIORequest->osData == agNULL)
{
TI_DBG1( ("itdssIOCompleted: pos 1; "
"tdIORequestBody->tiIORequest->osData is null, wrong\n") );
}
#endif
tdIORequestBody->ioCompleted = agTRUE;
tdIORequestBody->ioStarted = agFALSE;
agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody);
agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq);
TI_DBG6( ("itdssIOCompleted: CDB 0x%x\n",
agSSPInitiatorRequest->sspCmdIU.cdb[0]) );
if((agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0))
{
if ( (agSSPInitiatorRequest->sspCmdIU.cdb[0] == SCSIOPC_INQUIRY) &&
((agSSPInitiatorRequest->sspCmdIU.cdb[1] & 0x01) == 0))
{
bit32 qdepth = 32;
tiDeviceHandle = tdIORequestBody->tiDevHandle;
if( tiDeviceHandle )
{
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if( oneDeviceData->DeviceType == TD_SAS_DEVICE )
{
qdepth = MAX_OUTSTANDING_IO_PER_LUN;
}
if( oneDeviceData->DeviceType == TD_SATA_DEVICE )
{
qdepth = 63;
}
}
if ( ostiSetDeviceQueueDepth( tiRoot,
tdIORequestBody->tiIORequest,
MAX_OUTSTANDING_IO_PER_LUN ) == agFALSE )
{
TI_DBG1( ( "itdssIOCompleted: failed to call "
"ostiSetDeviceQueueDepth() Q=%d !!!\n", qdepth ) );
}
else
{
TI_DBG2(("itdssIOCompleted: set ostiSetDeviceQueueDepth() Q=%d\n",qdepth));
}
}
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOSuccess,
SCSI_STAT_GOOD,
agNULL,
agTRUE
);
return;
}
else
{
TI_DBG6(("itdssIOCompleted: SUCCESS but data returned \n"));
TI_DBG6( ("itdssIOCompleted: agIOStatus SUCCESS but data returned 0x%x\n",
agIOStatus) );
if(tdIORequestBody)
{
tiDeviceHandle = tdIORequestBody->tiDevHandle;
if(tiDeviceHandle)
{
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
}
}
osti_memset(&agSSPRespIU, 0, sizeof(agsaSSPResponseInfoUnit_t));
saFrameReadBlock( agRoot,
agParam,
0,
&agSSPRespIU,
sizeof(agsaSSPResponseInfoUnit_t) );
scsi_status = agSSPRespIU.status;
switch (scsi_status)
{
case SCSI_STAT_GOOD:
TI_DBG2( ("itdssIOCompleted: SCSI_STAT_GOOD %d\n",
Initiator->ScsiStatusCounts.GoodStatus) );
Initiator->ScsiStatusCounts.GoodStatus++;
break;
case SCSI_STAT_CHECK_CONDITION:
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CHECK_CONDITION %d\n",
Initiator->ScsiStatusCounts.CheckCondition) );
Initiator->ScsiStatusCounts.CheckCondition++;
break;
case SCSI_STAT_BUSY:
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_BUSY %d\n",
Initiator->ScsiStatusCounts.BusyStatus) );
Initiator->ScsiStatusCounts.BusyStatus++;
break;
case SCSI_STAT_RESV_CONFLICT:
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_RESV_CONFLICT %d\n",
Initiator->ScsiStatusCounts.ResvConflict) );
Initiator->ScsiStatusCounts.ResvConflict++;
break;
case SCSI_STAT_TASK_SET_FULL:
Initiator->ScsiStatusCounts.TaskSetFull++;
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_SET_FULL %d\n",
Initiator->ScsiStatusCounts.TaskSetFull) );
break;
case SCSI_STAT_ACA_ACTIVE:
Initiator->ScsiStatusCounts.AcaActive++;
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_ACA_ACTIVE %d\n",
Initiator->ScsiStatusCounts.AcaActive) );
break;
case SCSI_STAT_TASK_ABORTED:
Initiator->ScsiStatusCounts.TaskAborted++;
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_ABORTED %d\n",
Initiator->ScsiStatusCounts.TaskAborted) );
break;
case SCSI_STAT_CONDITION_MET:
Initiator->ScsiStatusCounts.ConditionMet++;
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CONDITION_MET %d\n",
Initiator->ScsiStatusCounts.ConditionMet) );
break;
case SCSI_STAT_INTERMEDIATE:
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTERMEDIATE %d\n",
Initiator->ScsiStatusCounts.ObsoleteStatus) );
Initiator->ScsiStatusCounts.ObsoleteStatus++;
break;
case SCSI_STAT_INTER_CONDIT_MET:
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTER_CONDIT_MET %d\n",
Initiator->ScsiStatusCounts.ObsoleteStatus) );
Initiator->ScsiStatusCounts.ObsoleteStatus++;
break;
case SCSI_STAT_COMMANDTERMINATED:
TI_DBG1( ("itdssIOCompleted: SCSI_STAT_COMMANDTERMINATED %d\n",
Initiator->ScsiStatusCounts.ObsoleteStatus) );
Initiator->ScsiStatusCounts.ObsoleteStatus++;
break;
default:
Initiator->ScsiStatusCounts.ObsoleteStatus++;
TI_DBG1( ("itdssIOCompleted: Unknown scsi_status %d 0x%x\n",
scsi_status,Initiator->ScsiStatusCounts.ObsoleteStatus) );
}
switch (agIOStatus)
{
case OSSA_IO_SUCCESS:
itdssIOSuccessHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_ABORTED:
itdssIOAbortedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_UNDERFLOW:
itdssIOUnderFlowHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_FAILED:
itdssIOFailedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_ABORT_RESET:
itdssIOAbortResetHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_NO_DEVICE:
itdssIONoDeviceHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERROR_BREAK:
itdssXferErrorBreakHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERROR_PHY_NOT_READY:
itdssXferErrorPhyNotReadyHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
itdssOpenCnxErrorProtocolNotSupprotedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION:
itdssOpenCnxErrorZoneViolationHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_BREAK:
itdssOpenCnxErrorBreakHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS:
itdssOpenCnxErrorITNexusLossHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION:
itdssOpenCnxErrorBadDestinationHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED:
itdssOpenCnxErrorConnectionRateNotSupportedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION:
itdssOpenCnxErrorWrongDestinationHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR:
itdssOpenCnxErrorUnknownErrorHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERROR_NAK_RECEIVED:
itdssXferErrorNAKReceivedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT:
itdssXferErrorACKNAKTimeoutHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERROR_DMA:
itdssXferErrorDMAHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH:
itdssXferErrorOffsetMismatchHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT:
itdssXferOpenRetryTimeoutHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_PORT_IN_RESET:
itdssPortInResetHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_DS_NON_OPERATIONAL:
itdssDsNonOperationalHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_DS_IN_RECOVERY:
itdssDsInRecoveryHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_TM_TAG_NOT_FOUND:
itdssTmTagNotFoundHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR:
itdssSSPExtIUZeroLenHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE:
itdssXferErrorUnexpectedPhaseHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED:
itdssXferOpenRetryBackoffThresholdReachedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO:
itdssOpenCnxErrorItNexusLossOpenTmoHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST:
itdssOpenCnxErrorItNexusLossNoDestHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE:
itdssOpenCnxErrorItNexusLossOpenCollideHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED:
itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
case OSSA_IO_XFR_ERROR_INTERNAL_RAM:
case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
itdssEncryptionHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
itdssDifHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
itdssIOResourceUnavailableHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_MPI_IO_RQE_BUSY_FULL:
itdssIORQEBusyFullHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME:
itdssXferErrorInvalidSSPRspFrameHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN:
itdssXferErrorEOBDataOverrunHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED:
itdssOpenCnxErrorOpenPreemptedHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
default:
TI_DBG1( ("itdssIOCompleted: Unknown agIOStatus 0x%x\n",agIOStatus) );
itdssIODefaultHandler( agRoot,
agIORequest,
agIOStatus,
agIOInfoLen,
agParam,
agOtherInfo );
break;
}
}
return;
}
#ifdef TD_DISCOVER
osGLOBAL void
itdssSMPCompleted (
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
agsaFrameHandle_t agFrameHandle
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
#ifdef REMOVED
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared);
#endif
tdssSMPRequestBody_t *tdSMPRequestBody;
agsaSASRequestBody_t *agSASRequestBody;
agsaSMPFrame_t *agSMPFrame;
tdsaDeviceData_t *oneDeviceData;
tiIORequest_t *CurrentTaskTag;
tdsaPortContext_t *onePortContext;
tdsaPortContext_t *oldonePortContext;
smpReqPhyControl_t *smpPhyControlReq;
bit8 smpHeader[4];
tdssSMPFrameHeader_t *tdSMPFrameHeader;
bit8 *tdSMPPayload;
agsaDevHandle_t *agDevHandle;
bit32 status;
#ifndef DIRECT_SMP
tdssSMPFrameHeader_t *tdRequestSMPFrameHeader;
bit8 smpRequestHeader[4];
#endif
bit8 SMPRequestFunction;
TI_DBG3(("itdssSMPCompleted: start\n"));
tdSMPRequestBody = (tdssSMPRequestBody_t *)agIORequest->osData;
CurrentTaskTag = tdSMPRequestBody->CurrentTaskTag;
oneDeviceData = tdSMPRequestBody->tdDevice;
onePortContext = oneDeviceData->tdPortContext;
agDevHandle = oneDeviceData->agDevHandle;
agSASRequestBody = &(tdSMPRequestBody->agSASRequestBody);
agSMPFrame = &(agSASRequestBody->smpFrame);
#ifdef DIRECT_SMP
SMPRequestFunction = tdSMPRequestBody->smpPayload[1];
#else
saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpRequestHeader, 4);
tdRequestSMPFrameHeader = (tdssSMPFrameHeader_t *)smpRequestHeader;
SMPRequestFunction = tdRequestSMPFrameHeader->smpFunction;
#endif
TI_DBG3(("itdssSMPCompleted: agIORequest %p\n", agIORequest));
TI_DBG3(("itdssSMPCompleted: SMPRequestbody %p\n", tdSMPRequestBody));
if (onePortContext != agNULL)
{
TI_DBG3(("itdssSMPCompleted: pid %d\n", onePortContext->id));
}
else
{
TI_DBG1(("itdssSMPCompleted: Wrong!!! onePortContext is NULL\n"));
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
oldonePortContext = tdSMPRequestBody->tdPortContext;
if (oldonePortContext != agNULL)
{
TI_DBG3(("itdssSMPCompleted: old pid %d\n", oldonePortContext->id));
}
else
{
TI_DBG1(("itdssSMPCompleted: Wrong!!! oldonePortContext is NULL\n"));
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
onePortContext->discovery.pendingSMP--;
if (onePortContext != oldonePortContext)
{
TI_DBG1(("itdssSMPCompleted: portcontext has changed!!!\n"));
if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
SMPRequestFunction == SMP_REPORT_PHY_SATA ||
SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
{
if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
{
tdsaKillTimer(
tiRoot,
&(onePortContext->discovery.DiscoverySMPTimer)
);
}
if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
{
tdsaKillTimer(
tiRoot,
&(oldonePortContext->discovery.DiscoverySMPTimer)
);
}
}
tdsaCleanAllExp(tiRoot, oldonePortContext);
tdssInternalRemovals(oldonePortContext->agRoot,
oldonePortContext
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
if (onePortContext->valid == agFALSE)
{
if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
SMPRequestFunction == SMP_REPORT_PHY_SATA ||
SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
{
if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
{
tdsaKillTimer(
tiRoot,
&(onePortContext->discovery.DiscoverySMPTimer)
);
}
if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
{
tdsaKillTimer(
tiRoot,
&(oldonePortContext->discovery.DiscoverySMPTimer)
);
}
}
if (onePortContext->discovery.pendingSMP == 0)
{
TI_DBG1(("itdssSMPCompleted: aborting discovery\n"));
tdsaSASDiscoverAbort(tiRoot, onePortContext);
}
else
{
TI_DBG1(("itdssSMPCompleted: not yet abort; non zero pendingSMP %d\n", onePortContext->discovery.pendingSMP));
}
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
SMPRequestFunction == SMP_REPORT_PHY_SATA ||
SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
{
if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
{
tdsaKillTimer(
tiRoot,
&(onePortContext->discovery.DiscoverySMPTimer)
);
}
if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE)
{
tdsaKillTimer(
tiRoot,
&(oldonePortContext->discovery.DiscoverySMPTimer)
);
}
}
if (agIOStatus == OSSA_IO_SUCCESS)
{
#ifdef DIRECT_SMP
saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
#else
saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpHeader, 4);
#endif
tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
switch (tdSMPFrameHeader->smpFunction)
{
case SMP_REPORT_GENERAL:
TI_DBG3(("itdssSMPCompleted: report general\n"));
if (agIOInfoLen != sizeof(smpRespReportGeneral_t) + 4 &&
tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
{
TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportGeneral_t) + 4));
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
tdsaReportGeneralRespRcvd(
tiRoot,
agRoot,
agIORequest,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle
);
break;
case SMP_DISCOVER:
TI_DBG3(("itdssSMPCompleted: discover\n"));
if (agIOInfoLen != sizeof(smpRespDiscover_t) + 4 &&
tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
{
TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespDiscover_t) + 4));
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
tdsaDiscoverRespRcvd(
tiRoot,
agRoot,
agIORequest,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle
);
break;
case SMP_REPORT_PHY_SATA:
TI_DBG3(("itdssSMPCompleted: report phy sata\n"));
if (agIOInfoLen != sizeof(smpRespReportPhySata_t) + 4 &&
tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
{
TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportPhySata_t) + 4));
tdsaSATADiscoverDone(tiRoot, onePortContext, tiError);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
tdsaReportPhySataRcvd(
tiRoot,
agRoot,
agIORequest,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle
);
break;
case SMP_CONFIGURE_ROUTING_INFORMATION:
TI_DBG1(("itdssSMPCompleted: configure routing information\n"));
if (agIOInfoLen != 4 &&
tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
{
TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
tdsaConfigRoutingInfoRespRcvd(
tiRoot,
agRoot,
agIORequest,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle
);
break;
case SMP_PHY_CONTROL:
TI_DBG3(("itdssSMPCompleted: phy control\n"));
if (agIOInfoLen != 4 &&
tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
{
TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
tdsaPhyControlRespRcvd(
tiRoot,
agRoot,
agIORequest,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle,
CurrentTaskTag
);
break;
#ifdef REMOVED
case SMP_REPORT_MANUFACTURE_INFORMATION:
TI_DBG1(("itdssSMPCompleted: REPORT_MANUFACTURE_INFORMATION\n"));
if (agIOInfoLen != sizeof(smpRespReportManufactureInfo_t) + 4 &&
tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED)
{
TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4));
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
tdsaReportManInfoRespRcvd(
tiRoot,
agRoot,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle
);
break;
#endif
case SMP_REPORT_ROUTING_INFORMATION:
case SMP_REPORT_PHY_ERROR_LOG:
case SMP_PHY_TEST_FUNCTION:
case SMP_REPORT_MANUFACTURE_INFORMATION:
case SMP_READ_GPIO_REGISTER:
case SMP_WRITE_GPIO_REGISTER:
default:
TI_DBG1(("itdssSMPCompleted: wrong SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
TI_DBG1(("itdssSMPCompleted: smpFrameType 0x%x\n", tdSMPFrameHeader->smpFrameType));
TI_DBG1(("itdssSMPCompleted: smpFunctionResult 0x%x\n", tdSMPFrameHeader->smpFunctionResult));
TI_DBG1(("itdssSMPCompleted: smpReserved 0x%x\n", tdSMPFrameHeader->smpReserved));
tdhexdump("itdssSMPCompleted: SMP payload", (bit8 *)agFrameHandle, agIOInfoLen);
break;
}
}
else if (agIOStatus == OSSA_IO_ABORTED || agIOStatus == OSSA_IO_INVALID_LENGTH)
{
TI_DBG1(("itdssSMPCompleted: OSSA_IO_ABORTED\n"));
}
else if (agIOStatus == OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE)
{
TI_DBG1(("itdssSMPCompleted: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE\n"));
saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4);
tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader;
status = saSMPStart(
agRoot,
agIORequest,
tdSMPRequestBody->queueNumber,
agDevHandle,
AGSA_SMP_INIT_REQ,
agSASRequestBody,
&ossaSMPCompleted
);
if (status == AGSA_RC_SUCCESS)
{
onePortContext->discovery.pendingSMP++;
if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER ||
SMPRequestFunction == SMP_REPORT_PHY_SATA ||
SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
{
tdsaDiscoverySMPTimer(tiRoot, onePortContext, (bit32)(tdSMPFrameHeader->smpFunction), tdSMPRequestBody);
}
return;
}
else if (status == AGSA_RC_BUSY)
{
if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
{
tdsaSMPBusyTimer(tiRoot, onePortContext, oneDeviceData, tdSMPRequestBody);
}
else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
{
tdsaPhyControlFailureRespRcvd(
tiRoot,
agRoot,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle,
CurrentTaskTag
);
}
else
{
}
}
else
{
if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION )
{
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
}
else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
{
tdsaPhyControlFailureRespRcvd(
tiRoot,
agRoot,
oneDeviceData,
tdSMPFrameHeader,
agFrameHandle,
CurrentTaskTag
);
}
else
{
}
}
}
else
{
if (tdSMPRequestBody->retries < SMP_RETRIES)
{
TI_DBG1(("itdssSMPCompleted: failed! but retries %d agIOStatus 0x%x %d agIOInfoLen %d\n",
tdSMPRequestBody->retries, agIOStatus, agIOStatus, agIOInfoLen));
if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS ||
agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED ||
agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO ||
agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST ||
agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE ||
agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED ||
agIOStatus == OSSA_IO_DS_NON_OPERATIONAL
)
{
saSetDeviceState(agRoot, agNULL, tdSMPRequestBody->queueNumber, agDevHandle, SA_DS_OPERATIONAL);
}
saSMPStart(
agRoot,
agIORequest,
tdSMPRequestBody->queueNumber,
agDevHandle,
AGSA_SMP_INIT_REQ,
agSASRequestBody,
&ossaSMPCompleted
);
onePortContext->discovery.pendingSMP++;
tdSMPRequestBody->retries++;
return;
}
else
{
tdSMPFrameHeader = (tdssSMPFrameHeader_t *)agSMPFrame->outFrameBuf;
tdSMPPayload = (bit8 *)agSMPFrame->outFrameBuf + 4;
TI_DBG1(("itdssSMPCompleted: failed! no more retry! agIOStatus 0x%x %d\n", agIOStatus, agIOStatus));
if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL)
{
TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n"));
}
if (agIOStatus == OSSA_IO_DS_IN_RECOVERY)
{
TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_IN_RECOVERY\n"));
}
if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL ||
tdSMPFrameHeader->smpFunction == SMP_DISCOVER ||
tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA ||
tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION
)
{
TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
TI_DBG1(("itdssSMPCompleted: discover done with error\n"));
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
}
else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL)
{
TI_DBG1(("itdssSMPCompleted: SMP_PHY_CONTROL\n"));
smpPhyControlReq = (smpReqPhyControl_t *)tdSMPPayload;
if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_CLEAR_AFFILIATION)
{
TI_DBG1(("itdssSMPCompleted: discover done with error\n"));
tdsaSASDiscoverDone(tiRoot, onePortContext, tiError);
}
else if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_HARD_RESET ||
smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_LINK_RESET )
{
TI_DBG1(("itdssSMPCompleted: device reset failed\n"));
if (CurrentTaskTag != agNULL )
{
TI_DBG1(("itdssSMPCompleted: callback to OS layer with failure\n"));
ostiInitiatorEvent( tiRoot,
NULL,
NULL,
tiIntrEventTypeTaskManagement,
tiTMFailed,
CurrentTaskTag );
}
else
{
oneDeviceData->ResetCnt = 0;
}
}
else
{
TI_DBG1(("itdssSMPCompleted: unknown phy operation 0x%x\n", smpPhyControlReq->phyOperation));
}
}
else
{
TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction));
}
}
}
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->osMemHandle,
sizeof(tdssSMPRequestBody_t)
);
#ifndef DIRECT_SMP
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPReqosMemHandle,
tdSMPRequestBody->IndirectSMPReqLen
);
ostiFreeMemory(
tiRoot,
tdSMPRequestBody->IndirectSMPResposMemHandle,
tdSMPRequestBody->IndirectSMPRespLen
);
#endif
return;
}
#else
osGLOBAL void
itdssSMPCompleted (
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
agsaFrameHandle_t agFrameHandle
)
{
TI_DBG3(("itdssSMPCompleted: start\n"));
}
#endif
osGLOBAL void
itdssIOSuccessHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
itdsaIni_t *Initiator = (itdsaIni_t *)osData->itdsaIni;
tdIORequestBody_t *tdIORequestBody;
agsaSSPResponseInfoUnit_t agSSPRespIU;
tiSenseData_t senseData;
bit8 senseDataPayload[256];
bit8 respData[128];
bit32 scsi_status;
bit32 senseLen;
bit32 respLen;
bit32 data_status;
bit32 i;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
TI_DBG2(("itdssIOSuccessHandler: start\n"));
TI_DBG2(("itdssIOSuccessHandler: agIOInfoLen %d\n", agIOInfoLen));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
tdIORequestBody->ioCompleted = agTRUE;
tdIORequestBody->ioStarted = agFALSE;
if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
{
TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen does not match!!!\n"));
TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t)));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
agTRUE
);
return;
}
saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
scsi_status = agSSPRespIU.status;
senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
TI_DBG2(("itdssIOSuccessHandler: dataPres=%x\n", data_status));
TI_DBG2(("itdssIOSuccessHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen));
if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
{
TI_DBG1(("itdssIOSuccessHandler: Second agIOInfoLen does not match!!!\n"));
TI_DBG1(("itdssIOSuccessHandler: Second agIOInfoLen 0x%x IU 0x%x senselen 0x%x resplen 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t), senseLen, respLen));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
agTRUE
);
return;
}
saFrameReadBlock(agRoot, agParam,
sizeof(agsaSSPResponseInfoUnit_t),
respData, respLen);
saFrameReadBlock(agRoot, agParam,
sizeof(agsaSSPResponseInfoUnit_t)
+ respLen,
senseDataPayload, senseLen);
if (data_status == 0)
{
TI_DBG1(("itdssIOSuccessHandler: no data scsi_status 0x%x\n",scsi_status));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOSuccess,
scsi_status,
agNULL,
agTRUE
);
return;
}
if (data_status == 1)
{
TI_DBG1(("itdssIOSuccessHandler: response data \n"));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOSuccess,
0,
agNULL,
agTRUE
);
return;
}
if (data_status == 2)
{
TI_DBG2(("itdssIOSuccessHandler: sense data \n"));
senseData.senseData = &senseDataPayload;
senseData.senseLen = MIN(256, senseLen);
tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
tiDeviceHandle = tdIORequestBody->tiDevHandle;
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
TI_DBG1(("sense data Sense Key 0x%2X ASC(Code) 0x%2X ASCQ(Qualifier) 0x%2X, did 0x%x\n",*(senseDataPayload+ 2),*(senseDataPayload + 12),*(senseDataPayload + 13),
oneDeviceData->id));
tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen);
if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
{
Initiator->SenseKeyCounter.SoftError ++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
{
Initiator->SenseKeyCounter.MediumNotReady++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
{
Initiator->SenseKeyCounter.MediumError++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
{
Initiator->SenseKeyCounter.HardwareError++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
{
Initiator->SenseKeyCounter.IllegalRequest++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
{
Initiator->SenseKeyCounter.UnitAttention++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
{
Initiator->SenseKeyCounter.AbortCommand++;
}
else
{
Initiator->SenseKeyCounter.OtherKeyType++;
}
if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
{
TI_DBG2(("itdssIOSuccessHandler: sending notfify spinup\n"));
tiDeviceHandle = tdIORequestBody->tiDevHandle;
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData->directlyAttached == agTRUE)
{
for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
{
saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
}
}
}
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOSuccess,
scsi_status,
&senseData,
agTRUE
);
return;
}
if (data_status == 3)
{
TI_DBG1(("itdssIOSuccessHandler: reserved wrong!!!\n"));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
scsi_status,
agNULL,
agTRUE
);
return;
}
}
osGLOBAL void
itdssIOAbortedHandler (
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
TI_DBG2(("itdssIOAbortedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
if (agIOStatus != OSSA_IO_ABORTED)
{
TI_DBG1(("itdssIOAbortedHandler: incorrect agIOStatus 0x%x\n", agIOStatus));
}
if (tdIORequestBody == agNULL)
{
TI_DBG1(("itdssIOAbortedHandler: start\n"));
return;
}
if (tdIORequestBody != agNULL)
{
tiDeviceHandle = tdIORequestBody->tiDevHandle;
}
if (tiDeviceHandle != agNULL)
{
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
}
if (oneDeviceData != agNULL)
{
TI_DBG2(("itdssIOAbortedHandler: did %d \n", oneDeviceData->id));
}
else
{
TI_DBG1(("itdssIOAbortedHandler: oneDeviceData is NULL\n"));
}
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailAborted,
agNULL,
intContext
);
return;
}
#ifdef REMOVED
osGLOBAL void
itdssIOOverFlowHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIOOverFlowHandler: start\n"));
TI_DBG2(("itdssIOOverFlowHandler: not transferred byte 0x%x\n", agIOInfoLen));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOOverRun,
agIOInfoLen,
agNULL,
intContext
);
return;
}
#endif
osGLOBAL void
itdssIOUnderFlowHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG6(("itdssIOUnderFlowHandler: start\n"));
TI_DBG6(("itdssIOUnderFlowHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOUnderRun,
agIOInfoLen,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIOFailedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssIOFailedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIOAbortResetHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIOAbortResetHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailAbortReset,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIONotValidHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIONotValidHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailNotValid,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIONoDeviceHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIONoDeviceHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailNoLogin,
agNULL,
intContext
);
return;
}
#ifdef REMOVED
osGLOBAL void
itdssIllegalParameterHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIllegalParameterHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
#endif
osGLOBAL void
itdssLinkFailureHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssLinkFailureHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssProgErrorHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssProgErrorHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorBreakHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorBreakHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorPhyNotReadyHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferErrorPhyNotReadyHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorProtocolNotSupprotedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorProtocolNotSupprotedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorZoneViolationHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorZoneViolationHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorBreakHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssOpenCnxErrorBreakHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorITNexusLossHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssOpenCnxErrorITNexusLossHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorBadDestinationHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssOpenCnxErrorBadDestinationHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorConnectionRateNotSupportedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
agsaDevHandle_t *agDevHandle = agNULL;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
bit32 ConnRate = SAS_CONNECTION_RATE_12_0G;
agsaContext_t *agContext = agNULL;
TI_DBG1(("itdssOpenCnxErrorConnectionRateNotSupportedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
tiDeviceHandle = tdIORequestBody->tiDevHandle;
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
agDevHandle = oneDeviceData->agDevHandle;
if (tdsaAllShared->RateAdjust)
{
if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
oneDeviceData->tdPortContext != agNULL )
{
ConnRate = DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo);
if (ConnRate == SAS_CONNECTION_RATE_1_5G)
{
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
}
else
{
ConnRate = ConnRate - 1;
}
agContext = &(tdIORequestBody->agContext);
agContext->osData = agIORequest;
saSetDeviceInfo(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 32, ConnRate << 28, ossaIniSetDeviceInfoCB);
}
}
else
{
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
}
return;
}
osGLOBAL void
itdssOpenCnxErrorSTPResourceBusyHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorSTPResourceBusyHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorWrongDestinationHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssOpenCnxErrorWrongDestinationHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorUnknownErrorHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssOpenCnxErrorUnknownErrorHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorNAKReceivedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorNAKReceivedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorACKNAKTimeoutHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorACKNAKTimeoutHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorPeerAbortedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferErrorPeerAbortedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorRxFrameHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorRxFrameHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorDMAHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorDMAHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherErrorNoRetry,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorCreditTimeoutHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorCreditTimeoutHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorCMDIssueACKNAKTimeoutHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorCMDIssueACKNAKTimeoutHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorCMDIssueBreakBeforeACKNAKHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorCMDIssueBreakBeforeACKNAKHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorDisruptedPhyDownHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferErrorDisruptedPhyDownHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorOffsetMismatchHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssXferErrorOffsetMismatchHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorXferZeroDataLenHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferErrorXferZeroDataLenHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferOpenRetryTimeoutHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
agsaDevHandle_t *agDevHandle = agNULL;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
bit32 saStatus = AGSA_RC_FAILURE;
TI_DBG2(("itdssXferOpenRetryTimeoutHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
tiDeviceHandle = tdIORequestBody->tiDevHandle;
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
agDevHandle = oneDeviceData->agDevHandle;
if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
oneDeviceData->tdPortContext != agNULL )
{
if (tdIORequestBody->reTries < OPEN_RETRY_RETRIES)
{
saStatus = saSSPStart(agRoot,
agIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
agDevHandle,
tdIORequestBody->agRequestType,
&(tdIORequestBody->transport.SAS.agSASRequestBody),
agNULL,
&ossaSSPCompleted);
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG2(("itdssXferOpenRetryTimeoutHandler: retried\n"));
Initiator->NumIOsActive++;
tdIORequestBody->ioStarted = agTRUE;
tdIORequestBody->ioCompleted = agFALSE;
tdIORequestBody->reTries++;
return;
}
else
{
TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry failed\n"));
tdIORequestBody->ioStarted = agFALSE;
tdIORequestBody->ioCompleted = agTRUE;
tdIORequestBody->reTries = 0;
}
}
else
{
TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry is over and fail\n"));
tdIORequestBody->reTries = 0;
}
}
else
{
TI_DBG1(("itdssXferOpenRetryTimeoutHandler: not valid deivce no retry\n"));
tdIORequestBody->reTries = 0;
}
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssPortInResetHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssPortInResetHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssDsNonOperationalHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
agsaDevHandle_t *agDevHandle = agNULL;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
TI_DBG2(("itdssDsNonOperationalHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
#if 1
tiDeviceHandle = tdIORequestBody->tiDevHandle;
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
agDevHandle = oneDeviceData->agDevHandle;
if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE &&
oneDeviceData->tdPortContext != agNULL )
{
saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL);
}
#endif
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssDsInRecoveryHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssDsInRecoveryHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssTmTagNotFoundHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssTmTagNotFoundHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssSSPExtIUZeroLenHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssSSPExtIUZeroLenHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorUnexpectedPhaseHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferErrorUnexpectedPhaseHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
#ifdef REMOVED
osGLOBAL void
itdssIOUnderFlowWithChkConditionHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
tdIORequestBody_t *tdIORequestBody;
agsaSSPResponseInfoUnit_t agSSPRespIU;
tiSenseData_t senseData;
bit8 senseDataPayload[256];
bit8 respData[128];
bit32 scsi_status;
bit32 senseLen;
bit32 respLen;
bit32 data_status;
bit32 i;
tiDeviceHandle_t *tiDeviceHandle = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: start\n"));
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: agIOInfoLen 0x%x\n", agIOInfoLen));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
tdIORequestBody->ioCompleted = agTRUE;
tdIORequestBody->ioStarted = agFALSE;
if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t))
{
TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen does not match!!!\n"));
TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t)));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
agTRUE
);
return;
}
saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU);
scsi_status = agSSPRespIU.status;
senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU);
respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU);
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: dataPres=%x\n", data_status));
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen));
if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen)
{
TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: Second agIOInfoLen does not match!!!\n"));
TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: Second agIOInfoLen 0x%x IU 0x%x senselen 0x%x resplen 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t), senseLen, respLen));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
agTRUE
);
return;
}
saFrameReadBlock(agRoot, agParam,
sizeof(agsaSSPResponseInfoUnit_t),
respData, respLen);
saFrameReadBlock(agRoot, agParam,
sizeof(agsaSSPResponseInfoUnit_t)
+ respLen,
senseDataPayload, senseLen);
if (data_status == 0)
{
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: no data\n"));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOSuccess,
scsi_status,
agNULL,
agTRUE
);
return;
}
if (data_status == 1)
{
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: response data \n"));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOSuccess,
0,
agNULL,
agTRUE
);
return;
}
if (data_status == 2)
{
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sense data \n"));
senseData.senseData = &senseDataPayload;
senseData.senseLen = MIN(256, senseLen);
tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t));
tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen);
tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen);
if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR)
{
Initiator->SenseKeyCounter.SoftError ++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY)
{
Initiator->SenseKeyCounter.MediumNotReady++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR)
{
Initiator->SenseKeyCounter.MediumError++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR)
{
Initiator->SenseKeyCounter.HardwareError++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST)
{
Initiator->SenseKeyCounter.IllegalRequest++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION)
{
Initiator->SenseKeyCounter.UnitAttention++;
}
else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND)
{
Initiator->SenseKeyCounter.AbortCommand++;
}
else
{
Initiator->SenseKeyCounter.OtherKeyType++;
}
if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11))
{
TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sending notfify spinup\n"));
tiDeviceHandle = tdIORequestBody->tiDevHandle;
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData->directlyAttached == agTRUE)
{
for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++)
{
saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL);
}
}
}
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOSuccess,
scsi_status,
&senseData,
agTRUE
);
return;
}
if (data_status == 3)
{
TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: reserved wrong!!!\n"));
ostiInitiatorIOCompleted(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
scsi_status,
agNULL,
agTRUE
);
return;
}
return;
}
#endif
osGLOBAL void
itdssXferOpenRetryBackoffThresholdReachedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferOpenRetryBackoffThresholdReachedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorItNexusLossOpenTmoHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenTmoHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorItNexusLossNoDestHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorItNexusLossNoDestHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorItNexusLossOpenCollideHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenCollideHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssEncryptionHandler (
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
bit32 errorDetail = tiDetailOtherError;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssEncryptionHandler: start\n"));
TI_DBG1(("itdssEncryptionHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
switch (agIOStatus)
{
case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
errorDetail = tiDetailDekKeyCacheMiss;
break;
case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID:
TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n"));
errorDetail = tiDetailCipherModeInvalid;
break;
case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH:
TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n"));
errorDetail = tiDetailDekIVMismatch;
break;
case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR:
TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n"));
errorDetail = tiDetailDekRamInterfaceError;
break;
case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS:
TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS\n"));
errorDetail = tiDetailDekIndexOutofBounds;
break;
case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE:
TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE\n"));
errorDetail = tiDetailOtherError;
break;
default:
TI_DBG1(("itdssEncryptionHandler: other error!!! 0x%x\n", agIOStatus));
errorDetail = tiDetailOtherError;
break;
}
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOEncryptError,
errorDetail,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssDifHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
bit32 errorDetail = tiDetailOtherError;
tdIORequestBody_t *tdIORequestBody;
#ifdef TD_DEBUG_ENABLE
agsaDifDetails_t *DifDetail;
#endif
TI_DBG1(("itdssDifHandler: start\n"));
TI_DBG1(("itdssDifHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
#ifdef TD_DEBUG_ENABLE
DifDetail = (agsaDifDetails_t *)agParam;
#endif
switch (agIOStatus)
{
case OSSA_IO_XFR_ERROR_DIF_MISMATCH:
errorDetail = tiDetailDifMismatch;
TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_MISMATCH\n"));
break;
case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
errorDetail = tiDetailDifAppTagMismatch;
TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
break;
case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
errorDetail = tiDetailDifRefTagMismatch;
TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
break;
case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
errorDetail = tiDetailDifCrcMismatch;
TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
break;
default:
errorDetail = tiDetailOtherError;
TI_DBG1(("itdssDifHandler: other error!!! 0x%x\n", agIOStatus));
break;
}
TI_DBG1(("itdssDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIODifError,
errorDetail,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIOResourceUnavailableHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIOResourceUnavailableHandler: start\n"));
TI_DBG2(("itdssIOResourceUnavailableHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailBusy,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIORQEBusyFullHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIORQEBusyFullHandler: start\n"));
TI_DBG2(("itdssIORQEBusyFullHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailBusy,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorInvalidSSPRspFrameHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: start\n"));
TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssXferErrorEOBDataOverrunHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: start\n"));
TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssOpenCnxErrorOpenPreemptedHandler(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: start\n"));
TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIODefaultHandler (
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
bit32 intContext = osData->IntContext;
tdIORequestBody_t *tdIORequestBody;
TI_DBG2(("itdssIODefaultHandler: start\n"));
TI_DBG2(("itdssIODefaultHandler: agIOStatus 0x%x\n", agIOStatus));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
ostiInitiatorIOCompleted (
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailOtherError,
agNULL,
intContext
);
return;
}
osGLOBAL void
itdssIOForDebugging1Completed(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
TI_DBG1(("itdssIOForDebugging1Completed: start, error!!! can't be called. \n"));
}
osGLOBAL void
itdssIOForDebugging2Completed(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
TI_DBG1(("itdssIOForDebugging2Completed: start, error!!! can't be called. \n"));
}
osGLOBAL void
itdssIOForDebugging3Completed(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
void *agParam,
bit32 agOtherInfo
)
{
TI_DBG1(("itdssIOForDebugging3Completed: start, error!!! can't be called. \n"));
}