1285242Sachim/******************************************************************************* 2285242Sachim** 3285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 4285242Sachim* 5285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided 6285242Sachim*that the following conditions are met: 7285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 8285242Sachim*following disclaimer. 9285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice, 10285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided 11285242Sachim*with the distribution. 12285242Sachim* 13285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 14285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 15285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 16285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 17285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 18285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 19285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 20285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 21285242Sachim** 22285242Sachim********************************************************************************/ 23285242Sachim/*****************************************************************************/ 24285242Sachim/** \file 25285242Sachim * 26285242Sachim * This file contains initiator CB functions 27285242Sachim * 28285242Sachim */ 29285242Sachim#include <sys/cdefs.h> 30285242Sachim__FBSDID("$FreeBSD$"); 31285242Sachim#include <dev/pms/config.h> 32285242Sachim 33285242Sachim#include <dev/pms/freebsd/driver/common/osenv.h> 34285242Sachim#include <dev/pms/freebsd/driver/common/ostypes.h> 35285242Sachim#include <dev/pms/freebsd/driver/common/osdebug.h> 36285242Sachim 37285242Sachim#include <dev/pms/RefTisa/sallsdk/api/sa.h> 38285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saapi.h> 39285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saosapi.h> 40285242Sachim 41285242Sachim#include <dev/pms/RefTisa/tisa/api/titypes.h> 42285242Sachim#include <dev/pms/RefTisa/tisa/api/ostiapi.h> 43285242Sachim#include <dev/pms/RefTisa/tisa/api/tiapi.h> 44285242Sachim#include <dev/pms/RefTisa/tisa/api/tiglobal.h> 45285242Sachim 46285242Sachim#ifdef FDS_SM 47285242Sachim#include <dev/pms/RefTisa/sat/api/sm.h> 48285242Sachim#include <dev/pms/RefTisa/sat/api/smapi.h> 49285242Sachim#include <dev/pms/RefTisa/sat/api/tdsmapi.h> 50285242Sachim#endif 51285242Sachim 52285242Sachim#ifdef FDS_DM 53285242Sachim#include <dev/pms/RefTisa/discovery/api/dm.h> 54285242Sachim#include <dev/pms/RefTisa/discovery/api/dmapi.h> 55285242Sachim#include <dev/pms/RefTisa/discovery/api/tddmapi.h> 56285242Sachim#endif 57285242Sachim 58285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h> 59285242Sachim#include <dev/pms/freebsd/driver/common/osstring.h> 60285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h> 61285242Sachim 62285242Sachim#ifdef INITIATOR_DRIVER 63285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h> 64285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h> 65285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h> 66285242Sachim#endif 67285242Sachim 68285242Sachim#ifdef TARGET_DRIVER 69285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h> 70285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h> 71285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h> 72285242Sachim#endif 73285242Sachim 74285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h> 75285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h> 76285242Sachim 77285242Sachim/***************************************************************************** 78285242Sachim*! \brief itdssTaskCompleted 79285242Sachim* 80285242Sachim* Purpose: This routine is called to complete an task management request 81285242Sachim* previously issued to the LL Layer. All task management completes with 82285242Sachim* this function except query task management. 83285242Sachim* 84285242Sachim* \param agRoot: Pointer to driver Instance. 85285242Sachim* \param agIORequest: Pointer to the I/O Request data structure for 86285242Sachim* this I/O. 87285242Sachim* \param agIOStatus: Status of I/O just completed. 88285242Sachim* \param agIOInfoLen: Length of the I/O information associated with this 89285242Sachim* I/O request 90285242Sachim* \param agParam A Handle used to refer to the response frame or handle 91285242Sachim* of abort request 92285242Sachim* \param agOtherInfo Residual count 93285242Sachim* \return: None 94285242Sachim* 95285242Sachim* \note - This is a initiator specific function called by the jump table. 96285242Sachim* 97285242Sachim*****************************************************************************/ 98285242SachimosGLOBAL void 99285242SachimitdssTaskCompleted( 100285242Sachim agsaRoot_t *agRoot, 101285242Sachim agsaIORequest_t *agIORequest, 102285242Sachim bit32 agIOStatus, 103285242Sachim bit32 agIOInfoLen, 104285242Sachim void *agParam, 105285242Sachim bit32 agOtherInfo 106285242Sachim ) 107285242Sachim{ 108285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 109285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 110285242Sachim tiIORequest_t *taskTag = agNULL, *currentTaskTag = agNULL; 111285242Sachim tdIORequestBody_t *tdIORequestBody = agNULL; 112285242Sachim tdIORequestBody_t *TMtdIORequestBody = agNULL; 113285242Sachim tdIORequestBody_t *AborttdIORequestBody = agNULL; 114285242Sachim agsaIORequest_t *agTaskedIORequest; 115285242Sachim agsaSSPResponseInfoUnit_t agSSPRespIU; 116285242Sachim bit8 respData[128]; 117285242Sachim bit32 respLen; 118285242Sachim#ifdef TD_DEBUG_ENABLE 119285242Sachim bit32 data_status; 120285242Sachim#endif 121285242Sachim agsaSASRequestBody_t *agSASRequestBody = agNULL; 122285242Sachim agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest = agNULL; 123285242Sachim agsaIORequest_t *agAbortIORequest; 124285242Sachim tdIORequestBody_t *tdAbortIORequestBody; 125285242Sachim bit32 PhysUpper32; 126285242Sachim bit32 PhysLower32; 127285242Sachim bit32 memAllocStatus; 128285242Sachim void *osMemHandle; 129285242Sachim bit32 abortOrquery = agTRUE; 130285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 131285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 132285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 133285242Sachim bit32 status = AGSA_RC_FAILURE; 134285242Sachim 135285242Sachim TI_DBG2(("itdssTaskCompleted: start\n")); 136285242Sachim 137285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 138285242Sachim 139285242Sachim /* check the agIOStatus */ 140285242Sachim currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag; 141285242Sachim 142285242Sachim if (currentTaskTag == agNULL) 143285242Sachim { 144285242Sachim TI_DBG1(("itdssTaskCompleted: currentTaskTag is NULL \n")); 145285242Sachim /* as the currentTaskTag is agNULL, shall not call ostiInitiatorEvent */ 146285242Sachim #if 0 147285242Sachim ostiInitiatorEvent( tiRoot, 148285242Sachim NULL, 149285242Sachim NULL, 150285242Sachim tiIntrEventTypeTaskManagement, 151285242Sachim tiTMFailed, 152285242Sachim currentTaskTag ); 153285242Sachim #endif 154285242Sachim /* free up allocated memory */ 155285242Sachim ostiFreeMemory( 156285242Sachim tiRoot, 157285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 158285242Sachim sizeof(tdIORequestBody_t) 159285242Sachim ); 160285242Sachim return; 161285242Sachim } 162285242Sachim 163285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 164285242Sachim { 165285242Sachim TI_DBG1(("itdssTaskCompleted: agIOStatus failed and tiTMFailed\n")); 166285242Sachim if (agIOStatus == OSSA_IO_TM_TAG_NOT_FOUND) 167285242Sachim { 168285242Sachim TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_TM_TAG_NOT_FOUND\n")); 169285242Sachim } 170285242Sachim else 171285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 172285242Sachim { 173285242Sachim TI_DBG1(("itdssTaskCompleted: agIOStatus OSSA_IO_ABORTED\n")); 174285242Sachim } 175285242Sachim else 176285242Sachim { 177285242Sachim TI_DBG1(("itdssTaskCompleted: agIOStatus 0x%x\n", agIOStatus)); 178285242Sachim } 179285242Sachim ostiInitiatorEvent( tiRoot, 180285242Sachim NULL, 181285242Sachim NULL, 182285242Sachim tiIntrEventTypeTaskManagement, 183285242Sachim tiTMFailed, 184285242Sachim currentTaskTag ); 185285242Sachim /* free up allocated memory */ 186285242Sachim ostiFreeMemory( 187285242Sachim tiRoot, 188285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 189285242Sachim sizeof(tdIORequestBody_t) 190285242Sachim ); 191285242Sachim return; 192285242Sachim } 193285242Sachim 194285242Sachim /* parse the task management response */ 195285242Sachim /* reads agsaSSPResponseInfoUnit_t */ 196285242Sachim saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t)); 197285242Sachim#ifdef TD_DEBUG_ENABLE 198285242Sachim data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU); 199285242Sachim#endif 200285242Sachim respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU); 201285242Sachim TI_DBG6(("itdssTaskCompleted: dataPres %d. should be 1\n", data_status)); 202285242Sachim /* reads response data */ 203285242Sachim saFrameReadBlock(agRoot, agParam, 204285242Sachim sizeof(agsaSSPResponseInfoUnit_t), 205285242Sachim respData, respLen); 206285242Sachim TI_DBG6(("itdssTaskCompleted: res code %d. should be 0\n", respData[3])); 207285242Sachim 208285242Sachim taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag; 209285242Sachim if (taskTag == agNULL) 210285242Sachim { 211285242Sachim /* other than Abort Task or Query Task */ 212285242Sachim TI_DBG1(("itdssTaskCompleted: taskTag is NULL\n")); 213285242Sachim 214285242Sachim abortOrquery = agFALSE; 215285242Sachim TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData; 216285242Sachim } 217285242Sachim else 218285242Sachim { 219285242Sachim /* Abort Task or Query Task */ 220285242Sachim TI_DBG2(("itdssTaskCompleted: taskTag is NOT NULL\n")); 221285242Sachim abortOrquery = agTRUE; 222285242Sachim TMtdIORequestBody = (tdIORequestBody_t *)currentTaskTag->tdData; 223285242Sachim } 224285242Sachim 225285242Sachim TI_DBG2(("itdssTaskCompleted: TMtdIORequestBody %p\n", TMtdIORequestBody)); 226285242Sachim 227285242Sachim if (TMtdIORequestBody == agNULL) 228285242Sachim { 229285242Sachim TI_DBG1(("itdssTaskCompleted: TMtdIORequestBody is NULL \n")); 230285242Sachim ostiInitiatorEvent( tiRoot, 231285242Sachim NULL, 232285242Sachim NULL, 233285242Sachim tiIntrEventTypeTaskManagement, 234285242Sachim tiTMFailed, 235285242Sachim currentTaskTag ); 236285242Sachim /* free up allocated memory */ 237285242Sachim ostiFreeMemory( 238285242Sachim tiRoot, 239285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 240285242Sachim sizeof(tdIORequestBody_t) 241285242Sachim ); 242285242Sachim return; 243285242Sachim } 244285242Sachim 245285242Sachim if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0) 246285242Sachim { 247285242Sachim TI_DBG1(("itdssTaskCompleted: agIOInfoLen is zero, wrong\n")); 248285242Sachim ostiInitiatorEvent( tiRoot, 249285242Sachim NULL, 250285242Sachim NULL, 251285242Sachim tiIntrEventTypeTaskManagement, 252285242Sachim tiTMFailed, 253285242Sachim currentTaskTag ); 254285242Sachim /* free up allocated memory */ 255285242Sachim ostiFreeMemory( 256285242Sachim tiRoot, 257285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 258285242Sachim sizeof(tdIORequestBody_t) 259285242Sachim ); 260285242Sachim return; 261285242Sachim } 262285242Sachim 263285242Sachim agSASRequestBody = (agsaSASRequestBody_t *)&(TMtdIORequestBody->transport.SAS.agSASRequestBody); 264285242Sachim agSSPTaskMgntRequest = (agsaSSPScsiTaskMgntReq_t *)&(agSASRequestBody->sspTaskMgntReq); 265285242Sachim TI_DBG2(("itdssTaskCompleted: agSSPTaskMgntRequest->taskMgntFunction 0x%x\n", agSSPTaskMgntRequest->taskMgntFunction)); 266285242Sachim 267285242Sachim if ( (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK || 268285242Sachim agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK) && 269285242Sachim abortOrquery == agFALSE 270285242Sachim ) 271285242Sachim { 272285242Sachim TI_DBG1(("itdssTaskCompleted: incorrect tasktag, first\n")); 273285242Sachim ostiInitiatorEvent( tiRoot, 274285242Sachim NULL, 275285242Sachim NULL, 276285242Sachim tiIntrEventTypeTaskManagement, 277285242Sachim tiTMFailed, 278285242Sachim currentTaskTag ); 279285242Sachim /* free up allocated memory */ 280285242Sachim ostiFreeMemory( 281285242Sachim tiRoot, 282285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 283285242Sachim sizeof(tdIORequestBody_t) 284285242Sachim ); 285285242Sachim return; 286285242Sachim } 287285242Sachim 288285242Sachim if ((agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK_SET || 289285242Sachim agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_TASK_SET || 290285242Sachim agSSPTaskMgntRequest->taskMgntFunction == AGSA_LOGICAL_UNIT_RESET || 291285242Sachim agSSPTaskMgntRequest->taskMgntFunction == AGSA_CLEAR_ACA ) && 292285242Sachim abortOrquery == agTRUE 293285242Sachim ) 294285242Sachim { 295285242Sachim TI_DBG1(("itdssTaskCompleted: incorrect tasktag, second\n")); 296285242Sachim ostiInitiatorEvent( tiRoot, 297285242Sachim NULL, 298285242Sachim NULL, 299285242Sachim tiIntrEventTypeTaskManagement, 300285242Sachim tiTMFailed, 301285242Sachim currentTaskTag ); 302285242Sachim /* free up allocated memory */ 303285242Sachim ostiFreeMemory( 304285242Sachim tiRoot, 305285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 306285242Sachim sizeof(tdIORequestBody_t) 307285242Sachim ); 308285242Sachim return; 309285242Sachim } 310285242Sachim 311285242Sachim 312285242Sachim if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_ABORT_TASK) 313285242Sachim { 314285242Sachim TI_DBG2(("itdssTaskCompleted: calling saSSPAbort()\n")); 315285242Sachim AborttdIORequestBody = (tdIORequestBody_t *)taskTag->tdData; 316285242Sachim if (AborttdIORequestBody == agNULL) 317285242Sachim { 318285242Sachim TI_DBG1(("itdssTaskCompleted: wrong, AborttdIORequestBody is NULL\n")); 319285242Sachim return; 320285242Sachim } 321285242Sachim 322285242Sachim tiDeviceHandle = AborttdIORequestBody->tiDevHandle; 323285242Sachim if (tiDeviceHandle == agNULL) 324285242Sachim { 325285242Sachim TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n")); 326285242Sachim return; 327285242Sachim } 328285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 329285242Sachim if (oneDeviceData == agNULL) 330285242Sachim { 331285242Sachim TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n")); 332285242Sachim return; 333285242Sachim } 334285242Sachim agDevHandle = oneDeviceData->agDevHandle; 335285242Sachim if (agDevHandle == agNULL) 336285242Sachim { 337285242Sachim TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n")); 338285242Sachim } 339285242Sachim 340285242Sachim agTaskedIORequest = (agsaIORequest_t *)&(AborttdIORequestBody->agIORequest); 341285242Sachim if (agTaskedIORequest == agNULL) 342285242Sachim { 343285242Sachim TI_DBG1(("itdssTaskCompleted: agTaskedIORequest is NULL \n")); 344285242Sachim ostiInitiatorEvent( tiRoot, 345285242Sachim NULL, 346285242Sachim NULL, 347285242Sachim tiIntrEventTypeTaskManagement, 348285242Sachim tiTMFailed, 349285242Sachim currentTaskTag ); 350285242Sachim /* free up allocated memory */ 351285242Sachim ostiFreeMemory( 352285242Sachim tiRoot, 353285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 354285242Sachim sizeof(tdIORequestBody_t) 355285242Sachim ); 356285242Sachim return; 357285242Sachim } 358285242Sachim 359285242Sachim 360285242Sachim /* allocating agIORequest for abort itself */ 361285242Sachim memAllocStatus = ostiAllocMemory( 362285242Sachim tiRoot, 363285242Sachim &osMemHandle, 364285242Sachim (void **)&tdAbortIORequestBody, 365285242Sachim &PhysUpper32, 366285242Sachim &PhysLower32, 367285242Sachim 8, 368285242Sachim sizeof(tdIORequestBody_t), 369285242Sachim agTRUE 370285242Sachim ); 371285242Sachim if (memAllocStatus != tiSuccess) 372285242Sachim { 373285242Sachim /* let os process IO */ 374285242Sachim TI_DBG1(("itdssTaskCompleted: ostiAllocMemory failed...\n")); 375285242Sachim return; 376285242Sachim } 377285242Sachim 378285242Sachim if (tdAbortIORequestBody == agNULL) 379285242Sachim { 380285242Sachim /* let os process IO */ 381285242Sachim TI_DBG1(("itdssTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n")); 382285242Sachim return; 383285242Sachim } 384285242Sachim 385285242Sachim /* setup task management structure */ 386285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 387285242Sachim tdAbortIORequestBody->tiDevHandle = tiDeviceHandle; 388285242Sachim /* setting callback */ 389285242Sachim tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler; 390285242Sachim 391285242Sachim /* setting to NULL because the local abort is triggered by TD layer */ 392285242Sachim tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL; 393285242Sachim /* initialize agIORequest */ 394285242Sachim agAbortIORequest = &(tdAbortIORequestBody->agIORequest); 395285242Sachim agAbortIORequest->osData = (void *) tdAbortIORequestBody; 396285242Sachim agAbortIORequest->sdkData = agNULL; /* LL takes care of this */ 397285242Sachim 398285242Sachim status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL); 399285242Sachim if (status != AGSA_RC_SUCCESS) 400285242Sachim { 401285242Sachim TI_DBG1(("itdssTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n")); 402285242Sachim ostiFreeMemory( 403285242Sachim tiRoot, 404285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 405285242Sachim sizeof(tdIORequestBody_t) 406285242Sachim ); 407285242Sachim } 408285242Sachim } 409285242Sachim 410285242Sachim /* 411285242Sachim parse the response and based on the parse, 412285242Sachim set the flag 413285242Sachim */ 414285242Sachim if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE || 415285242Sachim respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED) 416285242Sachim { 417285242Sachim TI_DBG2(("itdssTaskCompleted: tiTMOK\n")); 418285242Sachim tiDeviceHandle = TMtdIORequestBody->tiDevHandle; 419285242Sachim if (tiDeviceHandle == agNULL) 420285242Sachim { 421285242Sachim TI_DBG1(("itdssTaskCompleted: wrong, tiDeviceHandle is NULL\n")); 422285242Sachim return; 423285242Sachim } 424285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 425285242Sachim if (oneDeviceData == agNULL) 426285242Sachim { 427285242Sachim TI_DBG1(("itdssTaskCompleted: wrong, oneDeviceData is NULL\n")); 428285242Sachim return; 429285242Sachim } 430285242Sachim agDevHandle = oneDeviceData->agDevHandle; 431285242Sachim if (agDevHandle == agNULL) 432285242Sachim { 433285242Sachim TI_DBG1(("itdssTaskCompleted: wrong, agDevHandle is NULL\n")); 434285242Sachim } 435285242Sachim TI_DBG2(("itdssTaskCompleted: setting Device state to SA_DS_OPERATIONAL\n")); 436285242Sachim 437285242Sachim saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL); 438285242Sachim 439285242Sachim ostiInitiatorEvent( tiRoot, 440285242Sachim NULL, 441285242Sachim NULL, 442285242Sachim tiIntrEventTypeTaskManagement, 443285242Sachim tiTMOK, 444285242Sachim currentTaskTag ); 445285242Sachim } 446285242Sachim else 447285242Sachim { 448285242Sachim TI_DBG1(("itdssTaskCompleted: tiTMFailed\n")); 449285242Sachim ostiInitiatorEvent( tiRoot, 450285242Sachim NULL, 451285242Sachim NULL, 452285242Sachim tiIntrEventTypeTaskManagement, 453285242Sachim tiTMFailed, 454285242Sachim currentTaskTag ); 455285242Sachim 456285242Sachim } 457285242Sachim 458285242Sachim /* free up allocated memory */ 459285242Sachim ostiFreeMemory( 460285242Sachim tiRoot, 461285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 462285242Sachim sizeof(tdIORequestBody_t) 463285242Sachim ); 464285242Sachim return; 465285242Sachim} 466285242Sachim 467285242Sachim#ifdef INITIATOR_DRIVER 468285242Sachim 469285242Sachim/***************************************************************************** 470285242Sachim*! \brief itdssQueryTaskCompleted 471285242Sachim* 472285242Sachim* Purpose: This routine is called to complete an query task management request 473285242Sachim* previously issued to the LL Layer. 474285242Sachim* 475285242Sachim* \param agRoot: Pointer to driver Instance. 476285242Sachim* \param agIORequest: Pointer to the I/O Request data structure for 477285242Sachim* this I/O. 478285242Sachim* \param agIOStatus: Status of I/O just completed. 479285242Sachim* \param agIOInfoLen: Length of the I/O information associated with this 480285242Sachim* I/O request 481285242Sachim* \param agParam A Handle used to refer to the response frame or handle 482285242Sachim* of abort request 483285242Sachim* 484285242Sachim* \return: None 485285242Sachim* 486285242Sachim* \note - This is a initiator specific function called by the jump table. 487285242Sachim* 488285242Sachim*****************************************************************************/ 489285242SachimosGLOBAL void 490285242SachimitdssQueryTaskCompleted( 491285242Sachim agsaRoot_t *agRoot, 492285242Sachim agsaIORequest_t *agIORequest, 493285242Sachim bit32 agIOStatus, 494285242Sachim bit32 agIOInfoLen, 495285242Sachim void *agParam, 496285242Sachim bit32 agOtherInfo 497285242Sachim ) 498285242Sachim{ 499285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 500285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 501285242Sachim tiIORequest_t *taskTag = agNULL; 502285242Sachim tdIORequestBody_t *tdIORequestBody = agNULL; /* query task */ 503285242Sachim tdIORequestBody_t *TMtdIORequestBody = agNULL; /* IO being query tasked */ 504285242Sachim agsaIORequest_t *agTaskedIORequest = agNULL; 505285242Sachim agsaSSPResponseInfoUnit_t agSSPRespIU; 506285242Sachim bit8 respData[128]; 507285242Sachim bit32 respLen; 508285242Sachim#ifdef TD_DEBUG_ENABLE 509285242Sachim bit32 data_status; 510285242Sachim#endif 511285242Sachim agsaSASRequestBody_t *agSASRequestBody = agNULL; 512285242Sachim agsaSSPScsiTaskMgntReq_t *agSSPTaskMgntRequest = agNULL; 513285242Sachim bit32 status; 514285242Sachim agsaIORequest_t *agAbortIORequest = agNULL; 515285242Sachim tdIORequestBody_t *tdAbortIORequestBody = agNULL; 516285242Sachim bit32 PhysUpper32; 517285242Sachim bit32 PhysLower32; 518285242Sachim bit32 memAllocStatus; 519285242Sachim void *osMemHandle = agNULL; 520285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 521285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 522285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 523285242Sachim 524285242Sachim TI_DBG2(("itdssQueryTaskComplted: start\n")); 525285242Sachim 526285242Sachim /* query task management IORequestBody */ 527285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 528285242Sachim 529285242Sachim /* OS's tiIORequest for this query taks, which is agNULL */ 530285242Sachim //currentTaskTag = tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag; 531285242Sachim 532285242Sachim /* 533285242Sachim currentTaskTag is agNULL for query task since it is generated by 534285242Sachim TD layer 535285242Sachim */ 536285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 537285242Sachim { 538285242Sachim /* let os process IO */ 539285242Sachim TI_DBG1(("itdssQueryTaskComplted: agIOStatus failed and tiTMFailed\n")); 540285242Sachim /* free up allocated memory */ 541285242Sachim ostiFreeMemory( 542285242Sachim tiRoot, 543285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 544285242Sachim sizeof(tdIORequestBody_t) 545285242Sachim ); 546285242Sachim return; 547285242Sachim } 548285242Sachim /* parse the task management response */ 549285242Sachim /* reads agsaSSPResponseInfoUnit_t */ 550285242Sachim saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t)); 551285242Sachim#ifdef TD_DEBUG_ENABLE 552285242Sachim data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU); 553285242Sachim#endif 554285242Sachim respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU); 555285242Sachim 556285242Sachim TI_DBG6(("itdssQueryTaskCompleted: dataPres %d. should be 1\n", data_status)); 557285242Sachim /* reads response data */ 558285242Sachim saFrameReadBlock(agRoot, agParam, 559285242Sachim sizeof(agsaSSPResponseInfoUnit_t), 560285242Sachim respData, respLen); 561285242Sachim 562285242Sachim TI_DBG6(("itdssQueryTaskCompleted: res code %d. should be 0\n", respData[3])); 563285242Sachim 564285242Sachim /* IO being query tasked */ 565285242Sachim taskTag = tdIORequestBody->IOType.InitiatorTMIO.TaskTag; 566285242Sachim if (taskTag == agNULL) 567285242Sachim { 568285242Sachim TI_DBG1(("itdssQueryTaskComplted: taskTag is NULL \n")); 569285242Sachim /* free up allocated memory */ 570285242Sachim ostiFreeMemory( 571285242Sachim tiRoot, 572285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 573285242Sachim sizeof(tdIORequestBody_t) 574285242Sachim ); 575285242Sachim return; 576285242Sachim } 577285242Sachim 578285242Sachim /* request body of IO being query tasked */ 579285242Sachim TMtdIORequestBody = (tdIORequestBody_t *)taskTag->tdData; 580285242Sachim if (TMtdIORequestBody == agNULL) 581285242Sachim { 582285242Sachim TI_DBG1(("itdssQueryTaskComplted: TMtdIORequestBody is NULL \n")); 583285242Sachim /* free up allocated memory */ 584285242Sachim ostiFreeMemory( 585285242Sachim tiRoot, 586285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 587285242Sachim sizeof(tdIORequestBody_t) 588285242Sachim ); 589285242Sachim return; 590285242Sachim } 591285242Sachim 592285242Sachim agTaskedIORequest = &(TMtdIORequestBody->agIORequest); 593285242Sachim if (agTaskedIORequest == agNULL) 594285242Sachim { 595285242Sachim TI_DBG1(("itdssQueryTaskComplted: agTaskedIORequest is NULL \n")); 596285242Sachim /* free up allocated memory */ 597285242Sachim ostiFreeMemory( 598285242Sachim tiRoot, 599285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 600285242Sachim sizeof(tdIORequestBody_t) 601285242Sachim ); 602285242Sachim return; 603285242Sachim } 604285242Sachim 605285242Sachim if (agIOStatus == OSSA_IO_SUCCESS && agIOInfoLen == 0) 606285242Sachim { 607285242Sachim TI_DBG1(("itdssQueryTaskCompleted: agIOInfoLen is zero, wrong\n")); 608285242Sachim /* free up allocated memory */ 609285242Sachim ostiFreeMemory( 610285242Sachim tiRoot, 611285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 612285242Sachim sizeof(tdIORequestBody_t) 613285242Sachim ); 614285242Sachim return; 615285242Sachim } 616285242Sachim /* this is query task itself */ 617285242Sachim agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody); 618285242Sachim agSSPTaskMgntRequest = &(agSASRequestBody->sspTaskMgntReq); 619285242Sachim if (agSSPTaskMgntRequest->taskMgntFunction == AGSA_QUERY_TASK) 620285242Sachim { 621285242Sachim /* 622285242Sachim process response for query task 623285242Sachim For query task, response code must be either 624285242Sachim TASK MANAGEMENT FUNCTION COMPLETE or TASK MANAGEMENT FUNCTION SUCCEEDED by 625285242Sachim SAM 626285242Sachim 627285242Sachim 1. If TASK MANAGEMENT FUNCTION SUCCEEDE, do nothing 628285242Sachim 629285242Sachim 2. If TASK MANAGEMENT FUNCTION COMPLETE and IO is not completed, 630285242Sachim retry by saSSPAbort() 631285242Sachim */ 632285242Sachim if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_SUCCEEDED) 633285242Sachim { 634285242Sachim /* OK; IO is being process at the target; do nothing */ 635285242Sachim } 636285242Sachim else if (respData[3] == AGSA_TASK_MANAGEMENT_FUNCTION_COMPLETE) 637285242Sachim { 638285242Sachim tiDeviceHandle = TMtdIORequestBody->tiDevHandle; 639285242Sachim if (tiDeviceHandle == agNULL) 640285242Sachim { 641285242Sachim TI_DBG1(("itdssQueryTaskCompleted: wrong, tiDeviceHandle is NULL\n")); 642285242Sachim /* free up allocated memory */ 643285242Sachim ostiFreeMemory( 644285242Sachim tiRoot, 645285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 646285242Sachim sizeof(tdIORequestBody_t) 647285242Sachim ); 648285242Sachim return; 649285242Sachim } 650285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 651285242Sachim if (oneDeviceData == agNULL) 652285242Sachim { 653285242Sachim TI_DBG1(("itdssQueryTaskCompleted: wrong, oneDeviceData is NULL\n")); 654285242Sachim /* free up allocated memory */ 655285242Sachim ostiFreeMemory( 656285242Sachim tiRoot, 657285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 658285242Sachim sizeof(tdIORequestBody_t) 659285242Sachim ); 660285242Sachim 661285242Sachim return; 662285242Sachim } 663285242Sachim agDevHandle = oneDeviceData->agDevHandle; 664285242Sachim if (agDevHandle == agNULL) 665285242Sachim { 666285242Sachim TI_DBG1(("itdssQueryTaskCompleted: wrong, agDevHandle is NULL\n")); 667285242Sachim } 668285242Sachim /* if IO is not completed, retry IO by saSSPAbort() */ 669285242Sachim if (TMtdIORequestBody->ioCompleted != agTRUE) 670285242Sachim { 671285242Sachim /* allocating agIORequest for abort itself */ 672285242Sachim memAllocStatus = ostiAllocMemory( 673285242Sachim tiRoot, 674285242Sachim &osMemHandle, 675285242Sachim (void **)&tdAbortIORequestBody, 676285242Sachim &PhysUpper32, 677285242Sachim &PhysLower32, 678285242Sachim 8, 679285242Sachim sizeof(tdIORequestBody_t), 680285242Sachim agTRUE 681285242Sachim ); 682285242Sachim if (memAllocStatus != tiSuccess) 683285242Sachim { 684285242Sachim /* let os process IO */ 685285242Sachim TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory failed...\n")); 686285242Sachim /* free up allocated memory */ 687285242Sachim ostiFreeMemory( 688285242Sachim tiRoot, 689285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 690285242Sachim sizeof(tdIORequestBody_t) 691285242Sachim ); 692285242Sachim 693285242Sachim return; 694285242Sachim } 695285242Sachim if (tdAbortIORequestBody == agNULL) 696285242Sachim { 697285242Sachim /* let os process IO */ 698285242Sachim TI_DBG1(("itdssQueryTaskCompleted: ostiAllocMemory returned NULL tdAbortIORequestBody\n")); 699285242Sachim /* free up allocated memory */ 700285242Sachim ostiFreeMemory( 701285242Sachim tiRoot, 702285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 703285242Sachim sizeof(tdIORequestBody_t) 704285242Sachim ); 705285242Sachim 706285242Sachim return; 707285242Sachim } 708285242Sachim 709285242Sachim /* setup task management structure */ 710285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 711285242Sachim tdAbortIORequestBody->tiDevHandle = tdIORequestBody->tiDevHandle; 712285242Sachim tdAbortIORequestBody->tiIOToBeAbortedRequest = agNULL; 713285242Sachim 714285242Sachim /* setting callback */ 715285242Sachim tdAbortIORequestBody->IOCompletionFunc = itdssIOAbortedHandler; 716285242Sachim 717285242Sachim /* initialize agIORequest */ 718285242Sachim agAbortIORequest = &(tdAbortIORequestBody->agIORequest); 719285242Sachim agAbortIORequest->osData = (void *) tdAbortIORequestBody; 720285242Sachim agAbortIORequest->sdkData = agNULL; /* LL takes care of this */ 721285242Sachim 722285242Sachim TI_DBG2(("itdssQueryTaskCompleted: issuing saSSPAbort()\n")); 723285242Sachim status = saSSPAbort(agRoot, agAbortIORequest, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 0, agTaskedIORequest, agNULL); 724285242Sachim if (status != AGSA_RC_SUCCESS) 725285242Sachim { 726285242Sachim TI_DBG1(("itdssQueryTaskCompleted: saSSPAbort failed agIOInfoLen is zero, wrong\n")); 727285242Sachim ostiFreeMemory( 728285242Sachim tiRoot, 729285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 730285242Sachim sizeof(tdIORequestBody_t) 731285242Sachim ); 732285242Sachim } 733285242Sachim } 734285242Sachim } 735285242Sachim else 736285242Sachim { 737285242Sachim TI_DBG1(("itdssQueryTaskComplted: not expected response 0x%x\n",respData[3])); 738285242Sachim } 739285242Sachim } 740285242Sachim else 741285242Sachim { 742285242Sachim TI_DBG1(("itdssQueryTaskCompleted: not expected task management fn %d\n",agSSPTaskMgntRequest->taskMgntFunction)); 743285242Sachim } 744285242Sachim 745285242Sachim /* free up allocated memory */ 746285242Sachim ostiFreeMemory( 747285242Sachim tiRoot, 748285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle, 749285242Sachim sizeof(tdIORequestBody_t) 750285242Sachim ); 751285242Sachim return; 752285242Sachim} 753285242Sachim#endif 754285242Sachim 755285242Sachim/***************************************************************************** 756285242Sachim*! \brief itssdosIOCompleted 757285242Sachim* 758285242Sachim* Purpose: This routine is called to complete an I/O request previously 759285242Sachim* issued to the LL Layer in saSSPStart(). 760285242Sachim* 761285242Sachim* \param agRoot: Pointer to driver Instance. 762285242Sachim* \param agIORequest: Pointer to the I/O Request data structure for 763285242Sachim* this I/O. 764285242Sachim* \param agIOStatus: Status of I/O just completed. 765285242Sachim* \param agIOInfoLen: Length of the I/O information associated with this 766285242Sachim* I/O request 767285242Sachim* \param agParam A Handle used to refer to the response frame or handle 768285242Sachim* of abort request 769285242Sachim* \param agOtherInfo Residual count 770285242Sachim* \return: None 771285242Sachim* 772285242Sachim* \note - This is a initiator specific function called by the jump table. 773285242Sachim* 774285242Sachim*****************************************************************************/ 775285242SachimFORCEINLINE void 776285242SachimitdssIOCompleted( 777285242Sachim agsaRoot_t *agRoot, 778285242Sachim agsaIORequest_t *agIORequest, 779285242Sachim bit32 agIOStatus, 780285242Sachim bit32 agIOInfoLen, 781285242Sachim void *agParam, 782285242Sachim bit32 agOtherInfo 783285242Sachim ) 784285242Sachim{ 785285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 786285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 787285242Sachim itdsaIni_t *Initiator = (itdsaIni_t *)osData->itdsaIni; 788285242Sachim tdIORequestBody_t *tdIORequestBody = agNULL; 789285242Sachim agsaSASRequestBody_t *agSASRequestBody = agNULL; 790285242Sachim agsaSSPInitiatorRequest_t *agSSPInitiatorRequest = agNULL; 791285242Sachim agsaSSPResponseInfoUnit_t agSSPRespIU; 792285242Sachim 793285242Sachim bit32 scsi_status = 0; 794285242Sachim 795285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 796285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 797285242Sachim 798285242Sachim TI_DBG6(("itdssIOCompleted: start\n")); 799285242Sachim TI_DBG6(("itdssIOCompleted: agIOInfoLen %d\n", agIOInfoLen)); 800285242Sachim 801285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 802285242Sachim TD_ASSERT((NULL != tdIORequestBody), "itdssIOCompleted:tdIORequestBody NULL"); 803285242Sachim if ( NULL == tdIORequestBody ) // handle windows assert case 804285242Sachim { 805285242Sachim return; 806285242Sachim } 807285242Sachim Initiator->NumIOsActive--; 808285242Sachim 809285242Sachim#ifdef DBG 810285242Sachim if (tdIORequestBody->ioCompleted == agTRUE) 811285242Sachim { 812285242Sachim#ifdef TD_DEBUG_ENABLE 813285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 814285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 815285242Sachim#endif /*TD_DEBUG_ENABLE*/ 816285242Sachim TI_DBG1(("itdssIOCompleted: Error!!!!!! double completion\n")); 817285242Sachim#ifdef TD_DEBUG_ENABLE 818285242Sachim TI_DBG1(("itdssIOCompleted: did %d \n", oneDeviceData->id)); 819285242Sachim#endif /*TD_DEBUG_ENABLE*/ 820285242Sachim } 821285242Sachim 822285242Sachim if (Initiator->NumIOsActive == 0) 823285242Sachim { 824285242Sachim /* so far, no timer assocaicated here */ 825285242Sachim TI_DBG6(("itdssIOCompleted: no acitve IO's. Kill timers\n")); 826285242Sachim } 827285242Sachim 828285242Sachim if (tdIORequestBody->tiIORequest->osData == agNULL) 829285242Sachim { 830285242Sachim TI_DBG1( ("itdssIOCompleted: pos 1; " 831285242Sachim "tdIORequestBody->tiIORequest->osData is null, wrong\n") ); 832285242Sachim } 833285242Sachim#endif /*DBG*/ 834285242Sachim 835285242Sachim tdIORequestBody->ioCompleted = agTRUE; 836285242Sachim tdIORequestBody->ioStarted = agFALSE; 837285242Sachim 838285242Sachim /* Process completion for debugging, printing cbd */ 839285242Sachim agSASRequestBody = &(tdIORequestBody->transport.SAS.agSASRequestBody); 840285242Sachim agSSPInitiatorRequest = &(agSASRequestBody->sspInitiatorReq); 841285242Sachim 842285242Sachim TI_DBG6( ("itdssIOCompleted: CDB 0x%x\n", 843285242Sachim agSSPInitiatorRequest->sspCmdIU.cdb[0]) ); 844285242Sachim 845285242Sachim /* no respsonse or sense data; data has been processed */ 846285242Sachim if((agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0)) 847285242Sachim { 848285242Sachim // if this is a standard Inquiry command, notify Stoport to set the 849285242Sachim // device queue depth to maximize oustanding IO 850285242Sachim if ( (agSSPInitiatorRequest->sspCmdIU.cdb[0] == SCSIOPC_INQUIRY) && 851285242Sachim ((agSSPInitiatorRequest->sspCmdIU.cdb[1] & 0x01) == 0)) 852285242Sachim { 853285242Sachim bit32 qdepth = 32; 854285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 855285242Sachim if( tiDeviceHandle ) 856285242Sachim { 857285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 858285242Sachim if( oneDeviceData->DeviceType == TD_SAS_DEVICE ) 859285242Sachim { 860285242Sachim qdepth = MAX_OUTSTANDING_IO_PER_LUN; 861285242Sachim } 862285242Sachim if( oneDeviceData->DeviceType == TD_SATA_DEVICE ) 863285242Sachim { 864285242Sachim qdepth = 63; 865285242Sachim } 866285242Sachim } 867285242Sachim 868285242Sachim if ( ostiSetDeviceQueueDepth( tiRoot, 869285242Sachim tdIORequestBody->tiIORequest, 870285242Sachim MAX_OUTSTANDING_IO_PER_LUN ) == agFALSE ) 871285242Sachim { 872285242Sachim TI_DBG1( ( "itdssIOCompleted: failed to call " 873285242Sachim "ostiSetDeviceQueueDepth() Q=%d !!!\n", qdepth ) ); 874285242Sachim } 875285242Sachim else 876285242Sachim { 877285242Sachim TI_DBG2(("itdssIOCompleted: set ostiSetDeviceQueueDepth() Q=%d\n",qdepth)); 878285242Sachim } 879285242Sachim } 880285242Sachim // SCSI command was completed OK, this is the normal path. Now call the 881285242Sachim // OS Specific module about this completion. 882285242Sachim ostiInitiatorIOCompleted( 883285242Sachim tiRoot, 884285242Sachim tdIORequestBody->tiIORequest, 885285242Sachim tiIOSuccess, 886285242Sachim SCSI_STAT_GOOD, 887285242Sachim agNULL, 888285242Sachim agTRUE /* intContext; is not being used */ 889285242Sachim ); 890285242Sachim return; 891285242Sachim } 892285242Sachim 893285242Sachim else 894285242Sachim { 895285242Sachim TI_DBG6(("itdssIOCompleted: SUCCESS but data returned \n")); 896285242Sachim TI_DBG6( ("itdssIOCompleted: agIOStatus SUCCESS but data returned 0x%x\n", 897285242Sachim agIOStatus) ); 898285242Sachim if(tdIORequestBody) 899285242Sachim { 900285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 901285242Sachim if(tiDeviceHandle) 902285242Sachim { 903285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 904285242Sachim } 905285242Sachim } 906285242Sachim 907285242Sachim osti_memset(&agSSPRespIU, 0, sizeof(agsaSSPResponseInfoUnit_t)); 908285242Sachim 909285242Sachim saFrameReadBlock( agRoot, 910285242Sachim agParam, 911285242Sachim 0, 912285242Sachim &agSSPRespIU, 913285242Sachim sizeof(agsaSSPResponseInfoUnit_t) ); 914285242Sachim scsi_status = agSSPRespIU.status; 915285242Sachim 916285242Sachim switch (scsi_status) 917285242Sachim { 918285242Sachim case SCSI_STAT_GOOD: 919285242Sachim TI_DBG2( ("itdssIOCompleted: SCSI_STAT_GOOD %d\n", 920285242Sachim Initiator->ScsiStatusCounts.GoodStatus) ); 921285242Sachim Initiator->ScsiStatusCounts.GoodStatus++; 922285242Sachim break; 923285242Sachim case SCSI_STAT_CHECK_CONDITION: 924285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CHECK_CONDITION %d\n", 925285242Sachim Initiator->ScsiStatusCounts.CheckCondition) ); 926285242Sachim Initiator->ScsiStatusCounts.CheckCondition++; 927285242Sachim break; 928285242Sachim case SCSI_STAT_BUSY: 929285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_BUSY %d\n", 930285242Sachim Initiator->ScsiStatusCounts.BusyStatus) ); 931285242Sachim Initiator->ScsiStatusCounts.BusyStatus++; 932285242Sachim break; 933285242Sachim case SCSI_STAT_RESV_CONFLICT: 934285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_RESV_CONFLICT %d\n", 935285242Sachim Initiator->ScsiStatusCounts.ResvConflict) ); 936285242Sachim Initiator->ScsiStatusCounts.ResvConflict++; 937285242Sachim break; 938285242Sachim case SCSI_STAT_TASK_SET_FULL: 939285242Sachim Initiator->ScsiStatusCounts.TaskSetFull++; 940285242Sachim //agIOStatus = OSSA_IO_FAILED; 941285242Sachim //agOtherInfo = tiDetailBusy; 942285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_SET_FULL %d\n", 943285242Sachim Initiator->ScsiStatusCounts.TaskSetFull) ); 944285242Sachim break; 945285242Sachim case SCSI_STAT_ACA_ACTIVE: 946285242Sachim Initiator->ScsiStatusCounts.AcaActive++; 947285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_ACA_ACTIVE %d\n", 948285242Sachim Initiator->ScsiStatusCounts.AcaActive) ); 949285242Sachim break; 950285242Sachim case SCSI_STAT_TASK_ABORTED: 951285242Sachim Initiator->ScsiStatusCounts.TaskAborted++; 952285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_TASK_ABORTED %d\n", 953285242Sachim Initiator->ScsiStatusCounts.TaskAborted) ); 954285242Sachim break; 955285242Sachim case SCSI_STAT_CONDITION_MET: 956285242Sachim Initiator->ScsiStatusCounts.ConditionMet++; 957285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_CONDITION_MET %d\n", 958285242Sachim Initiator->ScsiStatusCounts.ConditionMet) ); 959285242Sachim break; 960285242Sachim case SCSI_STAT_INTERMEDIATE: 961285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTERMEDIATE %d\n", 962285242Sachim Initiator->ScsiStatusCounts.ObsoleteStatus) ); 963285242Sachim Initiator->ScsiStatusCounts.ObsoleteStatus++; 964285242Sachim break; 965285242Sachim case SCSI_STAT_INTER_CONDIT_MET: 966285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_INTER_CONDIT_MET %d\n", 967285242Sachim Initiator->ScsiStatusCounts.ObsoleteStatus) ); 968285242Sachim Initiator->ScsiStatusCounts.ObsoleteStatus++; 969285242Sachim break; 970285242Sachim case SCSI_STAT_COMMANDTERMINATED: 971285242Sachim TI_DBG1( ("itdssIOCompleted: SCSI_STAT_COMMANDTERMINATED %d\n", 972285242Sachim Initiator->ScsiStatusCounts.ObsoleteStatus) ); 973285242Sachim Initiator->ScsiStatusCounts.ObsoleteStatus++; 974285242Sachim break; 975285242Sachim default: 976285242Sachim Initiator->ScsiStatusCounts.ObsoleteStatus++; 977285242Sachim TI_DBG1( ("itdssIOCompleted: Unknown scsi_status %d 0x%x\n", 978285242Sachim scsi_status,Initiator->ScsiStatusCounts.ObsoleteStatus) ); 979285242Sachim } 980285242Sachim 981285242Sachim switch (agIOStatus) 982285242Sachim { 983285242Sachim case OSSA_IO_SUCCESS: 984285242Sachim itdssIOSuccessHandler( agRoot, 985285242Sachim agIORequest, 986285242Sachim agIOStatus, 987285242Sachim agIOInfoLen, 988285242Sachim agParam, 989285242Sachim agOtherInfo ); 990285242Sachim break; 991285242Sachim case OSSA_IO_ABORTED: 992285242Sachim itdssIOAbortedHandler( agRoot, 993285242Sachim agIORequest, 994285242Sachim agIOStatus, 995285242Sachim agIOInfoLen, 996285242Sachim agParam, 997285242Sachim agOtherInfo ); 998285242Sachim break; 999285242Sachim case OSSA_IO_UNDERFLOW: 1000285242Sachim itdssIOUnderFlowHandler( agRoot, 1001285242Sachim agIORequest, 1002285242Sachim agIOStatus, 1003285242Sachim agIOInfoLen, 1004285242Sachim agParam, 1005285242Sachim agOtherInfo ); 1006285242Sachim break; 1007285242Sachim case OSSA_IO_FAILED: 1008285242Sachim itdssIOFailedHandler( agRoot, 1009285242Sachim agIORequest, 1010285242Sachim agIOStatus, 1011285242Sachim agIOInfoLen, 1012285242Sachim agParam, 1013285242Sachim agOtherInfo ); 1014285242Sachim break; 1015285242Sachim case OSSA_IO_ABORT_RESET: 1016285242Sachim itdssIOAbortResetHandler( agRoot, 1017285242Sachim agIORequest, 1018285242Sachim agIOStatus, 1019285242Sachim agIOInfoLen, 1020285242Sachim agParam, 1021285242Sachim agOtherInfo ); 1022285242Sachim break; 1023285242Sachim case OSSA_IO_NO_DEVICE: 1024285242Sachim itdssIONoDeviceHandler( agRoot, 1025285242Sachim agIORequest, 1026285242Sachim agIOStatus, 1027285242Sachim agIOInfoLen, 1028285242Sachim agParam, 1029285242Sachim agOtherInfo ); 1030285242Sachim break; 1031285242Sachim case OSSA_IO_XFER_ERROR_BREAK: 1032285242Sachim itdssXferErrorBreakHandler( agRoot, 1033285242Sachim agIORequest, 1034285242Sachim agIOStatus, 1035285242Sachim agIOInfoLen, 1036285242Sachim agParam, 1037285242Sachim agOtherInfo ); 1038285242Sachim break; 1039285242Sachim case OSSA_IO_XFER_ERROR_PHY_NOT_READY: 1040285242Sachim itdssXferErrorPhyNotReadyHandler( agRoot, 1041285242Sachim agIORequest, 1042285242Sachim agIOStatus, 1043285242Sachim agIOInfoLen, 1044285242Sachim agParam, 1045285242Sachim agOtherInfo ); 1046285242Sachim break; 1047285242Sachim case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: 1048285242Sachim itdssOpenCnxErrorProtocolNotSupprotedHandler( agRoot, 1049285242Sachim agIORequest, 1050285242Sachim agIOStatus, 1051285242Sachim agIOInfoLen, 1052285242Sachim agParam, 1053285242Sachim agOtherInfo ); 1054285242Sachim break; 1055285242Sachim case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: 1056285242Sachim itdssOpenCnxErrorZoneViolationHandler( agRoot, 1057285242Sachim agIORequest, 1058285242Sachim agIOStatus, 1059285242Sachim agIOInfoLen, 1060285242Sachim agParam, 1061285242Sachim agOtherInfo ); 1062285242Sachim break; 1063285242Sachim case OSSA_IO_OPEN_CNX_ERROR_BREAK: 1064285242Sachim itdssOpenCnxErrorBreakHandler( agRoot, 1065285242Sachim agIORequest, 1066285242Sachim agIOStatus, 1067285242Sachim agIOInfoLen, 1068285242Sachim agParam, 1069285242Sachim agOtherInfo ); 1070285242Sachim break; 1071285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: 1072285242Sachim itdssOpenCnxErrorITNexusLossHandler( agRoot, 1073285242Sachim agIORequest, 1074285242Sachim agIOStatus, 1075285242Sachim agIOInfoLen, 1076285242Sachim agParam, 1077285242Sachim agOtherInfo ); 1078285242Sachim break; 1079285242Sachim case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: 1080285242Sachim itdssOpenCnxErrorBadDestinationHandler( agRoot, 1081285242Sachim agIORequest, 1082285242Sachim agIOStatus, 1083285242Sachim agIOInfoLen, 1084285242Sachim agParam, 1085285242Sachim agOtherInfo ); 1086285242Sachim break; 1087285242Sachim case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: 1088285242Sachim itdssOpenCnxErrorConnectionRateNotSupportedHandler( agRoot, 1089285242Sachim agIORequest, 1090285242Sachim agIOStatus, 1091285242Sachim agIOInfoLen, 1092285242Sachim agParam, 1093285242Sachim agOtherInfo ); 1094285242Sachim break; 1095285242Sachim case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: 1096285242Sachim itdssOpenCnxErrorWrongDestinationHandler( agRoot, 1097285242Sachim agIORequest, 1098285242Sachim agIOStatus, 1099285242Sachim agIOInfoLen, 1100285242Sachim agParam, 1101285242Sachim agOtherInfo ); 1102285242Sachim break; 1103285242Sachim case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: 1104285242Sachim itdssOpenCnxErrorUnknownErrorHandler( agRoot, 1105285242Sachim agIORequest, 1106285242Sachim agIOStatus, 1107285242Sachim agIOInfoLen, 1108285242Sachim agParam, 1109285242Sachim agOtherInfo ); 1110285242Sachim break; 1111285242Sachim case OSSA_IO_XFER_ERROR_NAK_RECEIVED: 1112285242Sachim itdssXferErrorNAKReceivedHandler( agRoot, 1113285242Sachim agIORequest, 1114285242Sachim agIOStatus, 1115285242Sachim agIOInfoLen, 1116285242Sachim agParam, 1117285242Sachim agOtherInfo ); 1118285242Sachim break; 1119285242Sachim case OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT: 1120285242Sachim itdssXferErrorACKNAKTimeoutHandler( agRoot, 1121285242Sachim agIORequest, 1122285242Sachim agIOStatus, 1123285242Sachim agIOInfoLen, 1124285242Sachim agParam, 1125285242Sachim agOtherInfo ); 1126285242Sachim break; 1127285242Sachim case OSSA_IO_XFER_ERROR_DMA: 1128285242Sachim itdssXferErrorDMAHandler( agRoot, 1129285242Sachim agIORequest, 1130285242Sachim agIOStatus, 1131285242Sachim agIOInfoLen, 1132285242Sachim agParam, 1133285242Sachim agOtherInfo ); 1134285242Sachim break; 1135285242Sachim case OSSA_IO_XFER_ERROR_OFFSET_MISMATCH: 1136285242Sachim itdssXferErrorOffsetMismatchHandler( agRoot, 1137285242Sachim agIORequest, 1138285242Sachim agIOStatus, 1139285242Sachim agIOInfoLen, 1140285242Sachim agParam, 1141285242Sachim agOtherInfo ); 1142285242Sachim break; 1143285242Sachim case OSSA_IO_XFER_OPEN_RETRY_TIMEOUT: 1144285242Sachim itdssXferOpenRetryTimeoutHandler( agRoot, 1145285242Sachim agIORequest, 1146285242Sachim agIOStatus, 1147285242Sachim agIOInfoLen, 1148285242Sachim agParam, 1149285242Sachim agOtherInfo ); 1150285242Sachim break; 1151285242Sachim case OSSA_IO_PORT_IN_RESET: 1152285242Sachim itdssPortInResetHandler( agRoot, 1153285242Sachim agIORequest, 1154285242Sachim agIOStatus, 1155285242Sachim agIOInfoLen, 1156285242Sachim agParam, 1157285242Sachim agOtherInfo ); 1158285242Sachim break; 1159285242Sachim case OSSA_IO_DS_NON_OPERATIONAL: 1160285242Sachim itdssDsNonOperationalHandler( agRoot, 1161285242Sachim agIORequest, 1162285242Sachim agIOStatus, 1163285242Sachim agIOInfoLen, 1164285242Sachim agParam, 1165285242Sachim agOtherInfo ); 1166285242Sachim break; 1167285242Sachim case OSSA_IO_DS_IN_RECOVERY: 1168285242Sachim itdssDsInRecoveryHandler( agRoot, 1169285242Sachim agIORequest, 1170285242Sachim agIOStatus, 1171285242Sachim agIOInfoLen, 1172285242Sachim agParam, 1173285242Sachim agOtherInfo ); 1174285242Sachim break; 1175285242Sachim case OSSA_IO_TM_TAG_NOT_FOUND: 1176285242Sachim itdssTmTagNotFoundHandler( agRoot, 1177285242Sachim agIORequest, 1178285242Sachim agIOStatus, 1179285242Sachim agIOInfoLen, 1180285242Sachim agParam, 1181285242Sachim agOtherInfo ); 1182285242Sachim break; 1183285242Sachim case OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR: 1184285242Sachim itdssSSPExtIUZeroLenHandler( agRoot, 1185285242Sachim agIORequest, 1186285242Sachim agIOStatus, 1187285242Sachim agIOInfoLen, 1188285242Sachim agParam, 1189285242Sachim agOtherInfo ); 1190285242Sachim break; 1191285242Sachim case OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE: 1192285242Sachim itdssXferErrorUnexpectedPhaseHandler( agRoot, 1193285242Sachim agIORequest, 1194285242Sachim agIOStatus, 1195285242Sachim agIOInfoLen, 1196285242Sachim agParam, 1197285242Sachim agOtherInfo ); 1198285242Sachim break; 1199285242Sachim//new 1200285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED: 1201285242Sachim itdssXferOpenRetryBackoffThresholdReachedHandler( agRoot, 1202285242Sachim agIORequest, 1203285242Sachim agIOStatus, 1204285242Sachim agIOInfoLen, 1205285242Sachim agParam, 1206285242Sachim agOtherInfo ); 1207285242Sachim break; 1208285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO: 1209285242Sachim itdssOpenCnxErrorItNexusLossOpenTmoHandler( agRoot, 1210285242Sachim agIORequest, 1211285242Sachim agIOStatus, 1212285242Sachim agIOInfoLen, 1213285242Sachim agParam, 1214285242Sachim agOtherInfo ); 1215285242Sachim break; 1216285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST: 1217285242Sachim itdssOpenCnxErrorItNexusLossNoDestHandler( agRoot, 1218285242Sachim agIORequest, 1219285242Sachim agIOStatus, 1220285242Sachim agIOInfoLen, 1221285242Sachim agParam, 1222285242Sachim agOtherInfo ); 1223285242Sachim break; 1224285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE: 1225285242Sachim itdssOpenCnxErrorItNexusLossOpenCollideHandler( agRoot, 1226285242Sachim agIORequest, 1227285242Sachim agIOStatus, 1228285242Sachim agIOInfoLen, 1229285242Sachim agParam, 1230285242Sachim agOtherInfo ); 1231285242Sachim break; 1232285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED: 1233285242Sachim itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler( agRoot, 1234285242Sachim agIORequest, 1235285242Sachim agIOStatus, 1236285242Sachim agIOInfoLen, 1237285242Sachim agParam, 1238285242Sachim agOtherInfo ); 1239285242Sachim break; 1240285242Sachim // encryption IO error handling 1241285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: 1242285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH: 1243285242Sachim case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: 1244285242Sachim case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: 1245285242Sachim case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: 1246285242Sachim case OSSA_IO_XFR_ERROR_INTERNAL_RAM: 1247285242Sachim case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS: 1248285242Sachim itdssEncryptionHandler( agRoot, 1249285242Sachim agIORequest, 1250285242Sachim agIOStatus, 1251285242Sachim agIOInfoLen, 1252285242Sachim agParam, 1253285242Sachim agOtherInfo ); 1254285242Sachim break; 1255285242Sachim 1256285242Sachim /* DIF IO error handling */ 1257285242Sachim case OSSA_IO_XFR_ERROR_DIF_MISMATCH: 1258285242Sachim case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: 1259285242Sachim case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: 1260285242Sachim case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 1261285242Sachim itdssDifHandler( agRoot, 1262285242Sachim agIORequest, 1263285242Sachim agIOStatus, 1264285242Sachim agIOInfoLen, 1265285242Sachim agParam, 1266285242Sachim agOtherInfo ); 1267285242Sachim break; 1268285242Sachim case OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE: 1269285242Sachim itdssIOResourceUnavailableHandler( agRoot, 1270285242Sachim agIORequest, 1271285242Sachim agIOStatus, 1272285242Sachim agIOInfoLen, 1273285242Sachim agParam, 1274285242Sachim agOtherInfo ); 1275285242Sachim break; 1276285242Sachim case OSSA_MPI_IO_RQE_BUSY_FULL: 1277285242Sachim itdssIORQEBusyFullHandler( agRoot, 1278285242Sachim agIORequest, 1279285242Sachim agIOStatus, 1280285242Sachim agIOInfoLen, 1281285242Sachim agParam, 1282285242Sachim agOtherInfo ); 1283285242Sachim break; 1284285242Sachim case OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME: 1285285242Sachim itdssXferErrorInvalidSSPRspFrameHandler( agRoot, 1286285242Sachim agIORequest, 1287285242Sachim agIOStatus, 1288285242Sachim agIOInfoLen, 1289285242Sachim agParam, 1290285242Sachim agOtherInfo ); 1291285242Sachim break; 1292285242Sachim case OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN: 1293285242Sachim itdssXferErrorEOBDataOverrunHandler( agRoot, 1294285242Sachim agIORequest, 1295285242Sachim agIOStatus, 1296285242Sachim agIOInfoLen, 1297285242Sachim agParam, 1298285242Sachim agOtherInfo ); 1299285242Sachim break; 1300285242Sachim case OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED: 1301285242Sachim itdssOpenCnxErrorOpenPreemptedHandler( agRoot, 1302285242Sachim agIORequest, 1303285242Sachim agIOStatus, 1304285242Sachim agIOInfoLen, 1305285242Sachim agParam, 1306285242Sachim agOtherInfo ); 1307285242Sachim break; 1308285242Sachim default: 1309285242Sachim TI_DBG1( ("itdssIOCompleted: Unknown agIOStatus 0x%x\n",agIOStatus) ); 1310285242Sachim itdssIODefaultHandler( agRoot, 1311285242Sachim agIORequest, 1312285242Sachim agIOStatus, 1313285242Sachim agIOInfoLen, 1314285242Sachim agParam, 1315285242Sachim agOtherInfo ); 1316285242Sachim break; 1317285242Sachim } 1318285242Sachim } 1319285242Sachim return; 1320285242Sachim} 1321285242Sachim 1322285242Sachim#ifdef TD_DISCOVER 1323285242Sachim/***************************************************************************** 1324285242Sachim*! \brief itdssSMPCompleted 1325285242Sachim* 1326285242Sachim* Purpose: This routine is called to complete an SMP request previously 1327285242Sachim* issued to the LL Layer in saSMPStart(). 1328285242Sachim* 1329285242Sachim* \param agRoot: Pointer to driver Instance. 1330285242Sachim* \param agIORequest: Pointer to the I/O Request data structure for 1331285242Sachim* this I/O. 1332285242Sachim* \param agIOStatus: Status of I/O just completed. 1333285242Sachim* \param agIOInfoLen: Length of the I/O information associated with this 1334285242Sachim* I/O request 1335285242Sachim* \param agFrameHandle A Handle used to refer to the response frame 1336285242Sachim* 1337285242Sachim* \return: None 1338285242Sachim* 1339285242Sachim* \note - This is a initiator specific function called by the jump table. 1340285242Sachim* 1341285242Sachim*****************************************************************************/ 1342285242SachimosGLOBAL void 1343285242SachimitdssSMPCompleted ( 1344285242Sachim agsaRoot_t *agRoot, 1345285242Sachim agsaIORequest_t *agIORequest, 1346285242Sachim bit32 agIOStatus, 1347285242Sachim bit32 agIOInfoLen, 1348285242Sachim agsaFrameHandle_t agFrameHandle 1349285242Sachim ) 1350285242Sachim{ 1351285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1352285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1353285242Sachim#ifdef REMOVED 1354285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1355285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared); 1356285242Sachim#endif 1357285242Sachim tdssSMPRequestBody_t *tdSMPRequestBody; 1358285242Sachim agsaSASRequestBody_t *agSASRequestBody; 1359285242Sachim agsaSMPFrame_t *agSMPFrame; 1360285242Sachim tdsaDeviceData_t *oneDeviceData; 1361285242Sachim tiIORequest_t *CurrentTaskTag; 1362285242Sachim tdsaPortContext_t *onePortContext; 1363285242Sachim tdsaPortContext_t *oldonePortContext; 1364285242Sachim smpReqPhyControl_t *smpPhyControlReq; 1365285242Sachim bit8 smpHeader[4]; 1366285242Sachim tdssSMPFrameHeader_t *tdSMPFrameHeader; 1367285242Sachim bit8 *tdSMPPayload; 1368285242Sachim agsaDevHandle_t *agDevHandle; 1369285242Sachim bit32 status; 1370285242Sachim#ifndef DIRECT_SMP 1371285242Sachim tdssSMPFrameHeader_t *tdRequestSMPFrameHeader; 1372285242Sachim bit8 smpRequestHeader[4]; 1373285242Sachim#endif 1374285242Sachim bit8 SMPRequestFunction; 1375285242Sachim 1376285242Sachim TI_DBG3(("itdssSMPCompleted: start\n")); 1377285242Sachim 1378285242Sachim 1379285242Sachim tdSMPRequestBody = (tdssSMPRequestBody_t *)agIORequest->osData; 1380285242Sachim CurrentTaskTag = tdSMPRequestBody->CurrentTaskTag; 1381285242Sachim 1382285242Sachim oneDeviceData = tdSMPRequestBody->tdDevice; 1383285242Sachim onePortContext = oneDeviceData->tdPortContext; 1384285242Sachim agDevHandle = oneDeviceData->agDevHandle; 1385285242Sachim 1386285242Sachim 1387285242Sachim agSASRequestBody = &(tdSMPRequestBody->agSASRequestBody); 1388285242Sachim agSMPFrame = &(agSASRequestBody->smpFrame); 1389285242Sachim 1390285242Sachim#ifdef DIRECT_SMP 1391285242Sachim SMPRequestFunction = tdSMPRequestBody->smpPayload[1]; 1392285242Sachim#else 1393285242Sachim saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpRequestHeader, 4); 1394285242Sachim tdRequestSMPFrameHeader = (tdssSMPFrameHeader_t *)smpRequestHeader; 1395285242Sachim SMPRequestFunction = tdRequestSMPFrameHeader->smpFunction; 1396285242Sachim#endif 1397285242Sachim 1398285242Sachim TI_DBG3(("itdssSMPCompleted: agIORequest %p\n", agIORequest)); 1399285242Sachim TI_DBG3(("itdssSMPCompleted: SMPRequestbody %p\n", tdSMPRequestBody)); 1400285242Sachim 1401285242Sachim if (onePortContext != agNULL) 1402285242Sachim { 1403285242Sachim TI_DBG3(("itdssSMPCompleted: pid %d\n", onePortContext->id)); 1404285242Sachim } 1405285242Sachim else 1406285242Sachim { 1407285242Sachim TI_DBG1(("itdssSMPCompleted: Wrong!!! onePortContext is NULL\n")); 1408285242Sachim ostiFreeMemory( 1409285242Sachim tiRoot, 1410285242Sachim tdSMPRequestBody->osMemHandle, 1411285242Sachim sizeof(tdssSMPRequestBody_t) 1412285242Sachim ); 1413285242Sachim#ifndef DIRECT_SMP 1414285242Sachim ostiFreeMemory( 1415285242Sachim tiRoot, 1416285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1417285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1418285242Sachim ); 1419285242Sachim ostiFreeMemory( 1420285242Sachim tiRoot, 1421285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1422285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1423285242Sachim ); 1424285242Sachim#endif 1425285242Sachim return; 1426285242Sachim } 1427285242Sachim 1428285242Sachim oldonePortContext = tdSMPRequestBody->tdPortContext; 1429285242Sachim if (oldonePortContext != agNULL) 1430285242Sachim { 1431285242Sachim TI_DBG3(("itdssSMPCompleted: old pid %d\n", oldonePortContext->id)); 1432285242Sachim } 1433285242Sachim else 1434285242Sachim { 1435285242Sachim TI_DBG1(("itdssSMPCompleted: Wrong!!! oldonePortContext is NULL\n")); 1436285242Sachim ostiFreeMemory( 1437285242Sachim tiRoot, 1438285242Sachim tdSMPRequestBody->osMemHandle, 1439285242Sachim sizeof(tdssSMPRequestBody_t) 1440285242Sachim ); 1441285242Sachim#ifndef DIRECT_SMP 1442285242Sachim ostiFreeMemory( 1443285242Sachim tiRoot, 1444285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1445285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1446285242Sachim ); 1447285242Sachim ostiFreeMemory( 1448285242Sachim tiRoot, 1449285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1450285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1451285242Sachim ); 1452285242Sachim#endif 1453285242Sachim return; 1454285242Sachim } 1455285242Sachim 1456285242Sachim 1457285242Sachim /* decrement the number of pending SMP */ 1458285242Sachim onePortContext->discovery.pendingSMP--; 1459285242Sachim 1460285242Sachim /* for port invalid case; 1461285242Sachim full discovery -> full discovery; incremental discovery -> full discovery 1462285242Sachim */ 1463285242Sachim if (onePortContext != oldonePortContext) 1464285242Sachim { 1465285242Sachim TI_DBG1(("itdssSMPCompleted: portcontext has changed!!!\n")); 1466285242Sachim if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER || 1467285242Sachim SMPRequestFunction == SMP_REPORT_PHY_SATA || 1468285242Sachim SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION ) 1469285242Sachim { 1470285242Sachim /* stop SMP timer */ 1471285242Sachim if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE) 1472285242Sachim { 1473285242Sachim tdsaKillTimer( 1474285242Sachim tiRoot, 1475285242Sachim &(onePortContext->discovery.DiscoverySMPTimer) 1476285242Sachim ); 1477285242Sachim } 1478285242Sachim if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE) 1479285242Sachim { 1480285242Sachim tdsaKillTimer( 1481285242Sachim tiRoot, 1482285242Sachim &(oldonePortContext->discovery.DiscoverySMPTimer) 1483285242Sachim ); 1484285242Sachim } 1485285242Sachim } 1486285242Sachim 1487285242Sachim /* clean up expanders data strucures; move to free exp when device is cleaned */ 1488285242Sachim tdsaCleanAllExp(tiRoot, oldonePortContext); 1489285242Sachim /* remove devices */ 1490285242Sachim tdssInternalRemovals(oldonePortContext->agRoot, 1491285242Sachim oldonePortContext 1492285242Sachim ); 1493285242Sachim 1494285242Sachim ostiFreeMemory( 1495285242Sachim tiRoot, 1496285242Sachim tdSMPRequestBody->osMemHandle, 1497285242Sachim sizeof(tdssSMPRequestBody_t) 1498285242Sachim ); 1499285242Sachim#ifndef DIRECT_SMP 1500285242Sachim ostiFreeMemory( 1501285242Sachim tiRoot, 1502285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1503285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1504285242Sachim ); 1505285242Sachim ostiFreeMemory( 1506285242Sachim tiRoot, 1507285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1508285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1509285242Sachim ); 1510285242Sachim#endif 1511285242Sachim return; 1512285242Sachim } 1513285242Sachim 1514285242Sachim if (onePortContext->valid == agFALSE) 1515285242Sachim { 1516285242Sachim if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER || 1517285242Sachim SMPRequestFunction == SMP_REPORT_PHY_SATA || 1518285242Sachim SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION ) 1519285242Sachim { 1520285242Sachim /* stop SMP timer */ 1521285242Sachim if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE) 1522285242Sachim { 1523285242Sachim tdsaKillTimer( 1524285242Sachim tiRoot, 1525285242Sachim &(onePortContext->discovery.DiscoverySMPTimer) 1526285242Sachim ); 1527285242Sachim } 1528285242Sachim if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE) 1529285242Sachim { 1530285242Sachim tdsaKillTimer( 1531285242Sachim tiRoot, 1532285242Sachim &(oldonePortContext->discovery.DiscoverySMPTimer) 1533285242Sachim ); 1534285242Sachim } 1535285242Sachim } 1536285242Sachim 1537285242Sachim if (onePortContext->discovery.pendingSMP == 0) 1538285242Sachim { 1539285242Sachim TI_DBG1(("itdssSMPCompleted: aborting discovery\n")); 1540285242Sachim tdsaSASDiscoverAbort(tiRoot, onePortContext); 1541285242Sachim } 1542285242Sachim else 1543285242Sachim { 1544285242Sachim TI_DBG1(("itdssSMPCompleted: not yet abort; non zero pendingSMP %d\n", onePortContext->discovery.pendingSMP)); 1545285242Sachim } 1546285242Sachim ostiFreeMemory( 1547285242Sachim tiRoot, 1548285242Sachim tdSMPRequestBody->osMemHandle, 1549285242Sachim sizeof(tdssSMPRequestBody_t) 1550285242Sachim ); 1551285242Sachim#ifndef DIRECT_SMP 1552285242Sachim ostiFreeMemory( 1553285242Sachim tiRoot, 1554285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1555285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1556285242Sachim ); 1557285242Sachim ostiFreeMemory( 1558285242Sachim tiRoot, 1559285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1560285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1561285242Sachim ); 1562285242Sachim#endif 1563285242Sachim return; 1564285242Sachim } 1565285242Sachim 1566285242Sachim 1567285242Sachim if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER || 1568285242Sachim SMPRequestFunction == SMP_REPORT_PHY_SATA || 1569285242Sachim SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION ) 1570285242Sachim { 1571285242Sachim /* stop SMP timer */ 1572285242Sachim if (onePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE) 1573285242Sachim { 1574285242Sachim tdsaKillTimer( 1575285242Sachim tiRoot, 1576285242Sachim &(onePortContext->discovery.DiscoverySMPTimer) 1577285242Sachim ); 1578285242Sachim } 1579285242Sachim if (oldonePortContext->discovery.DiscoverySMPTimer.timerRunning == agTRUE) 1580285242Sachim { 1581285242Sachim tdsaKillTimer( 1582285242Sachim tiRoot, 1583285242Sachim &(oldonePortContext->discovery.DiscoverySMPTimer) 1584285242Sachim ); 1585285242Sachim } 1586285242Sachim } 1587285242Sachim 1588285242Sachim /* the host as of 4/16/08 does not use indirect SMP. So, check only OSSA_IO_SUCCESS status*/ 1589285242Sachim if (agIOStatus == OSSA_IO_SUCCESS) 1590285242Sachim { 1591285242Sachim //tdhexdump("itdssSMPCompleted", (bit8*)agFrameHandle, agIOInfoLen); 1592285242Sachim /* parsing SMP payload */ 1593285242Sachim#ifdef DIRECT_SMP 1594285242Sachim saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4); 1595285242Sachim#else 1596285242Sachim saFrameReadBlock(agRoot, tdSMPRequestBody->IndirectSMPResp, 0, smpHeader, 4); 1597285242Sachim#endif 1598285242Sachim tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader; 1599285242Sachim 1600285242Sachim /* SMP function dependent payload */ 1601285242Sachim switch (tdSMPFrameHeader->smpFunction) 1602285242Sachim { 1603285242Sachim case SMP_REPORT_GENERAL: 1604285242Sachim TI_DBG3(("itdssSMPCompleted: report general\n")); 1605285242Sachim if (agIOInfoLen != sizeof(smpRespReportGeneral_t) + 4 && 1606285242Sachim tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) 1607285242Sachim { 1608285242Sachim TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportGeneral_t) + 4)); 1609285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1610285242Sachim ostiFreeMemory( 1611285242Sachim tiRoot, 1612285242Sachim tdSMPRequestBody->osMemHandle, 1613285242Sachim sizeof(tdssSMPRequestBody_t) 1614285242Sachim ); 1615285242Sachim#ifndef DIRECT_SMP 1616285242Sachim ostiFreeMemory( 1617285242Sachim tiRoot, 1618285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1619285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1620285242Sachim ); 1621285242Sachim ostiFreeMemory( 1622285242Sachim tiRoot, 1623285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1624285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1625285242Sachim ); 1626285242Sachim#endif 1627285242Sachim return; 1628285242Sachim } 1629285242Sachim tdsaReportGeneralRespRcvd( 1630285242Sachim tiRoot, 1631285242Sachim agRoot, 1632285242Sachim agIORequest, 1633285242Sachim oneDeviceData, 1634285242Sachim tdSMPFrameHeader, 1635285242Sachim agFrameHandle 1636285242Sachim ); 1637285242Sachim 1638285242Sachim break; 1639285242Sachim case SMP_DISCOVER: 1640285242Sachim TI_DBG3(("itdssSMPCompleted: discover\n")); 1641285242Sachim if (agIOInfoLen != sizeof(smpRespDiscover_t) + 4 && 1642285242Sachim tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) 1643285242Sachim { 1644285242Sachim TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespDiscover_t) + 4)); 1645285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1646285242Sachim ostiFreeMemory( 1647285242Sachim tiRoot, 1648285242Sachim tdSMPRequestBody->osMemHandle, 1649285242Sachim sizeof(tdssSMPRequestBody_t) 1650285242Sachim ); 1651285242Sachim#ifndef DIRECT_SMP 1652285242Sachim ostiFreeMemory( 1653285242Sachim tiRoot, 1654285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1655285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1656285242Sachim ); 1657285242Sachim ostiFreeMemory( 1658285242Sachim tiRoot, 1659285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1660285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1661285242Sachim ); 1662285242Sachim#endif 1663285242Sachim return; 1664285242Sachim } 1665285242Sachim tdsaDiscoverRespRcvd( 1666285242Sachim tiRoot, 1667285242Sachim agRoot, 1668285242Sachim agIORequest, 1669285242Sachim oneDeviceData, 1670285242Sachim tdSMPFrameHeader, 1671285242Sachim agFrameHandle 1672285242Sachim ); 1673285242Sachim break; 1674285242Sachim case SMP_REPORT_PHY_SATA: 1675285242Sachim TI_DBG3(("itdssSMPCompleted: report phy sata\n")); 1676285242Sachim if (agIOInfoLen != sizeof(smpRespReportPhySata_t) + 4 && 1677285242Sachim tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) 1678285242Sachim { 1679285242Sachim TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, (unsigned int)sizeof(smpRespReportPhySata_t) + 4)); 1680285242Sachim tdsaSATADiscoverDone(tiRoot, onePortContext, tiError); 1681285242Sachim ostiFreeMemory( 1682285242Sachim tiRoot, 1683285242Sachim tdSMPRequestBody->osMemHandle, 1684285242Sachim sizeof(tdssSMPRequestBody_t) 1685285242Sachim ); 1686285242Sachim#ifndef DIRECT_SMP 1687285242Sachim ostiFreeMemory( 1688285242Sachim tiRoot, 1689285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1690285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1691285242Sachim ); 1692285242Sachim ostiFreeMemory( 1693285242Sachim tiRoot, 1694285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1695285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1696285242Sachim ); 1697285242Sachim#endif 1698285242Sachim return; 1699285242Sachim } 1700285242Sachim tdsaReportPhySataRcvd( 1701285242Sachim tiRoot, 1702285242Sachim agRoot, 1703285242Sachim agIORequest, 1704285242Sachim oneDeviceData, 1705285242Sachim tdSMPFrameHeader, 1706285242Sachim agFrameHandle 1707285242Sachim ); 1708285242Sachim break; 1709285242Sachim case SMP_CONFIGURE_ROUTING_INFORMATION: 1710285242Sachim TI_DBG1(("itdssSMPCompleted: configure routing information\n")); 1711285242Sachim if (agIOInfoLen != 4 && 1712285242Sachim tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) 1713285242Sachim { 1714285242Sachim TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4)); 1715285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1716285242Sachim ostiFreeMemory( 1717285242Sachim tiRoot, 1718285242Sachim tdSMPRequestBody->osMemHandle, 1719285242Sachim sizeof(tdssSMPRequestBody_t) 1720285242Sachim ); 1721285242Sachim#ifndef DIRECT_SMP 1722285242Sachim ostiFreeMemory( 1723285242Sachim tiRoot, 1724285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1725285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1726285242Sachim ); 1727285242Sachim ostiFreeMemory( 1728285242Sachim tiRoot, 1729285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1730285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1731285242Sachim ); 1732285242Sachim#endif 1733285242Sachim return; 1734285242Sachim } 1735285242Sachim tdsaConfigRoutingInfoRespRcvd( 1736285242Sachim tiRoot, 1737285242Sachim agRoot, 1738285242Sachim agIORequest, 1739285242Sachim oneDeviceData, 1740285242Sachim tdSMPFrameHeader, 1741285242Sachim agFrameHandle 1742285242Sachim ); 1743285242Sachim 1744285242Sachim break; 1745285242Sachim case SMP_PHY_CONTROL: 1746285242Sachim TI_DBG3(("itdssSMPCompleted: phy control\n")); 1747285242Sachim if (agIOInfoLen != 4 && 1748285242Sachim tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) /*zero length is expected */ 1749285242Sachim { 1750285242Sachim TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4)); 1751285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1752285242Sachim ostiFreeMemory( 1753285242Sachim tiRoot, 1754285242Sachim tdSMPRequestBody->osMemHandle, 1755285242Sachim sizeof(tdssSMPRequestBody_t) 1756285242Sachim ); 1757285242Sachim#ifndef DIRECT_SMP 1758285242Sachim ostiFreeMemory( 1759285242Sachim tiRoot, 1760285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1761285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1762285242Sachim ); 1763285242Sachim ostiFreeMemory( 1764285242Sachim tiRoot, 1765285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1766285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1767285242Sachim ); 1768285242Sachim#endif 1769285242Sachim return; 1770285242Sachim } 1771285242Sachim tdsaPhyControlRespRcvd( 1772285242Sachim tiRoot, 1773285242Sachim agRoot, 1774285242Sachim agIORequest, 1775285242Sachim oneDeviceData, 1776285242Sachim tdSMPFrameHeader, 1777285242Sachim agFrameHandle, 1778285242Sachim CurrentTaskTag 1779285242Sachim ); 1780285242Sachim 1781285242Sachim break; 1782285242Sachim#ifdef REMOVED 1783285242Sachim//temp for testing 1784285242Sachim case SMP_REPORT_MANUFACTURE_INFORMATION: 1785285242Sachim TI_DBG1(("itdssSMPCompleted: REPORT_MANUFACTURE_INFORMATION\n")); 1786285242Sachim if (agIOInfoLen != sizeof(smpRespReportManufactureInfo_t) + 4 && 1787285242Sachim tdSMPFrameHeader->smpFunctionResult == SMP_FUNCTION_ACCEPTED) /*zero length is expected */ 1788285242Sachim { 1789285242Sachim TI_DBG1(("itdssSMPCompleted: mismatch len agIOInfoLen 0x%x 0x%x\n", agIOInfoLen, 4)); 1790285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1791285242Sachim ostiFreeMemory( 1792285242Sachim tiRoot, 1793285242Sachim tdSMPRequestBody->osMemHandle, 1794285242Sachim sizeof(tdssSMPRequestBody_t) 1795285242Sachim ); 1796285242Sachim#ifndef DIRECT_SMP 1797285242Sachim ostiFreeMemory( 1798285242Sachim tiRoot, 1799285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 1800285242Sachim tdSMPRequestBody->IndirectSMPReqLen 1801285242Sachim ); 1802285242Sachim ostiFreeMemory( 1803285242Sachim tiRoot, 1804285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 1805285242Sachim tdSMPRequestBody->IndirectSMPRespLen 1806285242Sachim ); 1807285242Sachim#endif 1808285242Sachim return; 1809285242Sachim } 1810285242Sachim tdsaReportManInfoRespRcvd( 1811285242Sachim tiRoot, 1812285242Sachim agRoot, 1813285242Sachim oneDeviceData, 1814285242Sachim tdSMPFrameHeader, 1815285242Sachim agFrameHandle 1816285242Sachim ); 1817285242Sachim 1818285242Sachim break; 1819285242Sachim//end temp for testing 1820285242Sachim#endif 1821285242Sachim case SMP_REPORT_ROUTING_INFORMATION: 1822285242Sachim case SMP_REPORT_PHY_ERROR_LOG: 1823285242Sachim case SMP_PHY_TEST_FUNCTION: 1824285242Sachim case SMP_REPORT_MANUFACTURE_INFORMATION: 1825285242Sachim case SMP_READ_GPIO_REGISTER: 1826285242Sachim case SMP_WRITE_GPIO_REGISTER: 1827285242Sachim default: 1828285242Sachim TI_DBG1(("itdssSMPCompleted: wrong SMP function 0x%x\n", tdSMPFrameHeader->smpFunction)); 1829285242Sachim TI_DBG1(("itdssSMPCompleted: smpFrameType 0x%x\n", tdSMPFrameHeader->smpFrameType)); 1830285242Sachim TI_DBG1(("itdssSMPCompleted: smpFunctionResult 0x%x\n", tdSMPFrameHeader->smpFunctionResult)); 1831285242Sachim TI_DBG1(("itdssSMPCompleted: smpReserved 0x%x\n", tdSMPFrameHeader->smpReserved)); 1832285242Sachim tdhexdump("itdssSMPCompleted: SMP payload", (bit8 *)agFrameHandle, agIOInfoLen); 1833285242Sachim break; 1834285242Sachim } 1835285242Sachim } 1836285242Sachim else if (agIOStatus == OSSA_IO_ABORTED || agIOStatus == OSSA_IO_INVALID_LENGTH) 1837285242Sachim { 1838285242Sachim /* no retry this case */ 1839285242Sachim TI_DBG1(("itdssSMPCompleted: OSSA_IO_ABORTED\n")); 1840285242Sachim } 1841285242Sachim else if (agIOStatus == OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE) 1842285242Sachim { 1843285242Sachim TI_DBG1(("itdssSMPCompleted: OSSA_IO_ERROR_INTERNAL_SMP_RESOURCE\n")); 1844285242Sachim saFrameReadBlock(agRoot, agFrameHandle, 0, smpHeader, 4); 1845285242Sachim tdSMPFrameHeader = (tdssSMPFrameHeader_t *)smpHeader; 1846285242Sachim 1847285242Sachim status = saSMPStart( 1848285242Sachim agRoot, 1849285242Sachim agIORequest, 1850285242Sachim tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData), 1851285242Sachim agDevHandle, 1852285242Sachim AGSA_SMP_INIT_REQ, 1853285242Sachim agSASRequestBody, 1854285242Sachim &ossaSMPCompleted 1855285242Sachim ); 1856285242Sachim 1857285242Sachim if (status == AGSA_RC_SUCCESS) 1858285242Sachim { 1859285242Sachim /* increment the number of pending SMP */ 1860285242Sachim onePortContext->discovery.pendingSMP++; 1861285242Sachim if (SMPRequestFunction == SMP_REPORT_GENERAL || SMPRequestFunction == SMP_DISCOVER || 1862285242Sachim SMPRequestFunction == SMP_REPORT_PHY_SATA || 1863285242Sachim SMPRequestFunction == SMP_CONFIGURE_ROUTING_INFORMATION ) 1864285242Sachim { 1865285242Sachim /* start discovery-related SMP timer */ 1866285242Sachim tdsaDiscoverySMPTimer(tiRoot, onePortContext, (bit32)(tdSMPFrameHeader->smpFunction), tdSMPRequestBody); 1867285242Sachim } 1868285242Sachim return; 1869285242Sachim } 1870285242Sachim else if (status == AGSA_RC_BUSY) 1871285242Sachim { 1872285242Sachim if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL || 1873285242Sachim tdSMPFrameHeader->smpFunction == SMP_DISCOVER || 1874285242Sachim tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA || 1875285242Sachim tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION ) 1876285242Sachim { 1877285242Sachim tdsaSMPBusyTimer(tiRoot, onePortContext, oneDeviceData, tdSMPRequestBody); 1878285242Sachim } 1879285242Sachim else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL) 1880285242Sachim { 1881285242Sachim /* For taskmanagement SMP, let's fail task management failure */ 1882285242Sachim tdsaPhyControlFailureRespRcvd( 1883285242Sachim tiRoot, 1884285242Sachim agRoot, 1885285242Sachim oneDeviceData, 1886285242Sachim tdSMPFrameHeader, 1887285242Sachim agFrameHandle, 1888285242Sachim CurrentTaskTag 1889285242Sachim ); 1890285242Sachim } 1891285242Sachim else 1892285242Sachim { 1893285242Sachim } 1894285242Sachim } 1895285242Sachim else /* AGSA_RC_FAILURE */ 1896285242Sachim { 1897285242Sachim if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL || 1898285242Sachim tdSMPFrameHeader->smpFunction == SMP_DISCOVER || 1899285242Sachim tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA || 1900285242Sachim tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION ) 1901285242Sachim { 1902285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1903285242Sachim } 1904285242Sachim else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL) 1905285242Sachim { 1906285242Sachim /* task management failure */ 1907285242Sachim tdsaPhyControlFailureRespRcvd( 1908285242Sachim tiRoot, 1909285242Sachim agRoot, 1910285242Sachim oneDeviceData, 1911285242Sachim tdSMPFrameHeader, 1912285242Sachim agFrameHandle, 1913285242Sachim CurrentTaskTag 1914285242Sachim ); 1915285242Sachim } 1916285242Sachim else 1917285242Sachim { 1918285242Sachim } 1919285242Sachim } 1920285242Sachim } 1921285242Sachim else 1922285242Sachim { 1923285242Sachim if (tdSMPRequestBody->retries < SMP_RETRIES) /* 5 */ 1924285242Sachim { 1925285242Sachim /* retry the SMP again */ 1926285242Sachim TI_DBG1(("itdssSMPCompleted: failed! but retries %d agIOStatus 0x%x %d agIOInfoLen %d\n", 1927285242Sachim tdSMPRequestBody->retries, agIOStatus, agIOStatus, agIOInfoLen)); 1928285242Sachim if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS || 1929285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED || 1930285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO || 1931285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST || 1932285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE || 1933285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED || 1934285242Sachim agIOStatus == OSSA_IO_DS_NON_OPERATIONAL 1935285242Sachim ) 1936285242Sachim { 1937285242Sachim saSetDeviceState(agRoot, agNULL, tdSMPRequestBody->queueNumber, agDevHandle, SA_DS_OPERATIONAL); 1938285242Sachim } 1939285242Sachim saSMPStart( 1940285242Sachim agRoot, 1941285242Sachim agIORequest, 1942285242Sachim tdSMPRequestBody->queueNumber, //tdsaAllShared->SMPQNum, //tdsaRotateQnumber(tiRoot, oneDeviceData), 1943285242Sachim agDevHandle, 1944285242Sachim AGSA_SMP_INIT_REQ, 1945285242Sachim agSASRequestBody, 1946285242Sachim &ossaSMPCompleted 1947285242Sachim ); 1948285242Sachim /* increment the number of pending SMP */ 1949285242Sachim onePortContext->discovery.pendingSMP++; 1950285242Sachim tdSMPRequestBody->retries++; 1951285242Sachim return; 1952285242Sachim } 1953285242Sachim else 1954285242Sachim { 1955285242Sachim tdSMPFrameHeader = (tdssSMPFrameHeader_t *)agSMPFrame->outFrameBuf; 1956285242Sachim tdSMPPayload = (bit8 *)agSMPFrame->outFrameBuf + 4; 1957285242Sachim TI_DBG1(("itdssSMPCompleted: failed! no more retry! agIOStatus 0x%x %d\n", agIOStatus, agIOStatus)); 1958285242Sachim if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL) 1959285242Sachim { 1960285242Sachim TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n")); 1961285242Sachim } 1962285242Sachim 1963285242Sachim if (agIOStatus == OSSA_IO_DS_IN_RECOVERY) 1964285242Sachim { 1965285242Sachim TI_DBG1(("itdssSMPCompleted: failed! agIOStatus is OSSA_IO_DS_IN_RECOVERY\n")); 1966285242Sachim } 1967285242Sachim 1968285242Sachim if (tdSMPFrameHeader->smpFunction == SMP_REPORT_GENERAL || 1969285242Sachim tdSMPFrameHeader->smpFunction == SMP_DISCOVER || 1970285242Sachim tdSMPFrameHeader->smpFunction == SMP_REPORT_PHY_SATA || 1971285242Sachim tdSMPFrameHeader->smpFunction == SMP_CONFIGURE_ROUTING_INFORMATION 1972285242Sachim ) 1973285242Sachim { 1974285242Sachim /* discovery failure */ 1975285242Sachim TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction)); 1976285242Sachim TI_DBG1(("itdssSMPCompleted: discover done with error\n")); 1977285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1978285242Sachim } 1979285242Sachim else if (tdSMPFrameHeader->smpFunction == SMP_PHY_CONTROL) 1980285242Sachim { 1981285242Sachim TI_DBG1(("itdssSMPCompleted: SMP_PHY_CONTROL\n")); 1982285242Sachim smpPhyControlReq = (smpReqPhyControl_t *)tdSMPPayload; 1983285242Sachim if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_CLEAR_AFFILIATION) 1984285242Sachim { 1985285242Sachim TI_DBG1(("itdssSMPCompleted: discover done with error\n")); 1986285242Sachim tdsaSASDiscoverDone(tiRoot, onePortContext, tiError); 1987285242Sachim } 1988285242Sachim else if (smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_HARD_RESET || 1989285242Sachim smpPhyControlReq->phyOperation == SMP_PHY_CONTROL_LINK_RESET ) 1990285242Sachim { 1991285242Sachim TI_DBG1(("itdssSMPCompleted: device reset failed\n")); 1992285242Sachim if (CurrentTaskTag != agNULL ) 1993285242Sachim { 1994285242Sachim TI_DBG1(("itdssSMPCompleted: callback to OS layer with failure\n")); 1995285242Sachim ostiInitiatorEvent( tiRoot, 1996285242Sachim NULL, 1997285242Sachim NULL, 1998285242Sachim tiIntrEventTypeTaskManagement, 1999285242Sachim tiTMFailed, 2000285242Sachim CurrentTaskTag ); 2001285242Sachim } 2002285242Sachim else 2003285242Sachim { 2004285242Sachim /* hard reset was not done with this device */ 2005285242Sachim oneDeviceData->ResetCnt = 0; 2006285242Sachim } 2007285242Sachim } 2008285242Sachim else 2009285242Sachim { 2010285242Sachim TI_DBG1(("itdssSMPCompleted: unknown phy operation 0x%x\n", smpPhyControlReq->phyOperation)); 2011285242Sachim } 2012285242Sachim } /* SMP_PHY_CONTROL */ 2013285242Sachim else 2014285242Sachim { 2015285242Sachim TI_DBG1(("itdssSMPCompleted: SMP function 0x%x\n", tdSMPFrameHeader->smpFunction)); 2016285242Sachim } 2017285242Sachim } /* else */ 2018285242Sachim } /* outer else */ 2019285242Sachim 2020285242Sachim ostiFreeMemory( 2021285242Sachim tiRoot, 2022285242Sachim tdSMPRequestBody->osMemHandle, 2023285242Sachim sizeof(tdssSMPRequestBody_t) 2024285242Sachim ); 2025285242Sachim#ifndef DIRECT_SMP 2026285242Sachim ostiFreeMemory( 2027285242Sachim tiRoot, 2028285242Sachim tdSMPRequestBody->IndirectSMPReqosMemHandle, 2029285242Sachim tdSMPRequestBody->IndirectSMPReqLen 2030285242Sachim ); 2031285242Sachim ostiFreeMemory( 2032285242Sachim tiRoot, 2033285242Sachim tdSMPRequestBody->IndirectSMPResposMemHandle, 2034285242Sachim tdSMPRequestBody->IndirectSMPRespLen 2035285242Sachim ); 2036285242Sachim#endif 2037285242Sachim 2038285242Sachim 2039285242Sachim return; 2040285242Sachim} 2041285242Sachim 2042285242Sachim#else 2043285242Sachim 2044285242SachimosGLOBAL void 2045285242SachimitdssSMPCompleted ( 2046285242Sachim agsaRoot_t *agRoot, 2047285242Sachim agsaIORequest_t *agIORequest, 2048285242Sachim bit32 agIOStatus, 2049285242Sachim bit32 agIOInfoLen, 2050285242Sachim agsaFrameHandle_t agFrameHandle 2051285242Sachim ) 2052285242Sachim{ 2053285242Sachim /* pass the payload to OS layer */ 2054285242Sachim TI_DBG3(("itdssSMPCompleted: start\n")); 2055285242Sachim} 2056285242Sachim#endif 2057285242Sachim 2058285242Sachim 2059285242Sachim/***************************************************************************** 2060285242Sachim*! \brief itdIoSuccessHandler 2061285242Sachim* 2062285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2063285242Sachim* layer with agIOStatus = OSSA_IO_SUCCESS 2064285242Sachim* 2065285242Sachim* \param agRoot: pointer to port instance 2066285242Sachim* \param agIORequest: pointer to I/O request 2067285242Sachim* \param agIOStatus: I/O status given by LL layer 2068285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2069285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2070285242Sachim* of abort request 2071285242Sachim* \param agOtherInfo Residual count 2072285242Sachim* \return: None 2073285242Sachim* 2074285242Sachim* 2075285242Sachim*****************************************************************************/ 2076285242SachimosGLOBAL void 2077285242SachimitdssIOSuccessHandler( 2078285242Sachim agsaRoot_t *agRoot, 2079285242Sachim agsaIORequest_t *agIORequest, 2080285242Sachim bit32 agIOStatus, 2081285242Sachim bit32 agIOInfoLen, 2082285242Sachim void *agParam, 2083285242Sachim bit32 agOtherInfo 2084285242Sachim ) 2085285242Sachim{ 2086285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2087285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2088285242Sachim itdsaIni_t *Initiator = (itdsaIni_t *)osData->itdsaIni; 2089285242Sachim tdIORequestBody_t *tdIORequestBody; 2090285242Sachim agsaSSPResponseInfoUnit_t agSSPRespIU; 2091285242Sachim tiSenseData_t senseData; 2092285242Sachim bit8 senseDataPayload[256]; 2093285242Sachim bit8 respData[128]; 2094285242Sachim bit32 scsi_status; 2095285242Sachim bit32 senseLen; 2096285242Sachim bit32 respLen; 2097285242Sachim bit32 data_status; 2098285242Sachim bit32 i; 2099285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 2100285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 2101285242Sachim 2102285242Sachim TI_DBG2(("itdssIOSuccessHandler: start\n")); 2103285242Sachim TI_DBG2(("itdssIOSuccessHandler: agIOInfoLen %d\n", agIOInfoLen)); 2104285242Sachim 2105285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2106285242Sachim 2107285242Sachim tdIORequestBody->ioCompleted = agTRUE; 2108285242Sachim tdIORequestBody->ioStarted = agFALSE; 2109285242Sachim 2110285242Sachim /* 2111285242Sachim agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum 2112285242Sachim date length 2113285242Sachim */ 2114285242Sachim if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t)) 2115285242Sachim { 2116285242Sachim TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen does not match!!!\n")); 2117285242Sachim TI_DBG1(("itdssIOSuccessHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t))); 2118285242Sachim ostiInitiatorIOCompleted( 2119285242Sachim tiRoot, 2120285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 2121285242Sachim tiIOFailed, 2122285242Sachim tiDetailOtherError, 2123285242Sachim agNULL, 2124285242Sachim agTRUE /* intContext; is not being used */ 2125285242Sachim ); 2126285242Sachim return; 2127285242Sachim } 2128285242Sachim /* reads agsaSSPResponseInfoUnit_t */ 2129285242Sachim saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t)); 2130285242Sachim 2131285242Sachim data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU); 2132285242Sachim scsi_status = agSSPRespIU.status; 2133285242Sachim /* endianess is invovled here */ 2134285242Sachim senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU); 2135285242Sachim respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU); 2136285242Sachim 2137285242Sachim TI_DBG2(("itdssIOSuccessHandler: dataPres=%x\n", data_status)); 2138285242Sachim TI_DBG2(("itdssIOSuccessHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen)); 2139285242Sachim 2140285242Sachim /* 2141285242Sachim sanity check: do not go beyond of agIOInfoLen. if happens, return error 2142285242Sachim agIOInfoLen >= sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> OK 2143285242Sachim because frame must be divisible by 4, so there can be extra padding 2144285242Sachim agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> NOT OK 2145285242Sachim */ 2146285242Sachim if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen) 2147285242Sachim { 2148285242Sachim TI_DBG1(("itdssIOSuccessHandler: Second agIOInfoLen does not match!!!\n")); 2149285242Sachim 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)); 2150285242Sachim 2151285242Sachim ostiInitiatorIOCompleted( 2152285242Sachim tiRoot, 2153285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 2154285242Sachim tiIOFailed, 2155285242Sachim tiDetailOtherError, 2156285242Sachim agNULL, 2157285242Sachim agTRUE /* intContext; is not being used */ 2158285242Sachim ); 2159285242Sachim return; 2160285242Sachim } 2161285242Sachim 2162285242Sachim /* reads response data */ 2163285242Sachim saFrameReadBlock(agRoot, agParam, 2164285242Sachim sizeof(agsaSSPResponseInfoUnit_t), 2165285242Sachim respData, respLen); 2166285242Sachim /* reads sense data */ 2167285242Sachim saFrameReadBlock(agRoot, agParam, 2168285242Sachim sizeof(agsaSSPResponseInfoUnit_t) 2169285242Sachim + respLen, 2170285242Sachim senseDataPayload, senseLen); 2171285242Sachim 2172285242Sachim if (data_status == 0) 2173285242Sachim { 2174285242Sachim /* NO_DATA */ 2175285242Sachim TI_DBG1(("itdssIOSuccessHandler: no data scsi_status 0x%x\n",scsi_status)); 2176285242Sachim 2177285242Sachim ostiInitiatorIOCompleted( 2178285242Sachim tiRoot, 2179285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 2180285242Sachim tiIOSuccess, 2181285242Sachim scsi_status, 2182285242Sachim agNULL, 2183285242Sachim agTRUE /* intContext; is not being used */ 2184285242Sachim ); 2185285242Sachim 2186285242Sachim return; 2187285242Sachim } 2188285242Sachim 2189285242Sachim if (data_status == 1) 2190285242Sachim { 2191285242Sachim /* RESPONSE_DATA */ 2192285242Sachim TI_DBG1(("itdssIOSuccessHandler: response data \n")); 2193285242Sachim 2194285242Sachim ostiInitiatorIOCompleted( 2195285242Sachim tiRoot, 2196285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 2197285242Sachim tiIOSuccess, 2198285242Sachim 0, 2199285242Sachim agNULL, 2200285242Sachim agTRUE /* intContext; is not being used */ 2201285242Sachim ); 2202285242Sachim return; 2203285242Sachim } 2204285242Sachim 2205285242Sachim if (data_status == 2) 2206285242Sachim { 2207285242Sachim /* SENSE_DATA */ 2208285242Sachim TI_DBG2(("itdssIOSuccessHandler: sense data \n")); 2209285242Sachim 2210285242Sachim senseData.senseData = &senseDataPayload; 2211285242Sachim senseData.senseLen = MIN(256, senseLen); 2212285242Sachim /* debugging */ 2213285242Sachim tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t)); 2214285242Sachim 2215285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 2216285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2217285242Sachim 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), 2218285242Sachim oneDeviceData->id)); 2219285242Sachim tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen); 2220285242Sachim// tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen); 2221285242Sachim 2222285242Sachim if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR) 2223285242Sachim { 2224285242Sachim Initiator->SenseKeyCounter.SoftError ++; 2225285242Sachim } 2226285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY) 2227285242Sachim { 2228285242Sachim Initiator->SenseKeyCounter.MediumNotReady++; 2229285242Sachim } 2230285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR) 2231285242Sachim { 2232285242Sachim Initiator->SenseKeyCounter.MediumError++; 2233285242Sachim } 2234285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR) 2235285242Sachim { 2236285242Sachim Initiator->SenseKeyCounter.HardwareError++; 2237285242Sachim } 2238285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST) 2239285242Sachim { 2240285242Sachim Initiator->SenseKeyCounter.IllegalRequest++; 2241285242Sachim } 2242285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION) 2243285242Sachim { 2244285242Sachim Initiator->SenseKeyCounter.UnitAttention++; 2245285242Sachim } 2246285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND) 2247285242Sachim { 2248285242Sachim Initiator->SenseKeyCounter.AbortCommand++; 2249285242Sachim } 2250285242Sachim else 2251285242Sachim { 2252285242Sachim Initiator->SenseKeyCounter.OtherKeyType++; 2253285242Sachim } 2254285242Sachim 2255285242Sachim /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */ 2256285242Sachim if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11)) 2257285242Sachim { 2258285242Sachim TI_DBG2(("itdssIOSuccessHandler: sending notfify spinup\n")); 2259285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 2260285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2261285242Sachim if (oneDeviceData->directlyAttached == agTRUE) 2262285242Sachim { 2263285242Sachim for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++) 2264285242Sachim { 2265285242Sachim saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL); 2266285242Sachim } 2267285242Sachim } 2268285242Sachim } 2269285242Sachim ostiInitiatorIOCompleted( 2270285242Sachim tiRoot, 2271285242Sachim /* tiIORequest */ 2272285242Sachim tdIORequestBody->tiIORequest, 2273285242Sachim tiIOSuccess, 2274285242Sachim scsi_status, 2275285242Sachim &senseData, 2276285242Sachim agTRUE /* intContext; is not being used */ 2277285242Sachim ); 2278285242Sachim return; 2279285242Sachim } 2280285242Sachim if (data_status == 3) 2281285242Sachim { 2282285242Sachim /* RESERVED */ 2283285242Sachim TI_DBG1(("itdssIOSuccessHandler: reserved wrong!!!\n")); 2284285242Sachim ostiInitiatorIOCompleted( 2285285242Sachim tiRoot, 2286285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 2287285242Sachim tiIOFailed, 2288285242Sachim scsi_status, 2289285242Sachim agNULL, 2290285242Sachim agTRUE /* intContext; is not being used */ 2291285242Sachim ); 2292285242Sachim return; 2293285242Sachim } 2294285242Sachim 2295285242Sachim} 2296285242Sachim 2297285242Sachim/***************************************************************************** 2298285242Sachim*! \brief itdssIOAbortedHandler 2299285242Sachim* 2300285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2301285242Sachim* layer with agIOStatus = OSSA_IO_ABORTED 2302285242Sachim* 2303285242Sachim* \param agRoot: pointer to port instance 2304285242Sachim* \param agIORequest: pointer to I/O request 2305285242Sachim* \param agIOStatus: I/O status given by LL layer 2306285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2307285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2308285242Sachim* of abort request 2309285242Sachim* \param agOtherInfo Residual count 2310285242Sachim* \return: None 2311285242Sachim* 2312285242Sachim* 2313285242Sachim*****************************************************************************/ 2314285242Sachim/* see itdosIOCompleted() and itdinit.c and itdIoAbortedHandler in itdio.c*/ 2315285242SachimosGLOBAL void 2316285242SachimitdssIOAbortedHandler ( 2317285242Sachim agsaRoot_t *agRoot, 2318285242Sachim agsaIORequest_t *agIORequest, 2319285242Sachim bit32 agIOStatus, 2320285242Sachim bit32 agIOInfoLen, 2321285242Sachim void *agParam, 2322285242Sachim bit32 agOtherInfo 2323285242Sachim ) 2324285242Sachim{ 2325285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2326285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2327285242Sachim bit32 intContext = osData->IntContext; 2328285242Sachim tdIORequestBody_t *tdIORequestBody; 2329285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 2330285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 2331285242Sachim 2332285242Sachim TI_DBG2(("itdssIOAbortedHandler: start\n")); 2333285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2334285242Sachim 2335285242Sachim if (agIOStatus != OSSA_IO_ABORTED) 2336285242Sachim { 2337285242Sachim TI_DBG1(("itdssIOAbortedHandler: incorrect agIOStatus 0x%x\n", agIOStatus)); 2338285242Sachim } 2339285242Sachim 2340285242Sachim if (tdIORequestBody == agNULL) 2341285242Sachim { 2342285242Sachim TI_DBG1(("itdssIOAbortedHandler: start\n")); 2343285242Sachim return; 2344285242Sachim } 2345285242Sachim 2346285242Sachim if (tdIORequestBody != agNULL) 2347285242Sachim { 2348285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 2349285242Sachim } 2350285242Sachim if (tiDeviceHandle != agNULL) 2351285242Sachim { 2352285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2353285242Sachim } 2354285242Sachim if (oneDeviceData != agNULL) 2355285242Sachim { 2356285242Sachim TI_DBG2(("itdssIOAbortedHandler: did %d \n", oneDeviceData->id)); 2357285242Sachim } 2358285242Sachim else 2359285242Sachim { 2360285242Sachim TI_DBG1(("itdssIOAbortedHandler: oneDeviceData is NULL\n")); 2361285242Sachim } 2362285242Sachim 2363285242Sachim 2364285242Sachim ostiInitiatorIOCompleted ( 2365285242Sachim tiRoot, 2366285242Sachim tdIORequestBody->tiIORequest, 2367285242Sachim tiIOFailed, 2368285242Sachim tiDetailAborted, 2369285242Sachim agNULL, 2370285242Sachim intContext 2371285242Sachim ); 2372285242Sachim 2373285242Sachim return; 2374285242Sachim} 2375285242Sachim 2376285242Sachim#ifdef REMOVED 2377285242Sachim/***************************************************************************** 2378285242Sachim*! \brief itdssIOOverFlowHandler 2379285242Sachim* 2380285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2381285242Sachim* layer with agIOStatus = OSSA_IO_OVERFLOW 2382285242Sachim* 2383285242Sachim* \param agRoot: pointer to port instance 2384285242Sachim* \param agIORequest: pointer to I/O request 2385285242Sachim* \param agIOStatus: I/O status given by LL layer 2386285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2387285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2388285242Sachim* of abort request 2389285242Sachim* \return: None 2390285242Sachim* 2391285242Sachim* 2392285242Sachim*****************************************************************************/ 2393285242SachimosGLOBAL void 2394285242SachimitdssIOOverFlowHandler( 2395285242Sachim agsaRoot_t *agRoot, 2396285242Sachim agsaIORequest_t *agIORequest, 2397285242Sachim bit32 agIOStatus, 2398285242Sachim bit32 agIOInfoLen, 2399285242Sachim void *agParam 2400285242Sachim ) 2401285242Sachim{ 2402285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2403285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2404285242Sachim bit32 intContext = osData->IntContext; 2405285242Sachim tdIORequestBody_t *tdIORequestBody; 2406285242Sachim 2407285242Sachim TI_DBG2(("itdssIOOverFlowHandler: start\n")); 2408285242Sachim TI_DBG2(("itdssIOOverFlowHandler: not transferred byte 0x%x\n", agIOInfoLen)); 2409285242Sachim 2410285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2411285242Sachim 2412285242Sachim ostiInitiatorIOCompleted ( 2413285242Sachim tiRoot, 2414285242Sachim tdIORequestBody->tiIORequest, 2415285242Sachim tiIOOverRun, 2416285242Sachim agIOInfoLen, 2417285242Sachim agNULL, 2418285242Sachim intContext 2419285242Sachim ); 2420285242Sachim 2421285242Sachim return; 2422285242Sachim} 2423285242Sachim#endif 2424285242Sachim 2425285242Sachim 2426285242Sachim/***************************************************************************** 2427285242Sachim*! \brief itdssIOUnderFlowHandler 2428285242Sachim* 2429285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2430285242Sachim* layer with agIOStatus = OSSA_IO_UNDERFLOW 2431285242Sachim* 2432285242Sachim* \param agRoot: pointer to port instance 2433285242Sachim* \param agIORequest: pointer to I/O request 2434285242Sachim* \param agIOStatus: I/O status given by LL layer 2435285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2436285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2437285242Sachim* of abort request 2438285242Sachim* \param agOtherInfo Residual count 2439285242Sachim* \return: None 2440285242Sachim* 2441285242Sachim* 2442285242Sachim*****************************************************************************/ 2443285242SachimosGLOBAL void 2444285242SachimitdssIOUnderFlowHandler( 2445285242Sachim agsaRoot_t *agRoot, 2446285242Sachim agsaIORequest_t *agIORequest, 2447285242Sachim bit32 agIOStatus, 2448285242Sachim bit32 agIOInfoLen, 2449285242Sachim void *agParam, 2450285242Sachim bit32 agOtherInfo 2451285242Sachim ) 2452285242Sachim{ 2453285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2454285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2455285242Sachim bit32 intContext = osData->IntContext; 2456285242Sachim tdIORequestBody_t *tdIORequestBody; 2457285242Sachim 2458285242Sachim TI_DBG6(("itdssIOUnderFlowHandler: start\n")); 2459285242Sachim TI_DBG6(("itdssIOUnderFlowHandler: agIOInfoLen 0x%x\n", agIOInfoLen)); 2460285242Sachim 2461285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2462285242Sachim 2463285242Sachim ostiInitiatorIOCompleted ( 2464285242Sachim tiRoot, 2465285242Sachim tdIORequestBody->tiIORequest, 2466285242Sachim tiIOUnderRun, 2467285242Sachim agIOInfoLen, 2468285242Sachim agNULL, 2469285242Sachim intContext 2470285242Sachim ); 2471285242Sachim 2472285242Sachim return; 2473285242Sachim} 2474285242Sachim 2475285242Sachim/***************************************************************************** 2476285242Sachim*! \brief itdssIOFailedHandler 2477285242Sachim* 2478285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2479285242Sachim* layer with agIOStatus = OSSA_IO_FAILED 2480285242Sachim* 2481285242Sachim* \param agRoot: pointer to port instance 2482285242Sachim* \param agIORequest: pointer to I/O request 2483285242Sachim* \param agIOStatus: I/O status given by LL layer 2484285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2485285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2486285242Sachim* of abort request 2487285242Sachim* \param agOtherInfo Residual count 2488285242Sachim* \return: None 2489285242Sachim* 2490285242Sachim* 2491285242Sachim*****************************************************************************/ 2492285242SachimosGLOBAL void 2493285242SachimitdssIOFailedHandler( 2494285242Sachim agsaRoot_t *agRoot, 2495285242Sachim agsaIORequest_t *agIORequest, 2496285242Sachim bit32 agIOStatus, 2497285242Sachim bit32 agIOInfoLen, 2498285242Sachim void *agParam, 2499285242Sachim bit32 agOtherInfo 2500285242Sachim ) 2501285242Sachim{ 2502285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2503285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2504285242Sachim bit32 intContext = osData->IntContext; 2505285242Sachim tdIORequestBody_t *tdIORequestBody; 2506285242Sachim 2507285242Sachim TI_DBG1(("itdssIOFailedHandler: start\n")); 2508285242Sachim 2509285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2510285242Sachim 2511285242Sachim ostiInitiatorIOCompleted ( 2512285242Sachim tiRoot, 2513285242Sachim tdIORequestBody->tiIORequest, 2514285242Sachim tiIOFailed, 2515285242Sachim tiDetailOtherError, 2516285242Sachim agNULL, 2517285242Sachim intContext 2518285242Sachim ); 2519285242Sachim return; 2520285242Sachim} 2521285242Sachim 2522285242Sachim/***************************************************************************** 2523285242Sachim*! \brief itdssIOAbortResetHandler 2524285242Sachim* 2525285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2526285242Sachim* layer with agIOStatus = OSSA_IO_ABORT_RESET 2527285242Sachim* 2528285242Sachim* \param agRoot: pointer to port instance 2529285242Sachim* \param agIORequest: pointer to I/O request 2530285242Sachim* \param agIOStatus: I/O status given by LL layer 2531285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2532285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2533285242Sachim* of abort request 2534285242Sachim* \param agOtherInfo Residual count 2535285242Sachim* \return: None 2536285242Sachim* 2537285242Sachim* 2538285242Sachim*****************************************************************************/ 2539285242SachimosGLOBAL void 2540285242SachimitdssIOAbortResetHandler( 2541285242Sachim agsaRoot_t *agRoot, 2542285242Sachim agsaIORequest_t *agIORequest, 2543285242Sachim bit32 agIOStatus, 2544285242Sachim bit32 agIOInfoLen, 2545285242Sachim void *agParam, 2546285242Sachim bit32 agOtherInfo 2547285242Sachim ) 2548285242Sachim{ 2549285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2550285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2551285242Sachim bit32 intContext = osData->IntContext; 2552285242Sachim tdIORequestBody_t *tdIORequestBody; 2553285242Sachim TI_DBG2(("itdssIOAbortResetHandler: start\n")); 2554285242Sachim 2555285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2556285242Sachim 2557285242Sachim ostiInitiatorIOCompleted ( 2558285242Sachim tiRoot, 2559285242Sachim tdIORequestBody->tiIORequest, 2560285242Sachim tiIOFailed, 2561285242Sachim tiDetailAbortReset, 2562285242Sachim agNULL, 2563285242Sachim intContext 2564285242Sachim ); 2565285242Sachim 2566285242Sachim 2567285242Sachim return; 2568285242Sachim} 2569285242Sachim 2570285242Sachim/***************************************************************************** 2571285242Sachim*! \brief itdssIONotValidHandler 2572285242Sachim* 2573285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2574285242Sachim* layer with agIOStatus = OSSA_IO_NOT_VALID 2575285242Sachim* 2576285242Sachim* \param agRoot: pointer to port instance 2577285242Sachim* \param agIORequest: pointer to I/O request 2578285242Sachim* \param agIOStatus: I/O status given by LL layer 2579285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2580285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2581285242Sachim* of abort request 2582285242Sachim* \param agOtherInfo Residual count 2583285242Sachim* \return: None 2584285242Sachim* 2585285242Sachim* 2586285242Sachim*****************************************************************************/ 2587285242SachimosGLOBAL void 2588285242SachimitdssIONotValidHandler( 2589285242Sachim agsaRoot_t *agRoot, 2590285242Sachim agsaIORequest_t *agIORequest, 2591285242Sachim bit32 agIOStatus, 2592285242Sachim bit32 agIOInfoLen, 2593285242Sachim void *agParam, 2594285242Sachim bit32 agOtherInfo 2595285242Sachim ) 2596285242Sachim{ 2597285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2598285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2599285242Sachim bit32 intContext = osData->IntContext; 2600285242Sachim tdIORequestBody_t *tdIORequestBody; 2601285242Sachim TI_DBG2(("itdssIONotValidHandler: start\n")); 2602285242Sachim 2603285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2604285242Sachim 2605285242Sachim ostiInitiatorIOCompleted ( 2606285242Sachim tiRoot, 2607285242Sachim tdIORequestBody->tiIORequest, 2608285242Sachim tiIOFailed, 2609285242Sachim tiDetailNotValid, 2610285242Sachim agNULL, 2611285242Sachim intContext 2612285242Sachim ); 2613285242Sachim return; 2614285242Sachim} 2615285242Sachim 2616285242Sachim/***************************************************************************** 2617285242Sachim*! \brief itdssIONoDeviceHandler 2618285242Sachim* 2619285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2620285242Sachim* layer with agIOStatus = OSSA_IO_NO_DEVICE 2621285242Sachim* 2622285242Sachim* \param agRoot: pointer to port instance 2623285242Sachim* \param agIORequest: pointer to I/O request 2624285242Sachim* \param agIOStatus: I/O status given by LL layer 2625285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2626285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2627285242Sachim* of abort request 2628285242Sachim* \param agOtherInfo Residual count 2629285242Sachim* \return: None 2630285242Sachim* 2631285242Sachim* 2632285242Sachim*****************************************************************************/ 2633285242SachimosGLOBAL void 2634285242SachimitdssIONoDeviceHandler( 2635285242Sachim agsaRoot_t *agRoot, 2636285242Sachim agsaIORequest_t *agIORequest, 2637285242Sachim bit32 agIOStatus, 2638285242Sachim bit32 agIOInfoLen, 2639285242Sachim void *agParam, 2640285242Sachim bit32 agOtherInfo 2641285242Sachim ) 2642285242Sachim{ 2643285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2644285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2645285242Sachim bit32 intContext = osData->IntContext; 2646285242Sachim tdIORequestBody_t *tdIORequestBody; 2647285242Sachim TI_DBG2(("itdssIONoDeviceHandler: start\n")); 2648285242Sachim 2649285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2650285242Sachim 2651285242Sachim ostiInitiatorIOCompleted ( 2652285242Sachim tiRoot, 2653285242Sachim tdIORequestBody->tiIORequest, 2654285242Sachim tiIOFailed, 2655285242Sachim tiDetailNoLogin, 2656285242Sachim agNULL, 2657285242Sachim intContext 2658285242Sachim ); 2659285242Sachim return; 2660285242Sachim} 2661285242Sachim 2662285242Sachim#ifdef REMOVED /* to do: removed from spec */ 2663285242Sachim/***************************************************************************** 2664285242Sachim*! \brief itdssIllegalParameterHandler 2665285242Sachim* 2666285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2667285242Sachim* layer with agIOStatus = OSSA_IO_ILLEGAL_PARAMETER 2668285242Sachim* 2669285242Sachim* \param agRoot: pointer to port instance 2670285242Sachim* \param agIORequest: pointer to I/O request 2671285242Sachim* \param agIOStatus: I/O status given by LL layer 2672285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2673285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2674285242Sachim* of abort request 2675285242Sachim* \return: None 2676285242Sachim* 2677285242Sachim* 2678285242Sachim*****************************************************************************/ 2679285242SachimosGLOBAL void 2680285242SachimitdssIllegalParameterHandler( 2681285242Sachim agsaRoot_t *agRoot, 2682285242Sachim agsaIORequest_t *agIORequest, 2683285242Sachim bit32 agIOStatus, 2684285242Sachim bit32 agIOInfoLen, 2685285242Sachim void *agParam 2686285242Sachim ) 2687285242Sachim{ 2688285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2689285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2690285242Sachim bit32 intContext = osData->IntContext; 2691285242Sachim tdIORequestBody_t *tdIORequestBody; 2692285242Sachim TI_DBG2(("itdssIllegalParameterHandler: start\n")); 2693285242Sachim 2694285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2695285242Sachim 2696285242Sachim ostiInitiatorIOCompleted ( 2697285242Sachim tiRoot, 2698285242Sachim tdIORequestBody->tiIORequest, 2699285242Sachim tiIOFailed, 2700285242Sachim tiDetailOtherError, 2701285242Sachim agNULL, 2702285242Sachim intContext 2703285242Sachim ); 2704285242Sachim 2705285242Sachim return; 2706285242Sachim} 2707285242Sachim#endif 2708285242Sachim 2709285242Sachim/***************************************************************************** 2710285242Sachim*! \brief itdssLinkFailureHandler 2711285242Sachim* 2712285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2713285242Sachim* layer with agIOStatus = OSSA_IO_LINK_FAILURE 2714285242Sachim* 2715285242Sachim* \param agRoot: pointer to port instance 2716285242Sachim* \param agIORequest: pointer to I/O request 2717285242Sachim* \param agIOStatus: I/O status given by LL layer 2718285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2719285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2720285242Sachim* of abort request 2721285242Sachim* \param agOtherInfo Residual count 2722285242Sachim* \return: None 2723285242Sachim* 2724285242Sachim* 2725285242Sachim*****************************************************************************/ 2726285242SachimosGLOBAL void 2727285242SachimitdssLinkFailureHandler( 2728285242Sachim agsaRoot_t *agRoot, 2729285242Sachim agsaIORequest_t *agIORequest, 2730285242Sachim bit32 agIOStatus, 2731285242Sachim bit32 agIOInfoLen, 2732285242Sachim void *agParam, 2733285242Sachim bit32 agOtherInfo 2734285242Sachim ) 2735285242Sachim{ 2736285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2737285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2738285242Sachim bit32 intContext = osData->IntContext; 2739285242Sachim tdIORequestBody_t *tdIORequestBody; 2740285242Sachim TI_DBG1(("itdssLinkFailureHandler: start\n")); 2741285242Sachim 2742285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2743285242Sachim 2744285242Sachim ostiInitiatorIOCompleted ( 2745285242Sachim tiRoot, 2746285242Sachim tdIORequestBody->tiIORequest, 2747285242Sachim tiIOFailed, 2748285242Sachim tiDetailOtherError, 2749285242Sachim agNULL, 2750285242Sachim intContext 2751285242Sachim ); 2752285242Sachim 2753285242Sachim return; 2754285242Sachim} 2755285242Sachim 2756285242Sachim/***************************************************************************** 2757285242Sachim*! \brief itdssProgErrorHandler 2758285242Sachim* 2759285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2760285242Sachim* layer with agIOStatus = OSSA_IO_PROG_ERROR 2761285242Sachim* 2762285242Sachim* \param agRoot: pointer to port instance 2763285242Sachim* \param agIORequest: pointer to I/O request 2764285242Sachim* \param agIOStatus: I/O status given by LL layer 2765285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2766285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2767285242Sachim* of abort request 2768285242Sachim* \param agOtherInfo Residual count 2769285242Sachim* \return: None 2770285242Sachim* 2771285242Sachim* 2772285242Sachim*****************************************************************************/ 2773285242SachimosGLOBAL void 2774285242SachimitdssProgErrorHandler( 2775285242Sachim agsaRoot_t *agRoot, 2776285242Sachim agsaIORequest_t *agIORequest, 2777285242Sachim bit32 agIOStatus, 2778285242Sachim bit32 agIOInfoLen, 2779285242Sachim void *agParam, 2780285242Sachim bit32 agOtherInfo 2781285242Sachim ) 2782285242Sachim{ 2783285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2784285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2785285242Sachim bit32 intContext = osData->IntContext; 2786285242Sachim tdIORequestBody_t *tdIORequestBody; 2787285242Sachim TI_DBG2(("itdssProgErrorHandler: start\n")); 2788285242Sachim 2789285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2790285242Sachim 2791285242Sachim ostiInitiatorIOCompleted ( 2792285242Sachim tiRoot, 2793285242Sachim tdIORequestBody->tiIORequest, 2794285242Sachim tiIOFailed, 2795285242Sachim tiDetailOtherError, 2796285242Sachim agNULL, 2797285242Sachim intContext 2798285242Sachim ); 2799285242Sachim 2800285242Sachim return; 2801285242Sachim} 2802285242Sachim 2803285242Sachim/***************************************************************************** 2804285242Sachim*! \brief itdssXferErrorBreakHandler 2805285242Sachim* 2806285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2807285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_BREAK 2808285242Sachim* 2809285242Sachim* \param agRoot: pointer to port instance 2810285242Sachim* \param agIORequest: pointer to I/O request 2811285242Sachim* \param agIOStatus: I/O status given by LL layer 2812285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2813285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2814285242Sachim* of abort request 2815285242Sachim* \param agOtherInfo Residual count 2816285242Sachim* \return: None 2817285242Sachim* 2818285242Sachim* 2819285242Sachim*****************************************************************************/ 2820285242SachimosGLOBAL void 2821285242SachimitdssXferErrorBreakHandler( 2822285242Sachim agsaRoot_t *agRoot, 2823285242Sachim agsaIORequest_t *agIORequest, 2824285242Sachim bit32 agIOStatus, 2825285242Sachim bit32 agIOInfoLen, 2826285242Sachim void *agParam, 2827285242Sachim bit32 agOtherInfo 2828285242Sachim ) 2829285242Sachim{ 2830285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2831285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2832285242Sachim bit32 intContext = osData->IntContext; 2833285242Sachim tdIORequestBody_t *tdIORequestBody; 2834285242Sachim TI_DBG1(("itdssXferErrorBreakHandler: start\n")); 2835285242Sachim 2836285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2837285242Sachim 2838285242Sachim ostiInitiatorIOCompleted ( 2839285242Sachim tiRoot, 2840285242Sachim tdIORequestBody->tiIORequest, 2841285242Sachim tiIOFailed, 2842285242Sachim tiDetailOtherError, 2843285242Sachim agNULL, 2844285242Sachim intContext 2845285242Sachim ); 2846285242Sachim 2847285242Sachim return; 2848285242Sachim} 2849285242Sachim 2850285242Sachim/***************************************************************************** 2851285242Sachim*! \brief itdssXferErrorPhyNotReadyHandler 2852285242Sachim* 2853285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2854285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_PHY_NOT_READY 2855285242Sachim* 2856285242Sachim* \param agRoot: pointer to port instance 2857285242Sachim* \param agIORequest: pointer to I/O request 2858285242Sachim* \param agIOStatus: I/O status given by LL layer 2859285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2860285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2861285242Sachim* of abort request 2862285242Sachim* \param agOtherInfo Residual count 2863285242Sachim* \return: None 2864285242Sachim* 2865285242Sachim* 2866285242Sachim*****************************************************************************/ 2867285242SachimosGLOBAL void 2868285242SachimitdssXferErrorPhyNotReadyHandler( 2869285242Sachim agsaRoot_t *agRoot, 2870285242Sachim agsaIORequest_t *agIORequest, 2871285242Sachim bit32 agIOStatus, 2872285242Sachim bit32 agIOInfoLen, 2873285242Sachim void *agParam, 2874285242Sachim bit32 agOtherInfo 2875285242Sachim ) 2876285242Sachim{ 2877285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2878285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2879285242Sachim bit32 intContext = osData->IntContext; 2880285242Sachim tdIORequestBody_t *tdIORequestBody; 2881285242Sachim TI_DBG2(("itdssXferErrorPhyNotReadyHandler: start\n")); 2882285242Sachim 2883285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2884285242Sachim 2885285242Sachim ostiInitiatorIOCompleted ( 2886285242Sachim tiRoot, 2887285242Sachim tdIORequestBody->tiIORequest, 2888285242Sachim tiIOFailed, 2889285242Sachim tiDetailOtherError, 2890285242Sachim agNULL, 2891285242Sachim intContext 2892285242Sachim ); 2893285242Sachim 2894285242Sachim return; 2895285242Sachim} 2896285242Sachim 2897285242Sachim/***************************************************************************** 2898285242Sachim*! \brief itdssOpenCnxErrorProtocolNotSupprotedHandler 2899285242Sachim* 2900285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2901285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED 2902285242Sachim* 2903285242Sachim* \param agRoot: pointer to port instance 2904285242Sachim* \param agIORequest: pointer to I/O request 2905285242Sachim* \param agIOStatus: I/O status given by LL layer 2906285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2907285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2908285242Sachim* of abort request 2909285242Sachim* \param agOtherInfo Residual count 2910285242Sachim* \return: None 2911285242Sachim* 2912285242Sachim* 2913285242Sachim*****************************************************************************/ 2914285242SachimosGLOBAL void 2915285242SachimitdssOpenCnxErrorProtocolNotSupprotedHandler( 2916285242Sachim agsaRoot_t *agRoot, 2917285242Sachim agsaIORequest_t *agIORequest, 2918285242Sachim bit32 agIOStatus, 2919285242Sachim bit32 agIOInfoLen, 2920285242Sachim void *agParam, 2921285242Sachim bit32 agOtherInfo 2922285242Sachim ) 2923285242Sachim{ 2924285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2925285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2926285242Sachim bit32 intContext = osData->IntContext; 2927285242Sachim tdIORequestBody_t *tdIORequestBody; 2928285242Sachim TI_DBG2(("itdssOpenCnxErrorProtocolNotSupprotedHandler: start\n")); 2929285242Sachim 2930285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2931285242Sachim 2932285242Sachim ostiInitiatorIOCompleted ( 2933285242Sachim tiRoot, 2934285242Sachim tdIORequestBody->tiIORequest, 2935285242Sachim tiIOFailed, 2936285242Sachim tiDetailOtherError, 2937285242Sachim agNULL, 2938285242Sachim intContext 2939285242Sachim ); 2940285242Sachim 2941285242Sachim return; 2942285242Sachim} 2943285242Sachim 2944285242Sachim/***************************************************************************** 2945285242Sachim*! \brief itdssOpenCnxErrorZoneViolationHandler 2946285242Sachim* 2947285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2948285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION 2949285242Sachim* 2950285242Sachim* \param agRoot: pointer to port instance 2951285242Sachim* \param agIORequest: pointer to I/O request 2952285242Sachim* \param agIOStatus: I/O status given by LL layer 2953285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 2954285242Sachim* \param agParam A Handle used to refer to the response frame or handle 2955285242Sachim* of abort request 2956285242Sachim* \param agOtherInfo Residual count 2957285242Sachim* \return: None 2958285242Sachim* 2959285242Sachim* 2960285242Sachim*****************************************************************************/ 2961285242SachimosGLOBAL void 2962285242SachimitdssOpenCnxErrorZoneViolationHandler( 2963285242Sachim agsaRoot_t *agRoot, 2964285242Sachim agsaIORequest_t *agIORequest, 2965285242Sachim bit32 agIOStatus, 2966285242Sachim bit32 agIOInfoLen, 2967285242Sachim void *agParam, 2968285242Sachim bit32 agOtherInfo 2969285242Sachim ) 2970285242Sachim{ 2971285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2972285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2973285242Sachim bit32 intContext = osData->IntContext; 2974285242Sachim tdIORequestBody_t *tdIORequestBody; 2975285242Sachim TI_DBG2(("itdssOpenCnxErrorZoneViolationHandler: start\n")); 2976285242Sachim 2977285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2978285242Sachim 2979285242Sachim ostiInitiatorIOCompleted ( 2980285242Sachim tiRoot, 2981285242Sachim tdIORequestBody->tiIORequest, 2982285242Sachim tiIOFailed, 2983285242Sachim tiDetailOtherError, 2984285242Sachim agNULL, 2985285242Sachim intContext 2986285242Sachim ); 2987285242Sachim 2988285242Sachim return; 2989285242Sachim} 2990285242Sachim 2991285242Sachim/***************************************************************************** 2992285242Sachim*! \brief itdssOpenCnxErrorBreakHandler 2993285242Sachim* 2994285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 2995285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_BREAK 2996285242Sachim* 2997285242Sachim* \param agRoot: pointer to port instance 2998285242Sachim* \param agIORequest: pointer to I/O request 2999285242Sachim* \param agIOStatus: I/O status given by LL layer 3000285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3001285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3002285242Sachim* of abort request 3003285242Sachim* \param agOtherInfo Residual count 3004285242Sachim* \return: None 3005285242Sachim* 3006285242Sachim* 3007285242Sachim*****************************************************************************/ 3008285242SachimosGLOBAL void 3009285242SachimitdssOpenCnxErrorBreakHandler( 3010285242Sachim agsaRoot_t *agRoot, 3011285242Sachim agsaIORequest_t *agIORequest, 3012285242Sachim bit32 agIOStatus, 3013285242Sachim bit32 agIOInfoLen, 3014285242Sachim void *agParam, 3015285242Sachim bit32 agOtherInfo 3016285242Sachim ) 3017285242Sachim{ 3018285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3019285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3020285242Sachim bit32 intContext = osData->IntContext; 3021285242Sachim tdIORequestBody_t *tdIORequestBody; 3022285242Sachim TI_DBG1(("itdssOpenCnxErrorBreakHandler: start\n")); 3023285242Sachim 3024285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3025285242Sachim 3026285242Sachim ostiInitiatorIOCompleted ( 3027285242Sachim tiRoot, 3028285242Sachim tdIORequestBody->tiIORequest, 3029285242Sachim tiIOFailed, 3030285242Sachim tiDetailOtherError, 3031285242Sachim agNULL, 3032285242Sachim intContext 3033285242Sachim ); 3034285242Sachim 3035285242Sachim return; 3036285242Sachim} 3037285242Sachim 3038285242Sachim/***************************************************************************** 3039285242Sachim*! \brief itdssOpenCnxErrorITNexusLossHandler 3040285242Sachim* 3041285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3042285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS 3043285242Sachim* 3044285242Sachim* \param agRoot: pointer to port instance 3045285242Sachim* \param agIORequest: pointer to I/O request 3046285242Sachim* \param agIOStatus: I/O status given by LL layer 3047285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3048285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3049285242Sachim* of abort request 3050285242Sachim* \param agOtherInfo Residual count 3051285242Sachim* \return: None 3052285242Sachim* 3053285242Sachim* 3054285242Sachim*****************************************************************************/ 3055285242SachimosGLOBAL void 3056285242SachimitdssOpenCnxErrorITNexusLossHandler( 3057285242Sachim agsaRoot_t *agRoot, 3058285242Sachim agsaIORequest_t *agIORequest, 3059285242Sachim bit32 agIOStatus, 3060285242Sachim bit32 agIOInfoLen, 3061285242Sachim void *agParam, 3062285242Sachim bit32 agOtherInfo 3063285242Sachim ) 3064285242Sachim{ 3065285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3066285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3067285242Sachim bit32 intContext = osData->IntContext; 3068285242Sachim tdIORequestBody_t *tdIORequestBody; 3069285242Sachim TI_DBG1(("itdssOpenCnxErrorITNexusLossHandler: start\n")); 3070285242Sachim 3071285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3072285242Sachim 3073285242Sachim ostiInitiatorIOCompleted ( 3074285242Sachim tiRoot, 3075285242Sachim tdIORequestBody->tiIORequest, 3076285242Sachim tiIOFailed, 3077285242Sachim tiDetailOtherError, 3078285242Sachim agNULL, 3079285242Sachim intContext 3080285242Sachim ); 3081285242Sachim 3082285242Sachim return; 3083285242Sachim} 3084285242Sachim 3085285242Sachim/***************************************************************************** 3086285242Sachim*! \brief itdssOpenCnxErrorBadDestinationHandler 3087285242Sachim* 3088285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3089285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION 3090285242Sachim* 3091285242Sachim* \param agRoot: pointer to port instance 3092285242Sachim* \param agIORequest: pointer to I/O request 3093285242Sachim* \param agIOStatus: I/O status given by LL layer 3094285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3095285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3096285242Sachim* of abort request 3097285242Sachim* \param agOtherInfo Residual count 3098285242Sachim* \return: None 3099285242Sachim* 3100285242Sachim* 3101285242Sachim*****************************************************************************/ 3102285242SachimosGLOBAL void 3103285242SachimitdssOpenCnxErrorBadDestinationHandler( 3104285242Sachim agsaRoot_t *agRoot, 3105285242Sachim agsaIORequest_t *agIORequest, 3106285242Sachim bit32 agIOStatus, 3107285242Sachim bit32 agIOInfoLen, 3108285242Sachim void *agParam, 3109285242Sachim bit32 agOtherInfo 3110285242Sachim ) 3111285242Sachim{ 3112285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3113285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3114285242Sachim bit32 intContext = osData->IntContext; 3115285242Sachim tdIORequestBody_t *tdIORequestBody; 3116285242Sachim TI_DBG1(("itdssOpenCnxErrorBadDestinationHandler: start\n")); 3117285242Sachim 3118285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3119285242Sachim 3120285242Sachim ostiInitiatorIOCompleted ( 3121285242Sachim tiRoot, 3122285242Sachim tdIORequestBody->tiIORequest, 3123285242Sachim tiIOFailed, 3124285242Sachim tiDetailOtherError, 3125285242Sachim agNULL, 3126285242Sachim intContext 3127285242Sachim ); 3128285242Sachim 3129285242Sachim return; 3130285242Sachim} 3131285242Sachim 3132285242Sachim/***************************************************************************** 3133285242Sachim*! \brief itdssOpenCnxErrorConnectionRateNotSupportedHandler 3134285242Sachim* 3135285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3136285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED 3137285242Sachim* 3138285242Sachim* \param agRoot: pointer to port instance 3139285242Sachim* \param agIORequest: pointer to I/O request 3140285242Sachim* \param agIOStatus: I/O status given by LL layer 3141285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3142285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3143285242Sachim* of abort request 3144285242Sachim* \param agOtherInfo Residual count 3145285242Sachim* \return: None 3146285242Sachim* 3147285242Sachim* 3148285242Sachim*****************************************************************************/ 3149285242SachimosGLOBAL void 3150285242SachimitdssOpenCnxErrorConnectionRateNotSupportedHandler( 3151285242Sachim agsaRoot_t *agRoot, 3152285242Sachim agsaIORequest_t *agIORequest, 3153285242Sachim bit32 agIOStatus, 3154285242Sachim bit32 agIOInfoLen, 3155285242Sachim void *agParam, 3156285242Sachim bit32 agOtherInfo 3157285242Sachim ) 3158285242Sachim{ 3159285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3160285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3161285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3162285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3163285242Sachim bit32 intContext = osData->IntContext; 3164285242Sachim tdIORequestBody_t *tdIORequestBody; 3165285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 3166285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 3167285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 3168285242Sachim bit32 ConnRate = SAS_CONNECTION_RATE_12_0G; 3169285242Sachim agsaContext_t *agContext = agNULL; 3170285242Sachim TI_DBG1(("itdssOpenCnxErrorConnectionRateNotSupportedHandler: start\n")); 3171285242Sachim 3172285242Sachim /* we retry by lowering link rate 3173285242Sachim retry should be in ossaSetDeviceInfoCB() 3174285242Sachim */ 3175285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3176285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 3177285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 3178285242Sachim agDevHandle = oneDeviceData->agDevHandle; 3179285242Sachim 3180285242Sachim if (tdsaAllShared->RateAdjust) 3181285242Sachim { 3182285242Sachim if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && 3183285242Sachim oneDeviceData->tdPortContext != agNULL ) 3184285242Sachim { 3185285242Sachim ConnRate = DEVINFO_GET_LINKRATE(&oneDeviceData->agDeviceInfo); 3186285242Sachim if (ConnRate == SAS_CONNECTION_RATE_1_5G) 3187285242Sachim { 3188285242Sachim /* no retry; completes IO */ 3189285242Sachim ostiInitiatorIOCompleted( 3190285242Sachim tiRoot, 3191285242Sachim tdIORequestBody->tiIORequest, 3192285242Sachim tiIOFailed, 3193285242Sachim tiDetailOtherError, 3194285242Sachim agNULL, 3195285242Sachim intContext 3196285242Sachim ); 3197285242Sachim } 3198285242Sachim else 3199285242Sachim { 3200285242Sachim ConnRate = ConnRate - 1; 3201285242Sachim } 3202285242Sachim agContext = &(tdIORequestBody->agContext); 3203285242Sachim agContext->osData = agIORequest; 3204285242Sachim saSetDeviceInfo(agRoot, agContext, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, 32, ConnRate << 28, ossaIniSetDeviceInfoCB); 3205285242Sachim } 3206285242Sachim } 3207285242Sachim else 3208285242Sachim { 3209285242Sachim ostiInitiatorIOCompleted( 3210285242Sachim tiRoot, 3211285242Sachim tdIORequestBody->tiIORequest, 3212285242Sachim tiIOFailed, 3213285242Sachim tiDetailOtherError, 3214285242Sachim agNULL, 3215285242Sachim intContext 3216285242Sachim ); 3217285242Sachim } 3218285242Sachim 3219285242Sachim return; 3220285242Sachim} 3221285242Sachim 3222285242Sachim/***************************************************************************** 3223285242Sachim*! \brief itdssOpenCnxErrorSTPResourceBusyHandler 3224285242Sachim* 3225285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3226285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY 3227285242Sachim* 3228285242Sachim* \param agRoot: pointer to port instance 3229285242Sachim* \param agIORequest: pointer to I/O request 3230285242Sachim* \param agIOStatus: I/O status given by LL layer 3231285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3232285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3233285242Sachim* of abort request 3234285242Sachim* \param agOtherInfo Residual count 3235285242Sachim* \return: None 3236285242Sachim* 3237285242Sachim* 3238285242Sachim*****************************************************************************/ 3239285242SachimosGLOBAL void 3240285242SachimitdssOpenCnxErrorSTPResourceBusyHandler( 3241285242Sachim agsaRoot_t *agRoot, 3242285242Sachim agsaIORequest_t *agIORequest, 3243285242Sachim bit32 agIOStatus, 3244285242Sachim bit32 agIOInfoLen, 3245285242Sachim void *agParam, 3246285242Sachim bit32 agOtherInfo 3247285242Sachim ) 3248285242Sachim{ 3249285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3250285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3251285242Sachim bit32 intContext = osData->IntContext; 3252285242Sachim tdIORequestBody_t *tdIORequestBody; 3253285242Sachim TI_DBG2(("itdssOpenCnxErrorSTPResourceBusyHandler: start\n")); 3254285242Sachim 3255285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3256285242Sachim 3257285242Sachim ostiInitiatorIOCompleted ( 3258285242Sachim tiRoot, 3259285242Sachim tdIORequestBody->tiIORequest, 3260285242Sachim tiIOFailed, 3261285242Sachim tiDetailOtherError, 3262285242Sachim agNULL, 3263285242Sachim intContext 3264285242Sachim ); 3265285242Sachim 3266285242Sachim return; 3267285242Sachim} 3268285242Sachim 3269285242Sachim/***************************************************************************** 3270285242Sachim*! \brief itdssOpenCnxErrorWrongDestinationHandler 3271285242Sachim* 3272285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3273285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION 3274285242Sachim* 3275285242Sachim* \param agRoot: pointer to port instance 3276285242Sachim* \param agIORequest: pointer to I/O request 3277285242Sachim* \param agIOStatus: I/O status given by LL layer 3278285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3279285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3280285242Sachim* of abort request 3281285242Sachim* \param agOtherInfo Residual count 3282285242Sachim* \return: None 3283285242Sachim* 3284285242Sachim* 3285285242Sachim*****************************************************************************/ 3286285242SachimosGLOBAL void 3287285242SachimitdssOpenCnxErrorWrongDestinationHandler( 3288285242Sachim agsaRoot_t *agRoot, 3289285242Sachim agsaIORequest_t *agIORequest, 3290285242Sachim bit32 agIOStatus, 3291285242Sachim bit32 agIOInfoLen, 3292285242Sachim void *agParam, 3293285242Sachim bit32 agOtherInfo 3294285242Sachim ) 3295285242Sachim{ 3296285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3297285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3298285242Sachim bit32 intContext = osData->IntContext; 3299285242Sachim tdIORequestBody_t *tdIORequestBody; 3300285242Sachim TI_DBG1(("itdssOpenCnxErrorWrongDestinationHandler: start\n")); 3301285242Sachim 3302285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3303285242Sachim 3304285242Sachim ostiInitiatorIOCompleted ( 3305285242Sachim tiRoot, 3306285242Sachim tdIORequestBody->tiIORequest, 3307285242Sachim tiIOFailed, 3308285242Sachim tiDetailOtherError, 3309285242Sachim agNULL, 3310285242Sachim intContext 3311285242Sachim ); 3312285242Sachim 3313285242Sachim return; 3314285242Sachim} 3315285242Sachim 3316285242Sachim/***************************************************************************** 3317285242Sachim*! \brief itdssOpenCnxErrorUnknownErrorHandler 3318285242Sachim* 3319285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3320285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR 3321285242Sachim* 3322285242Sachim* \param agRoot: pointer to port instance 3323285242Sachim* \param agIORequest: pointer to I/O request 3324285242Sachim* \param agIOStatus: I/O status given by LL layer 3325285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3326285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3327285242Sachim* of abort request 3328285242Sachim* \param agOtherInfo Residual count 3329285242Sachim* \return: None 3330285242Sachim* 3331285242Sachim* 3332285242Sachim*****************************************************************************/ 3333285242SachimosGLOBAL void 3334285242SachimitdssOpenCnxErrorUnknownErrorHandler( 3335285242Sachim agsaRoot_t *agRoot, 3336285242Sachim agsaIORequest_t *agIORequest, 3337285242Sachim bit32 agIOStatus, 3338285242Sachim bit32 agIOInfoLen, 3339285242Sachim void *agParam, 3340285242Sachim bit32 agOtherInfo 3341285242Sachim ) 3342285242Sachim{ 3343285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3344285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3345285242Sachim bit32 intContext = osData->IntContext; 3346285242Sachim tdIORequestBody_t *tdIORequestBody; 3347285242Sachim TI_DBG1(("itdssOpenCnxErrorUnknownErrorHandler: start\n")); 3348285242Sachim 3349285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3350285242Sachim 3351285242Sachim ostiInitiatorIOCompleted ( 3352285242Sachim tiRoot, 3353285242Sachim tdIORequestBody->tiIORequest, 3354285242Sachim tiIOFailed, 3355285242Sachim tiDetailOtherError, 3356285242Sachim agNULL, 3357285242Sachim intContext 3358285242Sachim ); 3359285242Sachim 3360285242Sachim return; 3361285242Sachim} 3362285242Sachim 3363285242Sachim/***************************************************************************** 3364285242Sachim*! \brief itdssXferErrorNAKReceivedHandler 3365285242Sachim* 3366285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3367285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_NAK_RECEIVED 3368285242Sachim* 3369285242Sachim* \param agRoot: pointer to port instance 3370285242Sachim* \param agIORequest: pointer to I/O request 3371285242Sachim* \param agIOStatus: I/O status given by LL layer 3372285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3373285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3374285242Sachim* of abort request 3375285242Sachim* \param agOtherInfo Residual count 3376285242Sachim* \return: None 3377285242Sachim* 3378285242Sachim* 3379285242Sachim*****************************************************************************/ 3380285242SachimosGLOBAL void 3381285242SachimitdssXferErrorNAKReceivedHandler( 3382285242Sachim agsaRoot_t *agRoot, 3383285242Sachim agsaIORequest_t *agIORequest, 3384285242Sachim bit32 agIOStatus, 3385285242Sachim bit32 agIOInfoLen, 3386285242Sachim void *agParam, 3387285242Sachim bit32 agOtherInfo 3388285242Sachim ) 3389285242Sachim{ 3390285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3391285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3392285242Sachim bit32 intContext = osData->IntContext; 3393285242Sachim tdIORequestBody_t *tdIORequestBody; 3394285242Sachim TI_DBG1(("itdssXferErrorNAKReceivedHandler: start\n")); 3395285242Sachim 3396285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3397285242Sachim 3398285242Sachim ostiInitiatorIOCompleted ( 3399285242Sachim tiRoot, 3400285242Sachim tdIORequestBody->tiIORequest, 3401285242Sachim tiIOFailed, 3402285242Sachim tiDetailOtherError, 3403285242Sachim agNULL, 3404285242Sachim intContext 3405285242Sachim ); 3406285242Sachim 3407285242Sachim return; 3408285242Sachim} 3409285242Sachim 3410285242Sachim/***************************************************************************** 3411285242Sachim*! \brief itdssXferErrorACKNAKTimeoutHandler 3412285242Sachim* 3413285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3414285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_ACK_NAK_TIMEOUT 3415285242Sachim* 3416285242Sachim* \param agRoot: pointer to port instance 3417285242Sachim* \param agIORequest: pointer to I/O request 3418285242Sachim* \param agIOStatus: I/O status given by LL layer 3419285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3420285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3421285242Sachim* of abort request 3422285242Sachim* \param agOtherInfo Residual count 3423285242Sachim* \return: None 3424285242Sachim* 3425285242Sachim* 3426285242Sachim*****************************************************************************/ 3427285242SachimosGLOBAL void 3428285242SachimitdssXferErrorACKNAKTimeoutHandler( 3429285242Sachim agsaRoot_t *agRoot, 3430285242Sachim agsaIORequest_t *agIORequest, 3431285242Sachim bit32 agIOStatus, 3432285242Sachim bit32 agIOInfoLen, 3433285242Sachim void *agParam, 3434285242Sachim bit32 agOtherInfo 3435285242Sachim ) 3436285242Sachim{ 3437285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3438285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3439285242Sachim bit32 intContext = osData->IntContext; 3440285242Sachim tdIORequestBody_t *tdIORequestBody; 3441285242Sachim TI_DBG1(("itdssXferErrorACKNAKTimeoutHandler: start\n")); 3442285242Sachim 3443285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3444285242Sachim 3445285242Sachim ostiInitiatorIOCompleted ( 3446285242Sachim tiRoot, 3447285242Sachim tdIORequestBody->tiIORequest, 3448285242Sachim tiIOFailed, 3449285242Sachim tiDetailOtherError, 3450285242Sachim agNULL, 3451285242Sachim intContext 3452285242Sachim ); 3453285242Sachim 3454285242Sachim return; 3455285242Sachim} 3456285242Sachim 3457285242Sachim/***************************************************************************** 3458285242Sachim*! \brief itdssXferErrorPeerAbortedHandler 3459285242Sachim* 3460285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3461285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_PEER_ABORTED 3462285242Sachim* 3463285242Sachim* \param agRoot: pointer to port instance 3464285242Sachim* \param agIORequest: pointer to I/O request 3465285242Sachim* \param agIOStatus: I/O status given by LL layer 3466285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3467285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3468285242Sachim* of abort request 3469285242Sachim* \param agOtherInfo Residual count 3470285242Sachim* \return: None 3471285242Sachim* 3472285242Sachim* 3473285242Sachim*****************************************************************************/ 3474285242SachimosGLOBAL void 3475285242SachimitdssXferErrorPeerAbortedHandler( 3476285242Sachim agsaRoot_t *agRoot, 3477285242Sachim agsaIORequest_t *agIORequest, 3478285242Sachim bit32 agIOStatus, 3479285242Sachim bit32 agIOInfoLen, 3480285242Sachim void *agParam, 3481285242Sachim bit32 agOtherInfo 3482285242Sachim ) 3483285242Sachim{ 3484285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3485285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3486285242Sachim bit32 intContext = osData->IntContext; 3487285242Sachim tdIORequestBody_t *tdIORequestBody; 3488285242Sachim TI_DBG2(("itdssXferErrorPeerAbortedHandler: start\n")); 3489285242Sachim 3490285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3491285242Sachim 3492285242Sachim ostiInitiatorIOCompleted ( 3493285242Sachim tiRoot, 3494285242Sachim tdIORequestBody->tiIORequest, 3495285242Sachim tiIOFailed, 3496285242Sachim tiDetailOtherError, 3497285242Sachim agNULL, 3498285242Sachim intContext 3499285242Sachim ); 3500285242Sachim 3501285242Sachim return; 3502285242Sachim} 3503285242Sachim 3504285242Sachim/***************************************************************************** 3505285242Sachim*! \brief itdssXferErrorRxFrameHandler 3506285242Sachim* 3507285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3508285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_RX_FRAME 3509285242Sachim* 3510285242Sachim* \param agRoot: pointer to port instance 3511285242Sachim* \param agIORequest: pointer to I/O request 3512285242Sachim* \param agIOStatus: I/O status given by LL layer 3513285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3514285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3515285242Sachim* of abort request 3516285242Sachim* \param agOtherInfo Residual count 3517285242Sachim* \return: None 3518285242Sachim* 3519285242Sachim* 3520285242Sachim*****************************************************************************/ 3521285242SachimosGLOBAL void 3522285242SachimitdssXferErrorRxFrameHandler( 3523285242Sachim agsaRoot_t *agRoot, 3524285242Sachim agsaIORequest_t *agIORequest, 3525285242Sachim bit32 agIOStatus, 3526285242Sachim bit32 agIOInfoLen, 3527285242Sachim void *agParam, 3528285242Sachim bit32 agOtherInfo 3529285242Sachim ) 3530285242Sachim{ 3531285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3532285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3533285242Sachim bit32 intContext = osData->IntContext; 3534285242Sachim tdIORequestBody_t *tdIORequestBody; 3535285242Sachim TI_DBG1(("itdssXferErrorRxFrameHandler: start\n")); 3536285242Sachim 3537285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3538285242Sachim 3539285242Sachim ostiInitiatorIOCompleted ( 3540285242Sachim tiRoot, 3541285242Sachim tdIORequestBody->tiIORequest, 3542285242Sachim tiIOFailed, 3543285242Sachim tiDetailOtherError, 3544285242Sachim agNULL, 3545285242Sachim intContext 3546285242Sachim ); 3547285242Sachim 3548285242Sachim return; 3549285242Sachim} 3550285242Sachim 3551285242Sachim/***************************************************************************** 3552285242Sachim*! \brief itdssXferErrorDMAHandler 3553285242Sachim* 3554285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3555285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_DMA 3556285242Sachim* 3557285242Sachim* \param agRoot: pointer to port instance 3558285242Sachim* \param agIORequest: pointer to I/O request 3559285242Sachim* \param agIOStatus: I/O status given by LL layer 3560285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3561285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3562285242Sachim* of abort request 3563285242Sachim* \param agOtherInfo Residual count 3564285242Sachim* \return: None 3565285242Sachim* 3566285242Sachim* 3567285242Sachim*****************************************************************************/ 3568285242SachimosGLOBAL void 3569285242SachimitdssXferErrorDMAHandler( 3570285242Sachim agsaRoot_t *agRoot, 3571285242Sachim agsaIORequest_t *agIORequest, 3572285242Sachim bit32 agIOStatus, 3573285242Sachim bit32 agIOInfoLen, 3574285242Sachim void *agParam, 3575285242Sachim bit32 agOtherInfo 3576285242Sachim ) 3577285242Sachim{ 3578285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3579285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3580285242Sachim bit32 intContext = osData->IntContext; 3581285242Sachim tdIORequestBody_t *tdIORequestBody; 3582285242Sachim TI_DBG1(("itdssXferErrorDMAHandler: start\n")); 3583285242Sachim 3584285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3585285242Sachim 3586285242Sachim ostiInitiatorIOCompleted ( 3587285242Sachim tiRoot, 3588285242Sachim tdIORequestBody->tiIORequest, 3589285242Sachim tiIOFailed, 3590285242Sachim tiDetailOtherErrorNoRetry, 3591285242Sachim agNULL, 3592285242Sachim intContext 3593285242Sachim ); 3594285242Sachim 3595285242Sachim return; 3596285242Sachim} 3597285242Sachim 3598285242Sachim/***************************************************************************** 3599285242Sachim*! \brief itdssXferErrorCreditTimeoutHandler 3600285242Sachim* 3601285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3602285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_CREDIT_TIMEOUT 3603285242Sachim* 3604285242Sachim* \param agRoot: pointer to port instance 3605285242Sachim* \param agIORequest: pointer to I/O request 3606285242Sachim* \param agIOStatus: I/O status given by LL layer 3607285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3608285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3609285242Sachim* of abort request 3610285242Sachim* \param agOtherInfo Residual count 3611285242Sachim* \return: None 3612285242Sachim* 3613285242Sachim* 3614285242Sachim*****************************************************************************/ 3615285242SachimosGLOBAL void 3616285242SachimitdssXferErrorCreditTimeoutHandler( 3617285242Sachim agsaRoot_t *agRoot, 3618285242Sachim agsaIORequest_t *agIORequest, 3619285242Sachim bit32 agIOStatus, 3620285242Sachim bit32 agIOInfoLen, 3621285242Sachim void *agParam, 3622285242Sachim bit32 agOtherInfo 3623285242Sachim ) 3624285242Sachim{ 3625285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3626285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3627285242Sachim bit32 intContext = osData->IntContext; 3628285242Sachim tdIORequestBody_t *tdIORequestBody; 3629285242Sachim TI_DBG1(("itdssXferErrorCreditTimeoutHandler: start\n")); 3630285242Sachim 3631285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3632285242Sachim 3633285242Sachim ostiInitiatorIOCompleted ( 3634285242Sachim tiRoot, 3635285242Sachim tdIORequestBody->tiIORequest, 3636285242Sachim tiIOFailed, 3637285242Sachim tiDetailOtherError, 3638285242Sachim agNULL, 3639285242Sachim intContext 3640285242Sachim ); 3641285242Sachim 3642285242Sachim return; 3643285242Sachim} 3644285242Sachim 3645285242Sachim/***************************************************************************** 3646285242Sachim*! \brief itdssXferErrorCMDIssueACKNAKTimeoutHandler 3647285242Sachim* 3648285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3649285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_ACK_NAK_TIMEOUT 3650285242Sachim* 3651285242Sachim* \param agRoot: pointer to port instance 3652285242Sachim* \param agIORequest: pointer to I/O request 3653285242Sachim* \param agIOStatus: I/O status given by LL layer 3654285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3655285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3656285242Sachim* of abort request 3657285242Sachim* \param agOtherInfo Residual count 3658285242Sachim* \return: None 3659285242Sachim* 3660285242Sachim* 3661285242Sachim*****************************************************************************/ 3662285242SachimosGLOBAL void 3663285242SachimitdssXferErrorCMDIssueACKNAKTimeoutHandler( 3664285242Sachim agsaRoot_t *agRoot, 3665285242Sachim agsaIORequest_t *agIORequest, 3666285242Sachim bit32 agIOStatus, 3667285242Sachim bit32 agIOInfoLen, 3668285242Sachim void *agParam, 3669285242Sachim bit32 agOtherInfo 3670285242Sachim ) 3671285242Sachim{ 3672285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3673285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3674285242Sachim bit32 intContext = osData->IntContext; 3675285242Sachim tdIORequestBody_t *tdIORequestBody; 3676285242Sachim TI_DBG1(("itdssXferErrorCMDIssueACKNAKTimeoutHandler: start\n")); 3677285242Sachim 3678285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3679285242Sachim 3680285242Sachim ostiInitiatorIOCompleted ( 3681285242Sachim tiRoot, 3682285242Sachim tdIORequestBody->tiIORequest, 3683285242Sachim tiIOFailed, 3684285242Sachim tiDetailOtherError, 3685285242Sachim agNULL, 3686285242Sachim intContext 3687285242Sachim ); 3688285242Sachim 3689285242Sachim return; 3690285242Sachim} 3691285242Sachim 3692285242Sachim/***************************************************************************** 3693285242Sachim*! \brief itdssXferErrorCMDIssueBreakBeforeACKNAKHandler 3694285242Sachim* 3695285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3696285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_BREAK_BEFORE_ACK_NAK 3697285242Sachim* 3698285242Sachim* \param agRoot: pointer to port instance 3699285242Sachim* \param agIORequest: pointer to I/O request 3700285242Sachim* \param agIOStatus: I/O status given by LL layer 3701285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3702285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3703285242Sachim* of abort request 3704285242Sachim* \param agOtherInfo Residual count 3705285242Sachim* \return: None 3706285242Sachim* 3707285242Sachim* 3708285242Sachim*****************************************************************************/ 3709285242SachimosGLOBAL void 3710285242SachimitdssXferErrorCMDIssueBreakBeforeACKNAKHandler( 3711285242Sachim agsaRoot_t *agRoot, 3712285242Sachim agsaIORequest_t *agIORequest, 3713285242Sachim bit32 agIOStatus, 3714285242Sachim bit32 agIOInfoLen, 3715285242Sachim void *agParam, 3716285242Sachim bit32 agOtherInfo 3717285242Sachim ) 3718285242Sachim{ 3719285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3720285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3721285242Sachim bit32 intContext = osData->IntContext; 3722285242Sachim tdIORequestBody_t *tdIORequestBody; 3723285242Sachim TI_DBG1(("itdssXferErrorCMDIssueBreakBeforeACKNAKHandler: start\n")); 3724285242Sachim 3725285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3726285242Sachim 3727285242Sachim ostiInitiatorIOCompleted ( 3728285242Sachim tiRoot, 3729285242Sachim tdIORequestBody->tiIORequest, 3730285242Sachim tiIOFailed, 3731285242Sachim tiDetailOtherError, 3732285242Sachim agNULL, 3733285242Sachim intContext 3734285242Sachim ); 3735285242Sachim 3736285242Sachim return; 3737285242Sachim} 3738285242Sachim 3739285242Sachim/***************************************************************************** 3740285242Sachim*! \brief itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler 3741285242Sachim* 3742285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3743285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_CMD_ISSUE_PHY_DOWN_BEFORE_ACK_NAK 3744285242Sachim* 3745285242Sachim* \param agRoot: pointer to port instance 3746285242Sachim* \param agIORequest: pointer to I/O request 3747285242Sachim* \param agIOStatus: I/O status given by LL layer 3748285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3749285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3750285242Sachim* of abort request 3751285242Sachim* \param agOtherInfo Residual count 3752285242Sachim* \return: None 3753285242Sachim* 3754285242Sachim* 3755285242Sachim*****************************************************************************/ 3756285242SachimosGLOBAL void 3757285242SachimitdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler( 3758285242Sachim agsaRoot_t *agRoot, 3759285242Sachim agsaIORequest_t *agIORequest, 3760285242Sachim bit32 agIOStatus, 3761285242Sachim bit32 agIOInfoLen, 3762285242Sachim void *agParam, 3763285242Sachim bit32 agOtherInfo 3764285242Sachim ) 3765285242Sachim{ 3766285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3767285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3768285242Sachim bit32 intContext = osData->IntContext; 3769285242Sachim tdIORequestBody_t *tdIORequestBody; 3770285242Sachim TI_DBG1(("itdssXferErrorCMDIssuePhyDownBeforeACKNAKHandler: start\n")); 3771285242Sachim 3772285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3773285242Sachim 3774285242Sachim ostiInitiatorIOCompleted ( 3775285242Sachim tiRoot, 3776285242Sachim tdIORequestBody->tiIORequest, 3777285242Sachim tiIOFailed, 3778285242Sachim tiDetailOtherError, 3779285242Sachim agNULL, 3780285242Sachim intContext 3781285242Sachim ); 3782285242Sachim 3783285242Sachim return; 3784285242Sachim} 3785285242Sachim 3786285242Sachim/***************************************************************************** 3787285242Sachim*! \brief itdssXferErrorDisruptedPhyDownHandler 3788285242Sachim* 3789285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3790285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_DISRUPTED_PHY_DOWN 3791285242Sachim* 3792285242Sachim* \param agRoot: pointer to port instance 3793285242Sachim* \param agIORequest: pointer to I/O request 3794285242Sachim* \param agIOStatus: I/O status given by LL layer 3795285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3796285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3797285242Sachim* of abort request 3798285242Sachim* \param agOtherInfo Residual count 3799285242Sachim* \return: None 3800285242Sachim* 3801285242Sachim* 3802285242Sachim*****************************************************************************/ 3803285242SachimosGLOBAL void 3804285242SachimitdssXferErrorDisruptedPhyDownHandler( 3805285242Sachim agsaRoot_t *agRoot, 3806285242Sachim agsaIORequest_t *agIORequest, 3807285242Sachim bit32 agIOStatus, 3808285242Sachim bit32 agIOInfoLen, 3809285242Sachim void *agParam, 3810285242Sachim bit32 agOtherInfo 3811285242Sachim ) 3812285242Sachim{ 3813285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3814285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3815285242Sachim bit32 intContext = osData->IntContext; 3816285242Sachim tdIORequestBody_t *tdIORequestBody; 3817285242Sachim TI_DBG2(("itdssXferErrorDisruptedPhyDownHandler: start\n")); 3818285242Sachim 3819285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3820285242Sachim 3821285242Sachim ostiInitiatorIOCompleted ( 3822285242Sachim tiRoot, 3823285242Sachim tdIORequestBody->tiIORequest, 3824285242Sachim tiIOFailed, 3825285242Sachim tiDetailOtherError, 3826285242Sachim agNULL, 3827285242Sachim intContext 3828285242Sachim ); 3829285242Sachim 3830285242Sachim return; 3831285242Sachim} 3832285242Sachim 3833285242Sachim/***************************************************************************** 3834285242Sachim*! \brief itdssXferErrorOffsetMismatchHandler 3835285242Sachim* 3836285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3837285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_OFFSET_MISMATCH 3838285242Sachim* 3839285242Sachim* \param agRoot: pointer to port instance 3840285242Sachim* \param agIORequest: pointer to I/O request 3841285242Sachim* \param agIOStatus: I/O status given by LL layer 3842285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3843285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3844285242Sachim* of abort request 3845285242Sachim* \param agOtherInfo Residual count 3846285242Sachim* \return: None 3847285242Sachim* 3848285242Sachim* 3849285242Sachim*****************************************************************************/ 3850285242SachimosGLOBAL void 3851285242SachimitdssXferErrorOffsetMismatchHandler( 3852285242Sachim agsaRoot_t *agRoot, 3853285242Sachim agsaIORequest_t *agIORequest, 3854285242Sachim bit32 agIOStatus, 3855285242Sachim bit32 agIOInfoLen, 3856285242Sachim void *agParam, 3857285242Sachim bit32 agOtherInfo 3858285242Sachim ) 3859285242Sachim{ 3860285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3861285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3862285242Sachim bit32 intContext = osData->IntContext; 3863285242Sachim tdIORequestBody_t *tdIORequestBody; 3864285242Sachim TI_DBG1(("itdssXferErrorOffsetMismatchHandler: start\n")); 3865285242Sachim 3866285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3867285242Sachim 3868285242Sachim ostiInitiatorIOCompleted ( 3869285242Sachim tiRoot, 3870285242Sachim tdIORequestBody->tiIORequest, 3871285242Sachim tiIOFailed, 3872285242Sachim tiDetailOtherError, 3873285242Sachim agNULL, 3874285242Sachim intContext 3875285242Sachim ); 3876285242Sachim 3877285242Sachim return; 3878285242Sachim} 3879285242Sachim 3880285242Sachim/***************************************************************************** 3881285242Sachim*! \brief itdssXferErrorXferZeroDataLenHandler 3882285242Sachim* 3883285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3884285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_XFER_ZERO_DATA_LEN 3885285242Sachim* 3886285242Sachim* \param agRoot: pointer to port instance 3887285242Sachim* \param agIORequest: pointer to I/O request 3888285242Sachim* \param agIOStatus: I/O status given by LL layer 3889285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3890285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3891285242Sachim* of abort request 3892285242Sachim* \param agOtherInfo Residual count 3893285242Sachim* \return: None 3894285242Sachim* 3895285242Sachim* 3896285242Sachim*****************************************************************************/ 3897285242SachimosGLOBAL void 3898285242SachimitdssXferErrorXferZeroDataLenHandler( 3899285242Sachim agsaRoot_t *agRoot, 3900285242Sachim agsaIORequest_t *agIORequest, 3901285242Sachim bit32 agIOStatus, 3902285242Sachim bit32 agIOInfoLen, 3903285242Sachim void *agParam, 3904285242Sachim bit32 agOtherInfo 3905285242Sachim ) 3906285242Sachim{ 3907285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3908285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3909285242Sachim bit32 intContext = osData->IntContext; 3910285242Sachim tdIORequestBody_t *tdIORequestBody; 3911285242Sachim TI_DBG2(("itdssXferErrorXferZeroDataLenHandler: start\n")); 3912285242Sachim 3913285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3914285242Sachim 3915285242Sachim ostiInitiatorIOCompleted ( 3916285242Sachim tiRoot, 3917285242Sachim tdIORequestBody->tiIORequest, 3918285242Sachim tiIOFailed, 3919285242Sachim tiDetailOtherError, 3920285242Sachim agNULL, 3921285242Sachim intContext 3922285242Sachim ); 3923285242Sachim 3924285242Sachim return; 3925285242Sachim} 3926285242Sachim 3927285242Sachim/***************************************************************************** 3928285242Sachim*! \brief itdssXferOpenRetryTimeoutHandler 3929285242Sachim* 3930285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 3931285242Sachim* layer with agIOStatus = OSSA_IO_XFER_OPEN_RETRY_TIMEOUT 3932285242Sachim* 3933285242Sachim* \param agRoot: pointer to port instance 3934285242Sachim* \param agIORequest: pointer to I/O request 3935285242Sachim* \param agIOStatus: I/O status given by LL layer 3936285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3937285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3938285242Sachim* of abort request 3939285242Sachim* \param agOtherInfo Residual count 3940285242Sachim* \return: None 3941285242Sachim* 3942285242Sachim* 3943285242Sachim*****************************************************************************/ 3944285242SachimosGLOBAL void 3945285242SachimitdssXferOpenRetryTimeoutHandler( 3946285242Sachim agsaRoot_t *agRoot, 3947285242Sachim agsaIORequest_t *agIORequest, 3948285242Sachim bit32 agIOStatus, 3949285242Sachim bit32 agIOInfoLen, 3950285242Sachim void *agParam, 3951285242Sachim bit32 agOtherInfo 3952285242Sachim ) 3953285242Sachim{ 3954285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3955285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3956285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3957285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3958285242Sachim itdsaIni_t *Initiator = (itdsaIni_t *)tdsaAllShared->itdsaIni; 3959285242Sachim bit32 intContext = osData->IntContext; 3960285242Sachim tdIORequestBody_t *tdIORequestBody; 3961285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 3962285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 3963285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 3964285242Sachim bit32 saStatus = AGSA_RC_FAILURE; 3965285242Sachim 3966285242Sachim TI_DBG2(("itdssXferOpenRetryTimeoutHandler: start\n")); 3967285242Sachim 3968285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3969285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 3970285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 3971285242Sachim agDevHandle = oneDeviceData->agDevHandle; 3972285242Sachim 3973285242Sachim if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && 3974285242Sachim oneDeviceData->tdPortContext != agNULL ) 3975285242Sachim { 3976285242Sachim if (tdIORequestBody->reTries < OPEN_RETRY_RETRIES) /* 10 */ 3977285242Sachim { 3978285242Sachim saStatus = saSSPStart(agRoot, 3979285242Sachim agIORequest, 3980285242Sachim tdsaRotateQnumber(tiRoot, oneDeviceData), 3981285242Sachim agDevHandle, 3982285242Sachim tdIORequestBody->agRequestType, 3983285242Sachim &(tdIORequestBody->transport.SAS.agSASRequestBody), 3984285242Sachim agNULL, 3985285242Sachim &ossaSSPCompleted); 3986285242Sachim 3987285242Sachim if (saStatus == AGSA_RC_SUCCESS) 3988285242Sachim { 3989285242Sachim TI_DBG2(("itdssXferOpenRetryTimeoutHandler: retried\n")); 3990285242Sachim Initiator->NumIOsActive++; 3991285242Sachim tdIORequestBody->ioStarted = agTRUE; 3992285242Sachim tdIORequestBody->ioCompleted = agFALSE; 3993285242Sachim tdIORequestBody->reTries++; 3994285242Sachim return; 3995285242Sachim } 3996285242Sachim else 3997285242Sachim { 3998285242Sachim TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry failed\n")); 3999285242Sachim tdIORequestBody->ioStarted = agFALSE; 4000285242Sachim tdIORequestBody->ioCompleted = agTRUE; 4001285242Sachim tdIORequestBody->reTries = 0; 4002285242Sachim } 4003285242Sachim } 4004285242Sachim else 4005285242Sachim { 4006285242Sachim TI_DBG1(("itdssXferOpenRetryTimeoutHandler: retry is over and fail\n")); 4007285242Sachim tdIORequestBody->reTries = 0; 4008285242Sachim } 4009285242Sachim } 4010285242Sachim else 4011285242Sachim { 4012285242Sachim TI_DBG1(("itdssXferOpenRetryTimeoutHandler: not valid deivce no retry\n")); 4013285242Sachim tdIORequestBody->reTries = 0; 4014285242Sachim } 4015285242Sachim ostiInitiatorIOCompleted( 4016285242Sachim tiRoot, 4017285242Sachim tdIORequestBody->tiIORequest, 4018285242Sachim tiIOFailed, 4019285242Sachim tiDetailOtherError, 4020285242Sachim agNULL, 4021285242Sachim intContext 4022285242Sachim ); 4023285242Sachim return; 4024285242Sachim} 4025285242Sachim 4026285242Sachim/***************************************************************************** 4027285242Sachim*! \brief itdssPortInResetHandler 4028285242Sachim* 4029285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4030285242Sachim* layer with agIOStatus = OSSA_IO_PORT_IN_RESET 4031285242Sachim* 4032285242Sachim* \param agRoot: pointer to port instance 4033285242Sachim* \param agIORequest: pointer to I/O request 4034285242Sachim* \param agIOStatus: I/O status given by LL layer 4035285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4036285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4037285242Sachim* of abort request 4038285242Sachim* \param agOtherInfo Residual count 4039285242Sachim* \return: None 4040285242Sachim* 4041285242Sachim* 4042285242Sachim*****************************************************************************/ 4043285242SachimosGLOBAL void 4044285242SachimitdssPortInResetHandler( 4045285242Sachim agsaRoot_t *agRoot, 4046285242Sachim agsaIORequest_t *agIORequest, 4047285242Sachim bit32 agIOStatus, 4048285242Sachim bit32 agIOInfoLen, 4049285242Sachim void *agParam, 4050285242Sachim bit32 agOtherInfo 4051285242Sachim ) 4052285242Sachim{ 4053285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4054285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4055285242Sachim bit32 intContext = osData->IntContext; 4056285242Sachim tdIORequestBody_t *tdIORequestBody; 4057285242Sachim TI_DBG2(("itdssPortInResetHandler: start\n")); 4058285242Sachim 4059285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4060285242Sachim 4061285242Sachim ostiInitiatorIOCompleted ( 4062285242Sachim tiRoot, 4063285242Sachim tdIORequestBody->tiIORequest, 4064285242Sachim tiIOFailed, 4065285242Sachim tiDetailOtherError, 4066285242Sachim agNULL, 4067285242Sachim intContext 4068285242Sachim ); 4069285242Sachim 4070285242Sachim return; 4071285242Sachim} 4072285242Sachim 4073285242Sachim/***************************************************************************** 4074285242Sachim*! \brief itdssDsNonOperationalHandler 4075285242Sachim* 4076285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4077285242Sachim* layer with agIOStatus = OSSA_IO_DS_NON_OPERATIONAL 4078285242Sachim* 4079285242Sachim* \param agRoot: pointer to port instance 4080285242Sachim* \param agIORequest: pointer to I/O request 4081285242Sachim* \param agIOStatus: I/O status given by LL layer 4082285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4083285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4084285242Sachim* of abort request 4085285242Sachim* \param agOtherInfo Residual count 4086285242Sachim* \return: None 4087285242Sachim* 4088285242Sachim* 4089285242Sachim*****************************************************************************/ 4090285242SachimosGLOBAL void 4091285242SachimitdssDsNonOperationalHandler( 4092285242Sachim agsaRoot_t *agRoot, 4093285242Sachim agsaIORequest_t *agIORequest, 4094285242Sachim bit32 agIOStatus, 4095285242Sachim bit32 agIOInfoLen, 4096285242Sachim void *agParam, 4097285242Sachim bit32 agOtherInfo 4098285242Sachim ) 4099285242Sachim{ 4100285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4101285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4102285242Sachim bit32 intContext = osData->IntContext; 4103285242Sachim tdIORequestBody_t *tdIORequestBody; 4104285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 4105285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 4106285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 4107285242Sachim 4108285242Sachim 4109285242Sachim TI_DBG2(("itdssDsNonOperationalHandler: start\n")); 4110285242Sachim 4111285242Sachim 4112285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4113285242Sachim 4114285242Sachim#if 1 /* TBD */ 4115285242Sachim /* let's do it only once ????? */ 4116285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 4117285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 4118285242Sachim agDevHandle = oneDeviceData->agDevHandle; 4119285242Sachim if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && 4120285242Sachim oneDeviceData->tdPortContext != agNULL ) 4121285242Sachim { 4122285242Sachim saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL); 4123285242Sachim } 4124285242Sachim#endif 4125285242Sachim 4126285242Sachim ostiInitiatorIOCompleted ( 4127285242Sachim tiRoot, 4128285242Sachim tdIORequestBody->tiIORequest, 4129285242Sachim tiIOFailed, 4130285242Sachim tiDetailOtherError, 4131285242Sachim agNULL, 4132285242Sachim intContext 4133285242Sachim ); 4134285242Sachim 4135285242Sachim return; 4136285242Sachim} 4137285242Sachim 4138285242Sachim/***************************************************************************** 4139285242Sachim*! \brief itdssDsInRecoveryHandler 4140285242Sachim* 4141285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4142285242Sachim* layer with agIOStatus = OSSA_IO_DS_IN_RECOVERY 4143285242Sachim* 4144285242Sachim* \param agRoot: pointer to port instance 4145285242Sachim* \param agIORequest: pointer to I/O request 4146285242Sachim* \param agIOStatus: I/O status given by LL layer 4147285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4148285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4149285242Sachim* of abort request 4150285242Sachim* \param agOtherInfo Residual count 4151285242Sachim* \return: None 4152285242Sachim* 4153285242Sachim* 4154285242Sachim*****************************************************************************/ 4155285242SachimosGLOBAL void 4156285242SachimitdssDsInRecoveryHandler( 4157285242Sachim agsaRoot_t *agRoot, 4158285242Sachim agsaIORequest_t *agIORequest, 4159285242Sachim bit32 agIOStatus, 4160285242Sachim bit32 agIOInfoLen, 4161285242Sachim void *agParam, 4162285242Sachim bit32 agOtherInfo 4163285242Sachim ) 4164285242Sachim{ 4165285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4166285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4167285242Sachim bit32 intContext = osData->IntContext; 4168285242Sachim tdIORequestBody_t *tdIORequestBody; 4169285242Sachim TI_DBG2(("itdssDsInRecoveryHandler: start\n")); 4170285242Sachim 4171285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4172285242Sachim 4173285242Sachim ostiInitiatorIOCompleted ( 4174285242Sachim tiRoot, 4175285242Sachim tdIORequestBody->tiIORequest, 4176285242Sachim tiIOFailed, 4177285242Sachim tiDetailOtherError, 4178285242Sachim agNULL, 4179285242Sachim intContext 4180285242Sachim ); 4181285242Sachim 4182285242Sachim return; 4183285242Sachim} 4184285242Sachim 4185285242Sachim/***************************************************************************** 4186285242Sachim*! \brief itdssTmTagNotFoundHandler 4187285242Sachim* 4188285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4189285242Sachim* layer with agIOStatus = OSSA_IO_TM_TAG_NOT_FOUND 4190285242Sachim* 4191285242Sachim* \param agRoot: pointer to port instance 4192285242Sachim* \param agIORequest: pointer to I/O request 4193285242Sachim* \param agIOStatus: I/O status given by LL layer 4194285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4195285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4196285242Sachim* of abort request 4197285242Sachim* \param agOtherInfo Residual count 4198285242Sachim* \return: None 4199285242Sachim* 4200285242Sachim* 4201285242Sachim*****************************************************************************/ 4202285242SachimosGLOBAL void 4203285242SachimitdssTmTagNotFoundHandler( 4204285242Sachim agsaRoot_t *agRoot, 4205285242Sachim agsaIORequest_t *agIORequest, 4206285242Sachim bit32 agIOStatus, 4207285242Sachim bit32 agIOInfoLen, 4208285242Sachim void *agParam, 4209285242Sachim bit32 agOtherInfo 4210285242Sachim ) 4211285242Sachim{ 4212285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4213285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4214285242Sachim bit32 intContext = osData->IntContext; 4215285242Sachim tdIORequestBody_t *tdIORequestBody; 4216285242Sachim TI_DBG2(("itdssTmTagNotFoundHandler: start\n")); 4217285242Sachim 4218285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4219285242Sachim 4220285242Sachim ostiInitiatorIOCompleted ( 4221285242Sachim tiRoot, 4222285242Sachim tdIORequestBody->tiIORequest, 4223285242Sachim tiIOFailed, 4224285242Sachim tiDetailOtherError, 4225285242Sachim agNULL, 4226285242Sachim intContext 4227285242Sachim ); 4228285242Sachim 4229285242Sachim return; 4230285242Sachim} 4231285242Sachim 4232285242Sachim/***************************************************************************** 4233285242Sachim*! \brief itdssSSPExtIUZeroLenHandler 4234285242Sachim* 4235285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4236285242Sachim* layer with agIOStatus = OSSA_IO_SSP_EXT_IU_ZERO_LEN_ERROR 4237285242Sachim* 4238285242Sachim* \param agRoot: pointer to port instance 4239285242Sachim* \param agIORequest: pointer to I/O request 4240285242Sachim* \param agIOStatus: I/O status given by LL layer 4241285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4242285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4243285242Sachim* of abort request 4244285242Sachim* \param agOtherInfo Residual count 4245285242Sachim* \return: None 4246285242Sachim* 4247285242Sachim* 4248285242Sachim*****************************************************************************/ 4249285242SachimosGLOBAL void 4250285242SachimitdssSSPExtIUZeroLenHandler( 4251285242Sachim agsaRoot_t *agRoot, 4252285242Sachim agsaIORequest_t *agIORequest, 4253285242Sachim bit32 agIOStatus, 4254285242Sachim bit32 agIOInfoLen, 4255285242Sachim void *agParam, 4256285242Sachim bit32 agOtherInfo 4257285242Sachim ) 4258285242Sachim{ 4259285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4260285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4261285242Sachim bit32 intContext = osData->IntContext; 4262285242Sachim tdIORequestBody_t *tdIORequestBody; 4263285242Sachim TI_DBG2(("itdssSSPExtIUZeroLenHandler: start\n")); 4264285242Sachim 4265285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4266285242Sachim 4267285242Sachim ostiInitiatorIOCompleted ( 4268285242Sachim tiRoot, 4269285242Sachim tdIORequestBody->tiIORequest, 4270285242Sachim tiIOFailed, 4271285242Sachim tiDetailOtherError, 4272285242Sachim agNULL, 4273285242Sachim intContext 4274285242Sachim ); 4275285242Sachim 4276285242Sachim return; 4277285242Sachim} 4278285242Sachim 4279285242Sachim/***************************************************************************** 4280285242Sachim*! \brief itdssXferErrorUnexpectedPhaseHandler 4281285242Sachim* 4282285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4283285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERROR_UNEXPECTED_PHASE 4284285242Sachim* 4285285242Sachim* \param agRoot: pointer to port instance 4286285242Sachim* \param agIORequest: pointer to I/O request 4287285242Sachim* \param agIOStatus: I/O status given by LL layer 4288285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4289285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4290285242Sachim* of abort request 4291285242Sachim* \param agOtherInfo Residual count 4292285242Sachim* \return: None 4293285242Sachim* 4294285242Sachim* 4295285242Sachim*****************************************************************************/ 4296285242SachimosGLOBAL void 4297285242SachimitdssXferErrorUnexpectedPhaseHandler( 4298285242Sachim agsaRoot_t *agRoot, 4299285242Sachim agsaIORequest_t *agIORequest, 4300285242Sachim bit32 agIOStatus, 4301285242Sachim bit32 agIOInfoLen, 4302285242Sachim void *agParam, 4303285242Sachim bit32 agOtherInfo 4304285242Sachim ) 4305285242Sachim{ 4306285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4307285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4308285242Sachim bit32 intContext = osData->IntContext; 4309285242Sachim tdIORequestBody_t *tdIORequestBody; 4310285242Sachim TI_DBG2(("itdssXferErrorUnexpectedPhaseHandler: start\n")); 4311285242Sachim 4312285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4313285242Sachim 4314285242Sachim ostiInitiatorIOCompleted ( 4315285242Sachim tiRoot, 4316285242Sachim tdIORequestBody->tiIORequest, 4317285242Sachim tiIOFailed, 4318285242Sachim tiDetailOtherError, 4319285242Sachim agNULL, 4320285242Sachim intContext 4321285242Sachim ); 4322285242Sachim 4323285242Sachim return; 4324285242Sachim} 4325285242Sachim 4326285242Sachim#ifdef REMOVED 4327285242Sachim/***************************************************************************** 4328285242Sachim*! \brief itdssIOUnderFlowWithChkConditionHandler 4329285242Sachim* 4330285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4331285242Sachim* layer with agIOStatus = OSSA_IO_UNDERFLOW_WITH_CHK_COND 4332285242Sachim* 4333285242Sachim* \param agRoot: pointer to port instance 4334285242Sachim* \param agIORequest: pointer to I/O request 4335285242Sachim* \param agIOStatus: I/O status given by LL layer 4336285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4337285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4338285242Sachim* of abort request 4339285242Sachim* \return: None 4340285242Sachim* 4341285242Sachim* 4342285242Sachim*****************************************************************************/ 4343285242Sachim/* 4344285242Sachim How to report SCSI_STAT_CHECK_CONDITION and tiIOUnderRun simultaneoulsy??? 4345285242Sachim ostiInitiatorIOCompleted( 4346285242Sachim tiRoot, 4347285242Sachim tdIORequestBody->tiIORequest, 4348285242Sachim tiIOSuccess, 4349285242Sachim SCSI_STAT_CHECK_CONDITION, 4350285242Sachim &senseData, 4351285242Sachim agTRUE 4352285242Sachim ); 4353285242Sachim 4354285242Sachim vs 4355285242Sachim 4356285242Sachim ostiInitiatorIOCompleted ( 4357285242Sachim tiRoot, 4358285242Sachim tdIORequestBody->tiIORequest, 4359285242Sachim tiIOUnderRun, 4360285242Sachim agIOInfoLen, 4361285242Sachim agNULL, 4362285242Sachim intContext 4363285242Sachim ); 4364285242Sachim 4365285242Sachim For now, SCSI_STAT_CHECK_CONDITION is reported until TISA changes (as of 1/6/09) 4366285242Sachim In other words, this handler is the practically same as itdssIOSuccessHandler() 4367285242Sachim*/ 4368285242SachimosGLOBAL void 4369285242SachimitdssIOUnderFlowWithChkConditionHandler( 4370285242Sachim agsaRoot_t *agRoot, 4371285242Sachim agsaIORequest_t *agIORequest, 4372285242Sachim bit32 agIOStatus, 4373285242Sachim bit32 agIOInfoLen, 4374285242Sachim void *agParam 4375285242Sachim ) 4376285242Sachim{ 4377285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4378285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4379285242Sachim tdIORequestBody_t *tdIORequestBody; 4380285242Sachim agsaSSPResponseInfoUnit_t agSSPRespIU; 4381285242Sachim tiSenseData_t senseData; 4382285242Sachim bit8 senseDataPayload[256]; 4383285242Sachim bit8 respData[128]; 4384285242Sachim bit32 scsi_status; 4385285242Sachim bit32 senseLen; 4386285242Sachim bit32 respLen; 4387285242Sachim bit32 data_status; 4388285242Sachim bit32 i; 4389285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 4390285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 4391285242Sachim 4392285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: start\n")); 4393285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: agIOInfoLen 0x%x\n", agIOInfoLen)); 4394285242Sachim 4395285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4396285242Sachim 4397285242Sachim tdIORequestBody->ioCompleted = agTRUE; 4398285242Sachim tdIORequestBody->ioStarted = agFALSE; 4399285242Sachim 4400285242Sachim /* 4401285242Sachim agIOInfoLen must be >= sizeof(agsaSSPResponseInfoUnit_t), which is minimum 4402285242Sachim date length 4403285242Sachim */ 4404285242Sachim if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t)) 4405285242Sachim { 4406285242Sachim TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen does not match!!!\n")); 4407285242Sachim TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: First agIOInfoLen 0x%x IU 0x%x\n", agIOInfoLen, (unsigned int)sizeof(agsaSSPResponseInfoUnit_t))); 4408285242Sachim ostiInitiatorIOCompleted( 4409285242Sachim tiRoot, 4410285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 4411285242Sachim tiIOFailed, 4412285242Sachim tiDetailOtherError, 4413285242Sachim agNULL, 4414285242Sachim agTRUE /* intContext; is not being used */ 4415285242Sachim ); 4416285242Sachim return; 4417285242Sachim } 4418285242Sachim /* reads agsaSSPResponseInfoUnit_t */ 4419285242Sachim saFrameReadBlock(agRoot, agParam, 0, &agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t)); 4420285242Sachim 4421285242Sachim data_status = SA_SSPRESP_GET_DATAPRES(&agSSPRespIU); 4422285242Sachim scsi_status = agSSPRespIU.status; 4423285242Sachim /* endianess is invovled here */ 4424285242Sachim senseLen = SA_SSPRESP_GET_SENSEDATALEN(&agSSPRespIU); 4425285242Sachim respLen = SA_SSPRESP_GET_RESPONSEDATALEN(&agSSPRespIU); 4426285242Sachim 4427285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: dataPres=%x\n", data_status)); 4428285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: scsi status=0x%x, senselen=0x%x resplen 0x%x\n", scsi_status, senseLen, respLen)); 4429285242Sachim 4430285242Sachim /* 4431285242Sachim sanity check: do not go beyond of agIOInfoLen. if happens, return error 4432285242Sachim agIOInfoLen >= sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> OK 4433285242Sachim because frame must be divisible by 4, so there can be extra padding 4434285242Sachim agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen -> NOT OK 4435285242Sachim */ 4436285242Sachim if (agIOInfoLen < sizeof(agsaSSPResponseInfoUnit_t) + senseLen + respLen) 4437285242Sachim { 4438285242Sachim TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: Second agIOInfoLen does not match!!!\n")); 4439285242Sachim 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)); 4440285242Sachim 4441285242Sachim ostiInitiatorIOCompleted( 4442285242Sachim tiRoot, 4443285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 4444285242Sachim tiIOFailed, 4445285242Sachim tiDetailOtherError, 4446285242Sachim agNULL, 4447285242Sachim agTRUE /* intContext; is not being used */ 4448285242Sachim ); 4449285242Sachim return; 4450285242Sachim } 4451285242Sachim 4452285242Sachim /* reads response data */ 4453285242Sachim saFrameReadBlock(agRoot, agParam, 4454285242Sachim sizeof(agsaSSPResponseInfoUnit_t), 4455285242Sachim respData, respLen); 4456285242Sachim /* reads sense data */ 4457285242Sachim saFrameReadBlock(agRoot, agParam, 4458285242Sachim sizeof(agsaSSPResponseInfoUnit_t) 4459285242Sachim + respLen, 4460285242Sachim senseDataPayload, senseLen); 4461285242Sachim 4462285242Sachim if (data_status == 0) 4463285242Sachim { 4464285242Sachim /* NO_DATA */ 4465285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: no data\n")); 4466285242Sachim 4467285242Sachim ostiInitiatorIOCompleted( 4468285242Sachim tiRoot, 4469285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 4470285242Sachim tiIOSuccess, 4471285242Sachim scsi_status, 4472285242Sachim agNULL, 4473285242Sachim agTRUE /* intContext; is not being used */ 4474285242Sachim ); 4475285242Sachim 4476285242Sachim return; 4477285242Sachim } 4478285242Sachim 4479285242Sachim if (data_status == 1) 4480285242Sachim { 4481285242Sachim /* RESPONSE_DATA */ 4482285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: response data \n")); 4483285242Sachim 4484285242Sachim ostiInitiatorIOCompleted( 4485285242Sachim tiRoot, 4486285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 4487285242Sachim tiIOSuccess, 4488285242Sachim 0, 4489285242Sachim agNULL, 4490285242Sachim agTRUE /* intContext; is not being used */ 4491285242Sachim ); 4492285242Sachim return; 4493285242Sachim } 4494285242Sachim 4495285242Sachim if (data_status == 2) 4496285242Sachim { 4497285242Sachim /* SENSE_DATA */ 4498285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sense data \n")); 4499285242Sachim 4500285242Sachim senseData.senseData = &senseDataPayload; 4501285242Sachim senseData.senseLen = MIN(256, senseLen); 4502285242Sachim /* debugging */ 4503285242Sachim tdhexdump("ResponseIU I", (bit8 *)&agSSPRespIU, sizeof(agsaSSPResponseInfoUnit_t)); 4504285242Sachim 4505285242Sachim tdhexdump("sense data I", (bit8 *)senseDataPayload, senseLen); 4506285242Sachim tdhexdump("sense data II", (bit8 *)senseData.senseData, senseData.senseLen); 4507285242Sachim 4508285242Sachim if (senseDataPayload[2] == SCSI_SENSE_KEY_RECOVERED_ERROR) 4509285242Sachim { 4510285242Sachim Initiator->SenseKeyCounter.SoftError ++; 4511285242Sachim } 4512285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_NOT_READY) 4513285242Sachim { 4514285242Sachim Initiator->SenseKeyCounter.MediumNotReady++; 4515285242Sachim } 4516285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_MEDIUM_ERROR) 4517285242Sachim { 4518285242Sachim Initiator->SenseKeyCounter.MediumError++; 4519285242Sachim } 4520285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_HARDWARE_ERROR) 4521285242Sachim { 4522285242Sachim Initiator->SenseKeyCounter.HardwareError++; 4523285242Sachim } 4524285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_ILLEGAL_REQUEST) 4525285242Sachim { 4526285242Sachim Initiator->SenseKeyCounter.IllegalRequest++; 4527285242Sachim } 4528285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_UNIT_ATTENTION) 4529285242Sachim { 4530285242Sachim Initiator->SenseKeyCounter.UnitAttention++; 4531285242Sachim } 4532285242Sachim else if (senseDataPayload[2] == SCSI_SENSE_KEY_ABORTED_COMMAND) 4533285242Sachim { 4534285242Sachim Initiator->SenseKeyCounter.AbortCommand++; 4535285242Sachim } 4536285242Sachim else 4537285242Sachim { 4538285242Sachim Initiator->SenseKeyCounter.OtherKeyType++; 4539285242Sachim } 4540285242Sachim 4541285242Sachim /* when ASQ and ASCQ 0x04 0x11, does saLocalPhyControl for notify spinup */ 4542285242Sachim if ((senseDataPayload[12] == 0x04 && senseDataPayload[13] == 0x11)) 4543285242Sachim { 4544285242Sachim TI_DBG2(("itdssIOUnderFlowWithChkConditionHandler: sending notfify spinup\n")); 4545285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 4546285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 4547285242Sachim if (oneDeviceData->directlyAttached == agTRUE) 4548285242Sachim { 4549285242Sachim for (i=0;i<TD_MAX_NUM_NOTIFY_SPINUP;i++) 4550285242Sachim { 4551285242Sachim saLocalPhyControl(agRoot, agNULL, 0, oneDeviceData->phyID, AGSA_PHY_NOTIFY_ENABLE_SPINUP, agNULL); 4552285242Sachim } 4553285242Sachim } 4554285242Sachim } 4555285242Sachim ostiInitiatorIOCompleted( 4556285242Sachim tiRoot, 4557285242Sachim /* tiIORequest */ 4558285242Sachim tdIORequestBody->tiIORequest, 4559285242Sachim tiIOSuccess, 4560285242Sachim scsi_status, 4561285242Sachim &senseData, 4562285242Sachim agTRUE /* intContext; is not being used */ 4563285242Sachim ); 4564285242Sachim return; 4565285242Sachim } 4566285242Sachim if (data_status == 3) 4567285242Sachim { 4568285242Sachim /* RESERVED */ 4569285242Sachim TI_DBG1(("itdssIOUnderFlowWithChkConditionHandler: reserved wrong!!!\n")); 4570285242Sachim ostiInitiatorIOCompleted( 4571285242Sachim tiRoot, 4572285242Sachim tdIORequestBody->tiIORequest, /* tiIORequest */ 4573285242Sachim tiIOFailed, 4574285242Sachim scsi_status, 4575285242Sachim agNULL, 4576285242Sachim agTRUE /* intContext; is not being used */ 4577285242Sachim ); 4578285242Sachim return; 4579285242Sachim } 4580285242Sachim 4581285242Sachim 4582285242Sachim return; 4583285242Sachim} 4584285242Sachim#endif 4585285242Sachim 4586285242Sachim/***************************************************************************** 4587285242Sachim*! \brief itdssXferOpenRetryBackoffThresholdReachedHandler 4588285242Sachim* 4589285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4590285242Sachim* layer with agIOStatus = 4591285242Sachim* OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED 4592285242Sachim* 4593285242Sachim* \param agRoot: pointer to port instance 4594285242Sachim* \param agIORequest: pointer to I/O request 4595285242Sachim* \param agIOStatus: I/O status given by LL layer 4596285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4597285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4598285242Sachim* of abort request 4599285242Sachim* \param agOtherInfo Residual count 4600285242Sachim* \return: None 4601285242Sachim* 4602285242Sachim* 4603285242Sachim*****************************************************************************/ 4604285242SachimosGLOBAL void 4605285242SachimitdssXferOpenRetryBackoffThresholdReachedHandler( 4606285242Sachim agsaRoot_t *agRoot, 4607285242Sachim agsaIORequest_t *agIORequest, 4608285242Sachim bit32 agIOStatus, 4609285242Sachim bit32 agIOInfoLen, 4610285242Sachim void *agParam, 4611285242Sachim bit32 agOtherInfo 4612285242Sachim ) 4613285242Sachim{ 4614285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4615285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4616285242Sachim bit32 intContext = osData->IntContext; 4617285242Sachim tdIORequestBody_t *tdIORequestBody; 4618285242Sachim TI_DBG2(("itdssXferOpenRetryBackoffThresholdReachedHandler: start\n")); 4619285242Sachim 4620285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4621285242Sachim 4622285242Sachim ostiInitiatorIOCompleted ( 4623285242Sachim tiRoot, 4624285242Sachim tdIORequestBody->tiIORequest, 4625285242Sachim tiIOFailed, 4626285242Sachim tiDetailOtherError, 4627285242Sachim agNULL, 4628285242Sachim intContext 4629285242Sachim ); 4630285242Sachim 4631285242Sachim return; 4632285242Sachim} 4633285242Sachim 4634285242Sachim/***************************************************************************** 4635285242Sachim*! \brief itdssOpenCnxErrorItNexusLossOpenTmoHandler 4636285242Sachim* 4637285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4638285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO 4639285242Sachim* 4640285242Sachim* \param agRoot: pointer to port instance 4641285242Sachim* \param agIORequest: pointer to I/O request 4642285242Sachim* \param agIOStatus: I/O status given by LL layer 4643285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4644285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4645285242Sachim* of abort request 4646285242Sachim* \param agOtherInfo Residual count 4647285242Sachim* \return: None 4648285242Sachim* 4649285242Sachim* 4650285242Sachim*****************************************************************************/ 4651285242SachimosGLOBAL void 4652285242SachimitdssOpenCnxErrorItNexusLossOpenTmoHandler( 4653285242Sachim agsaRoot_t *agRoot, 4654285242Sachim agsaIORequest_t *agIORequest, 4655285242Sachim bit32 agIOStatus, 4656285242Sachim bit32 agIOInfoLen, 4657285242Sachim void *agParam, 4658285242Sachim bit32 agOtherInfo 4659285242Sachim ) 4660285242Sachim{ 4661285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4662285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4663285242Sachim bit32 intContext = osData->IntContext; 4664285242Sachim tdIORequestBody_t *tdIORequestBody; 4665285242Sachim TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenTmoHandler: start\n")); 4666285242Sachim 4667285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4668285242Sachim 4669285242Sachim ostiInitiatorIOCompleted ( 4670285242Sachim tiRoot, 4671285242Sachim tdIORequestBody->tiIORequest, 4672285242Sachim tiIOFailed, 4673285242Sachim tiDetailOtherError, 4674285242Sachim agNULL, 4675285242Sachim intContext 4676285242Sachim ); 4677285242Sachim 4678285242Sachim return; 4679285242Sachim} 4680285242Sachim 4681285242Sachim/***************************************************************************** 4682285242Sachim*! \brief itdssOpenCnxErrorItNexusLossNoDestHandler 4683285242Sachim* 4684285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4685285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST 4686285242Sachim* 4687285242Sachim* \param agRoot: pointer to port instance 4688285242Sachim* \param agIORequest: pointer to I/O request 4689285242Sachim* \param agIOStatus: I/O status given by LL layer 4690285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4691285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4692285242Sachim* of abort request 4693285242Sachim* \param agOtherInfo Residual count 4694285242Sachim* \return: None 4695285242Sachim* 4696285242Sachim* 4697285242Sachim*****************************************************************************/ 4698285242SachimosGLOBAL void 4699285242SachimitdssOpenCnxErrorItNexusLossNoDestHandler( 4700285242Sachim agsaRoot_t *agRoot, 4701285242Sachim agsaIORequest_t *agIORequest, 4702285242Sachim bit32 agIOStatus, 4703285242Sachim bit32 agIOInfoLen, 4704285242Sachim void *agParam, 4705285242Sachim bit32 agOtherInfo 4706285242Sachim ) 4707285242Sachim{ 4708285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4709285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4710285242Sachim bit32 intContext = osData->IntContext; 4711285242Sachim tdIORequestBody_t *tdIORequestBody; 4712285242Sachim TI_DBG2(("itdssOpenCnxErrorItNexusLossNoDestHandler: start\n")); 4713285242Sachim 4714285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4715285242Sachim 4716285242Sachim ostiInitiatorIOCompleted ( 4717285242Sachim tiRoot, 4718285242Sachim tdIORequestBody->tiIORequest, 4719285242Sachim tiIOFailed, 4720285242Sachim tiDetailOtherError, 4721285242Sachim agNULL, 4722285242Sachim intContext 4723285242Sachim ); 4724285242Sachim 4725285242Sachim return; 4726285242Sachim} 4727285242Sachim 4728285242Sachim/***************************************************************************** 4729285242Sachim*! \brief itdssOpenCnxErrorItNexusLossOpenCollideHandler 4730285242Sachim* 4731285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4732285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE 4733285242Sachim* 4734285242Sachim* \param agRoot: pointer to port instance 4735285242Sachim* \param agIORequest: pointer to I/O request 4736285242Sachim* \param agIOStatus: I/O status given by LL layer 4737285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4738285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4739285242Sachim* of abort request 4740285242Sachim* \param agOtherInfo Residual count 4741285242Sachim* \return: None 4742285242Sachim* 4743285242Sachim* 4744285242Sachim*****************************************************************************/ 4745285242SachimosGLOBAL void 4746285242SachimitdssOpenCnxErrorItNexusLossOpenCollideHandler( 4747285242Sachim agsaRoot_t *agRoot, 4748285242Sachim agsaIORequest_t *agIORequest, 4749285242Sachim bit32 agIOStatus, 4750285242Sachim bit32 agIOInfoLen, 4751285242Sachim void *agParam, 4752285242Sachim bit32 agOtherInfo 4753285242Sachim ) 4754285242Sachim{ 4755285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4756285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4757285242Sachim bit32 intContext = osData->IntContext; 4758285242Sachim tdIORequestBody_t *tdIORequestBody; 4759285242Sachim TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenCollideHandler: start\n")); 4760285242Sachim 4761285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4762285242Sachim 4763285242Sachim ostiInitiatorIOCompleted ( 4764285242Sachim tiRoot, 4765285242Sachim tdIORequestBody->tiIORequest, 4766285242Sachim tiIOFailed, 4767285242Sachim tiDetailOtherError, 4768285242Sachim agNULL, 4769285242Sachim intContext 4770285242Sachim ); 4771285242Sachim 4772285242Sachim return; 4773285242Sachim} 4774285242Sachim 4775285242Sachim/***************************************************************************** 4776285242Sachim*! \brief itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler 4777285242Sachim* 4778285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4779285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED 4780285242Sachim* 4781285242Sachim* \param agRoot: pointer to port instance 4782285242Sachim* \param agIORequest: pointer to I/O request 4783285242Sachim* \param agIOStatus: I/O status given by LL layer 4784285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4785285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4786285242Sachim* of abort request 4787285242Sachim* \param agOtherInfo Residual count 4788285242Sachim* \return: None 4789285242Sachim* 4790285242Sachim* 4791285242Sachim*****************************************************************************/ 4792285242SachimosGLOBAL void 4793285242SachimitdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler( 4794285242Sachim agsaRoot_t *agRoot, 4795285242Sachim agsaIORequest_t *agIORequest, 4796285242Sachim bit32 agIOStatus, 4797285242Sachim bit32 agIOInfoLen, 4798285242Sachim void *agParam, 4799285242Sachim bit32 agOtherInfo 4800285242Sachim ) 4801285242Sachim{ 4802285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4803285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4804285242Sachim bit32 intContext = osData->IntContext; 4805285242Sachim tdIORequestBody_t *tdIORequestBody; 4806285242Sachim TI_DBG2(("itdssOpenCnxErrorItNexusLossOpenPathwayBlockedHandler: start\n")); 4807285242Sachim 4808285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4809285242Sachim 4810285242Sachim ostiInitiatorIOCompleted ( 4811285242Sachim tiRoot, 4812285242Sachim tdIORequestBody->tiIORequest, 4813285242Sachim tiIOFailed, 4814285242Sachim tiDetailOtherError, 4815285242Sachim agNULL, 4816285242Sachim intContext 4817285242Sachim ); 4818285242Sachim 4819285242Sachim return; 4820285242Sachim} 4821285242Sachim 4822285242Sachim/***************************************************************************** 4823285242Sachim*! \brief itdssEncryptionHandler 4824285242Sachim* 4825285242Sachim* Purpose: This function processes I/Os completed and returned by SAS lower 4826285242Sachim* layer with any encryption specific agIOStatus. 4827285242Sachim* 4828285242Sachim* \param agRoot: pointer to port instance 4829285242Sachim* \param agIORequest: pointer to I/O request 4830285242Sachim* \param agIOStatus: I/O status given by LL layer 4831285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4832285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4833285242Sachim* of abort request 4834285242Sachim* \return: None 4835285242Sachim* 4836285242Sachim* 4837285242Sachim*****************************************************************************/ 4838285242SachimosGLOBAL void 4839285242SachimitdssEncryptionHandler ( 4840285242Sachim agsaRoot_t *agRoot, 4841285242Sachim agsaIORequest_t *agIORequest, 4842285242Sachim bit32 agIOStatus, 4843285242Sachim bit32 agIOInfoLen, 4844285242Sachim void *agParam, 4845285242Sachim bit32 agOtherInfo 4846285242Sachim ) 4847285242Sachim{ 4848285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4849285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4850285242Sachim bit32 intContext = osData->IntContext; 4851285242Sachim bit32 errorDetail = tiDetailOtherError; 4852285242Sachim tdIORequestBody_t *tdIORequestBody; 4853285242Sachim TI_DBG1(("itdssEncryptionHandler: start\n")); 4854285242Sachim TI_DBG1(("itdssEncryptionHandler: agIOStatus 0x%x\n", agIOStatus)); 4855285242Sachim 4856285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4857285242Sachim 4858285242Sachim switch (agIOStatus) 4859285242Sachim { 4860285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: 4861285242Sachim TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n")); 4862285242Sachim errorDetail = tiDetailDekKeyCacheMiss; 4863285242Sachim break; 4864285242Sachim case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: 4865285242Sachim TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n")); 4866285242Sachim errorDetail = tiDetailCipherModeInvalid; 4867285242Sachim break; 4868285242Sachim case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: 4869285242Sachim TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n")); 4870285242Sachim errorDetail = tiDetailDekIVMismatch; 4871285242Sachim break; 4872285242Sachim case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: 4873285242Sachim TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n")); 4874285242Sachim errorDetail = tiDetailDekRamInterfaceError; 4875285242Sachim break; 4876285242Sachim case OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS: 4877285242Sachim TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_INDEX_OUT_OF_BOUNDS\n")); 4878285242Sachim errorDetail = tiDetailDekIndexOutofBounds; 4879285242Sachim break; 4880285242Sachim case OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE: 4881285242Sachim TI_DBG1(("itdssEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_ILLEGAL_TABLE\n")); 4882285242Sachim errorDetail = tiDetailOtherError; 4883285242Sachim break; 4884285242Sachim default: 4885285242Sachim TI_DBG1(("itdssEncryptionHandler: other error!!! 0x%x\n", agIOStatus)); 4886285242Sachim errorDetail = tiDetailOtherError; 4887285242Sachim break; 4888285242Sachim } 4889285242Sachim 4890285242Sachim ostiInitiatorIOCompleted ( 4891285242Sachim tiRoot, 4892285242Sachim tdIORequestBody->tiIORequest, 4893285242Sachim tiIOEncryptError, 4894285242Sachim errorDetail, 4895285242Sachim agNULL, 4896285242Sachim intContext 4897285242Sachim ); 4898285242Sachim return; 4899285242Sachim} 4900285242Sachim 4901285242Sachim/***************************************************************************** 4902285242Sachim*! \brief itdssDifHandler 4903285242Sachim* 4904285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4905285242Sachim* layer with any DIF specific agIOStatus 4906285242Sachim* 4907285242Sachim* \param agRoot: pointer to port instance 4908285242Sachim* \param agIORequest: pointer to I/O request 4909285242Sachim* \param agIOStatus: I/O status given by LL layer 4910285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4911285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4912285242Sachim* of abort request 4913285242Sachim* \param agOtherInfo Residual count 4914285242Sachim* \return: None 4915285242Sachim* 4916285242Sachim* 4917285242Sachim*****************************************************************************/ 4918285242SachimosGLOBAL void 4919285242SachimitdssDifHandler( 4920285242Sachim agsaRoot_t *agRoot, 4921285242Sachim agsaIORequest_t *agIORequest, 4922285242Sachim bit32 agIOStatus, 4923285242Sachim bit32 agIOInfoLen, 4924285242Sachim void *agParam, 4925285242Sachim bit32 agOtherInfo 4926285242Sachim ) 4927285242Sachim{ 4928285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4929285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4930285242Sachim bit32 intContext = osData->IntContext; 4931285242Sachim bit32 errorDetail = tiDetailOtherError; 4932285242Sachim tdIORequestBody_t *tdIORequestBody; 4933285242Sachim#ifdef TD_DEBUG_ENABLE 4934285242Sachim agsaDifDetails_t *DifDetail; 4935285242Sachim#endif 4936285242Sachim 4937285242Sachim TI_DBG1(("itdssDifHandler: start\n")); 4938285242Sachim TI_DBG1(("itdssDifHandler: agIOStatus 0x%x\n", agIOStatus)); 4939285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4940285242Sachim#ifdef TD_DEBUG_ENABLE 4941285242Sachim DifDetail = (agsaDifDetails_t *)agParam; 4942285242Sachim#endif 4943285242Sachim switch (agIOStatus) 4944285242Sachim { 4945285242Sachim case OSSA_IO_XFR_ERROR_DIF_MISMATCH: 4946285242Sachim errorDetail = tiDetailDifMismatch; 4947285242Sachim TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_MISMATCH\n")); 4948285242Sachim break; 4949285242Sachim case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: 4950285242Sachim errorDetail = tiDetailDifAppTagMismatch; 4951285242Sachim TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n")); 4952285242Sachim break; 4953285242Sachim case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: 4954285242Sachim errorDetail = tiDetailDifRefTagMismatch; 4955285242Sachim TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n")); 4956285242Sachim break; 4957285242Sachim case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 4958285242Sachim errorDetail = tiDetailDifCrcMismatch; 4959285242Sachim TI_DBG1(("itdssDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n")); 4960285242Sachim break; 4961285242Sachim default: 4962285242Sachim errorDetail = tiDetailOtherError; 4963285242Sachim TI_DBG1(("itdssDifHandler: other error!!! 0x%x\n", agIOStatus)); 4964285242Sachim break; 4965285242Sachim } 4966285242Sachim TI_DBG1(("itdssDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA)); 4967285242Sachim ostiInitiatorIOCompleted ( 4968285242Sachim tiRoot, 4969285242Sachim tdIORequestBody->tiIORequest, 4970285242Sachim tiIODifError, 4971285242Sachim errorDetail, 4972285242Sachim agNULL, 4973285242Sachim intContext 4974285242Sachim ); 4975285242Sachim return; 4976285242Sachim} 4977285242Sachim 4978285242Sachim/***************************************************************************** 4979285242Sachim*! \brief itdssIOResourceUnavailableHandler 4980285242Sachim* 4981285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 4982285242Sachim* layer with agIOStatus = OSSA_MPI_ERR_IO_RESOURCE_UNAVAILABLE 4983285242Sachim* 4984285242Sachim* \param agRoot: pointer to port instance 4985285242Sachim* \param agIORequest: pointer to I/O request 4986285242Sachim* \param agIOStatus: I/O status given by LL layer 4987285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 4988285242Sachim* \param agParam A Handle used to refer to the response frame or handle 4989285242Sachim* of abort request 4990285242Sachim* \param agOtherInfo Residual count 4991285242Sachim* \return: None 4992285242Sachim* 4993285242Sachim* 4994285242Sachim*****************************************************************************/ 4995285242SachimosGLOBAL void 4996285242SachimitdssIOResourceUnavailableHandler( 4997285242Sachim agsaRoot_t *agRoot, 4998285242Sachim agsaIORequest_t *agIORequest, 4999285242Sachim bit32 agIOStatus, 5000285242Sachim bit32 agIOInfoLen, 5001285242Sachim void *agParam, 5002285242Sachim bit32 agOtherInfo 5003285242Sachim ) 5004285242Sachim{ 5005285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5006285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5007285242Sachim bit32 intContext = osData->IntContext; 5008285242Sachim tdIORequestBody_t *tdIORequestBody; 5009285242Sachim TI_DBG2(("itdssIOResourceUnavailableHandler: start\n")); 5010285242Sachim TI_DBG2(("itdssIOResourceUnavailableHandler: agIOStatus 0x%x\n", agIOStatus)); 5011285242Sachim 5012285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5013285242Sachim 5014285242Sachim ostiInitiatorIOCompleted ( 5015285242Sachim tiRoot, 5016285242Sachim tdIORequestBody->tiIORequest, 5017285242Sachim tiIOFailed, 5018285242Sachim tiDetailBusy, 5019285242Sachim agNULL, 5020285242Sachim intContext 5021285242Sachim ); 5022285242Sachim return; 5023285242Sachim} 5024285242Sachim/***************************************************************************** 5025285242Sachim*! \brief itdssIORQEBusyFullHandler 5026285242Sachim* 5027285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 5028285242Sachim* layer with agIOStatus = OSSA_MPI_IO_RQE_BUSY_FULL 5029285242Sachim* 5030285242Sachim* \param agRoot: pointer to port instance 5031285242Sachim* \param agIORequest: pointer to I/O request 5032285242Sachim* \param agIOStatus: I/O status given by LL layer 5033285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5034285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5035285242Sachim* of abort request 5036285242Sachim* \param agOtherInfo Residual count 5037285242Sachim* \return: None 5038285242Sachim* 5039285242Sachim* 5040285242Sachim*****************************************************************************/ 5041285242SachimosGLOBAL void 5042285242SachimitdssIORQEBusyFullHandler( 5043285242Sachim agsaRoot_t *agRoot, 5044285242Sachim agsaIORequest_t *agIORequest, 5045285242Sachim bit32 agIOStatus, 5046285242Sachim bit32 agIOInfoLen, 5047285242Sachim void *agParam, 5048285242Sachim bit32 agOtherInfo 5049285242Sachim ) 5050285242Sachim{ 5051285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5052285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5053285242Sachim bit32 intContext = osData->IntContext; 5054285242Sachim tdIORequestBody_t *tdIORequestBody; 5055285242Sachim TI_DBG2(("itdssIORQEBusyFullHandler: start\n")); 5056285242Sachim TI_DBG2(("itdssIORQEBusyFullHandler: agIOStatus 0x%x\n", agIOStatus)); 5057285242Sachim 5058285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5059285242Sachim 5060285242Sachim ostiInitiatorIOCompleted ( 5061285242Sachim tiRoot, 5062285242Sachim tdIORequestBody->tiIORequest, 5063285242Sachim tiIOFailed, 5064285242Sachim tiDetailBusy, 5065285242Sachim agNULL, 5066285242Sachim intContext 5067285242Sachim ); 5068285242Sachim return; 5069285242Sachim} 5070285242Sachim 5071285242Sachim/***************************************************************************** 5072285242Sachim*! \brief itdssXferErrorInvalidSSPRspFrameHandler 5073285242Sachim* 5074285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 5075285242Sachim* layer with agIOStatus = OSSA_IO_XFR_ERROR_INVALID_SSP_RSP_FRAME 5076285242Sachim* 5077285242Sachim* \param agRoot: pointer to port instance 5078285242Sachim* \param agIORequest: pointer to I/O request 5079285242Sachim* \param agIOStatus: I/O status given by LL layer 5080285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5081285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5082285242Sachim* of abort request 5083285242Sachim* \param agOtherInfo Residual count 5084285242Sachim* \return: None 5085285242Sachim* 5086285242Sachim* 5087285242Sachim*****************************************************************************/ 5088285242SachimosGLOBAL void 5089285242SachimitdssXferErrorInvalidSSPRspFrameHandler( 5090285242Sachim agsaRoot_t *agRoot, 5091285242Sachim agsaIORequest_t *agIORequest, 5092285242Sachim bit32 agIOStatus, 5093285242Sachim bit32 agIOInfoLen, 5094285242Sachim void *agParam, 5095285242Sachim bit32 agOtherInfo 5096285242Sachim ) 5097285242Sachim{ 5098285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5099285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5100285242Sachim bit32 intContext = osData->IntContext; 5101285242Sachim tdIORequestBody_t *tdIORequestBody; 5102285242Sachim TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: start\n")); 5103285242Sachim TI_DBG2(("itdssXferErrorInvalidSSPRspFrameHandler: agIOStatus 0x%x\n", agIOStatus)); 5104285242Sachim 5105285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5106285242Sachim 5107285242Sachim ostiInitiatorIOCompleted ( 5108285242Sachim tiRoot, 5109285242Sachim tdIORequestBody->tiIORequest, 5110285242Sachim tiIOFailed, 5111285242Sachim tiDetailOtherError, 5112285242Sachim agNULL, 5113285242Sachim intContext 5114285242Sachim ); 5115285242Sachim return; 5116285242Sachim} 5117285242Sachim 5118285242Sachim/***************************************************************************** 5119285242Sachim*! \brief itdssXferErrorEOBDataOverrunHandler 5120285242Sachim* 5121285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 5122285242Sachim* layer with agIOStatus = OSSA_IO_XFER_ERR_EOB_DATA_OVERRUN 5123285242Sachim* 5124285242Sachim* \param agRoot: pointer to port instance 5125285242Sachim* \param agIORequest: pointer to I/O request 5126285242Sachim* \param agIOStatus: I/O status given by LL layer 5127285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5128285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5129285242Sachim* of abort request 5130285242Sachim* \param agOtherInfo Residual count 5131285242Sachim* \return: None 5132285242Sachim* 5133285242Sachim* 5134285242Sachim*****************************************************************************/ 5135285242SachimosGLOBAL void 5136285242SachimitdssXferErrorEOBDataOverrunHandler( 5137285242Sachim agsaRoot_t *agRoot, 5138285242Sachim agsaIORequest_t *agIORequest, 5139285242Sachim bit32 agIOStatus, 5140285242Sachim bit32 agIOInfoLen, 5141285242Sachim void *agParam, 5142285242Sachim bit32 agOtherInfo 5143285242Sachim ) 5144285242Sachim{ 5145285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5146285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5147285242Sachim bit32 intContext = osData->IntContext; 5148285242Sachim tdIORequestBody_t *tdIORequestBody; 5149285242Sachim TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: start\n")); 5150285242Sachim TI_DBG2(("itdssXferErrorEOBDataOverrunHandler: agIOStatus 0x%x\n", agIOStatus)); 5151285242Sachim 5152285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5153285242Sachim 5154285242Sachim ostiInitiatorIOCompleted ( 5155285242Sachim tiRoot, 5156285242Sachim tdIORequestBody->tiIORequest, 5157285242Sachim tiIOFailed, 5158285242Sachim tiDetailOtherError, 5159285242Sachim agNULL, 5160285242Sachim intContext 5161285242Sachim ); 5162285242Sachim return; 5163285242Sachim} 5164285242Sachim 5165285242Sachim/***************************************************************************** 5166285242Sachim*! \brief itdssOpenCnxErrorOpenPreemptedHandler 5167285242Sachim* 5168285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 5169285242Sachim* layer with agIOStatus = OSSA_IO_OPEN_CNX_ERROR_OPEN_PREEMPTED 5170285242Sachim* 5171285242Sachim* \param agRoot: pointer to port instance 5172285242Sachim* \param agIORequest: pointer to I/O request 5173285242Sachim* \param agIOStatus: I/O status given by LL layer 5174285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5175285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5176285242Sachim* of abort request 5177285242Sachim* \param agOtherInfo Residual count 5178285242Sachim* \return: None 5179285242Sachim* 5180285242Sachim* 5181285242Sachim*****************************************************************************/ 5182285242SachimosGLOBAL void 5183285242SachimitdssOpenCnxErrorOpenPreemptedHandler( 5184285242Sachim agsaRoot_t *agRoot, 5185285242Sachim agsaIORequest_t *agIORequest, 5186285242Sachim bit32 agIOStatus, 5187285242Sachim bit32 agIOInfoLen, 5188285242Sachim void *agParam, 5189285242Sachim bit32 agOtherInfo 5190285242Sachim ) 5191285242Sachim{ 5192285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5193285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5194285242Sachim bit32 intContext = osData->IntContext; 5195285242Sachim tdIORequestBody_t *tdIORequestBody; 5196285242Sachim TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: start\n")); 5197285242Sachim TI_DBG2(("itdssOpenCnxErrorOpenPreemptedHandler: agIOStatus 0x%x\n", agIOStatus)); 5198285242Sachim 5199285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5200285242Sachim 5201285242Sachim ostiInitiatorIOCompleted ( 5202285242Sachim tiRoot, 5203285242Sachim tdIORequestBody->tiIORequest, 5204285242Sachim tiIOFailed, 5205285242Sachim tiDetailOtherError, 5206285242Sachim agNULL, 5207285242Sachim intContext 5208285242Sachim ); 5209285242Sachim return; 5210285242Sachim} 5211285242Sachim 5212285242Sachim/* default */ 5213285242Sachim/***************************************************************************** 5214285242Sachim*! \brief itdssIODefaultHandler 5215285242Sachim* 5216285242Sachim* Purpose: This function processes I/Os completed and returned by SAS/SATA lower 5217285242Sachim* layer with agIOStatus = unspecified 5218285242Sachim* 5219285242Sachim* \param agRoot: pointer to port instance 5220285242Sachim* \param agIORequest: pointer to I/O request 5221285242Sachim* \param agIOStatus: I/O status given by LL layer 5222285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5223285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5224285242Sachim* of abort request 5225285242Sachim* \param agOtherInfo Residual count 5226285242Sachim* \return: None 5227285242Sachim* 5228285242Sachim* 5229285242Sachim*****************************************************************************/ 5230285242SachimosGLOBAL void 5231285242SachimitdssIODefaultHandler ( 5232285242Sachim agsaRoot_t *agRoot, 5233285242Sachim agsaIORequest_t *agIORequest, 5234285242Sachim bit32 agIOStatus, 5235285242Sachim bit32 agIOInfoLen, 5236285242Sachim void *agParam, 5237285242Sachim bit32 agOtherInfo 5238285242Sachim ) 5239285242Sachim{ 5240285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5241285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5242285242Sachim bit32 intContext = osData->IntContext; 5243285242Sachim tdIORequestBody_t *tdIORequestBody; 5244285242Sachim TI_DBG2(("itdssIODefaultHandler: start\n")); 5245285242Sachim TI_DBG2(("itdssIODefaultHandler: agIOStatus 0x%x\n", agIOStatus)); 5246285242Sachim 5247285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5248285242Sachim 5249285242Sachim ostiInitiatorIOCompleted ( 5250285242Sachim tiRoot, 5251285242Sachim tdIORequestBody->tiIORequest, 5252285242Sachim tiIOFailed, 5253285242Sachim tiDetailOtherError, 5254285242Sachim agNULL, 5255285242Sachim intContext 5256285242Sachim ); 5257285242Sachim return; 5258285242Sachim} 5259285242Sachim 5260285242Sachim/***************************************************************************** 5261285242Sachim*! \brief itdssIOForDebugging1Completed 5262285242Sachim* 5263285242Sachim* Purpose: This function is only for debugging. This function should NOT be 5264285242Sachim* called. 5265285242Sachim* 5266285242Sachim* \param agRoot: pointer to port instance 5267285242Sachim* \param agIORequest: pointer to I/O request 5268285242Sachim* \param agIOStatus: I/O status given by LL layer 5269285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5270285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5271285242Sachim* of abort request 5272285242Sachim* \param agOtherInfo Residual count 5273285242Sachim* \return: None 5274285242Sachim* 5275285242Sachim* 5276285242Sachim*****************************************************************************/ 5277285242SachimosGLOBAL void 5278285242SachimitdssIOForDebugging1Completed( 5279285242Sachim agsaRoot_t *agRoot, 5280285242Sachim agsaIORequest_t *agIORequest, 5281285242Sachim bit32 agIOStatus, 5282285242Sachim bit32 agIOInfoLen, 5283285242Sachim void *agParam, 5284285242Sachim bit32 agOtherInfo 5285285242Sachim ) 5286285242Sachim{ 5287285242Sachim TI_DBG1(("itdssIOForDebugging1Completed: start, error!!! can't be called. \n")); 5288285242Sachim} 5289285242Sachim 5290285242Sachim/***************************************************************************** 5291285242Sachim*! \brief itdssIOForDebugging2Completed 5292285242Sachim* 5293285242Sachim* Purpose: This function is only for debugging. This function should NOT be 5294285242Sachim* called. 5295285242Sachim* 5296285242Sachim* \param agRoot: pointer to port instance 5297285242Sachim* \param agIORequest: pointer to I/O request 5298285242Sachim* \param agIOStatus: I/O status given by LL layer 5299285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5300285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5301285242Sachim* of abort request 5302285242Sachim* \param agOtherInfo Residual count 5303285242Sachim* \return: None 5304285242Sachim* 5305285242Sachim* 5306285242Sachim*****************************************************************************/ 5307285242SachimosGLOBAL void 5308285242SachimitdssIOForDebugging2Completed( 5309285242Sachim agsaRoot_t *agRoot, 5310285242Sachim agsaIORequest_t *agIORequest, 5311285242Sachim bit32 agIOStatus, 5312285242Sachim bit32 agIOInfoLen, 5313285242Sachim void *agParam, 5314285242Sachim bit32 agOtherInfo 5315285242Sachim ) 5316285242Sachim{ 5317285242Sachim TI_DBG1(("itdssIOForDebugging2Completed: start, error!!! can't be called. \n")); 5318285242Sachim} 5319285242Sachim 5320285242Sachim/***************************************************************************** 5321285242Sachim*! \brief itdssIOForDebugging3Completed 5322285242Sachim* 5323285242Sachim* Purpose: This function is only for debugging. This function should NOT be 5324285242Sachim* called. 5325285242Sachim* 5326285242Sachim* \param agRoot: pointer to port instance 5327285242Sachim* \param agIORequest: pointer to I/O request 5328285242Sachim* \param agIOStatus: I/O status given by LL layer 5329285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 5330285242Sachim* \param agParam A Handle used to refer to the response frame or handle 5331285242Sachim* of abort request 5332285242Sachim* \param agOtherInfo Residual count 5333285242Sachim* \return: None 5334285242Sachim* 5335285242Sachim* 5336285242Sachim*****************************************************************************/ 5337285242SachimosGLOBAL void 5338285242SachimitdssIOForDebugging3Completed( 5339285242Sachim agsaRoot_t *agRoot, 5340285242Sachim agsaIORequest_t *agIORequest, 5341285242Sachim bit32 agIOStatus, 5342285242Sachim bit32 agIOInfoLen, 5343285242Sachim void *agParam, 5344285242Sachim bit32 agOtherInfo 5345285242Sachim ) 5346285242Sachim{ 5347285242Sachim TI_DBG1(("itdssIOForDebugging3Completed: start, error!!! can't be called. \n")); 5348285242Sachim} 5349285242Sachim 5350285242Sachim 5351