#include <osenv.h>
#include <ostypes.h>
#include <osdebug.h>
#include <sa.h>
#include <saapi.h>
#include <saosapi.h>
#include <titypes.h>
#include <ostiapi.h>
#include <tiapi.h>
#include <tiglobal.h>
#include <tdtypes.h>
#include <osstring.h>
#include <tdutil.h>
#ifdef INITIATOR_DRIVER
#include <itdtypes.h>
#include <itddefs.h>
#include <itdglobl.h>
#endif
#ifdef TARGET_DRIVER
#include <ttdglobl.h>
#include <ttdtxchg.h>
#include <ttdtypes.h>
#endif
#include <tdsatypes.h>
#include <tdproto.h>
#ifdef REMOVED
unsigned __int64
GetHiResTimeStamp(void);
#endif
#undef TD_DEBUG_TRACE_ENABLE
#define TD_DEBUG_IO_TRACE_BUFFER_MAX 1024
typedef struct TDDebugTraceEntry_s
{
bit64 Time;
ttdsaXchg_t ttdsaXchg;
tdsaDeviceData_t oneDeviceData;
} TDDebugTraceEntry_t;
typedef struct TDDebugTrace_s
{
bit32 Idx;
bit32 pad;
TDDebugTraceEntry_t Data[TD_DEBUG_IO_TRACE_BUFFER_MAX];
} TDDebugTrace_t;
void TDTraceInit(void);
void TDTraceAdd(ttdsaXchg_t *ttdsaXchg, tdsaDeviceData_t *oneDeviceData);
#ifdef TD_DEBUG_TRACE_ENABLE
#define TD_DEBUG_TRACE(ttdsaXchg, oneDeviceData) TDTraceAdd(ttdsaXchg, oneDeviceData)
#else
#define TD_DEBUG_TRACE(ttdsaXchg, oneDeviceData)
#endif
TDDebugTrace_t TraceData;
void TDTraceInit(void)
{
osti_memset(&TraceData, 0, sizeof(TraceData));
}
void TDTraceAdd(ttdsaXchg_t *ttdsaXchg, tdsaDeviceData_t *oneDeviceData)
{
static bit32 TraceIdx = 0;
TraceData.Idx = TraceIdx;
#ifdef REMOVED
TraceData.Data[TraceIdx].Time = GetHiResTimeStamp();
#endif
osti_memcpy((bit8 *)&(TraceData.Data[TraceIdx].ttdsaXchg), (bit8 *)ttdsaXchg, sizeof(ttdsaXchg_t));
osti_memcpy((bit8 *)&(TraceData.Data[TraceIdx].oneDeviceData), (bit8 *)oneDeviceData, sizeof(tdsaDeviceData_t));
#ifdef REMOVED
TraceData.Data[TraceIdx].ttdsaXchg = ttdsaXchg;
TraceData.Data[TraceIdx].oneDeviceData = oneDeviceData;
#endif
TraceIdx++;
if (TraceIdx >= TD_DEBUG_IO_TRACE_BUFFER_MAX)
{
TraceIdx = 0;
}
return;
}
osGLOBAL void
ttdsaSSPReqReceived(
agsaRoot_t *agRoot,
agsaDevHandle_t *agDevHandle,
agsaFrameHandle_t agFrameHandle,
bit32 agInitiatorTag,
bit32 parameter,
bit32 agFrameLen
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
ttdsaXchg_t *ttdsaXchg;
tdsaDeviceData_t *oneDeviceData = agNULL;
bit32 agFrameType, TLR;
TD_XCHG_CONTEXT_NO_CMD_RCVD(tiRoot) = TD_XCHG_CONTEXT_NO_CMD_RCVD(tiRoot)+1;
TI_DBG4(("ttdsaSSPReqReceived: start\n"));
agFrameType = TD_GET_FRAME_TYPE(parameter);
TLR = TD_GET_TLR(parameter);
oneDeviceData = (tdsaDeviceData_t *)agDevHandle->osData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("ttdsaSSPReqReceived: no device data\n"));
return;
}
ttdsaXchg = ttdsaXchgGetStruct(agRoot);
if (ttdsaXchg == agNULL)
{
TI_DBG1(("ttdsaSSPReqReceived: no free xchg structures\n"));
return;
}
if (ttdsaXchg->IORequestBody.tiIORequest == agNULL)
{
TI_DBG1(("ttdsaSSPReqReceived: tiIORequest is NULL\n"));
return;
}
oneDeviceData->agDevHandle = agDevHandle;
oneDeviceData->agRoot = agRoot;
ttdsaXchg->DeviceData = oneDeviceData;
ttdsaXchg->agRoot = agRoot;
ttdsaXchg->tiRoot = tiRoot;
ttdsaXchg->IORequestBody.agIORequest.sdkData = agNULL;
ttdsaXchg->tag = (bit16)agInitiatorTag;
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq.agTag
= ttdsaXchg->tag;
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse.agTag
= ttdsaXchg->tag;
TI_DBG6(("ttdsaSSPReqReceived: initiator tag 0x%x\n", agInitiatorTag));
if (agFrameType == OSSA_FRAME_TYPE_SSP_CMD)
{
TI_DBG4(("ttdsaSSPReqReceived: CMD frame type\n"));
saFrameReadBlock(
agRoot,
agFrameHandle,
0,
&ttdsaXchg->agSSPCmndIU,
agFrameLen
);
tdsaProcessCDB(&ttdsaXchg->agSSPCmndIU, ttdsaXchg);
ttdsaXchg->FrameType = SAS_CMND;
switch (SA_SSPCMD_GET_TASKATTRIB(&ttdsaXchg->agSSPCmndIU))
{
case 0:
ttdsaXchg->tiTgtScsiCmnd.taskAttribute = TASK_SIMPLE;
break;
case 1:
ttdsaXchg->tiTgtScsiCmnd.taskAttribute = TASK_HEAD_OF_QUEUE;
break;
case 2:
ttdsaXchg->tiTgtScsiCmnd.taskAttribute = TASK_ORDERED;
break;
case 3:
TI_DBG1(("ttdsaSSPReqReceived: reserved taskAttribute 0x%x\n",ttdsaXchg->agSSPCmndIU.efb_tp_taskAttribute));
ttdsaXchg->tiTgtScsiCmnd.taskAttribute = TASK_SIMPLE;
break;
case 4:
ttdsaXchg->tiTgtScsiCmnd.taskAttribute = TASK_ACA;
break;
default:
TI_DBG1(("ttdsaSSPReqReceived: unknown taskAttribute 0x%x\n",ttdsaXchg->agSSPCmndIU.efb_tp_taskAttribute));
ttdsaXchg->agSSPCmndIU.efb_tp_taskAttribute = TASK_SIMPLE;
break;
}
ttdsaXchg->tiTgtScsiCmnd.taskId = agInitiatorTag;
ttdsaXchg->tiTgtScsiCmnd.crn = 0;
ttdsaXchg->TLR = TLR;
ostiProcessScsiReq( tiRoot,
&ttdsaXchg->tiTgtScsiCmnd,
agFrameHandle,
0,
ttdsaXchg->IORequestBody.tiIORequest,
&ttdsaXchg->DeviceData->tiDeviceHandle);
}
else if (agFrameType == OSSA_FRAME_TYPE_SSP_TASK)
{
TI_DBG4(("ttdsaSSPReqReceived: TM frame type\n"));
saFrameReadBlock(
agRoot,
agFrameHandle,
0,
&ttdsaXchg->agTMIU,
agFrameLen
);
ttdsaXchg->FrameType = SAS_TM;
ttdsaTMProcess(tiRoot, ttdsaXchg);
return;
}
else
{
TI_DBG1(("ttdsaSSPReqReceived: unknown frame type\n"));
return;
}
return;
}
void
dumpCDB(bit8 *cdb)
{
bit32 i;
for(i=0;i<10;i++)
{
TI_DBG4(("cdb[%d] 0x%x\n", i, cdb[i]));
}
return;
}
osGLOBAL void
tdsaProcessCDB(
agsaSSPCmdInfoUnit_t *cmdIU,
ttdsaXchg_t *ttdsaXchg
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) ttdsaXchg->tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *) &tdsaRoot->tdsaAllShared;
ttdsaTgt_t *Target = (ttdsaTgt_t *) tdsaAllShared->ttdsaTgt;
bit8 group;
#ifdef TD_DEBUG_ENABLE
CDB6_t *cdb6;
#endif
CDB10_t *cdb10;
CDB12_t *cdb12;
CDB16_t *cdb16;
bit32 unknown = agFALSE;
bit32 len=0;
group = cmdIU->cdb[0] & CDB_GRP_MASK;
TI_DBG4(("tdsaProcessCDB: start\n"));
switch (cmdIU->cdb[0])
{
case SCSIOPC_REPORT_LUN:
TI_DBG4(("tdsaProcessCDB: REPORT_LUN\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_READ_DATA;
break;
case SCSIOPC_INQUIRY:
TI_DBG4(("tdsaProcessCDB: INQUIRY\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_READ_DATA;
break;
case SCSIOPC_TEST_UNIT_READY:
TI_DBG4(("tdsaProcessCDB: TEST_UNIT_READY\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_READ_DATA;
break;
case SCSIOPC_READ_CAPACITY_10:
case SCSIOPC_READ_CAPACITY_16:
TI_DBG4(("tdsaProcessCDB: READ CAPACITY\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_READ_DATA;
break;
case SCSIOPC_READ_6:
case SCSIOPC_READ_10:
TI_DBG4(("tdsaProcessCDB: READ\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_READ_DATA;
break;
case SCSIOPC_WRITE_6:
case SCSIOPC_WRITE_10:
TI_DBG4(("tdsaProcessCDB: WRITE\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_WRITE_DATA;
break;
case SCSIOPC_MODE_SENSE_6:
case SCSIOPC_MODE_SENSE_10:
TI_DBG4(("tdsaProcessCDB: MODE SENSE\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_READ_DATA;
break;
case SCSIOPC_SYNCHRONIZE_CACHE_10:
TI_DBG4(("tdsaProcessCDB: SCSIOPC_SYNCHRONIZE_CACHE_10\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_CMD_OR_TASK_RSP;
break;
case SCSIOPC_REQUEST_SENSE:
TI_DBG2(("tdsaProcessCDB: SCSIOPC_REQUEST_SENSE\n"));
ttdsaXchg->XchType = AGSA_SSP_TGT_READ_DATA;
break;
default:
TI_DBG4(("tdsaProcessCDB: UNKNOWN, cbd %d 0x%x\n", cmdIU->cdb[0], cmdIU->cdb[0]));
ttdsaXchg->XchType = TargetUnknown;
break;
}
switch (group)
{
case CDB_6BYTE:
TI_DBG4(("tdsaProcessCDB: CDB 6 byte, not yet\n"));
#ifdef TD_DEBUG_ENABLE
cdb6 = (CDB6_t *)(cmdIU->cdb);
#endif
TI_DBG4(("tdsaProcessCDB: CDB len 0x%x\n", cdb6->len));
break;
case CDB_10BYTE1:
case CDB_10BYTE2:
TI_DBG4(("tdsaProcessCDB: CDB 10 byte\n"));
cdb10 = (CDB10_t *)(cmdIU->cdb);
OSSA_READ_BE_16(AGROOT, &len, cdb10->len, 0);
TI_DBG4(("tdsaProcessCDB: CDB len 0x%x\n", len));
dumpCDB(cmdIU->cdb);
break;
case CDB_12BYTE:
TI_DBG4(("tdsaProcessCDB: CDB 12 byte, not yet\n"));
cdb12 = (CDB12_t *)(cmdIU->cdb);
OSSA_READ_BE_32(AGROOT, &len, cdb12->len, 0);
TI_DBG4(("tdsaProcessCDB: CDB len 0x%x\n", len));
break;
case CDB_16BYTE:
TI_DBG4(("tdsaProcessCDB: CDB 16 byte, not yet\n"));
cdb16 = (CDB16_t *)(cmdIU->cdb);
OSSA_READ_BE_32(AGROOT, &len, cdb16->len, 0);
TI_DBG4(("tdsaProcessCDB: CDB len 0x%x\n", len));
break;
default:
TI_DBG4(("tdsaProcessCDB: unknow CDB, group %d 0x%x\n", group, group));
len = 0;
unknown = agTRUE;
break;
}
if (cmdIU->cdb[0] == SCSIOPC_READ_6 || cmdIU->cdb[0] == SCSIOPC_READ_10 ||
cmdIU->cdb[0] == SCSIOPC_WRITE_6 || cmdIU->cdb[0] == SCSIOPC_WRITE_10 )
{
ttdsaXchg->dataLen = len * Target->OperatingOption.BlockSize;
}
else
{
ttdsaXchg->dataLen = len;
}
if (ttdsaXchg->dataLen == 0 && unknown == agFALSE)
{
ttdsaXchg->dataLen = 0xffffffff;
}
return;
}
osGLOBAL bit32
tiTGTIOStart( tiRoot_t *tiRoot,
tiIORequest_t *tiIORequest,
bit32 dataOffset,
bit32 dataLength,
tiSgl_t *dataSGL,
void *sglVirtualAddr
)
{
ttdsaXchg_t *ttdsaXchg;
agsaSSPTargetRequest_t *agSSPTargetReq;
bit32 tiStatus;
bit32 saStatus;
bit32 tdStatus;
tdsaPortContext_t *onePortContext = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
TI_DBG4(("tiTGTIOStart: start\n"));
TI_DBG4(("tiTGTIOStart: dataLength 0x%x %d\n", dataLength, dataLength));
TI_DBG4(("tiTGTIOStart: dataOffset 0x%x %d\n", dataOffset, dataOffset));
ttdsaXchg = (ttdsaXchg_t *)tiIORequest->tdData;
oneDeviceData = ttdsaXchg->DeviceData;
onePortContext= oneDeviceData->tdPortContext;
if (onePortContext->valid == agFALSE)
{
TI_DBG1(("tiTGTIOStart: portcontext pid %d is invalid\n", onePortContext->id));
return tiError;
}
agSSPTargetReq
= &(ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq);
agSSPTargetReq->dataLength = (bit32) MIN(dataLength, ttdsaXchg->dataLen);
agSSPTargetReq->offset = dataOffset;
agSSPTargetReq->agTag = ttdsaXchg->tag;
if (ttdsaXchg->TLR == 2)
{
agSSPTargetReq->sspOption = 0;
}
else
{
agSSPTargetReq->sspOption = 0x1F;
}
ttdsaXchg->IORequestBody.IOType.TargetIO.TargetIOType.RegIO.sglVirtualAddr
= sglVirtualAddr;
if (agSSPTargetReq->dataLength != 0)
{
TI_DBG6(("tiTGTIOStart: pos 1\n"));
ttdsaXchg->IORequestBody.IOType.TargetIO.TargetIOType.RegIO.tiSgl1
= *dataSGL;
}
else
{
TI_DBG6(("tiTGTIOStart: pos 2\n"));
ttdsaXchg->IORequestBody.IOType.TargetIO.TargetIOType.RegIO.tiSgl1.len
= 0;
ttdsaXchg->IORequestBody.IOType.TargetIO.TargetIOType.RegIO.tiSgl1.type
= tiSgl;
if (ttdsaXchg->resp.length != 0)
{
TI_DBG4(("tiTGTIOStart: send respsonse\n"));
TI_DBG4(("tiTGTIOStart: resp.length 0x%x\n",
ttdsaXchg->resp.length));
ttdsaXchg->responseSent = agTRUE;
ttdsaXchg->DeviceData->IOResponse++;
TD_DEBUG_TRACE(ttdsaXchg, ttdsaXchg->DeviceData);
tdStatus = ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
if (tdStatus == AGSA_RC_SUCCESS)
{
return tiSuccess;
}
else if (tdStatus == AGSA_RC_FAILURE)
{
TI_DBG1(("tiTGTIOStart: (ttdsaSendResp) sending not successful\n"));
return tiError;
}
else
{
TI_DBG1(("tiTGTIOStart: (ttdsaSendResp) sending busy\n"));
return tiBusy;
}
}
}
tiStatus = ttdssIOPrepareSGL(tiRoot, &ttdsaXchg->IORequestBody, dataSGL, NULL, sglVirtualAddr);
if (tiStatus != tiSuccess)
{
TI_DBG1(("tiTGTIOStart: ttdIOPrepareSGL did not return success\n"));
return tiStatus;
}
TI_DBG4(("tiTGTIOStart: agroot %p ttdsaXchg %p\n", ttdsaXchg->agRoot, ttdsaXchg));
TI_DBG4(("tiTGTIOStart: agDevHanlde %p\n", ttdsaXchg->DeviceData->agDevHandle));
if ( (ttdsaXchg->readRspCollapsed == agTRUE) || (ttdsaXchg->wrtRspCollapsed == agTRUE) )
{
TI_DBG4(("tiTGTIOStart: read rsp collapse\n"));
TI_DBG4(("tiTGTIOStart: initiator tag 0x%x\n", ttdsaXchg->tag));
TD_XCHG_CONTEXT_NO_START_IO(tiRoot) = TD_XCHG_CONTEXT_NO_START_IO(tiRoot)+1;
ttdsaXchg->DeviceData->IOStart++;
TD_DEBUG_TRACE(ttdsaXchg, ttdsaXchg->DeviceData);
saStatus = saSSPStart(
ttdsaXchg->agRoot,
&ttdsaXchg->IORequestBody.agIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
ttdsaXchg->DeviceData->agDevHandle,
ttdsaXchg->readRspCollapsed ? AGSA_SSP_TGT_READ_GOOD_RESP : AGSA_SSP_TGT_WRITE_GOOD_RESP,
&ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody,
agNULL,
&ossaSSPCompleted
);
}
else
{
TI_DBG4(("tiTGTIOStart: normal\n"));
TI_DBG4(("tiTGTIOStart: initiator tag 0x%x\n", ttdsaXchg->tag));
TD_XCHG_CONTEXT_NO_START_IO(tiRoot) = TD_XCHG_CONTEXT_NO_START_IO(tiRoot)+1;
ttdsaXchg->DeviceData->IOStart++;
TD_DEBUG_TRACE(ttdsaXchg, ttdsaXchg->DeviceData);
saStatus = saSSPStart(
ttdsaXchg->agRoot,
&ttdsaXchg->IORequestBody.agIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
ttdsaXchg->DeviceData->agDevHandle,
ttdsaXchg->XchType,
&ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody,
agNULL,
&ossaSSPCompleted
);
}
if (saStatus == AGSA_RC_SUCCESS)
{
return tiSuccess;
}
else if (saStatus == AGSA_RC_FAILURE)
{
TI_DBG1(("tiTGTIOStart: sending not successful\n"));
return tiError;
}
else
{
TI_DBG1(("tiTGTIOStart: sending busy\n"));
return tiBusy;
}
}
#ifdef EDC_ENABLE
osGLOBAL bit32 tiTGTIOStartDif(
tiRoot_t *tiRoot,
tiIORequest_t *tiIORequest,
bit32 dataOffset,
bit32 dataLength,
tiSgl_t *dataSGL,
void *sglVirtualAddr,
tiDif_t *difOption
)
{
return tiBusy;
}
#endif
osGLOBAL bit32
ttdssIOPrepareSGL(
tiRoot_t *tiRoot,
tdIORequestBody_t *tdIORequestBody,
tiSgl_t *tiSgl1,
tiSgl_t *tiSgl2,
void *sglVirtualAddr
)
{
agsaSgl_t *agSgl;
TI_DBG6(("ttdssIOPrepareSGL: start\n"));
agSgl = &(tdIORequestBody->transport.SAS.agSASRequestBody.sspTargetReq.agSgl);
agSgl->len = 0;
if (tiSgl1 == agNULL)
{
TI_DBG1(("ttdssIOPrepareSGL: Error tiSgl1 is NULL\n"));
return tiError;
}
agSgl->sgUpper = tiSgl1->upper;
agSgl->sgLower = tiSgl1->lower;
agSgl->len = tiSgl1->len;
agSgl->extReserved = tiSgl1->type;
return tiSuccess;
}
void
dumpresp(bit8 *resp, bit32 len)
{
bit32 i;
for(i=0;i<len;i++)
{
TI_DBG4(("resp[%d] 0x%x\n", i, resp[i]));
}
return;
}
osGLOBAL bit32
ttdsaSendResp(
agsaRoot_t *agRoot,
ttdsaXchg_t *ttdsaXchg
)
{
tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData;
tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot;
tdsaDeviceData_t *oneDeviceData = agNULL;
bit32 agRequestType;
bit32 saStatus;
agsaSSPTargetResponse_t *agSSPTargetResp;
agRequestType = AGSA_SSP_TGT_CMD_OR_TASK_RSP;
TI_DBG4(("ttdsaSendResp: start\n"));
TI_DBG4(("ttdsaSendResp: agroot %p ttdsaXchg %p\n", ttdsaXchg->agRoot, ttdsaXchg));
TI_DBG4(("ttdsaSendResp:: agDevHanlde %p\n", ttdsaXchg->DeviceData->agDevHandle));
TI_DBG4(("ttdsaSendResp: len 0x%x \n",
ttdsaXchg->resp.length));
TI_DBG4(("ttdsaSendResp: upper 0x%x \n",
ttdsaXchg->resp.phyAddrUpper));
TI_DBG4(("ttdsaSendResp: lower 0x%x \n",
ttdsaXchg->resp.phyAddrLower));
TI_DBG4(("ttdsaSendResp: initiator tag 0x%x\n", ttdsaXchg->tag));
agSSPTargetResp = &(ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse);
agSSPTargetResp->agTag = ttdsaXchg->tag;
agSSPTargetResp->respBufLength = ttdsaXchg->resp.length;
agSSPTargetResp->respBufUpper = ttdsaXchg->resp.phyAddrUpper;
agSSPTargetResp->respBufLower = ttdsaXchg->resp.phyAddrLower;
agSSPTargetResp->respOption = 3;
#if defined (INITIATOR_DRIVER) && defined (TARGET_DRIVER)
#else
if (agSSPTargetResp->respBufLength <= AGSA_MAX_SSPPAYLOAD_VIA_SFO)
agSSPTargetResp->frameBuf = ttdsaXchg->resp.virtAddr;
else
agSSPTargetResp->frameBuf = NULL;
#endif
dumpresp((bit8 *)ttdsaXchg->resp.virtAddr, ttdsaXchg->resp.length);
TD_XCHG_CONTEXT_NO_SEND_RSP(TD_GET_TIROOT(agRoot)) =
TD_XCHG_CONTEXT_NO_SEND_RSP(TD_GET_TIROOT(agRoot))+1;
oneDeviceData = ttdsaXchg->DeviceData;
saStatus = saSSPStart(
ttdsaXchg->agRoot,
&ttdsaXchg->IORequestBody.agIORequest,
tdsaRotateQnumber(tiRoot, oneDeviceData),
ttdsaXchg->DeviceData->agDevHandle,
agRequestType,
&ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody,
agNULL,
&ossaSSPCompleted
);
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG4(("ttdsaSendResp: sending successful\n"));
return AGSA_RC_SUCCESS;
}
else if (saStatus == AGSA_RC_FAILURE)
{
TI_DBG1(("ttdsaSendResp: sending not successful\n"));
return AGSA_RC_FAILURE;
}
else
{
TI_DBG1(("ttdsaSendResp: sending busy\n"));
return AGSA_RC_BUSY;
}
}
osGLOBAL void
ttdsaIOCompleted(
agsaRoot_t *agRoot,
agsaIORequest_t *agIORequest,
bit32 agIOStatus,
bit32 agIOInfoLen,
agsaFrameHandle_t agFrameHandle,
bit32 agOtherInfo
)
{
ttdsaXchg_t *ttdsaXchg = (ttdsaXchg_t *)agIORequest->osData;
bit32 IOFailed = agFALSE;
bit32 status;
bit32 statusDetail = 0;
tiRoot_t *tiRoot;
#ifdef REMOVED
tdsaRoot_t *tdsaRoot;
tdsaContext_t *tdsaAllShared;
#endif
bit32 tdStatus;
bit32 saStatus = AGSA_RC_FAILURE;
#ifdef TD_DEBUG_ENABLE
agsaDifDetails_t *DifDetail;
#endif
TI_DBG4(("ttdsaIOCompleted: start\n"));
tiRoot = ((tdsaRootOsData_t *)agRoot->osData)->tiRoot;
#ifdef REMOVED
tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
#endif
#ifdef TD_DEBUG_ENABLE
DifDetail = (agsaDifDetails_t *)agFrameHandle;
#endif
if (tiRoot == agNULL)
{
TI_DBG1(("ttdsaIOCompleted: tiRoot is NULL\n"));
return;
}
TD_XCHG_CONTEXT_NO_IO_COMPLETED(tiRoot) = TD_XCHG_CONTEXT_NO_IO_COMPLETED(tiRoot)+1;
if(TD_XCHG_GET_STATE(ttdsaXchg) != TD_XCHG_STATE_ACTIVE)
{
TI_DBG1(("ttdsaIOCompleted: XCHG is not active *****************\n"));
return;
}
if (ttdsaXchg->isTMRequest != agTRUE)
{
TI_DBG6(("ttdsaIOCompleted: COMMAND \n"));
TI_DBG6(("ttdsaIOCompleted: ttdsaXchg %p\n", ttdsaXchg));
TI_DBG6(("ttdsaIOCompleted: ttdsaXchg->IORequestBody.EsglPageList %p\n", &ttdsaXchg->IORequestBody.EsglPageList));
TI_DBG6(("ttdsaIOCompleted: command initiator tag 0x%x\n", ttdsaXchg->tag));
#ifdef REMOVED
if (ttdsaXchg->usedEsgl == agTRUE)
{
tdsaFreeEsglPages(tiRoot, &ttdsaXchg->IORequestBody.EsglPageList);
ttdsaXchg->usedEsgl = agFALSE;
}
#endif
if (agIOStatus == OSSA_IO_SUCCESS)
{
TI_DBG6(("ttdsaIOCompleted: osIOSuccess\n"));
if ( (ttdsaXchg->readRspCollapsed == agTRUE) || (ttdsaXchg->wrtRspCollapsed == agTRUE) )
{
ttdsaXchg->responseSent = agTRUE;
TI_DBG4(("ttdsaIOCompleted: read rsp collapse\n"));
}
if (ttdsaXchg->statusSent == agTRUE)
{
if (ttdsaXchg->responseSent == agFALSE)
{
TI_DBG6(("ttdsaIOCompleted: sending response\n"));
TD_DEBUG_TRACE(ttdsaXchg, ttdsaXchg->DeviceData);
tdStatus = ttdsaSendResp(agRoot, ttdsaXchg);
if (tdStatus != AGSA_RC_SUCCESS)
{
TI_DBG1(("ttdsaIOCompleted: attention needed\n"));
return;
}
ttdsaXchg->responseSent = agTRUE;
}
else
{
TI_DBG4(("ttdsaIOCompleted: read rsp collapse and complete \n"));
TI_DBG6(("ttdsaIOCompleted: already sent response, notify OS\n"));
if (TD_XCHG_GET_STATE(ttdsaXchg) == TD_XCHG_STATE_INACTIVE)
{
TI_DBG1(("ttdsaIOCompleted: wrong DEQUEUE_THIS\n"));
}
TI_DBG4(("ttdsaIOCompleted: calling ostiTargetIOCompleted\n"));
ostiTargetIOCompleted( tiRoot,
ttdsaXchg->IORequestBody.tiIORequest,
tiIOSuccess );
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
else
{
TI_DBG4(("ttdsaIOCompleted: osIOSuccess: nextphase\n"));
ostiNextDataPhase(ttdsaXchg->tiRoot,
ttdsaXchg->IORequestBody.tiIORequest );
}
return;
}
if (agIOStatus == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH || agIOStatus == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH
|| agIOStatus == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH)
{
TI_DBG1(("ttdsaIOCompleted: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA));
}
switch (agIOStatus)
{
case OSSA_IO_ABORTED:
TI_DBG1(("ttdsaIOCompleted: ABORTED\n"));
status = tiIOFailed;
statusDetail = tiDetailAborted;
IOFailed = agTRUE;
break;
#ifdef REMOVED
case OSSA_IO_OVERFLOW:
TI_DBG1(("ttdsaIOCompleted: OVERFLOW\n"));
status = tiIOOverRun;
IOFailed = agTRUE;
break;
#endif
case OSSA_IO_UNDERFLOW:
TI_DBG1(("ttdsaIOCompleted: UNDERFLOW\n"));
status = tiIOUnderRun;
IOFailed = agTRUE;
break;
case OSSA_IO_ABORT_RESET:
TI_DBG1(("ttdsaIOCompleted: ABORT_RESET\n"));
status = tiIOFailed;
statusDetail = tiDetailAbortReset;
IOFailed = agTRUE;
break;
case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS:
TI_DBG1(("ttdsaIOCompleted: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n"));
status = tiIOEncryptError;
statusDetail = tiDetailDekKeyCacheMiss;
IOFailed = agTRUE;
break;
case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH:
TI_DBG1(("ttdsaIOCompleted: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n"));
status = tiIOEncryptError;
statusDetail = tiDetailDekKeyCacheMiss;
IOFailed = agTRUE;
break;
case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH:
TI_DBG1(("ttdsaIOCompleted: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n"));
status = tiIODifError;
statusDetail = tiDetailDifAppTagMismatch;
IOFailed = agTRUE;
break;
case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH:
TI_DBG1(("ttdsaIOCompleted: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n"));
status = tiIODifError;
statusDetail = tiDetailDifRefTagMismatch;
IOFailed = agTRUE;
break;
case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH:
TI_DBG1(("ttdsaIOCompleted: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n"));
status = tiIODifError;
statusDetail = tiDetailDifCrcMismatch;
IOFailed = agTRUE;
break;
case OSSA_IO_FAILED:
case OSSA_IO_NO_DEVICE:
case OSSA_IO_LINK_FAILURE:
case OSSA_IO_PROG_ERROR:
case OSSA_IO_DS_NON_OPERATIONAL:
case OSSA_IO_DS_IN_RECOVERY:
case OSSA_IO_TM_TAG_NOT_FOUND:
case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
default:
status = tiIOFailed;
statusDetail = tiDetailOtherError;
IOFailed = agTRUE;
TI_DBG1(("ttdsaIOCompleted: Fail!!!!!!! agIOStatus=0x%x agIOInfoLen=0x%x agOtherInfo=0x%x\n", agIOStatus, agIOInfoLen, agOtherInfo));
if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
{
TI_DBG1(("ttdsaIOCompleted: OSSA_IO_XFER_OPEN_RETRY_TIMEOUT ttdsaXchg->id 0x%x datalen 0x%x offset 0x%x agTag 0x%x\n",
ttdsaXchg->id,
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq.dataLength,
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq.offset,
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq.agTag));
TI_DBG1(("ttdsaIOCompleted: statusSent %d responseSent %d\n", ttdsaXchg->statusSent, ttdsaXchg->responseSent));
}
break;
}
if (IOFailed == agTRUE)
{
if (agIORequest->sdkData == agNULL)
{
tiIORequest_t tiIORequest;
TI_DBG1(("ttdsaIOCompleted: ERROR ttdsaXchg=%p agIOStatus= 0x%x\n",
ttdsaXchg,
agIOStatus ));
TI_DBG1(("CDB= 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n",
ttdsaXchg->agSSPCmndIU.cdb[0],
ttdsaXchg->agSSPCmndIU.cdb[1],
ttdsaXchg->agSSPCmndIU.cdb[2],
ttdsaXchg->agSSPCmndIU.cdb[3],
ttdsaXchg->agSSPCmndIU.cdb[4],
ttdsaXchg->agSSPCmndIU.cdb[5],
ttdsaXchg->agSSPCmndIU.cdb[6],
ttdsaXchg->agSSPCmndIU.cdb[7],
ttdsaXchg->agSSPCmndIU.cdb[8],
ttdsaXchg->agSSPCmndIU.cdb[9],
ttdsaXchg->agSSPCmndIU.cdb[10],
ttdsaXchg->agSSPCmndIU.cdb[11],
ttdsaXchg->agSSPCmndIU.cdb[12],
ttdsaXchg->agSSPCmndIU.cdb[13],
ttdsaXchg->agSSPCmndIU.cdb[14],
ttdsaXchg->agSSPCmndIU.cdb[15] ));
if (TD_XCHG_GET_STATE(ttdsaXchg) == TD_XCHG_STATE_INACTIVE)
{
TI_DBG1(("ttdsaIOCompleted: wrong DEQUEUE_THIS 1\n"));
}
if (ttdsaXchg->retries <= OPEN_RETRY_RETRIES && agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
{
TI_DBG2(("ttdsaIOCompleted: 1 loc retries on OSSA_IO_XFER_OPEN_RETRY_TIMEOUT\n"));
if ( (agOtherInfo & 0x1) == 1)
{
TI_DBG2(("ttdsaIOCompleted: 0 loc response retry\n"));
saStatus = ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG2(("ttdsaIOCompleted: 0 loc retried\n"));
ttdsaXchg->retries++;
}
else
{
TI_DBG1(("ttdsaIOCompleted: 0 loc retry failed\n"));
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
else if ( (ttdsaXchg->readRspCollapsed == agTRUE) || (ttdsaXchg->wrtRspCollapsed == agTRUE) )
{
saStatus = saSSPStart(
ttdsaXchg->agRoot,
&ttdsaXchg->IORequestBody.agIORequest,
0,
ttdsaXchg->DeviceData->agDevHandle,
ttdsaXchg->readRspCollapsed ? AGSA_SSP_TGT_READ_GOOD_RESP : AGSA_SSP_TGT_WRITE_GOOD_RESP,
&ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody,
agNULL,
&ossaSSPCompleted
);
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG1(("ttdsaIOCompleted: 1 loc retried\n"));
ttdsaXchg->retries++;
}
else
{
TI_DBG1(("ttdsaIOCompleted: 1 loc retry failed\n"));
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
else
{
if (ttdsaXchg->responseSent == agFALSE)
{
saStatus = saSSPStart(
ttdsaXchg->agRoot,
&ttdsaXchg->IORequestBody.agIORequest,
0,
ttdsaXchg->DeviceData->agDevHandle,
ttdsaXchg->XchType,
&ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody,
agNULL,
&ossaSSPCompleted
);
}
else
{
TI_DBG1(("ttdsaIOCompleted: 2 loc reponse retry\n"));
saStatus = ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
}
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG1(("ttdsaIOCompleted: 2 loc retried\n"));
ttdsaXchg->retries++;
}
else
{
TI_DBG1(("ttdsaIOCompleted: 2 loc retry failed\n"));
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
}
else
{
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
else
{
tiIORequest_t tiIORequest;
TI_DBG1(("ttdsaIOCompleted: 2\n"));
if (TD_XCHG_GET_STATE(ttdsaXchg) == TD_XCHG_STATE_INACTIVE)
{
TI_DBG1(("ttdsaIOCompleted: wrong DEQUEUE_THIS 2\n"));
}
if (ttdsaXchg->retries <= OPEN_RETRY_RETRIES && agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT)
{
TI_DBG1(("ttdsaIOCompleted: 2 loc retries on OSSA_IO_XFER_OPEN_RETRY_TIMEOUT\n"));
if ( (agOtherInfo & 0x1) == 1)
{
TI_DBG2(("ttdsaIOCompleted: 0 loc response retry\n"));
saStatus = ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG2(("ttdsaIOCompleted: 0 loc retried\n"));
ttdsaXchg->retries++;
}
else
{
TI_DBG1(("ttdsaIOCompleted: 0 loc retry failed\n"));
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
else if ( (ttdsaXchg->readRspCollapsed == agTRUE) || (ttdsaXchg->wrtRspCollapsed == agTRUE) )
{
saStatus = saSSPStart(
ttdsaXchg->agRoot,
&ttdsaXchg->IORequestBody.agIORequest,
0,
ttdsaXchg->DeviceData->agDevHandle,
ttdsaXchg->readRspCollapsed ? AGSA_SSP_TGT_READ_GOOD_RESP : AGSA_SSP_TGT_WRITE_GOOD_RESP,
&ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody,
agNULL,
&ossaSSPCompleted
);
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG1(("ttdsaIOCompleted: 1 loc retried\n"));
ttdsaXchg->retries++;
}
else
{
TI_DBG1(("ttdsaIOCompleted: 1 loc retry failed\n"));
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
else
{
TI_DBG1(("ttdsaIOCompleted: 2 loc ttdsaXchg->id 0x%x datalen 0x%x offset 0x%x agTag 0x%x\n",
ttdsaXchg->id,
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq.dataLength,
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq.offset,
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetReq.agTag));
if (ttdsaXchg->responseSent == agFALSE)
{
saStatus = saSSPStart(
ttdsaXchg->agRoot,
&ttdsaXchg->IORequestBody.agIORequest,
0,
ttdsaXchg->DeviceData->agDevHandle,
ttdsaXchg->XchType,
&ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody,
agNULL,
&ossaSSPCompleted
);
}
else
{
TI_DBG1(("ttdsaIOCompleted: 2 loc response retry\n"));
saStatus = ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
}
if (saStatus == AGSA_RC_SUCCESS)
{
TI_DBG1(("ttdsaIOCompleted: 2 loc retried\n"));
ttdsaXchg->retries++;
}
else
{
TI_DBG1(("ttdsaIOCompleted: 2 loc retry failed\n"));
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
}
else
{
TI_DBG1(("ttdsaIOCompleted: retry is over\n"));
ttdsaXchg->retries = 0;
tiIORequest = ttdsaXchg->IORequestBody.IOType.TargetIO.tiIORequest;
tiIORequest.tdData = agNULL;
ostiTargetIOError(
tiRoot,
&tiIORequest,
status,
statusDetail
);
ttdsaXchgFreeStruct(tiRoot,ttdsaXchg);
}
}
}
}
else
{
TI_DBG1(("ttdsaIOCompleted: TM request\n"));
TI_DBG1(("ttdsaIOCompleted: TM initiator tag 0x%x\n", ttdsaXchg->tag));
switch(agIOStatus)
{
case OSSA_IO_SUCCESS:
TI_DBG1(("ttdsaIOCompleted: success\n"));
status = tiIOSuccess;
break;
case OSSA_IO_ABORTED:
TI_DBG1(("ttdsaIOCompleted: ABORTED\n"));
status = tiIOFailed;
statusDetail = tiDetailAborted;
IOFailed = agTRUE;
break;
case OSSA_IO_ABORT_RESET:
TI_DBG1(("ttdsaIOCompleted: ABORT_RESET\n"));
status = tiIOFailed;
statusDetail = tiDetailAbortReset;
IOFailed = agTRUE;
break;
#ifdef REMOVED
case OSSA_IO_OVERFLOW:
#endif
case OSSA_IO_UNDERFLOW:
case OSSA_IO_FAILED:
#ifdef REMOVED
case OSSA_IO_NOT_VALID:
#endif
case OSSA_IO_NO_DEVICE:
case OSSA_IO_LINK_FAILURE:
case OSSA_IO_PROG_ERROR:
case OSSA_IO_DS_NON_OPERATIONAL:
case OSSA_IO_DS_IN_RECOVERY:
case OSSA_IO_TM_TAG_NOT_FOUND:
case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE:
default:
status = tiIOFailed;
statusDetail = tiDetailOtherError;
IOFailed = agTRUE;
break;
}
if (ttdsaXchg->io_found == agTRUE)
{
ostiTargetTmCompleted(
tiRoot,
ttdsaXchg->IORequestBody.tiIORequest,
status,
statusDetail
);
}
ttdsaXchgFreeStruct(tiRoot, ttdsaXchg);
}
return;
}
osGLOBAL void
ttdsaTMProcess(
tiRoot_t *tiRoot,
ttdsaXchg_t *ttdsaXchg
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
ttdsaTgt_t *Target = (ttdsaTgt_t *)tdsaAllShared->ttdsaTgt;
agsaSSPScsiTaskMgntReq_t *agTMIU;
bit8 TMFun;
bit32 tiTMFun;
tiIORequest_t *reftiIORequest = agNULL;
tdList_t *IOList;
bit32 IOFound = agFALSE;
ttdsaXchg_t *tmp_ttdsaXchg = agNULL;
agsaRoot_t *agRoot = (agsaRoot_t *)&(tdsaAllShared->agRootNonInt);
agsaIORequest_t *agIORequest = agNULL;
agsaIORequest_t *agIOAbortRequest = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
agsaDevHandle_t *agDevHandle = agNULL;
TI_DBG1(("ttdsaTMProcess: start\n"));
ttdsaXchg->isTMRequest = agTRUE;
agTMIU = (agsaSSPScsiTaskMgntReq_t *)&(ttdsaXchg->agTMIU);
TMFun = agTMIU->taskMgntFunction;
switch (TMFun)
{
case AGSA_ABORT_TASK:
TI_DBG1(("ttdsaTMProcess: ABORT_TASK\n"));
tiTMFun = AG_ABORT_TASK;
break;
case AGSA_ABORT_TASK_SET:
TI_DBG1(("ttdsaTMProcess: ABORT_TASK_SET\n"));
tiTMFun = AG_ABORT_TASK_SET;
break;
case AGSA_CLEAR_TASK_SET:
TI_DBG1(("ttdsaTMProcess: CLEAR_TASK_SET\n"));
tiTMFun = AG_CLEAR_TASK_SET;
break;
case AGSA_LOGICAL_UNIT_RESET:
TI_DBG1(("ttdsaTMProcess: LOGICAL_UNIT_RESET\n"));
tiTMFun = AG_LOGICAL_UNIT_RESET;
break;
case AGSA_CLEAR_ACA:
TI_DBG1(("ttdsaTMProcess: CLEAR_ACA\n"));
tiTMFun = AG_CLEAR_ACA;
break;
case AGSA_QUERY_TASK:
TI_DBG1(("ttdsaTMProcess: QUERY_TASK\n"));
tiTMFun = AG_QUERY_TASK;
break;
default:
TI_DBG1(("ttdsaTMProcess: RESERVED TM 0x%x %d\n", TMFun, TMFun));
tiTMFun = 0xff;
break;
}
if (TMFun == AGSA_ABORT_TASK)
{
TI_DBG1(("ttdsaTMProcess: if abort task; to be tested \n"));
IOList = Target->ttdsaXchgData.xchgBusyList.flink;
IOFound = agFALSE;
while (IOList != &Target->ttdsaXchgData.xchgBusyList)
{
tmp_ttdsaXchg = TDLIST_OBJECT_BASE(ttdsaXchg_t, XchgLinks, IOList);
if (tmp_ttdsaXchg->tag == agTMIU->tagOfTaskToBeManaged)
{
TI_DBG1(("ttdsaTMProcess: tag 0x%x\n",tmp_ttdsaXchg->tag));
IOFound = agTRUE;
break;
}
IOList = IOList->flink;
}
if (IOFound == agTRUE)
{
TI_DBG1(("ttdsaTMProcess: found \n"));
TI_DBG1(("ttdsaTMProcess: loc 1\n"));
agIOAbortRequest = (agsaIORequest_t *)&(ttdsaXchg->IORequestBody.agIORequest);
agIORequest = (agsaIORequest_t *)&(tmp_ttdsaXchg->IORequestBody.agIORequest);
oneDeviceData = tmp_ttdsaXchg->DeviceData;
agDevHandle = oneDeviceData->agDevHandle;
if (agIORequest == agNULL)
{
TI_DBG1(("ttdsaTMProcess: agIORequest is NULL\n"));
}
else
{
TI_DBG1(("ttdsaTMProcess: agIORequest is NOT NULL\n"));
if (agIORequest->sdkData == agNULL)
{
TI_DBG1(("ttdsaTMProcess: agIORequest->saData is NULL\n"));
}
else
{
TI_DBG1(("ttdsaTMProcess: agIORequest->saData is NOT NULL\n"));
#ifdef RPM_SOC
saSSPAbort(agRoot, agIORequest);
#else
saSSPAbort(agRoot, agIOAbortRequest,0,agDevHandle,0,agIORequest, agNULL);
#endif
}
}
}
else
{
ttdsaXchg->io_found = agFALSE;
tiTGTSendTmResp(tiRoot,
ttdsaXchg->IORequestBody.tiIORequest,
tiError );
TI_DBG1(("ttdsaTMProcess: ABORT_TASK not found\n"));
return;
}
}
TI_DBG1(("ttdsaTMProcess: calling ostiTaskManagement\n"));
ostiTaskManagement(
tiRoot,
tiTMFun,
ttdsaXchg->agTMIU.lun,
reftiIORequest,
ttdsaXchg->IORequestBody.tiIORequest,
&ttdsaXchg->DeviceData->tiDeviceHandle
);
return;
}
osGLOBAL bit32
tiTGTIOAbort (
tiRoot_t *tiRoot,
tiIORequest_t *taskTag
)
{
ttdsaXchg_t *ttdsaXchg;
ttdsaXchg_t *ttdsaIOAbortXchg;
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
agsaRoot_t *agRoot = (agsaRoot_t *)&(tdsaAllShared->agRootNonInt);
agsaIORequest_t *agIORequest = agNULL;
agsaIORequest_t *agIOAbortRequest = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
agsaDevHandle_t *agDevHandle = agNULL;
TI_DBG1(("tiTGTIOAbort: start\n"));
ttdsaXchg = (ttdsaXchg_t *)taskTag->tdData;
if (ttdsaXchg == agNULL)
{
TI_DBG1(("tiTGTIOAbort: IOError 1 \n"));
ostiTargetIOError(
tiRoot,
taskTag,
tiIOFailed,
tiDetailAborted
);
}
else if (ttdsaXchg->IORequestBody.agIORequest.sdkData == agNULL)
{
TI_DBG1(("tiTGTIOAbort: IOError 2 \n"));
if (TD_XCHG_GET_STATE(ttdsaXchg) == TD_XCHG_STATE_INACTIVE)
{
TI_DBG1(("tiTGTIOAbort: wrong DEQUEUE_THIS\n"));
}
TI_DBG1(("tiTGTIOAbort: IOError 3\n"));
ostiTargetIOError(
tiRoot,
taskTag,
tiIOFailed,
tiDetailAborted
);
TI_DBG1(("tiTGTIOAbort: IOError 4\n"));
ttdsaXchgFreeStruct(
ttdsaXchg->tiRoot,
ttdsaXchg
);
TI_DBG1(("tiTGTIOAbort: IOError 5\n"));
}
else
{
TI_DBG1(("tiTGTIOAbort: aborting; to be tested \n"));
ttdsaIOAbortXchg = ttdsaXchgGetStruct(agRoot);
if (ttdsaIOAbortXchg == agNULL)
{
TI_DBG1(("tiTGTIOAbort: no free xchg structures\n"));
return tiError;
}
ttdsaIOAbortXchg->agRoot = agRoot;
ttdsaIOAbortXchg->tiRoot = tiRoot;
agIOAbortRequest= &(ttdsaXchg->IORequestBody.agIORequest);
ttdsaIOAbortXchg->tiIOToBeAbortedRequest = taskTag;
ttdsaIOAbortXchg->XchgToBeAborted = ttdsaXchg;
ttdsaXchg->oslayerAborting = agTRUE;
agIORequest = (agsaIORequest_t *)&(ttdsaXchg->IORequestBody.agIORequest);
oneDeviceData = ttdsaXchg->DeviceData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("tiTGTIOAbort: oneDeviceData is null; wrong\n"));
}
else
{
agDevHandle = oneDeviceData->agDevHandle;
ttdsaIOAbortXchg->DeviceData = oneDeviceData;
}
#ifdef RPM_SOC
saSSPAbort(agRoot, agIORequest);
#else
saSSPAbort(agRoot, agIOAbortRequest,0,agDevHandle,0,agIORequest, agNULL);
}
return tiSuccess;
}
osGLOBAL bit32
tiTGTIOAbortAll(
tiRoot_t *tiRoot,
tiDeviceHandle_t *tiDeviceHandle
)
{
agsaRoot_t *agRoot = agNULL;
tdsaDeviceData_t *oneDeviceData = agNULL;
bit32 status = tiError;
TI_DBG3(("tiTGTIOAbortAll: start\n"));
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData == agNULL)
{
TI_DBG1(("tiTGTIOAbortAll: oneDeviceData is NULL!!!\n"));
return tiError;
}
if (oneDeviceData->valid != agTRUE || oneDeviceData->registered != agTRUE ||
oneDeviceData->tdPortContext == agNULL )
{
TI_DBG1(("tiTGTIOAbortAll: NO Device did %d\n", oneDeviceData->id ));
TI_DBG1(("tiTGTIOAbortAll: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG1(("tiTGTIOAbortAll: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
return tiError;
}
agRoot = oneDeviceData->agRoot;
if (agRoot == agNULL)
{
TI_DBG1(("tiTGTIOAbortAll: agRoot is NULL!!!\n"));
return tiError;
}
oneDeviceData->OSAbortAll = agTRUE;
status = tdsaAbortAll(tiRoot, agRoot, oneDeviceData);
return status;
}
osGLOBAL bit32
tiTGTSendTmResp(
tiRoot_t *tiRoot,
tiIORequest_t *tiTMRequest,
bit32 status
)
{
ttdsaXchg_t *ttdsaXchg;
sas_resp_t *SASResp;
bit32 tdStatus;
TI_DBG1(("tiTGTSendTmResp: start 1\n"));
ttdsaXchg = (ttdsaXchg_t *)tiTMRequest->tdData;
TI_DBG1(("tiTGTSendTmResp: start 2\n"));
SASResp = (sas_resp_t *)ttdsaXchg->resp.virtAddr;
TI_DBG1(("tiTGTSendTmResp: start 3\n"));
if (ttdsaXchg->FrameType == SAS_TM)
{
SASResp->agResp.status = 0;
SASResp->agResp.dataPres = RESPONSE_DATA;
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.responsedataLen, 0, RESPONSE_DATA_LEN);
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.senseDataLen, 0, 0);
switch (status)
{
case tiSuccess:
TI_DBG2(("tiTGTSendTmResp: tiSuccess\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED;
break;
case tiError:
TI_DBG1(("tiTGTSendTmResp: tiError\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
case tiBusy:
TI_DBG1(("tiTGTSendTmResp: tibusy\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
case tiIONoDevice:
TI_DBG1(("tiTGTSendTmResp: tiionodevicee\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
case tiMemoryTooLarge:
TI_DBG1(("tiTGTSendTmResp: timemorytoolarge\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
case tiMemoryNotAvail:
TI_DBG1(("tiTGTSendTmResp: timemorynotavail\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
case tiInvalidHandle:
TI_DBG1(("tiTGTSendTmResp: tiinvalidhandle\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
case tiNotSupported:
TI_DBG1(("tiTGTSendTmResp: tiNotsupported\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_NOT_SUPPORTED;
break;
case tiReject:
TI_DBG1(("tiTGTSendTmResp: tireject\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
case tiIncorrectLun:
TI_DBG1(("tiTGTSendTmResp: tiincorrectlun\n"));
SASResp->RespData[3] = AGSA_INCORRECT_LOGICAL_UNIT_NUMBER;
break;
default:
TI_DBG1(("tiTGTSendTmResp: default\n"));
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_FAILED;
break;
}
ttdsaXchg->resp.length = sizeof(agsaSSPResponseInfoUnit_t) + RESPONSE_DATA_LEN;
ttdsaXchg->statusSent = agTRUE;
}
else
{
TI_DBG1(("tiTGTSendTmResp: not TM frame\n"));
return tiError;
}
tdStatus = ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
if (tdStatus == AGSA_RC_SUCCESS)
{
TI_DBG1(("tiTGTSendTmResp: send success\n"));
return tiSuccess;
}
else if (tdStatus == AGSA_RC_FAILURE)
{
TI_DBG1(("tiTGTSendTmResp: sending not successful\n"));
return tiError;
}
else
{
TI_DBG1(("tiTGTSendTmResp: send busy\n"));
return tiBusy;
}
#ifdef REMOVED
tiTGTSetResp(tiRoot, tiTMRequest, 0, 0, 0);
#endif
#ifdef REMOVED
if (ttdsaXchg->resp.length != 0)
{
TI_DBG1(("tiTGTSendTmResp: respsonse is set \n"));
TI_DBG1(("tiTGTSendTmResp: resp.length 0x%x\n",
ttdsaXchg->resp.length));
ttdsaXchg->responseSent = agTRUE;
ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
}
else
{
TI_DBG1(("tiTGTSendTmResp: direct call\n"));
tiTGTSetResp(tiRoot, tiTMRequest, 0, 0, 0);
ttdsaXchg->responseSent = agTRUE;
ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
}
#define TASK_MANAGEMENT_FUNCTION_COMPLETE 0x0
#define INVALID_FRAME 0x2
#define TASK_MANAGEMENT_FUNCTION_NOT_SUPPORTED 0x4
#define TASK_MANAGEMENT_FUNCTION_FAILED 0x5
#define TASK_MANAGEMENT_FUNCTION_SUCCEEDED 0x8
#define INVALID_LOGICAL_UNIT_NUMBER 0x9
#endif
}
osGLOBAL void *tiTGTSenseBufferGet( tiRoot_t *tiRoot,
tiIORequest_t *tiIORequest,
bit32 length
)
{
ttdsaXchg_t *ttdsaXchg;
ttdsaXchg = (ttdsaXchg_t *)tiIORequest->tdData;
TI_DBG4(("tiTGTSenseBufferGet: start\n"));
OS_ASSERT((length <= 64), "length too big in tiTGTSenseBufferGet");
return &ttdsaXchg->resp.virtAddr[sizeof(agsaSSPResponseInfoUnit_t)];
}
osGLOBAL void
tiTGTSetResp( tiRoot_t *tiRoot,
tiIORequest_t *tiIORequest,
bit32 dataSentLength,
bit8 ScsiStatus,
bit32 senseLength
)
{
ttdsaXchg_t *ttdsaXchg;
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *)tiRoot->tdData;
#ifdef REMOVED
agsaSSPTargetResponse_t *agSSPTargetResp;
#endif
sas_resp_t *SASResp;
bit32 TotalRespLen = 0;
TI_DBG4 (("tiTGTSetResp: start\n"));
TI_DBG4 (("tiTGTSetResp: datelen %d senselen %d\n", dataSentLength, senseLength));
ttdsaXchg = (ttdsaXchg_t *)tiIORequest->tdData;
SASResp = (sas_resp_t *)ttdsaXchg->resp.virtAddr;
SASResp->agResp.status = ScsiStatus;
if (ttdsaXchg->FrameType == SAS_TM)
{
TI_DBG1(("tiTGTSetResp: TM\n"));
if (senseLength != 0)
{
TI_DBG1 (("tiTGTSetResp: non-zero sensedatalen for TM\n"));
return;
}
SASResp->agResp.dataPres = RESPONSE_DATA;
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.responsedataLen, 0, RESPONSE_DATA_LEN);
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.senseDataLen, 0, 0);
SASResp->RespData[3] = AGSA_TASK_MANAGEMENT_FUNCTION_NOT_SUPPORTED;
TotalRespLen = sizeof(agsaSSPResponseInfoUnit_t) + RESPONSE_DATA_LEN;
}
else
{
if (senseLength == 0)
{
TI_DBG4 (("tiTGTSetResp: CMND, no data\n"));
SASResp->agResp.dataPres = NO_DATA;
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.responsedataLen, 0, 0);
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.senseDataLen, 0, 0);
TotalRespLen = sizeof(agsaSSPResponseInfoUnit_t);
if (ttdsaXchg->XchType == AGSA_SSP_TGT_READ_DATA)
{
TI_DBG4(("tiTGTSetResp: read rsp collapse\n"));
if (tdsaRoot->autoGoodRSP & READ_GOOD_RESPONSE)
ttdsaXchg->readRspCollapsed = agTRUE;
}
if (ttdsaXchg->XchType == AGSA_SSP_TGT_WRITE_DATA)
{
TI_DBG4(("tiTGTSetResp: write rsp collapse\n"));
if (tdsaRoot->autoGoodRSP & WRITE_GOOD_RESPONSE)
{
if (tiIS_SPC(TI_TIROOT_TO_AGROOT(tiRoot)))
{
ttdsaXchg->wrtRspCollapsed = agFALSE;
}
else
{
ttdsaXchg->wrtRspCollapsed = agTRUE;
}
}
}
}
else
{
TI_DBG4 (("tiTGTSetResp: CMND, sense data\n"));
SASResp->agResp.dataPres = SENSE_DATA;
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.responsedataLen, 0, 0);
OSSA_WRITE_BE_32(agRoot, SASResp->agResp.senseDataLen, 0, senseLength);
TotalRespLen = sizeof(agsaSSPResponseInfoUnit_t) + senseLength;
}
}
ttdsaXchg->statusSent = agTRUE;
TI_DBG4(("tiTGTSetResp: ttdsaXchg %p\n", ttdsaXchg));
TI_DBG4(("tiTGTSetResp: TotalRespLen 0x%x \n", TotalRespLen));
TI_DBG4(("tiTGTSetResp: upper 0x%x \n",
ttdsaXchg->resp.phyAddrUpper));
TI_DBG4(("tiTGTSetResp: lower 0x%x \n",
ttdsaXchg->resp.phyAddrLower));
ttdsaXchg->resp.length = TotalRespLen;
dumpresp((bit8 *)ttdsaXchg->resp.virtAddr, ttdsaXchg->resp.length);
#ifdef REMOVED
if (ttdsaXchg->FrameType == SAS_TM)
{
TI_DBG1(("tiTGTSetResp: respsonse is set \n"));
TI_DBG1(("tiTGTSetResp: resp.length 0x%x\n",
ttdsaXchg->resp.length));
ttdsaSendResp(ttdsaXchg->agRoot, ttdsaXchg);
}
#endif
#ifdef REMOVED
agSSPTargetResp =
&(ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse);
agSSPTargetResp->agTag = ttdsaXchg->tag;
agSSPTargetResp->respBufLength = TotalRespLen;
agSSPTargetResp->respBufUpper
= ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse.respBufUpper;
agSSPTargetResp->respBufLower
= ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse.respBufLower;
TI_DBG4(("tiTGTSetResp: len 0x%x \n",
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse.respBufLength));
TI_DBG4(("tiTGTSetResp: upper 0x%x \n",
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse.respBufUpper));
TI_DBG4(("tiTGTSetResp: lower 0x%x \n",
ttdsaXchg->IORequestBody.transport.SAS.agSASRequestBody.sspTargetResponse.respBufLower));
#endif
return;
}
osGLOBAL bit32
tiTGTGetDeviceHandles(
tiRoot_t *tiRoot,
tiPortalContext_t *tiPortalContext,
tiDeviceHandle_t *tiDev[],
bit32 maxDevs
)
{
tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData;
tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared;
ttdsaTgt_t *Target = (ttdsaTgt_t *)tdsaAllShared->ttdsaTgt;
bit32 deviceToReturn;
bit32 devicePresent=0;
bit32 deviceIndex=0;
tdList_t *PortContextList;
tdsaPortContext_t *onePortContext = agNULL;
tdList_t *DeviceListList;
tdsaDeviceData_t *oneDeviceData = agNULL;
bit32 found = agFALSE;
TI_DBG4 (("tiTGTGetDeviceHandles: start\n"));
if (maxDevs > Target->OperatingOption.MaxTargets)
{
deviceToReturn = Target->OperatingOption.MaxTargets;
}
else
{
deviceToReturn = maxDevs;
}
PortContextList = tdsaAllShared->MainPortContextList.flink;
while (PortContextList != &(tdsaAllShared->MainPortContextList))
{
onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList);
if (onePortContext->tiPortalContext == tiPortalContext)
{
TI_DBG4(("tiTGTGetDeviceHandles: found; oneportContext ID %d\n", onePortContext->id));
found = agTRUE;
break;
}
PortContextList = PortContextList->flink;
}
if (found == agFALSE)
{
TI_DBG4(("tiTGTGetDeviceHandles: No corressponding tdsaPortContext\n"));
return 0;
}
DeviceListList = tdsaAllShared->MainDeviceList.flink;
while (DeviceListList != &(tdsaAllShared->MainDeviceList))
{
oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, MainLink, DeviceListList);
TI_DBG4(("tiTGTGetDeviceHandles: pid %d did %d\n", onePortContext->id, oneDeviceData->id));
TI_DBG4(("tiTGTGetDeviceHandles: device AddrHi 0x%08x\n", oneDeviceData->SASAddressID.sasAddressHi));
TI_DBG4(("tiTGTGetDeviceHandles: device AddrLo 0x%08x\n", oneDeviceData->SASAddressID.sasAddressLo));
TI_DBG4(("tiTGTGetDeviceHandles: handle %p\n", &(oneDeviceData->tiDeviceHandle)));
if (oneDeviceData->valid == agTRUE)
{
TI_DBG4(("tiTGTGetDeviceHandles: valid deviceindex %d devicePresent %d\n", deviceIndex, devicePresent));
tiDev[deviceIndex] = &(oneDeviceData->tiDeviceHandle);
devicePresent++;
}
else
{
tiDev[deviceIndex] = agNULL;
TI_DBG4(("tiTGTGetDeviceHandles: not valid deviceindex %d devicePresent %d\n", deviceIndex, devicePresent));
}
deviceIndex++;
if (devicePresent >= deviceToReturn )
{
break;
}
DeviceListList = DeviceListList->flink;
}
return devicePresent;
}
osGLOBAL bit32
tiTGTGetDeviceInfo(
tiRoot_t *tiRoot,
tiDeviceHandle_t *tiDeviceHandle,
tiDeviceInfo_t *tiDeviceInfo)
{
tdsaDeviceData_t *oneDeviceData = agNULL;
TI_DBG4 (("tiTGTGetDeviceInfo: start\n"));
if (tiDeviceHandle == agNULL)
{
TI_DBG4 (("tiTGTGetDeviceInfo: tiDeviceHandle is NULL\n"));
return tiError;
}
oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData;
if (oneDeviceData == agNULL)
{
TI_DBG4 (("tiTGTGetDeviceInfo: oneDeviceData is NULL\n"));
return tiError;
}
if (oneDeviceData->registered == agTRUE)
{
tiDeviceInfo->info.devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate;
}
else
{
tiDeviceInfo->info.devType_S_Rate = oneDeviceData->agDeviceInfo.devType_S_Rate & 0x0f;
}
tiDeviceInfo->remoteName = (char *)&(oneDeviceData->tdPortContext->sasRemoteAddressHi);
tiDeviceInfo->remoteAddress = (char *)&(oneDeviceData->tdPortContext->sasRemoteAddressLo);
tiDeviceInfo->localName = (char *)&(oneDeviceData->tdPortContext->sasLocalAddressHi);
tiDeviceInfo->localAddress = (char *)&(oneDeviceData->tdPortContext->sasLocalAddressLo);
return tiSuccess;
}
osGLOBAL void
ttdssIOAbortedHandler (
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;
tdIORequestBody_t *tdIORequestBody;
TI_DBG1(("itdssIOAbortedHandler: start\n"));
tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData;
if (agIOStatus != OSSA_IO_ABORTED)
{
TI_DBG1(("itdssIOAbortedHandler: incorrect agIOStatus 0x%x\n", agIOStatus));
}
ostiTargetIOError(
tiRoot,
tdIORequestBody->tiIORequest,
tiIOFailed,
tiDetailAborted
);
return;
}