ossasat.c revision 285242
1285242Sachim/******************************************************************************* 2285242Sachim*Copyright (c) 2014 PMC-Sierra, Inc. All rights reserved. 3285242Sachim* 4285242Sachim*Redistribution and use in source and binary forms, with or without modification, are permitted provided 5285242Sachim*that the following conditions are met: 6285242Sachim*1. Redistributions of source code must retain the above copyright notice, this list of conditions and the 7285242Sachim*following disclaimer. 8285242Sachim*2. Redistributions in binary form must reproduce the above copyright notice, 9285242Sachim*this list of conditions and the following disclaimer in the documentation and/or other materials provided 10285242Sachim*with the distribution. 11285242Sachim* 12285242Sachim*THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED 13285242Sachim*WARRANTIES,INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 14285242Sachim*FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 15285242Sachim*FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 16285242Sachim*NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 17285242Sachim*BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 18285242Sachim*LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 19285242Sachim*SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE 20285242Sachim 21285242Sachim********************************************************************************/ 22285242Sachim/*****************************************************************************/ 23285242Sachim/** \file 24285242Sachim * 25285242Sachim * The file implementing SCSI/ATA Translation (SAT) for LL Layer callback 26285242Sachim * 27285242Sachim */ 28285242Sachim/*****************************************************************************/ 29285242Sachim#include <sys/cdefs.h> 30285242Sachim__FBSDID("$FreeBSD: projects/pms/sys/dev/pms/RefTisa/tisa/sassata/sata/host/ossasat.c 285242 2015-07-07 13:17:02Z achim $"); 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#ifdef SATA_ENABLE 38285242Sachim 39285242Sachim#include <dev/pms/RefTisa/sallsdk/api/sa.h> 40285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saapi.h> 41285242Sachim#include <dev/pms/RefTisa/sallsdk/api/saosapi.h> 42285242Sachim 43285242Sachim#include <dev/pms/RefTisa/tisa/api/titypes.h> 44285242Sachim#include <dev/pms/RefTisa/tisa/api/ostiapi.h> 45285242Sachim#include <dev/pms/RefTisa/tisa/api/tiapi.h> 46285242Sachim#include <dev/pms/RefTisa/tisa/api/tiglobal.h> 47285242Sachim 48285242Sachim#ifdef FDS_SM 49285242Sachim#include <dev/pms/RefTisa/sat/api/sm.h> 50285242Sachim#include <dev/pms/RefTisa/sat/api/smapi.h> 51285242Sachim#include <dev/pms/RefTisa/sat/api/tdsmapi.h> 52285242Sachim#endif 53285242Sachim 54285242Sachim#ifdef FDS_DM 55285242Sachim#include <dev/pms/RefTisa/discovery/api/dm.h> 56285242Sachim#include <dev/pms/RefTisa/discovery/api/dmapi.h> 57285242Sachim#include <dev/pms/RefTisa/discovery/api/tddmapi.h> 58285242Sachim#endif 59285242Sachim 60285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/common/tdtypes.h> 61285242Sachim#include <dev/pms/freebsd/driver/common/osstring.h> 62285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdutil.h> 63285242Sachim 64285242Sachim#ifdef INITIATOR_DRIVER 65285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdtypes.h> 66285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itddefs.h> 67285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/ini/itdglobl.h> 68285242Sachim#endif 69285242Sachim 70285242Sachim#ifdef TARGET_DRIVER 71285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdglobl.h> 72285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdxchg.h> 73285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sas/tgt/ttdtypes.h> 74285242Sachim#endif 75285242Sachim 76285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdsatypes.h> 77285242Sachim#include <dev/pms/RefTisa/tisa/sassata/common/tdproto.h> 78285242Sachim 79285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sata/host/sat.h> 80285242Sachim#include <dev/pms/RefTisa/tisa/sassata/sata/host/satproto.h> 81285242Sachim 82285242Sachim/***************************************************************************** 83285242Sachim*! \brief ossaSATACompleted 84285242Sachim* 85285242Sachim* This routine is called to complete a SATA request previously issued to the 86285242Sachim* LL Layer in saSATAStart() 87285242Sachim* 88285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 89285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 90285242Sachim* \param agIOStatus: Status of completed I/O. 91285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 92285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 93285242Sachim* length. 94285242Sachim* \param agParam: Additional info based on status. 95285242Sachim* 96285242Sachim* \return: none 97285242Sachim* 98285242Sachim*****************************************************************************/ 99285242SachimGLOBAL void 100285242SachimossaSATACompleted( 101285242Sachim agsaRoot_t *agRoot, 102285242Sachim agsaIORequest_t *agIORequest, 103285242Sachim bit32 agIOStatus, 104285242Sachim void *agFirstDword, 105285242Sachim bit32 agIOInfoLen, 106285242Sachim void *agParam 107285242Sachim ) 108285242Sachim 109285242Sachim{ 110285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 111285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 112285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 113285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&(tdsaRoot->tdsaAllShared); 114285242Sachim tdIORequestBody_t *tdIORequestBody; 115285242Sachim satIOContext_t *satIOContext; 116285242Sachim satDeviceData_t *pSatDevData; 117285242Sachim tdsaDeviceData_t *tdsaDeviceData = agNULL; 118285242Sachim tdsaPortContext_t *onePortContext; 119285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 120285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 121285242Sachim bit32 status; 122285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 123285242Sachim 124285242Sachim TDSA_OUT_ENTER(tiRoot); 125285242Sachim 126285242Sachim TI_DBG6(("ossaSATACompleted: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 127285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 128285242Sachim 129285242Sachim if (agIORequest == agNULL) 130285242Sachim { 131285242Sachim TI_DBG1(("ossaSATACompleted: agIORequest is NULL!!!!\n")); 132285242Sachim return; 133285242Sachim } 134285242Sachim 135285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 136285242Sachim 137285242Sachim if (tdIORequestBody == agNULL) 138285242Sachim { 139285242Sachim TI_DBG1(("ossaSATACompleted: tdIORequestBody is NULL!!!!\n")); 140285242Sachim return; 141285242Sachim } 142285242Sachim /* for debugging */ 143285242Sachim if (tdIORequestBody->ioCompleted == agTRUE) 144285242Sachim { 145285242Sachim tiDeviceHandle = tdIORequestBody->tiDevHandle; 146285242Sachim if (tiDeviceHandle == agNULL) 147285242Sachim { 148285242Sachim TI_DBG1(("ossaSATACompleted: tiDeviceHandle is NULL!!!!\n")); 149285242Sachim return; 150285242Sachim } 151285242Sachim tdsaDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 152285242Sachim TI_DBG1(("ossaSATACompleted: Error!!!!!! double completion\n")); 153285242Sachim if (tdsaDeviceData == agNULL) 154285242Sachim { 155285242Sachim TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n")); 156285242Sachim return; 157285242Sachim } 158285242Sachim TI_DBG1(("ossaSATACompleted: did %d \n", tdsaDeviceData->id)); 159285242Sachim return; 160285242Sachim } 161285242Sachim 162285242Sachim tdIORequestBody->ioCompleted = agTRUE; 163285242Sachim satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 164285242Sachim 165285242Sachim if (satIOContext == agNULL) 166285242Sachim { 167285242Sachim TI_DBG1(("ossaSATACompleted: satIOContext is NULL!!!!\n")); 168285242Sachim return; 169285242Sachim } 170285242Sachim 171285242Sachim pSatDevData = satIOContext->pSatDevData; 172285242Sachim 173285242Sachim if (tdIORequestBody->tiDevHandle != agNULL) 174285242Sachim { 175285242Sachim oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData; 176285242Sachim } 177285242Sachim 178285242Sachim if (pSatDevData == agNULL && oneDeviceData != agNULL) 179285242Sachim { 180285242Sachim TI_DBG1(("ossaSATACompleted: pSatDevData is NULL, loc 1, wrong\n")); 181285242Sachim pSatDevData = &(oneDeviceData->satDevData); 182285242Sachim } 183285242Sachim 184285242Sachim if (pSatDevData == agNULL) 185285242Sachim { 186285242Sachim TI_DBG1(("ossaSATACompleted: pSatDevData is NULL loc 2, wrong\n")); 187285242Sachim if (satIOContext->satOrgIOContext == agNULL) 188285242Sachim { 189285242Sachim TI_DBG1(("ossaSATACompleted: external command\n")); 190285242Sachim } 191285242Sachim else 192285242Sachim { 193285242Sachim TI_DBG1(("ossaSATACompleted: internal command\n")); 194285242Sachim } 195285242Sachim goto ext; 196285242Sachim } 197285242Sachim 198285242Sachim tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData; 199285242Sachim if (oneDeviceData != tdsaDeviceData) 200285242Sachim { 201285242Sachim if (satIOContext->satOrgIOContext == agNULL) 202285242Sachim { 203285242Sachim TI_DBG1(("ossaSATACompleted: diff device handle; external command\n")); 204285242Sachim } 205285242Sachim else 206285242Sachim { 207285242Sachim TI_DBG1(("ossaSATACompleted: diff device handle; internal command\n")); 208285242Sachim } 209285242Sachim } 210285242Sachim 211285242Sachim if (tdsaDeviceData == agNULL) 212285242Sachim { 213285242Sachim TI_DBG1(("ossaSATACompleted: tdsaDeviceData is NULL!!!!\n")); 214285242Sachim return; 215285242Sachim } 216285242Sachim 217285242Sachim onePortContext = tdsaDeviceData->tdPortContext; 218285242Sachim 219285242Sachim /* retries in OSSA_IO_XFER_OPEN_RETRY_TIMEOUT */ 220285242Sachim if (agIOStatus == OSSA_IO_XFER_OPEN_RETRY_TIMEOUT) 221285242Sachim { 222285242Sachim if (tdsaDeviceData->valid == agTRUE && tdsaDeviceData->registered == agTRUE && 223285242Sachim tdsaDeviceData->tdPortContext != agNULL ) 224285242Sachim { 225285242Sachim if (tdIORequestBody->reTries <= OPEN_RETRY_RETRIES) /* 10 */ 226285242Sachim { 227285242Sachim agDevHandle = tdsaDeviceData->agDevHandle; 228285242Sachim status = saSATAStart( agRoot, 229285242Sachim agIORequest, 230285242Sachim tdsaRotateQnumber(tiRoot, tdsaDeviceData), 231285242Sachim agDevHandle, 232285242Sachim satIOContext->reqType, 233285242Sachim &(tdIORequestBody->transport.SATA.agSATARequestBody), 234285242Sachim satIOContext->sataTag, 235285242Sachim ossaSATACompleted); 236285242Sachim 237285242Sachim if (status == AGSA_RC_SUCCESS) 238285242Sachim { 239285242Sachim TI_DBG1(("ossaSATACompleted: retried\n")); 240285242Sachim tdIORequestBody->ioStarted = agTRUE; 241285242Sachim tdIORequestBody->ioCompleted = agFALSE; 242285242Sachim tdIORequestBody->reTries++; 243285242Sachim goto ext; 244285242Sachim } 245285242Sachim else 246285242Sachim { 247285242Sachim TI_DBG1(("ossaSATACompleted: retry failed\n")); 248285242Sachim tdIORequestBody->ioStarted = agFALSE; 249285242Sachim tdIORequestBody->ioCompleted = agTRUE; 250285242Sachim tdIORequestBody->reTries = 0; 251285242Sachim } 252285242Sachim } 253285242Sachim else 254285242Sachim { 255285242Sachim /* retries is over, do nothing */ 256285242Sachim TI_DBG1(("ossaSATACompleted: retry is over and fail\n")); 257285242Sachim tdIORequestBody->reTries = 0; 258285242Sachim } 259285242Sachim } 260285242Sachim else 261285242Sachim { 262285242Sachim TI_DBG1(("ossaSATACompleted: incorrect device state or no portcontext\n")); 263285242Sachim tdIORequestBody->reTries = 0; 264285242Sachim } 265285242Sachim } /* if OSSA_IO_XFER_OPEN_RETRY_TIMEOUT*/ 266285242Sachim 267285242Sachim /* release tag value for SATA */ 268285242Sachim if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) || 269285242Sachim (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) ) 270285242Sachim { 271285242Sachim satTagRelease(tiRoot, pSatDevData, satIOContext->sataTag); 272285242Sachim } 273285242Sachim 274285242Sachim /* send SMP_PHY_CONTROL_HARD_RESET */ 275285242Sachim if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA) 276285242Sachim { 277285242Sachim if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */ 278285242Sachim { 279285242Sachim TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n")); 280285242Sachim pSatDevData->NumOfFCA++; 281285242Sachim tdsaPhyControlSend(tiRoot, 282285242Sachim tdsaDeviceData, 283285242Sachim SMP_PHY_CONTROL_HARD_RESET, 284285242Sachim agNULL, 285285242Sachim tdsaRotateQnumber(tiRoot, tdsaDeviceData) 286285242Sachim ); 287285242Sachim } 288285242Sachim else 289285242Sachim { 290285242Sachim /* given up after one time of SMP HARD RESET; */ 291285242Sachim TI_DBG1(("ossaSATACompleted: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n")); 292285242Sachim if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0) 293285242Sachim { 294285242Sachim /* 295285242Sachim 1. remove this device 296285242Sachim 2. device removal event 297285242Sachim */ 298285242Sachim tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData); 299285242Sachim tdsaDeviceData->valid = agFALSE; 300285242Sachim tdsaDeviceData->valid2 = agFALSE; 301285242Sachim tdsaDeviceData->registered = agFALSE; 302285242Sachim// pSatDevData->NumOfFCA = 0; 303285242Sachim ostiInitiatorEvent( 304285242Sachim tiRoot, 305285242Sachim onePortContext->tiPortalContext, 306285242Sachim agNULL, 307285242Sachim tiIntrEventTypeDeviceChange, 308285242Sachim tiDeviceRemoval, 309285242Sachim agNULL 310285242Sachim ); 311285242Sachim } 312285242Sachim } 313285242Sachim } 314285242Sachim 315285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 316285242Sachim { 317285242Sachim /* 318285242Sachim free abort IO request itself - agParam; done in ossaSATAEvent() 319285242Sachim */ 320285242Sachim } 321285242Sachim /* just for debugging */ 322285242Sachim if (agIOStatus == OSSA_IO_DS_NON_OPERATIONAL) 323285242Sachim { 324285242Sachim TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_NON_OPERATIONAL\n")); 325285242Sachim } 326285242Sachim if (agIOStatus == OSSA_IO_DS_IN_RECOVERY) 327285242Sachim { 328285242Sachim TI_DBG1(("ossaSATACompleted: agIOStatus is OSSA_IO_DS_IN_RECOVERY\n")); 329285242Sachim } 330285242Sachim 331285242Sachim satIOContext->satCompleteCB( agRoot, 332285242Sachim agIORequest, 333285242Sachim agIOStatus, 334285242Sachim agFirstDword, 335285242Sachim agIOInfoLen, 336285242Sachim agParam, 337285242Sachim satIOContext); 338285242Sachimext: 339285242Sachim TDSA_OUT_LEAVE(tiRoot); 340285242Sachim} 341285242Sachim 342285242Sachim/***************************************************************************** 343285242Sachim*! \brief satPacketCB 344285242Sachim* 345285242Sachim* This routine is a callback function called from ossaSATACompleted(). 346285242Sachim* This CB routine deals with normal Packet command I/O SATA request. 347285242Sachim* 348285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 349285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 350285242Sachim* \param agIOStatus: Status of completed I/O. 351285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 352285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 353285242Sachim* length. 354285242Sachim* \param agParam: Additional info based on status. 355285242Sachim* \param ioContext: Pointer to satIOContext_t. 356285242Sachim* 357285242Sachim* \return: none 358285242Sachim* 359285242Sachim*****************************************************************************/ 360285242Sachim 361285242Sachimvoid satPacketCB( 362285242Sachim agsaRoot_t *agRoot, 363285242Sachim agsaIORequest_t *agIORequest, 364285242Sachim bit32 agIOStatus, 365285242Sachim agsaFisHeader_t *agFirstDword, 366285242Sachim bit32 agIOInfoLen, 367285242Sachim void *agParam, 368285242Sachim void *ioContext 369285242Sachim ) 370285242Sachim{ 371285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 372285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 373285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 374285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 375285242Sachim tdIORequestBody_t *tdIORequestBody; 376285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 377285242Sachim satIOContext_t *satIOContext; 378285242Sachim satIOContext_t *satOrgIOContext; 379285242Sachim satIOContext_t *satNewIOContext; 380285242Sachim satInternalIo_t *satIntIo; 381285242Sachim satInternalIo_t *satNewIntIo = agNULL; 382285242Sachim satDeviceData_t *satDevData; 383285242Sachim scsiRspSense_t *pSense; 384285242Sachim tiIORequest_t *tiOrgIORequest; 385285242Sachim tiIniScsiCmnd_t *scsiCmnd; 386285242Sachim bit32 interruptContext = osData->IntContext; 387285242Sachim bit8 bSenseKey = 0; 388285242Sachim bit16 bSenseCodeInfo = 0; 389285242Sachim bit32 status = 0; 390285242Sachim 391285242Sachim TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 392285242Sachim 393285242Sachim /* internally generate tiIOContext */ 394285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 395285242Sachim satIOContext = (satIOContext_t *) ioContext; 396285242Sachim satIntIo = satIOContext->satIntIoContext; 397285242Sachim satDevData = satIOContext->pSatDevData; 398285242Sachim 399285242Sachim /*ttttttthe one */ 400285242Sachim if (satIntIo == agNULL) 401285242Sachim { 402285242Sachim TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n")); 403285242Sachim satOrgIOContext = satIOContext; 404285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 405285242Sachim pSense = satOrgIOContext->pSense; 406285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 407285242Sachim } 408285242Sachim else 409285242Sachim { 410285242Sachim TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n")); 411285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 412285242Sachim if (satOrgIOContext == agNULL) 413285242Sachim { 414285242Sachim TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n")); 415285242Sachim return; 416285242Sachim } 417285242Sachim else 418285242Sachim { 419285242Sachim TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n")); 420285242Sachim } 421285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 422285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 423285242Sachim pSense = satOrgIOContext->pSense; 424285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 425285242Sachim } 426285242Sachim 427285242Sachim /* Parse CDB */ 428285242Sachim switch(scsiCmnd->cdb[0]) 429285242Sachim { 430285242Sachim case SCSIOPC_TEST_UNIT_READY: 431285242Sachim //satTestUnitReadyCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext); 432285242Sachim //break; 433285242Sachim case SCSIOPC_GET_EVENT_STATUS_NOTIFICATION: 434285242Sachim //break; 435285242Sachim case SCSIOPC_READ_CAPACITY_10: 436285242Sachim case SCSIOPC_READ_CAPACITY_16: 437285242Sachim //satPacketReadCapacityCB(agRoot, agIORequest, agIOStatus, agFirstDword, agIOInfoLen, agParam, ioContext); 438285242Sachim //break; 439285242Sachim default: 440285242Sachim break; 441285242Sachim } 442285242Sachim 443285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 444285242Sachim 445285242Sachim tdIORequestBody->ioCompleted = agTRUE; 446285242Sachim tdIORequestBody->ioStarted = agFALSE; 447285242Sachim 448285242Sachim /* interal structure free */ 449285242Sachim satFreeIntIoResource( tiRoot, satDevData, satIntIo); 450285242Sachim 451285242Sachim if( agIOStatus == OSSA_IO_SUCCESS && agFirstDword == agNULL) 452285242Sachim { 453285242Sachim TI_DBG1(("satPacketCB: agIOStatus == OSSA_IO_SUCCESS, agFirstDword == agNULL \n")); 454285242Sachim ostiInitiatorIOCompleted( tiRoot, 455285242Sachim tdIORequestBody->tiIORequest, 456285242Sachim tiIOSuccess, 457285242Sachim SCSI_STAT_GOOD, 458285242Sachim agNULL, 459285242Sachim interruptContext); 460285242Sachim } 461285242Sachim else if (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL) 462285242Sachim { 463285242Sachim TI_DBG1(("satPacketCB: wrong. agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL \n")); 464285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 465285242Sachim tiOrgIORequest, 466285242Sachim satDevData, 467285242Sachim 32, 468285242Sachim satNewIntIo); 469285242Sachim if (satNewIntIo == agNULL) 470285242Sachim { 471285242Sachim /* memory allocation failure */ 472285242Sachim /* just translate the ATAPI error register to sense information */ 473285242Sachim satTranslateATAPIErrorsToSCSIErrors( 474285242Sachim scsiCmnd->cdb[0], 475285242Sachim agFirstDword->D2H.status, 476285242Sachim agFirstDword->D2H.error, 477285242Sachim &bSenseKey, 478285242Sachim &bSenseCodeInfo 479285242Sachim ); 480285242Sachim satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext); 481285242Sachim ostiInitiatorIOCompleted( tiRoot, 482285242Sachim tdIORequestBody->tiIORequest, 483285242Sachim tiIOSuccess, 484285242Sachim SCSI_STAT_CHECK_CONDITION, 485285242Sachim satOrgIOContext->pTiSenseData, 486285242Sachim interruptContext); 487285242Sachim TI_DBG1(("satPacketCB: momory allocation fails\n")); 488285242Sachim return; 489285242Sachim } /* end memory allocation */ 490285242Sachim 491285242Sachim satNewIOContext = satPrepareNewIO(satNewIntIo, 492285242Sachim tiOrgIORequest, 493285242Sachim satDevData, 494285242Sachim scsiCmnd, 495285242Sachim satOrgIOContext 496285242Sachim ); 497285242Sachim /* sends request sense to ATAPI device for acquiring sense information */ 498285242Sachim status = satRequestSenseForATAPI(tiRoot, 499285242Sachim &satNewIntIo->satIntTiIORequest, 500285242Sachim satNewIOContext->ptiDeviceHandle, 501285242Sachim &satNewIntIo->satIntTiScsiXchg, 502285242Sachim satNewIOContext 503285242Sachim ); 504285242Sachim if (status != tiSuccess) 505285242Sachim { 506285242Sachim satFreeIntIoResource( tiRoot, 507285242Sachim satDevData, 508285242Sachim satNewIntIo); 509285242Sachim /* just translate the ATAPI error register to sense information */ 510285242Sachim satTranslateATAPIErrorsToSCSIErrors( 511285242Sachim scsiCmnd->cdb[0], 512285242Sachim agFirstDword->D2H.status, 513285242Sachim agFirstDword->D2H.error, 514285242Sachim &bSenseKey, 515285242Sachim &bSenseCodeInfo 516285242Sachim ); 517285242Sachim satSetSensePayload(pSense, bSenseKey, 0, bSenseCodeInfo, satOrgIOContext); 518285242Sachim ostiInitiatorIOCompleted( tiRoot, 519285242Sachim tdIORequestBody->tiIORequest, 520285242Sachim tiIOSuccess, 521285242Sachim SCSI_STAT_CHECK_CONDITION, 522285242Sachim satOrgIOContext->pTiSenseData, 523285242Sachim interruptContext); 524285242Sachim TI_DBG1(("satPacketCB: failed to call satRequestSenseForATAPI()\n")); 525285242Sachim } 526285242Sachim } 527285242Sachim else if (agIOStatus != OSSA_IO_SUCCESS) 528285242Sachim { 529285242Sachim TI_DBG1(("satPacketCB: wrong. agIOStatus != OSSA_IO_SUCCESS, status %d\n", agIOStatus)); 530285242Sachim itdsatProcessAbnormalCompletion( 531285242Sachim agRoot, 532285242Sachim agIORequest, 533285242Sachim agIOStatus, 534285242Sachim agFirstDword, 535285242Sachim agIOInfoLen, 536285242Sachim agParam, 537285242Sachim satIOContext); 538285242Sachim } 539285242Sachim else 540285242Sachim { 541285242Sachim TI_DBG1(("satPacketCB: Unknown error \n")); 542285242Sachim ostiInitiatorIOCompleted( tiRoot, 543285242Sachim tdIORequestBody->tiIORequest, 544285242Sachim tiIOFailed, 545285242Sachim tiDetailOtherError, 546285242Sachim agNULL, 547285242Sachim interruptContext); 548285242Sachim } 549285242Sachim} 550285242Sachim/***************************************************************************** 551285242Sachim*! \brief satRequestSenseForATAPICB 552285242Sachim* 553285242Sachim* This routine is a callback function called from ossaSATACompleted(). 554285242Sachim* This CB routine deals with normal non-chained data I/O SATA request. 555285242Sachim* 556285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 557285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 558285242Sachim* \param agIOStatus: Status of completed I/O. 559285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 560285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 561285242Sachim* length. 562285242Sachim* \param agParam: Additional info based on status. 563285242Sachim* \param ioContext: Pointer to satIOContext_t. 564285242Sachim* 565285242Sachim* \return: none 566285242Sachim* 567285242Sachim*****************************************************************************/ 568285242Sachimvoid satRequestSenseForATAPICB( 569285242Sachim agsaRoot_t *agRoot, 570285242Sachim agsaIORequest_t *agIORequest, 571285242Sachim bit32 agIOStatus, 572285242Sachim agsaFisHeader_t *agFirstDword, 573285242Sachim bit32 agIOInfoLen, 574285242Sachim void *agParam, 575285242Sachim void *ioContext 576285242Sachim ) 577285242Sachim{ 578285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 579285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 580285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 581285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 582285242Sachim tdIORequestBody_t *tdIORequestBody; 583285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 584285242Sachim satIOContext_t *satIOContext; 585285242Sachim satIOContext_t *satOrgIOContext; 586285242Sachim satInternalIo_t *satIntIo; 587285242Sachim satDeviceData_t *satDevData; 588285242Sachim tiIORequest_t *tiOrgIORequest; 589285242Sachim bit32 interruptContext = osData->IntContext; 590285242Sachim 591285242Sachim TI_DBG4(("satPacketCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 592285242Sachim 593285242Sachim /* internally generate tiIOContext */ 594285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 595285242Sachim satIOContext = (satIOContext_t *) ioContext; 596285242Sachim satIntIo = satIOContext->satIntIoContext; 597285242Sachim satDevData = satIOContext->pSatDevData; 598285242Sachim 599285242Sachim /*ttttttthe one */ 600285242Sachim if (satIntIo == agNULL) 601285242Sachim { 602285242Sachim TI_DBG4(("satPacketCB: External satInternalIo_t satIntIoContext\n")); 603285242Sachim satOrgIOContext = satIOContext; 604285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 605285242Sachim } 606285242Sachim else 607285242Sachim { 608285242Sachim TI_DBG4(("satPacketCB: Internal satInternalIo_t satIntIoContext\n")); 609285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 610285242Sachim if (satOrgIOContext == agNULL) 611285242Sachim { 612285242Sachim TI_DBG4(("satPacketCB: satOrgIOContext is NULL, wrong\n")); 613285242Sachim return; 614285242Sachim } 615285242Sachim else 616285242Sachim { 617285242Sachim TI_DBG4(("satPacketCB: satOrgIOContext is NOT NULL\n")); 618285242Sachim } 619285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 620285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 621285242Sachim } 622285242Sachim 623285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 624285242Sachim 625285242Sachim tdIORequestBody->ioCompleted = agTRUE; 626285242Sachim tdIORequestBody->ioStarted = agFALSE; 627285242Sachim 628285242Sachim /* copy the request sense buffer to original IO buffer*/ 629285242Sachim if (satIntIo != agNULL) 630285242Sachim { 631285242Sachim osti_memcpy(satOrgIOContext->pTiSenseData->senseData, satIntIo->satIntDmaMem.virtPtr, SENSE_DATA_LENGTH); 632285242Sachim satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH; 633285242Sachim /* interal structure free */ 634285242Sachim satFreeIntIoResource( tiRoot, satDevData, satIntIo); 635285242Sachim } 636285242Sachim 637285242Sachim /* notify the OS to complete this SRB */ 638285242Sachim ostiInitiatorIOCompleted( tiRoot, 639285242Sachim tiOrgIORequest, 640285242Sachim tiIOSuccess, 641285242Sachim SCSI_STAT_CHECK_CONDITION, 642285242Sachim satOrgIOContext->pTiSenseData, 643285242Sachim interruptContext); 644285242Sachim} 645285242Sachim/***************************************************************************** 646285242Sachim*! \brief satSetFeaturesPIOCB 647285242Sachim* 648285242Sachim* This routine is a callback function called from ossaSATACompleted(). 649285242Sachim* This CB routine deals with normal non-chained data I/O SATA request. 650285242Sachim* 651285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 652285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 653285242Sachim* \param agIOStatus: Status of completed I/O. 654285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 655285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 656285242Sachim* length. 657285242Sachim* \param agParam: Additional info based on status. 658285242Sachim* \param ioContext: Pointer to satIOContext_t. 659285242Sachim* 660285242Sachim* \return: none 661285242Sachim* 662285242Sachim*****************************************************************************/ 663285242Sachimvoid satSetFeaturesPIOCB( 664285242Sachim agsaRoot_t *agRoot, 665285242Sachim agsaIORequest_t *agIORequest, 666285242Sachim bit32 agIOStatus, 667285242Sachim agsaFisHeader_t *agFirstDword, 668285242Sachim bit32 agIOInfoLen, 669285242Sachim void *agParam, 670285242Sachim void *ioContext 671285242Sachim ) 672285242Sachim{ 673285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 674285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 675285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 676285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 677285242Sachim tdIORequestBody_t *tdIORequestBody; 678285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 679285242Sachim satIOContext_t *satIOContext; 680285242Sachim satIOContext_t *satOrgIOContext; 681285242Sachim satIOContext_t *satNewIOContext; 682285242Sachim satInternalIo_t *satIntIo; 683285242Sachim satInternalIo_t *satNewIntIo = agNULL; 684285242Sachim satDeviceData_t *satDevData; 685285242Sachim tiIORequest_t *tiOrgIORequest; 686285242Sachim tiIniScsiCmnd_t *scsiCmnd; 687285242Sachim bit32 status; 688285242Sachim 689285242Sachim TI_DBG3(("satSetFeaturesPIOCB start\n")); 690285242Sachim 691285242Sachim /* internally generate tiIOContext */ 692285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 693285242Sachim satIOContext = (satIOContext_t *) ioContext; 694285242Sachim satIntIo = satIOContext->satIntIoContext; 695285242Sachim satDevData = satIOContext->pSatDevData; 696285242Sachim 697285242Sachim /*ttttttthe one */ 698285242Sachim if (satIntIo == agNULL) 699285242Sachim { 700285242Sachim TI_DBG4(("satSetFeaturesPIOCB: External satInternalIo_t satIntIoContext\n")); 701285242Sachim satOrgIOContext = satIOContext; 702285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 703285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 704285242Sachim } 705285242Sachim else 706285242Sachim { 707285242Sachim TI_DBG4(("satSetFeaturesPIOCB: Internal satInternalIo_t satIntIoContext\n")); 708285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 709285242Sachim if (satOrgIOContext == agNULL) 710285242Sachim { 711285242Sachim TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NULL, wrong\n")); 712285242Sachim return; 713285242Sachim } 714285242Sachim else 715285242Sachim { 716285242Sachim TI_DBG4(("satSetFeaturesPIOCB: satOrgIOContext is NOT NULL\n")); 717285242Sachim } 718285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 719285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 720285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 721285242Sachim } 722285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 723285242Sachim 724285242Sachim tdIORequestBody->ioCompleted = agTRUE; 725285242Sachim tdIORequestBody->ioStarted = agFALSE; 726285242Sachim 727285242Sachim /* interal structure free */ 728285242Sachim satFreeIntIoResource(tiRoot, 729285242Sachim satDevData, 730285242Sachim satIntIo); 731285242Sachim 732285242Sachim /*if the ATAPI device support DMA, then enble this feature*/ 733285242Sachim if (satDevData->satDMASupport && satDevData->satDMAEnabled) 734285242Sachim { 735285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 736285242Sachim tiOrgIORequest, 737285242Sachim satDevData, 738285242Sachim 0, 739285242Sachim satNewIntIo); 740285242Sachim if (satNewIntIo == agNULL) 741285242Sachim { 742285242Sachim TI_DBG1(("satSetFeaturesPIOCB: momory allocation fails\n")); 743285242Sachim return; 744285242Sachim } /* end memory allocation */ 745285242Sachim 746285242Sachim satNewIOContext = satPrepareNewIO(satNewIntIo, 747285242Sachim tiOrgIORequest, 748285242Sachim satDevData, 749285242Sachim scsiCmnd, 750285242Sachim satOrgIOContext 751285242Sachim ); 752285242Sachim /* sends either ATA SET FEATURES based on DMA bit */ 753285242Sachim status = satSetFeatures(tiRoot, 754285242Sachim &satNewIntIo->satIntTiIORequest, 755285242Sachim satNewIOContext->ptiDeviceHandle, 756285242Sachim &satNewIntIo->satIntTiScsiXchg, 757285242Sachim satNewIOContext, 758285242Sachim agTRUE 759285242Sachim ); 760285242Sachim if (status != tiSuccess) 761285242Sachim { 762285242Sachim satFreeIntIoResource( tiRoot, satDevData, satNewIntIo); 763285242Sachim TI_DBG1(("satSetFeaturesPIOCB: failed to call satSetFeatures()\n")); 764285242Sachim } 765285242Sachim } 766285242Sachim} 767285242Sachim 768285242Sachim/***************************************************************************** 769285242Sachim*! \brief satSetFeaturesCB 770285242Sachim* 771285242Sachim* This routine is a callback function called from ossaSATACompleted(). 772285242Sachim* This CB routine deals with normal non-chained data I/O SATA request. 773285242Sachim* 774285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 775285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 776285242Sachim* \param agIOStatus: Status of completed I/O. 777285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 778285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 779285242Sachim* length. 780285242Sachim* \param agParam: Additional info based on status. 781285242Sachim* \param ioContext: Pointer to satIOContext_t. 782285242Sachim* 783285242Sachim* \return: none 784285242Sachim* 785285242Sachim*****************************************************************************/ 786285242Sachimvoid satSetFeaturesCB( 787285242Sachim agsaRoot_t *agRoot, 788285242Sachim agsaIORequest_t *agIORequest, 789285242Sachim bit32 agIOStatus, 790285242Sachim agsaFisHeader_t *agFirstDword, 791285242Sachim bit32 agIOInfoLen, 792285242Sachim void *agParam, 793285242Sachim void *ioContext 794285242Sachim ) 795285242Sachim{ 796285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 797285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 798285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 799285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 800285242Sachim tdIORequestBody_t *tdIORequestBody; 801285242Sachim tdIORequestBody_t *tdOrgIORequestBody = agNULL; 802285242Sachim satIOContext_t *satIOContext; 803285242Sachim satIOContext_t *satOrgIOContext; 804285242Sachim satInternalIo_t *satIntIo; 805285242Sachim satDeviceData_t *satDevData; 806285242Sachim tdsaPortContext_t *onePortContext = agNULL; 807285242Sachim tiPortalContext_t *tiPortalContext = agNULL; 808285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 809285242Sachim bit8 PhyID =0; 810285242Sachim TI_DBG3(("satSetFeaturesCB start\n")); 811285242Sachim 812285242Sachim /* internally generate tiIOContext */ 813285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 814285242Sachim satIOContext = (satIOContext_t *) ioContext; 815285242Sachim satIntIo = satIOContext->satIntIoContext; 816285242Sachim satDevData = satIOContext->pSatDevData; 817285242Sachim oneDeviceData = (tdsaDeviceData_t *)tdIORequestBody->tiDevHandle->tdData; 818285242Sachim onePortContext = oneDeviceData->tdPortContext; 819285242Sachim if (onePortContext == agNULL) 820285242Sachim { 821285242Sachim TI_DBG4(("satSetFeaturesCB: onePortContext is NULL, wrong\n")); 822285242Sachim return; 823285242Sachim } 824285242Sachim tiPortalContext = onePortContext->tiPortalContext; 825285242Sachim PhyID = oneDeviceData->phyID; 826285242Sachim /*ttttttthe one */ 827285242Sachim if (satIntIo == agNULL) 828285242Sachim { 829285242Sachim TI_DBG4(("satSetFeaturesCB: External satInternalIo_t satIntIoContext\n")); 830285242Sachim satOrgIOContext = satIOContext; 831285242Sachim } 832285242Sachim else 833285242Sachim { 834285242Sachim TI_DBG4(("satSetFeaturesCB: Internal satInternalIo_t satIntIoContext\n")); 835285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 836285242Sachim if (satOrgIOContext == agNULL) 837285242Sachim { 838285242Sachim TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NULL, wrong\n")); 839285242Sachim return; 840285242Sachim } 841285242Sachim else 842285242Sachim { 843285242Sachim TI_DBG4(("satSetFeaturesCB: satOrgIOContext is NOT NULL\n")); 844285242Sachim } 845285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 846285242Sachim } 847285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 848285242Sachim 849285242Sachim tdIORequestBody->ioCompleted = agTRUE; 850285242Sachim tdIORequestBody->ioStarted = agFALSE; 851285242Sachim 852285242Sachim /* interal structure free */ 853285242Sachim satFreeIntIoResource(tiRoot, 854285242Sachim satDevData, 855285242Sachim satIntIo); 856285242Sachim 857285242Sachim 858285242Sachim /* clean up TD layer's IORequestBody */ 859285242Sachim if (tdOrgIORequestBody!= agNULL) 860285242Sachim { 861285242Sachim ostiFreeMemory(tiRoot, 862285242Sachim tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle, 863285242Sachim sizeof(tdIORequestBody_t) 864285242Sachim ); 865285242Sachim } 866285242Sachim 867285242Sachim if (onePortContext != agNULL) 868285242Sachim { 869285242Sachim /* this condition is for tdsaDiscoveryStartIDDevCB routine*/ 870285242Sachim if (onePortContext->DiscoveryState == ITD_DSTATE_COMPLETED) 871285242Sachim { 872285242Sachim TI_DBG1(("satSetFeaturesCB: ID completed after discovery is done; tiDeviceArrival\n")); 873285242Sachim /* in case registration is finished after discovery is finished */ 874285242Sachim ostiInitiatorEvent( 875285242Sachim tiRoot, 876285242Sachim tiPortalContext, 877285242Sachim agNULL, 878285242Sachim tiIntrEventTypeDeviceChange, 879285242Sachim tiDeviceArrival, 880285242Sachim agNULL 881285242Sachim ); 882285242Sachim return; 883285242Sachim } 884285242Sachim TI_DBG2(("satSetFeaturesCB: pid %d\n", tdsaAllShared->Ports[PhyID].portContext->id)); 885285242Sachim /* the below codes is for satAddSATAIDDevCB routine*/ 886285242Sachim /* notifying link up */ 887285242Sachim ostiPortEvent ( 888285242Sachim tiRoot, 889285242Sachim tiPortLinkUp, 890285242Sachim tiSuccess, 891285242Sachim (void *)tdsaAllShared->Ports[PhyID].tiPortalContext 892285242Sachim ); 893285242Sachim #ifdef INITIATOR_DRIVER 894285242Sachim /* triggers discovery */ 895285242Sachim ostiPortEvent( 896285242Sachim tiRoot, 897285242Sachim tiPortDiscoveryReady, 898285242Sachim tiSuccess, 899285242Sachim (void *) tdsaAllShared->Ports[PhyID].tiPortalContext 900285242Sachim ); 901285242Sachim #endif 902285242Sachim } 903285242Sachim else 904285242Sachim { 905285242Sachim TI_DBG1(("satSetFeaturesCB: onePortContext is NULL, wrong\n")); 906285242Sachim } 907285242Sachim} 908285242Sachim/***************************************************************************** 909285242Sachim*! \brief satDeviceResetCB 910285242Sachim* 911285242Sachim* This routine is a callback function called from ossaSATACompleted(). 912285242Sachim* This CB routine deals with normal non-chained data I/O SATA request. 913285242Sachim* 914285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 915285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 916285242Sachim* \param agIOStatus: Status of completed I/O. 917285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 918285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 919285242Sachim* length. 920285242Sachim* \param agParam: Additional info based on status. 921285242Sachim* \param ioContext: Pointer to satIOContext_t. 922285242Sachim* 923285242Sachim* \return: none 924285242Sachim* 925285242Sachim*****************************************************************************/ 926285242Sachimvoid satDeviceResetCB( 927285242Sachim agsaRoot_t *agRoot, 928285242Sachim agsaIORequest_t *agIORequest, 929285242Sachim bit32 agIOStatus, 930285242Sachim agsaFisHeader_t *agFirstDword, 931285242Sachim bit32 agIOInfoLen, 932285242Sachim void *agParam, 933285242Sachim void *ioContext 934285242Sachim ) 935285242Sachim{ 936285242Sachim /* callback for satResetDevice */ 937285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 938285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 939285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 940285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 941285242Sachim tdIORequestBody_t *tdIORequestBody; 942285242Sachim tdIORequestBody_t *tdOrgIORequestBody = agNULL; 943285242Sachim satIOContext_t *satIOContext; 944285242Sachim satIOContext_t *satOrgIOContext; 945285242Sachim// satIOContext_t *satNewIOContext; 946285242Sachim satInternalIo_t *satIntIo; 947285242Sachim// satInternalIo_t *satNewIntIo = agNULL; 948285242Sachim satDeviceData_t *satDevData; 949285242Sachim tiIORequest_t *tiOrgIORequest; 950285242Sachim#ifdef TD_DEBUG_ENABLE 951285242Sachim bit32 ataStatus = 0; 952285242Sachim bit32 ataError; 953285242Sachim agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL; 954285242Sachim#endif 955285242Sachim// bit32 status; 956285242Sachim bit32 report = agFALSE; 957285242Sachim bit32 AbortTM = agFALSE; 958285242Sachim 959285242Sachim TI_DBG1(("satDeviceResetCB: start\n")); 960285242Sachim 961285242Sachim TI_DBG6(("satDeviceResetCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 962285242Sachim 963285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 964285242Sachim satIOContext = (satIOContext_t *) ioContext; 965285242Sachim satIntIo = satIOContext->satIntIoContext; 966285242Sachim satDevData = satIOContext->pSatDevData; 967285242Sachim 968285242Sachim if (satIntIo == agNULL) 969285242Sachim { 970285242Sachim TI_DBG6(("satDeviceResetCB: External, OS generated\n")); 971285242Sachim satOrgIOContext = satIOContext; 972285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 973285242Sachim } 974285242Sachim else 975285242Sachim { 976285242Sachim TI_DBG6(("satDeviceResetCB: Internal, TD generated\n")); 977285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 978285242Sachim if (satOrgIOContext == agNULL) 979285242Sachim { 980285242Sachim TI_DBG6(("satDeviceResetCB: satOrgIOContext is NULL, wrong\n")); 981285242Sachim return; 982285242Sachim } 983285242Sachim else 984285242Sachim { 985285242Sachim TI_DBG6(("satDeviceResetCB: satOrgIOContext is NOT NULL\n")); 986285242Sachim } 987285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 988285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 989285242Sachim } 990285242Sachim 991285242Sachim tdIORequestBody->ioCompleted = agTRUE; 992285242Sachim tdIORequestBody->ioStarted = agFALSE; 993285242Sachim 994285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 995285242Sachim { 996285242Sachim TI_DBG1(("satDeviceResetCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 997285242Sachim 998285242Sachim if (satOrgIOContext->NotifyOS == agTRUE) 999285242Sachim { 1000285242Sachim ostiInitiatorEvent( tiRoot, 1001285242Sachim NULL, 1002285242Sachim NULL, 1003285242Sachim tiIntrEventTypeTaskManagement, 1004285242Sachim tiTMFailed, 1005285242Sachim tiOrgIORequest ); 1006285242Sachim } 1007285242Sachim 1008285242Sachim satDevData->satTmTaskTag = agNULL; 1009285242Sachim 1010285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1011285242Sachim 1012285242Sachim satFreeIntIoResource( tiRoot, 1013285242Sachim satDevData, 1014285242Sachim satIntIo); 1015285242Sachim return; 1016285242Sachim } 1017285242Sachim 1018285242Sachim if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED || 1019285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION || 1020285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK || 1021285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS || 1022285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION || 1023285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED || 1024285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION || 1025285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR || 1026285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY 1027285242Sachim ) 1028285242Sachim { 1029285242Sachim TI_DBG1(("satDeviceResetCB: OSSA_IO_OPEN_CNX_ERROR\n")); 1030285242Sachim 1031285242Sachim if (satOrgIOContext->NotifyOS == agTRUE) 1032285242Sachim { 1033285242Sachim ostiInitiatorEvent( tiRoot, 1034285242Sachim NULL, 1035285242Sachim NULL, 1036285242Sachim tiIntrEventTypeTaskManagement, 1037285242Sachim tiTMFailed, 1038285242Sachim tiOrgIORequest ); 1039285242Sachim } 1040285242Sachim 1041285242Sachim satDevData->satTmTaskTag = agNULL; 1042285242Sachim 1043285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1044285242Sachim 1045285242Sachim satFreeIntIoResource( tiRoot, 1046285242Sachim satDevData, 1047285242Sachim satIntIo); 1048285242Sachim return; 1049285242Sachim } 1050285242Sachim 1051285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 1052285242Sachim { 1053285242Sachim /* only agsaFisPioSetup_t is expected */ 1054285242Sachim#ifdef TD_DEBUG_ENABLE 1055285242Sachim satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup); 1056285242Sachim ataStatus = satPIOSetupHeader->status; /* ATA Status register */ 1057285242Sachim ataError = satPIOSetupHeader->error; /* ATA Eror register */ 1058285242Sachim#endif 1059285242Sachim TI_DBG1(("satDeviceResetCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError)); 1060285242Sachim 1061285242Sachim if (satOrgIOContext->NotifyOS == agTRUE) 1062285242Sachim { 1063285242Sachim ostiInitiatorEvent( tiRoot, 1064285242Sachim NULL, 1065285242Sachim NULL, 1066285242Sachim tiIntrEventTypeTaskManagement, 1067285242Sachim tiTMFailed, 1068285242Sachim tiOrgIORequest ); 1069285242Sachim } 1070285242Sachim 1071285242Sachim satDevData->satTmTaskTag = agNULL; 1072285242Sachim 1073285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1074285242Sachim 1075285242Sachim satFreeIntIoResource( tiRoot, 1076285242Sachim satDevData, 1077285242Sachim satIntIo); 1078285242Sachim return; 1079285242Sachim } 1080285242Sachim 1081285242Sachim /* success */ 1082285242Sachim if (satOrgIOContext->TMF == AG_ABORT_TASK) 1083285242Sachim { 1084285242Sachim AbortTM = agTRUE; 1085285242Sachim } 1086285242Sachim 1087285242Sachim if (satOrgIOContext->NotifyOS == agTRUE) 1088285242Sachim { 1089285242Sachim report = agTRUE; 1090285242Sachim } 1091285242Sachim 1092285242Sachim if (AbortTM == agTRUE) 1093285242Sachim { 1094285242Sachim TI_DBG1(("satDeResetDeviceCB: calling satAbort\n")); 1095285242Sachim satAbort(agRoot, satOrgIOContext->satToBeAbortedIOContext); 1096285242Sachim } 1097285242Sachim satDevData->satTmTaskTag = agNULL; 1098285242Sachim 1099285242Sachim satDevData->satDriveState = SAT_DEV_STATE_NORMAL; 1100285242Sachim 1101285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1102285242Sachim 1103285242Sachim TI_DBG1(("satDeviceResetCB: satPendingIO %d satNCQMaxIO %d\n", satDevData->satPendingIO, satDevData->satNCQMaxIO )); 1104285242Sachim TI_DBG1(("satDeviceResetCB: satPendingNCQIO %d satPendingNONNCQIO %d\n", satDevData->satPendingNCQIO, satDevData->satPendingNONNCQIO)); 1105285242Sachim 1106285242Sachim satFreeIntIoResource( tiRoot, 1107285242Sachim satDevData, 1108285242Sachim satIntIo); 1109285242Sachim 1110285242Sachim /* clean up TD layer's IORequestBody */ 1111285242Sachim if (tdOrgIORequestBody != agNULL) 1112285242Sachim { 1113285242Sachim ostiFreeMemory( 1114285242Sachim tiRoot, 1115285242Sachim tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle, 1116285242Sachim sizeof(tdIORequestBody_t) 1117285242Sachim ); 1118285242Sachim } 1119285242Sachim else 1120285242Sachim { 1121285242Sachim TI_DBG1(("satDeviceResetCB: tdOrgIORequestBody is NULL, wrong\n")); 1122285242Sachim } 1123285242Sachim 1124285242Sachim 1125285242Sachim if (report) 1126285242Sachim { 1127285242Sachim ostiInitiatorEvent( tiRoot, 1128285242Sachim NULL, 1129285242Sachim NULL, 1130285242Sachim tiIntrEventTypeTaskManagement, 1131285242Sachim tiTMOK, 1132285242Sachim tiOrgIORequest ); 1133285242Sachim } 1134285242Sachim 1135285242Sachim 1136285242Sachim TI_DBG5(("satDeviceResetCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO)); 1137285242Sachim TI_DBG6(("satDeviceResetCB: end\n")); 1138285242Sachim return; 1139285242Sachim} 1140285242Sachim 1141285242Sachim/***************************************************************************** 1142285242Sachim*! \brief satExecuteDeviceDiagnosticCB 1143285242Sachim* 1144285242Sachim* This routine is a callback function called from ossaSATACompleted(). 1145285242Sachim* This CB routine deals with normal non-chained data I/O SATA request. 1146285242Sachim* 1147285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 1148285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 1149285242Sachim* \param agIOStatus: Status of completed I/O. 1150285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 1151285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 1152285242Sachim* length. 1153285242Sachim* \param agParam: Additional info based on status. 1154285242Sachim* \param ioContext: Pointer to satIOContext_t. 1155285242Sachim* 1156285242Sachim* \return: none 1157285242Sachim* 1158285242Sachim*****************************************************************************/ 1159285242Sachimvoid satExecuteDeviceDiagnosticCB( 1160285242Sachim agsaRoot_t *agRoot, 1161285242Sachim agsaIORequest_t *agIORequest, 1162285242Sachim bit32 agIOStatus, 1163285242Sachim agsaFisHeader_t *agFirstDword, 1164285242Sachim bit32 agIOInfoLen, 1165285242Sachim void *agParam, 1166285242Sachim void *ioContext 1167285242Sachim ) 1168285242Sachim{ 1169285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1170285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1171285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1172285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1173285242Sachim tdIORequestBody_t *tdIORequestBody; 1174285242Sachim satIOContext_t *satIOContext; 1175285242Sachim satIOContext_t *satOrgIOContext; 1176285242Sachim satInternalIo_t *satIntIo; 1177285242Sachim satDeviceData_t *satDevData; 1178285242Sachim 1179285242Sachim TI_DBG3(("satExecuteDeviceDiagnosticCB start\n")); 1180285242Sachim 1181285242Sachim /* internally generate tiIOContext */ 1182285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1183285242Sachim satIOContext = (satIOContext_t *) ioContext; 1184285242Sachim satIntIo = satIOContext->satIntIoContext; 1185285242Sachim satDevData = satIOContext->pSatDevData; 1186285242Sachim 1187285242Sachim /*ttttttthe one */ 1188285242Sachim if (satIntIo == agNULL) 1189285242Sachim { 1190285242Sachim TI_DBG4(("satExecuteDeviceDiagnosticCB: External satInternalIo_t satIntIoContext\n")); 1191285242Sachim satOrgIOContext = satIOContext; 1192285242Sachim } 1193285242Sachim else 1194285242Sachim { 1195285242Sachim TI_DBG4(("satExecuteDeviceDiagnosticCB: Internal satInternalIo_t satIntIoContext\n")); 1196285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 1197285242Sachim if (satOrgIOContext == agNULL) 1198285242Sachim { 1199285242Sachim TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NULL, wrong\n")); 1200285242Sachim return; 1201285242Sachim } 1202285242Sachim else 1203285242Sachim { 1204285242Sachim TI_DBG4(("satExecuteDeviceDiagnosticCB: satOrgIOContext is NOT NULL\n")); 1205285242Sachim } 1206285242Sachim } 1207285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1208285242Sachim 1209285242Sachim tdIORequestBody->ioCompleted = agTRUE; 1210285242Sachim tdIORequestBody->ioStarted = agFALSE; 1211285242Sachim 1212285242Sachim /* interal structure free */ 1213285242Sachim satFreeIntIoResource(tiRoot, 1214285242Sachim satDevData, 1215285242Sachim satIntIo); 1216285242Sachim} 1217285242Sachim/***************************************************************************** 1218285242Sachim*! \brief satNonChainedDataIOCB 1219285242Sachim* 1220285242Sachim* This routine is a callback function called from ossaSATACompleted(). 1221285242Sachim* This CB routine deals with normal non-chained data I/O SATA request. 1222285242Sachim* 1223285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 1224285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 1225285242Sachim* \param agIOStatus: Status of completed I/O. 1226285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 1227285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 1228285242Sachim* length. 1229285242Sachim* \param agParam: Additional info based on status. 1230285242Sachim* \param ioContext: Pointer to satIOContext_t. 1231285242Sachim* 1232285242Sachim* \return: none 1233285242Sachim* 1234285242Sachim*****************************************************************************/ 1235285242Sachim 1236285242Sachimvoid satNonChainedDataIOCB( 1237285242Sachim agsaRoot_t *agRoot, 1238285242Sachim agsaIORequest_t *agIORequest, 1239285242Sachim bit32 agIOStatus, 1240285242Sachim agsaFisHeader_t *agFirstDword, 1241285242Sachim bit32 agIOInfoLen, 1242285242Sachim void *agParam, 1243285242Sachim void *ioContext 1244285242Sachim ) 1245285242Sachim{ 1246285242Sachim 1247285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1248285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1249285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1250285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1251285242Sachim tdIORequestBody_t *tdIORequestBody; 1252285242Sachim bit32 interruptContext = osData->IntContext; 1253285242Sachim satIOContext_t *satIOContext; 1254285242Sachim satInternalIo_t *SatIntIo; 1255285242Sachim satDeviceData_t *SatDevData; 1256285242Sachim 1257285242Sachim TI_DBG6(("satNonChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 1258285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 1259285242Sachim 1260285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1261285242Sachim satIOContext = (satIOContext_t *) ioContext; 1262285242Sachim SatIntIo = satIOContext->satIntIoContext; 1263285242Sachim SatDevData = satIOContext->pSatDevData; 1264285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1265285242Sachim tdIORequestBody->ioCompleted = agTRUE; 1266285242Sachim tdIORequestBody->ioStarted = agFALSE; 1267285242Sachim 1268285242Sachim /* interal structure free */ 1269285242Sachim satFreeIntIoResource( tiRoot, 1270285242Sachim SatDevData, 1271285242Sachim SatIntIo); 1272285242Sachim 1273285242Sachim /* Process completion */ 1274285242Sachim if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen == 0)) 1275285242Sachim { 1276285242Sachim TI_DBG5(("satNonChainedDataIOCB: success\n")); 1277285242Sachim TI_DBG5(("satNonChainedDataIOCB: success agIORequest %p\n", agIORequest)); 1278285242Sachim /* 1279285242Sachim * Command was completed OK, this is the normal path. 1280285242Sachim * Now call the OS-App Specific layer about this completion. 1281285242Sachim */ 1282285242Sachim ostiInitiatorIOCompleted( tiRoot, 1283285242Sachim tdIORequestBody->tiIORequest, 1284285242Sachim tiIOSuccess, 1285285242Sachim SCSI_STAT_GOOD, 1286285242Sachim agNULL, 1287285242Sachim interruptContext); 1288285242Sachim } 1289285242Sachim else 1290285242Sachim { 1291285242Sachim TI_DBG1(("satNonChainedDataIOCB: calling itdsatProcessAbnormalCompletion\n")); 1292285242Sachim /* More checking needed */ 1293285242Sachim itdsatProcessAbnormalCompletion( agRoot, 1294285242Sachim agIORequest, 1295285242Sachim agIOStatus, 1296285242Sachim agFirstDword, 1297285242Sachim agIOInfoLen, 1298285242Sachim agParam, 1299285242Sachim satIOContext); 1300285242Sachim } 1301285242Sachim 1302285242Sachim return; 1303285242Sachim 1304285242Sachim 1305285242Sachim} 1306285242Sachim/***************************************************************************** 1307285242Sachim*! \brief satChainedDataIOCB 1308285242Sachim* 1309285242Sachim* This routine is a callback function called from ossaSATACompleted(). 1310285242Sachim* This CB routine deals with normal chained data I/O SATA request. 1311285242Sachim* 1312285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 1313285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 1314285242Sachim* \param agIOStatus: Status of completed I/O. 1315285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 1316285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 1317285242Sachim* length. 1318285242Sachim* \param agParam: Additional info based on status. 1319285242Sachim* \param ioContext: Pointer to satIOContext_t. 1320285242Sachim* 1321285242Sachim* \return: none 1322285242Sachim* 1323285242Sachim*****************************************************************************/ 1324285242Sachimvoid satChainedDataIOCB( 1325285242Sachim agsaRoot_t *agRoot, 1326285242Sachim agsaIORequest_t *agIORequest, 1327285242Sachim bit32 agIOStatus, 1328285242Sachim agsaFisHeader_t *agFirstDword, 1329285242Sachim bit32 agIOInfoLen, 1330285242Sachim void *agParam, 1331285242Sachim void *ioContext 1332285242Sachim ) 1333285242Sachim{ 1334285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1335285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1336285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1337285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1338285242Sachim tdIORequestBody_t *tdIORequestBody; 1339285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 1340285242Sachim satIOContext_t *satIOContext; 1341285242Sachim satIOContext_t *satOrgIOContext; 1342285242Sachim satIOContext_t *satNewIOContext; 1343285242Sachim satInternalIo_t *satIntIo; 1344285242Sachim satInternalIo_t *satNewIntIo = agNULL; 1345285242Sachim satDeviceData_t *satDevData; 1346285242Sachim scsiRspSense_t *pSense; 1347285242Sachim tiIniScsiCmnd_t *scsiCmnd; 1348285242Sachim tiIORequest_t *tiOrgIORequest; 1349285242Sachim 1350285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 1351285242Sachim bit32 ataStatus = 0; 1352285242Sachim bit32 status = tiError; 1353285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 1354285242Sachim bit32 dataLength; 1355285242Sachim 1356285242Sachim TI_DBG6(("satChainedDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 1357285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 1358285242Sachim 1359285242Sachim 1360285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1361285242Sachim satIOContext = (satIOContext_t *) ioContext; 1362285242Sachim if (satIOContext == agNULL) 1363285242Sachim { 1364285242Sachim TI_DBG1(("satChainedDataIOCB: satIOContext is NULL\n")); 1365285242Sachim return; 1366285242Sachim } 1367285242Sachim satIntIo = satIOContext->satIntIoContext; 1368285242Sachim satDevData = satIOContext->pSatDevData; 1369285242Sachim hostToDevFis = satIOContext->pFis; 1370285242Sachim 1371285242Sachim if (satIntIo == agNULL) 1372285242Sachim { 1373285242Sachim TI_DBG5(("satChainedDataIOCB: External satInternalIo_t satIntIoContext\n")); 1374285242Sachim satOrgIOContext = satIOContext; 1375285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 1376285242Sachim pSense = satIOContext->pSense; 1377285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 1378285242Sachim } 1379285242Sachim else 1380285242Sachim { 1381285242Sachim TI_DBG5(("satChainedDataIOCB: Internal satInternalIo_t satIntIoContext\n")); 1382285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 1383285242Sachim if (satOrgIOContext == agNULL) 1384285242Sachim { 1385285242Sachim TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NULL\n")); 1386285242Sachim } 1387285242Sachim else 1388285242Sachim { 1389285242Sachim TI_DBG5(("satChainedDataIOCB: satOrgIOContext is NOT NULL\n")); 1390285242Sachim } 1391285242Sachim 1392285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 1393285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 1394285242Sachim 1395285242Sachim pSense = satOrgIOContext->pSense; 1396285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 1397285242Sachim } 1398285242Sachim 1399285242Sachim tdIORequestBody->ioCompleted = agTRUE; 1400285242Sachim tdIORequestBody->ioStarted = agFALSE; 1401285242Sachim 1402285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 1403285242Sachim { 1404285242Sachim TI_DBG1(("satChainedDataIOCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 1405285242Sachim satSetSensePayload( pSense, 1406285242Sachim SCSI_SNSKEY_NO_SENSE, 1407285242Sachim 0, 1408285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1409285242Sachim satOrgIOContext); 1410285242Sachim 1411285242Sachim ostiInitiatorIOCompleted( tiRoot, 1412285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1413285242Sachim tiIOSuccess, 1414285242Sachim SCSI_STAT_CHECK_CONDITION, 1415285242Sachim satOrgIOContext->pTiSenseData, 1416285242Sachim satOrgIOContext->interruptContext ); 1417285242Sachim 1418285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1419285242Sachim 1420285242Sachim satFreeIntIoResource( tiRoot, 1421285242Sachim satDevData, 1422285242Sachim satIntIo); 1423285242Sachim return; 1424285242Sachim } 1425285242Sachim 1426285242Sachim /* 1427285242Sachim checking IO status, FIS type and error status 1428285242Sachim */ 1429285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 1430285242Sachim { 1431285242Sachim /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read 1432285242Sachim agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write 1433285242Sachim first, assumed to be Reg Device to Host FIS 1434285242Sachim This is OK to just find fis type 1435285242Sachim */ 1436285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 1437285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 1438285242Sachim /* for debugging */ 1439285242Sachim if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) && 1440285242Sachim (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 1441285242Sachim (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 1442285242Sachim ) 1443285242Sachim { 1444285242Sachim TI_DBG1(("satChainedDataIOCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType)); 1445285242Sachim } 1446285242Sachim 1447285242Sachim /* for debugging */ 1448285242Sachim if ( (ataStatus & ERR_ATA_STATUS_MASK) || 1449285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 1450285242Sachim ) 1451285242Sachim { 1452285242Sachim TI_DBG1(("satChainedDataIOCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command)); 1453285242Sachim } 1454285242Sachim 1455285242Sachim /* the function below handles abort case */ 1456285242Sachim itdsatDelayedProcessAbnormalCompletion(agRoot, 1457285242Sachim agIORequest, 1458285242Sachim agIOStatus, 1459285242Sachim agFirstDword, 1460285242Sachim agIOInfoLen, 1461285242Sachim agParam, 1462285242Sachim satIOContext); 1463285242Sachim 1464285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1465285242Sachim satFreeIntIoResource( tiRoot, 1466285242Sachim satDevData, 1467285242Sachim satIntIo); 1468285242Sachim return; 1469285242Sachim } /* end of error */ 1470285242Sachim 1471285242Sachim switch (hostToDevFis->h.command) 1472285242Sachim { 1473285242Sachim case SAT_READ_DMA: /* fall through */ 1474285242Sachim case SAT_READ_SECTORS: /* fall through */ 1475285242Sachim case SAT_READ_DMA_EXT: /* fall through */ 1476285242Sachim case SAT_READ_SECTORS_EXT: /* fall through */ 1477285242Sachim case SAT_READ_FPDMA_QUEUED: /* fall through */ 1478285242Sachim case SAT_WRITE_DMA: /* fall through */ 1479285242Sachim case SAT_WRITE_SECTORS:/* fall through */ 1480285242Sachim case SAT_WRITE_DMA_FUA_EXT: /* fall through */ 1481285242Sachim case SAT_WRITE_DMA_EXT: /* fall through */ 1482285242Sachim case SAT_WRITE_SECTORS_EXT: /* fall through */ 1483285242Sachim case SAT_WRITE_FPDMA_QUEUED: 1484285242Sachim 1485285242Sachim TI_DBG5(("satChainedDataIOCB: READ/WRITE success case\n")); 1486285242Sachim 1487285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1488285242Sachim 1489285242Sachim /* done with internally genereated SAT_SMART_RETURN_STATUS */ 1490285242Sachim satFreeIntIoResource( tiRoot, 1491285242Sachim satDevData, 1492285242Sachim satIntIo); 1493285242Sachim /* let's loop till TL */ 1494285242Sachim 1495285242Sachim /* lba = lba + tl 1496285242Sachim loopnum--; 1497285242Sachim if (loopnum == 0) done 1498285242Sachim */ 1499285242Sachim (satOrgIOContext->LoopNum)--; 1500285242Sachim if (satOrgIOContext->LoopNum == 0) 1501285242Sachim { 1502285242Sachim /* done with read */ 1503285242Sachim ostiInitiatorIOCompleted( tiRoot, 1504285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1505285242Sachim tiIOSuccess, 1506285242Sachim SCSI_STAT_GOOD, 1507285242Sachim agNULL, 1508285242Sachim satOrgIOContext->interruptContext ); 1509285242Sachim return; 1510285242Sachim } 1511285242Sachim if (satOrgIOContext->superIOFlag) 1512285242Sachim { 1513285242Sachim dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 1514285242Sachim } 1515285242Sachim else 1516285242Sachim { 1517285242Sachim dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 1518285242Sachim } 1519285242Sachim 1520285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 1521285242Sachim tiOrgIORequest, 1522285242Sachim satDevData, 1523285242Sachim dataLength, 1524285242Sachim satNewIntIo); 1525285242Sachim if (satNewIntIo == agNULL) 1526285242Sachim { 1527285242Sachim /* memory allocation failure */ 1528285242Sachim satFreeIntIoResource( tiRoot, 1529285242Sachim satDevData, 1530285242Sachim satNewIntIo); 1531285242Sachim ostiInitiatorIOCompleted( tiRoot, 1532285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1533285242Sachim tiIOFailed, 1534285242Sachim tiDetailOtherError, 1535285242Sachim agNULL, 1536285242Sachim satOrgIOContext->interruptContext ); 1537285242Sachim 1538285242Sachim TI_DBG1(("satChainedDataIOCB: momory allocation fails\n")); 1539285242Sachim return; 1540285242Sachim } /* end of memory allocation failure */ 1541285242Sachim 1542285242Sachim /* 1543285242Sachim * Need to initialize all the fields within satIOContext 1544285242Sachim */ 1545285242Sachim 1546285242Sachim satNewIOContext = satPrepareNewIO( 1547285242Sachim satNewIntIo, 1548285242Sachim tiOrgIORequest, 1549285242Sachim satDevData, 1550285242Sachim scsiCmnd, 1551285242Sachim satOrgIOContext 1552285242Sachim ); 1553285242Sachim 1554285242Sachim /* sending another ATA command */ 1555285242Sachim switch (scsiCmnd->cdb[0]) 1556285242Sachim { 1557285242Sachim case SCSIOPC_READ_6: 1558285242Sachim /* no loop should occur with READ6 since it fits in one ATA command */ 1559285242Sachim break; 1560285242Sachim case SCSIOPC_READ_10: /* fall through */ 1561285242Sachim case SCSIOPC_READ_12: /* fall through */ 1562285242Sachim case SCSIOPC_READ_16: /* fall through */ 1563285242Sachim status = satRead_1( tiRoot, 1564285242Sachim &satNewIntIo->satIntTiIORequest, 1565285242Sachim satNewIOContext->ptiDeviceHandle, 1566285242Sachim &satNewIntIo->satIntTiScsiXchg, 1567285242Sachim satNewIOContext); 1568285242Sachim break; 1569285242Sachim case SCSIOPC_WRITE_6: 1570285242Sachim /* no loop should occur with WRITE6 since it fits in one ATA command */ 1571285242Sachim break; 1572285242Sachim case SCSIOPC_WRITE_10: /* fall through */ 1573285242Sachim case SCSIOPC_WRITE_12: /* fall through */ 1574285242Sachim case SCSIOPC_WRITE_16: /* fall through */ 1575285242Sachim status = satWrite_1( tiRoot, 1576285242Sachim &satNewIntIo->satIntTiIORequest, 1577285242Sachim satNewIOContext->ptiDeviceHandle, 1578285242Sachim &satNewIntIo->satIntTiScsiXchg, 1579285242Sachim satNewIOContext); 1580285242Sachim break; 1581285242Sachim default: 1582285242Sachim TI_DBG1(("satChainedDataIOCB: success but default case scsi cmd 0x%x ata cmd 0x%x\n",scsiCmnd->cdb[0], hostToDevFis->h.command)); 1583285242Sachim status = tiError; 1584285242Sachim break; 1585285242Sachim } 1586285242Sachim 1587285242Sachim 1588285242Sachim 1589285242Sachim if (status != tiSuccess) 1590285242Sachim { 1591285242Sachim satFreeIntIoResource( tiRoot, 1592285242Sachim satDevData, 1593285242Sachim satNewIntIo); 1594285242Sachim ostiInitiatorIOCompleted( tiRoot, 1595285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1596285242Sachim tiIOFailed, 1597285242Sachim tiDetailOtherError, 1598285242Sachim agNULL, 1599285242Sachim satOrgIOContext->interruptContext ); 1600285242Sachim TI_DBG1(("satChainedDataIOCB: calling satRead10_1 fails\n")); 1601285242Sachim return; 1602285242Sachim } 1603285242Sachim 1604285242Sachim break; 1605285242Sachim 1606285242Sachim 1607285242Sachim default: 1608285242Sachim TI_DBG1(("satChainedDataIOCB: success but default case command 0x%x\n",hostToDevFis->h.command)); 1609285242Sachim ostiInitiatorIOCompleted( tiRoot, 1610285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1611285242Sachim tiIOFailed, 1612285242Sachim tiDetailOtherError, 1613285242Sachim agNULL, 1614285242Sachim satOrgIOContext->interruptContext ); 1615285242Sachim 1616285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1617285242Sachim 1618285242Sachim satFreeIntIoResource( tiRoot, 1619285242Sachim satDevData, 1620285242Sachim satIntIo); 1621285242Sachim 1622285242Sachim break; 1623285242Sachim } 1624285242Sachim 1625285242Sachim 1626285242Sachim return; 1627285242Sachim} 1628285242Sachimvoid satNonChainedWriteNVerifyCB( 1629285242Sachim agsaRoot_t *agRoot, 1630285242Sachim agsaIORequest_t *agIORequest, 1631285242Sachim bit32 agIOStatus, 1632285242Sachim agsaFisHeader_t *agFirstDword, 1633285242Sachim bit32 agIOInfoLen, 1634285242Sachim void *agParam, 1635285242Sachim void *ioContext 1636285242Sachim ) 1637285242Sachim{ 1638285242Sachim 1639285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 1640285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 1641285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 1642285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 1643285242Sachim tdIORequestBody_t *tdIORequestBody; 1644285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 1645285242Sachim satIOContext_t *satIOContext; 1646285242Sachim satIOContext_t *satOrgIOContext; 1647285242Sachim satIOContext_t *satNewIOContext; 1648285242Sachim satInternalIo_t *satIntIo; 1649285242Sachim satInternalIo_t *satNewIntIo = agNULL; 1650285242Sachim satDeviceData_t *satDevData; 1651285242Sachim scsiRspSense_t *pSense; 1652285242Sachim tiIniScsiCmnd_t *scsiCmnd; 1653285242Sachim tiIORequest_t *tiOrgIORequest; 1654285242Sachim 1655285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 1656285242Sachim bit32 ataStatus = 0; 1657285242Sachim bit32 status; 1658285242Sachim tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 1659285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 1660285242Sachim agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL; 1661285242Sachim 1662285242Sachim TI_DBG5(("satNonChainedWriteNVerifyCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 1663285242Sachim 1664285242Sachim /* internally generate tiIOContext */ 1665285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 1666285242Sachim satIOContext = (satIOContext_t *) ioContext; 1667285242Sachim satIntIo = satIOContext->satIntIoContext; 1668285242Sachim satDevData = satIOContext->pSatDevData; 1669285242Sachim hostToDevFis = satIOContext->pFis; 1670285242Sachim 1671285242Sachim /* SPC: Self-Test Result Log page */ 1672285242Sachim tiScsiRequest = satIOContext->tiScsiXchg; 1673285242Sachim 1674285242Sachim if (satIntIo == agNULL) 1675285242Sachim { 1676285242Sachim TI_DBG4(("satNonChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n")); 1677285242Sachim satOrgIOContext = satIOContext; 1678285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 1679285242Sachim pSense = satOrgIOContext->pSense; 1680285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 1681285242Sachim } 1682285242Sachim else 1683285242Sachim { 1684285242Sachim TI_DBG4(("satNonChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 1685285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 1686285242Sachim if (satOrgIOContext == agNULL) 1687285242Sachim { 1688285242Sachim TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n")); 1689285242Sachim return; 1690285242Sachim } 1691285242Sachim else 1692285242Sachim { 1693285242Sachim TI_DBG4(("satNonChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n")); 1694285242Sachim } 1695285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 1696285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 1697285242Sachim 1698285242Sachim pSense = satOrgIOContext->pSense; 1699285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 1700285242Sachim } 1701285242Sachim 1702285242Sachim tdIORequestBody->ioCompleted = agTRUE; 1703285242Sachim tdIORequestBody->ioStarted = agFALSE; 1704285242Sachim 1705285242Sachim 1706285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 1707285242Sachim { 1708285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 1709285242Sachim ostiInitiatorIOCompleted ( 1710285242Sachim tiRoot, 1711285242Sachim tiOrgIORequest, 1712285242Sachim tiIOFailed, 1713285242Sachim tiDetailOtherError, 1714285242Sachim agNULL, 1715285242Sachim satOrgIOContext->interruptContext 1716285242Sachim ); 1717285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1718285242Sachim 1719285242Sachim satFreeIntIoResource( tiRoot, 1720285242Sachim satDevData, 1721285242Sachim satIntIo); 1722285242Sachim return; 1723285242Sachim } 1724285242Sachim 1725285242Sachim 1726285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 1727285242Sachim { 1728285242Sachim /* 1729285242Sachim FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS 1730285242Sachim */ 1731285242Sachim /* First, assumed to be Reg Device to Host FIS */ 1732285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 1733285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 1734285242Sachim } 1735285242Sachim 1736285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 1737285242Sachim { 1738285242Sachim if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS) 1739285242Sachim { 1740285242Sachim statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H); 1741285242Sachim 1742285242Sachim /* Get ATA Status register */ 1743285242Sachim ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */ 1744285242Sachim ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */ 1745285242Sachim 1746285242Sachim /* ATA Eror register */ 1747285242Sachim } 1748285242Sachim } 1749285242Sachim 1750285242Sachim 1751285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 1752285242Sachim { 1753285242Sachim /* 1754285242Sachim checking IO status, FIS type and error status 1755285242Sachim FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS 1756285242Sachim Both have fisType in the same location 1757285242Sachim */ 1758285242Sachim if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 1759285242Sachim (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) || 1760285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 1761285242Sachim ) 1762285242Sachim { 1763285242Sachim /* for debugging */ 1764285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 1765285242Sachim { 1766285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, NOT IO_SUCCESS\n")); 1767285242Sachim } 1768285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 1769285242Sachim { 1770285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 1771285242Sachim } 1772285242Sachim else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 1773285242Sachim { 1774285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 1775285242Sachim } 1776285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 1777285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 1778285242Sachim ) 1779285242Sachim { 1780285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: FAILED, FAILED, error status\n")); 1781285242Sachim } 1782285242Sachim 1783285242Sachim 1784285242Sachim /* Process abort case */ 1785285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 1786285242Sachim { 1787285242Sachim satProcessAbort(tiRoot, 1788285242Sachim tiOrgIORequest, 1789285242Sachim satOrgIOContext 1790285242Sachim ); 1791285242Sachim 1792285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1793285242Sachim 1794285242Sachim satFreeIntIoResource( tiRoot, 1795285242Sachim satDevData, 1796285242Sachim satIntIo); 1797285242Sachim return; 1798285242Sachim } 1799285242Sachim 1800285242Sachim /* for debugging */ 1801285242Sachim switch (hostToDevFis->h.command) 1802285242Sachim { 1803285242Sachim case SAT_WRITE_DMA_FUA_EXT: 1804285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT\n")); 1805285242Sachim break; 1806285242Sachim case SAT_WRITE_DMA_EXT: 1807285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT\n")); 1808285242Sachim break; 1809285242Sachim case SAT_WRITE_SECTORS_EXT: 1810285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT\n")); 1811285242Sachim break; 1812285242Sachim case SAT_WRITE_FPDMA_QUEUED: 1813285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED\n")); 1814285242Sachim break; 1815285242Sachim case SAT_READ_VERIFY_SECTORS: 1816285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS\n")); 1817285242Sachim break; 1818285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 1819285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n")); 1820285242Sachim break; 1821285242Sachim default: 1822285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command)); 1823285242Sachim break; 1824285242Sachim } 1825285242Sachim 1826285242Sachim satSetSensePayload( pSense, 1827285242Sachim SCSI_SNSKEY_NO_SENSE, 1828285242Sachim 0, 1829285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1830285242Sachim satOrgIOContext); 1831285242Sachim 1832285242Sachim ostiInitiatorIOCompleted( tiRoot, 1833285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1834285242Sachim tiIOSuccess, 1835285242Sachim SCSI_STAT_CHECK_CONDITION, 1836285242Sachim satOrgIOContext->pTiSenseData, 1837285242Sachim satOrgIOContext->interruptContext ); 1838285242Sachim 1839285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1840285242Sachim 1841285242Sachim satFreeIntIoResource( tiRoot, 1842285242Sachim satDevData, 1843285242Sachim satIntIo); 1844285242Sachim return; 1845285242Sachim } /* end error checking */ 1846285242Sachim } 1847285242Sachim 1848285242Sachim /* process success from this point on */ 1849285242Sachim 1850285242Sachim switch (hostToDevFis->h.command) 1851285242Sachim { 1852285242Sachim case SAT_WRITE_DMA_FUA_EXT: 1853285242Sachim TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_FUA_EXT success\n")); 1854285242Sachim break; 1855285242Sachim case SAT_WRITE_DMA_EXT: 1856285242Sachim TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_DMA_EXT success\n")); 1857285242Sachim break; 1858285242Sachim case SAT_WRITE_SECTORS_EXT: 1859285242Sachim TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_SECTORS_EXT succes\n")); 1860285242Sachim 1861285242Sachim break; 1862285242Sachim case SAT_WRITE_FPDMA_QUEUED: 1863285242Sachim TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_WRITE_FPDMA_QUEUED succes\n")); 1864285242Sachim break; 1865285242Sachim case SAT_READ_VERIFY_SECTORS: 1866285242Sachim TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS succes\n")); 1867285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1868285242Sachim 1869285242Sachim /* free */ 1870285242Sachim satFreeIntIoResource( tiRoot, 1871285242Sachim satDevData, 1872285242Sachim satIntIo); 1873285242Sachim 1874285242Sachim /* return stat_good */ 1875285242Sachim ostiInitiatorIOCompleted( tiRoot, 1876285242Sachim tiOrgIORequest, 1877285242Sachim tiIOSuccess, 1878285242Sachim SCSI_STAT_GOOD, 1879285242Sachim agNULL, 1880285242Sachim satOrgIOContext->interruptContext ); 1881285242Sachim return; 1882285242Sachim break; 1883285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 1884285242Sachim TI_DBG5(("satNonChainedWriteNVerifyCB: SAT_READ_VERIFY_SECTORS_EXT succes\n")); 1885285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1886285242Sachim 1887285242Sachim /* free */ 1888285242Sachim satFreeIntIoResource( tiRoot, 1889285242Sachim satDevData, 1890285242Sachim satIntIo); 1891285242Sachim 1892285242Sachim /* return stat_good */ 1893285242Sachim ostiInitiatorIOCompleted( tiRoot, 1894285242Sachim tiOrgIORequest, 1895285242Sachim tiIOSuccess, 1896285242Sachim SCSI_STAT_GOOD, 1897285242Sachim agNULL, 1898285242Sachim satOrgIOContext->interruptContext ); 1899285242Sachim return; 1900285242Sachim break; 1901285242Sachim default: 1902285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: error default case command 0x%x success\n", hostToDevFis->h.command)); 1903285242Sachim 1904285242Sachim satSetSensePayload( pSense, 1905285242Sachim SCSI_SNSKEY_NO_SENSE, 1906285242Sachim 0, 1907285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1908285242Sachim satOrgIOContext); 1909285242Sachim 1910285242Sachim ostiInitiatorIOCompleted( tiRoot, 1911285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1912285242Sachim tiIOSuccess, 1913285242Sachim SCSI_STAT_CHECK_CONDITION, 1914285242Sachim satOrgIOContext->pTiSenseData, 1915285242Sachim satOrgIOContext->interruptContext ); 1916285242Sachim 1917285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1918285242Sachim 1919285242Sachim satFreeIntIoResource( tiRoot, 1920285242Sachim satDevData, 1921285242Sachim satIntIo); 1922285242Sachim return; 1923285242Sachim break; 1924285242Sachim } 1925285242Sachim 1926285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 1927285242Sachim 1928285242Sachim /* free */ 1929285242Sachim satFreeIntIoResource( tiRoot, 1930285242Sachim satDevData, 1931285242Sachim satIntIo); 1932285242Sachim 1933285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 1934285242Sachim tiOrgIORequest, 1935285242Sachim satDevData, 1936285242Sachim 0, 1937285242Sachim satNewIntIo); 1938285242Sachim if (satNewIntIo == agNULL) 1939285242Sachim { 1940285242Sachim /* memory allocation failure */ 1941285242Sachim satFreeIntIoResource( tiRoot, 1942285242Sachim satDevData, 1943285242Sachim satNewIntIo); 1944285242Sachim 1945285242Sachim satSetSensePayload( pSense, 1946285242Sachim SCSI_SNSKEY_NO_SENSE, 1947285242Sachim 0, 1948285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1949285242Sachim satOrgIOContext); 1950285242Sachim 1951285242Sachim ostiInitiatorIOCompleted( tiRoot, 1952285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1953285242Sachim tiIOSuccess, 1954285242Sachim SCSI_STAT_CHECK_CONDITION, 1955285242Sachim satOrgIOContext->pTiSenseData, 1956285242Sachim satOrgIOContext->interruptContext ); 1957285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: momory allocation fails\n")); 1958285242Sachim return; 1959285242Sachim } /* end memory allocation */ 1960285242Sachim 1961285242Sachim satNewIOContext = satPrepareNewIO( 1962285242Sachim satNewIntIo, 1963285242Sachim tiOrgIORequest, 1964285242Sachim satDevData, 1965285242Sachim scsiCmnd, 1966285242Sachim satOrgIOContext 1967285242Sachim ); 1968285242Sachim 1969285242Sachim /* sends ATA verify command(READ_VERIFY_SECTORS or READ_VERIFY_SECTORS_EXT) */ 1970285242Sachim status = satNonChainedWriteNVerify_Verify(tiRoot, 1971285242Sachim &satNewIntIo->satIntTiIORequest, 1972285242Sachim satNewIOContext->ptiDeviceHandle, 1973285242Sachim tiScsiRequest, /* orginal from OS layer */ 1974285242Sachim satNewIOContext 1975285242Sachim ); 1976285242Sachim 1977285242Sachim 1978285242Sachim if (status != tiSuccess) 1979285242Sachim { 1980285242Sachim /* sending ATA command fails */ 1981285242Sachim satFreeIntIoResource( tiRoot, 1982285242Sachim satDevData, 1983285242Sachim satNewIntIo); 1984285242Sachim satSetSensePayload( pSense, 1985285242Sachim SCSI_SNSKEY_NO_SENSE, 1986285242Sachim 0, 1987285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 1988285242Sachim satOrgIOContext); 1989285242Sachim 1990285242Sachim ostiInitiatorIOCompleted( tiRoot, 1991285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 1992285242Sachim tiIOSuccess, 1993285242Sachim SCSI_STAT_CHECK_CONDITION, 1994285242Sachim satOrgIOContext->pTiSenseData, 1995285242Sachim satOrgIOContext->interruptContext ); 1996285242Sachim TI_DBG1(("satNonChainedWriteNVerifyCB: calling satWriteAndVerify10_1 fails\n")); 1997285242Sachim return; 1998285242Sachim } /* end send fails */ 1999285242Sachim 2000285242Sachim return; 2001285242Sachim} 2002285242Sachim 2003285242Sachim 2004285242Sachimvoid satChainedWriteNVerifyCB( 2005285242Sachim agsaRoot_t *agRoot, 2006285242Sachim agsaIORequest_t *agIORequest, 2007285242Sachim bit32 agIOStatus, 2008285242Sachim agsaFisHeader_t *agFirstDword, 2009285242Sachim bit32 agIOInfoLen, 2010285242Sachim void *agParam, 2011285242Sachim void *ioContext 2012285242Sachim ) 2013285242Sachim{ 2014285242Sachim /* 2015285242Sachim send write in loop 2016285242Sachim then, send verify in loop 2017285242Sachim */ 2018285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2019285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2020285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 2021285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 2022285242Sachim tdIORequestBody_t *tdIORequestBody; 2023285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 2024285242Sachim satIOContext_t *satIOContext; 2025285242Sachim satIOContext_t *satOrgIOContext; 2026285242Sachim satIOContext_t *satNewIOContext; 2027285242Sachim satInternalIo_t *satIntIo; 2028285242Sachim satInternalIo_t *satNewIntIo = agNULL; 2029285242Sachim satDeviceData_t *satDevData; 2030285242Sachim scsiRspSense_t *pSense; 2031285242Sachim tiIniScsiCmnd_t *scsiCmnd; 2032285242Sachim tiIORequest_t *tiOrgIORequest; 2033285242Sachim 2034285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 2035285242Sachim bit32 ataStatus = 0; 2036285242Sachim bit32 dataLength; 2037285242Sachim bit32 status = tiError; 2038285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 2039285242Sachim 2040285242Sachim TI_DBG6(("satChainedWriteNVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 2041285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 2042285242Sachim 2043285242Sachim 2044285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2045285242Sachim satIOContext = (satIOContext_t *) ioContext; 2046285242Sachim satIntIo = satIOContext->satIntIoContext; 2047285242Sachim satDevData = satIOContext->pSatDevData; 2048285242Sachim hostToDevFis = satIOContext->pFis; 2049285242Sachim 2050285242Sachim if (satIntIo == agNULL) 2051285242Sachim { 2052285242Sachim TI_DBG5(("satChainedWriteNVerifyCB: External satInternalIo_t satIntIoContext\n")); 2053285242Sachim satOrgIOContext = satIOContext; 2054285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 2055285242Sachim pSense = satIOContext->pSense; 2056285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 2057285242Sachim } 2058285242Sachim else 2059285242Sachim { 2060285242Sachim TI_DBG5(("satChainedWriteNVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 2061285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 2062285242Sachim if (satOrgIOContext == agNULL) 2063285242Sachim { 2064285242Sachim TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NULL, wrong\n")); 2065285242Sachim return; 2066285242Sachim } 2067285242Sachim else 2068285242Sachim { 2069285242Sachim TI_DBG5(("satChainedWriteNVerifyCB: satOrgIOContext is NOT NULL\n")); 2070285242Sachim } 2071285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 2072285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 2073285242Sachim 2074285242Sachim pSense = satOrgIOContext->pSense; 2075285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 2076285242Sachim } 2077285242Sachim 2078285242Sachim tdIORequestBody->ioCompleted = agTRUE; 2079285242Sachim tdIORequestBody->ioStarted = agFALSE; 2080285242Sachim 2081285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 2082285242Sachim { 2083285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 2084285242Sachim satSetSensePayload( pSense, 2085285242Sachim SCSI_SNSKEY_NO_SENSE, 2086285242Sachim 0, 2087285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 2088285242Sachim satOrgIOContext); 2089285242Sachim 2090285242Sachim ostiInitiatorIOCompleted( tiRoot, 2091285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2092285242Sachim tiIOSuccess, 2093285242Sachim SCSI_STAT_CHECK_CONDITION, 2094285242Sachim satOrgIOContext->pTiSenseData, 2095285242Sachim satOrgIOContext->interruptContext ); 2096285242Sachim 2097285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2098285242Sachim 2099285242Sachim satFreeIntIoResource( tiRoot, 2100285242Sachim satDevData, 2101285242Sachim satIntIo); 2102285242Sachim return; 2103285242Sachim } 2104285242Sachim 2105285242Sachim /* 2106285242Sachim checking IO status, FIS type and error status 2107285242Sachim */ 2108285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 2109285242Sachim { 2110285242Sachim /* agsaFisPioSetup_t or agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for read 2111285242Sachim agsaFisRegDeviceToHost_t or agsaFisSetDevBits_t for write 2112285242Sachim first, assumed to be Reg Device to Host FIS 2113285242Sachim This is OK to just find fis type 2114285242Sachim */ 2115285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 2116285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 2117285242Sachim /* for debugging */ 2118285242Sachim if( (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) && 2119285242Sachim (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 2120285242Sachim (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 2121285242Sachim ) 2122285242Sachim { 2123285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: FAILED, Wrong FIS type 0x%x\n", statDevToHostFisHeader->fisType)); 2124285242Sachim } 2125285242Sachim 2126285242Sachim /* for debugging */ 2127285242Sachim if ( (ataStatus & ERR_ATA_STATUS_MASK) || 2128285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 2129285242Sachim ) 2130285242Sachim { 2131285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: FAILED, error status and command 0x%x\n", hostToDevFis->h.command)); 2132285242Sachim } 2133285242Sachim 2134285242Sachim /* the function below handles abort case */ 2135285242Sachim itdsatDelayedProcessAbnormalCompletion(agRoot, 2136285242Sachim agIORequest, 2137285242Sachim agIOStatus, 2138285242Sachim agFirstDword, 2139285242Sachim agIOInfoLen, 2140285242Sachim agParam, 2141285242Sachim satIOContext); 2142285242Sachim 2143285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2144285242Sachim satFreeIntIoResource( tiRoot, 2145285242Sachim satDevData, 2146285242Sachim satIntIo); 2147285242Sachim return; 2148285242Sachim } /* end of error */ 2149285242Sachim 2150285242Sachim /* process the success case */ 2151285242Sachim switch (hostToDevFis->h.command) 2152285242Sachim { 2153285242Sachim case SAT_WRITE_DMA: /* fall through */ 2154285242Sachim case SAT_WRITE_SECTORS:/* fall through */ 2155285242Sachim// case SAT_WRITE_DMA_FUA_EXT: /* fall through */ 2156285242Sachim case SAT_WRITE_DMA_EXT: /* fall through */ 2157285242Sachim case SAT_WRITE_SECTORS_EXT: /* fall through */ 2158285242Sachim case SAT_WRITE_FPDMA_QUEUED: 2159285242Sachim 2160285242Sachim TI_DBG5(("satChainedWriteNVerifyCB: WRITE success case\n")); 2161285242Sachim 2162285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2163285242Sachim 2164285242Sachim /* done with internally genereated SAT_SMART_RETURN_STATUS */ 2165285242Sachim satFreeIntIoResource( tiRoot, 2166285242Sachim satDevData, 2167285242Sachim satIntIo); 2168285242Sachim /* let's loop till TL */ 2169285242Sachim 2170285242Sachim 2171285242Sachim (satOrgIOContext->LoopNum)--; 2172285242Sachim 2173285242Sachim if (satOrgIOContext->superIOFlag) 2174285242Sachim { 2175285242Sachim dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2176285242Sachim } 2177285242Sachim else 2178285242Sachim { 2179285242Sachim dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2180285242Sachim } 2181285242Sachim 2182285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 2183285242Sachim tiOrgIORequest, 2184285242Sachim satDevData, 2185285242Sachim dataLength, 2186285242Sachim satNewIntIo); 2187285242Sachim if (satNewIntIo == agNULL) 2188285242Sachim { 2189285242Sachim /* memory allocation failure */ 2190285242Sachim satFreeIntIoResource( tiRoot, 2191285242Sachim satDevData, 2192285242Sachim satNewIntIo); 2193285242Sachim ostiInitiatorIOCompleted( tiRoot, 2194285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2195285242Sachim tiIOFailed, 2196285242Sachim tiDetailOtherError, 2197285242Sachim agNULL, 2198285242Sachim satOrgIOContext->interruptContext ); 2199285242Sachim 2200285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n")); 2201285242Sachim return; 2202285242Sachim } /* end of memory allocation failure */ 2203285242Sachim 2204285242Sachim /* 2205285242Sachim * Need to initialize all the fields within satIOContext 2206285242Sachim */ 2207285242Sachim 2208285242Sachim satNewIOContext = satPrepareNewIO( 2209285242Sachim satNewIntIo, 2210285242Sachim tiOrgIORequest, 2211285242Sachim satDevData, 2212285242Sachim scsiCmnd, 2213285242Sachim satOrgIOContext 2214285242Sachim ); 2215285242Sachim 2216285242Sachim if (satOrgIOContext->LoopNum == 0) 2217285242Sachim { 2218285242Sachim /* 2219285242Sachim done with write 2220285242Sachim start with verify 2221285242Sachim */ 2222285242Sachim satOrgIOContext->LoopNum = satOrgIOContext->LoopNum2; 2223285242Sachim status = satChainedWriteNVerify_Start_Verify(tiRoot, 2224285242Sachim &satNewIntIo->satIntTiIORequest, 2225285242Sachim satNewIOContext->ptiDeviceHandle, 2226285242Sachim &satNewIntIo->satIntTiScsiXchg, 2227285242Sachim satNewIOContext); 2228285242Sachim } 2229285242Sachim else 2230285242Sachim { 2231285242Sachim status = satChainedWriteNVerify_Write(tiRoot, 2232285242Sachim &satNewIntIo->satIntTiIORequest, 2233285242Sachim satNewIOContext->ptiDeviceHandle, 2234285242Sachim &satNewIntIo->satIntTiScsiXchg, 2235285242Sachim satNewIOContext); 2236285242Sachim } 2237285242Sachim 2238285242Sachim if (status != tiSuccess) 2239285242Sachim { 2240285242Sachim satFreeIntIoResource( tiRoot, 2241285242Sachim satDevData, 2242285242Sachim satNewIntIo); 2243285242Sachim ostiInitiatorIOCompleted( tiRoot, 2244285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2245285242Sachim tiIOFailed, 2246285242Sachim tiDetailOtherError, 2247285242Sachim agNULL, 2248285242Sachim satOrgIOContext->interruptContext ); 2249285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Write fails\n")); 2250285242Sachim return; 2251285242Sachim } 2252285242Sachim 2253285242Sachim break; 2254285242Sachim 2255285242Sachim case SAT_READ_VERIFY_SECTORS: /* fall through */ 2256285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 2257285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2258285242Sachim 2259285242Sachim /* done with internally genereated SAT_SMART_RETURN_STATUS */ 2260285242Sachim satFreeIntIoResource( tiRoot, 2261285242Sachim satDevData, 2262285242Sachim satIntIo); 2263285242Sachim /* let's loop till TL */ 2264285242Sachim 2265285242Sachim /* lba = lba + tl 2266285242Sachim loopnum--; 2267285242Sachim if (loopnum == 0) done 2268285242Sachim */ 2269285242Sachim (satOrgIOContext->LoopNum)--; 2270285242Sachim if (satOrgIOContext->LoopNum == 0) 2271285242Sachim { 2272285242Sachim /* 2273285242Sachim done with write and verify 2274285242Sachim */ 2275285242Sachim ostiInitiatorIOCompleted( tiRoot, 2276285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2277285242Sachim tiIOSuccess, 2278285242Sachim SCSI_STAT_GOOD, 2279285242Sachim agNULL, 2280285242Sachim satOrgIOContext->interruptContext ); 2281285242Sachim return; 2282285242Sachim } 2283285242Sachim 2284285242Sachim if (satOrgIOContext->superIOFlag) 2285285242Sachim { 2286285242Sachim dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2287285242Sachim } 2288285242Sachim else 2289285242Sachim { 2290285242Sachim dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 2291285242Sachim } 2292285242Sachim 2293285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 2294285242Sachim tiOrgIORequest, 2295285242Sachim satDevData, 2296285242Sachim dataLength, 2297285242Sachim satNewIntIo); 2298285242Sachim if (satNewIntIo == agNULL) 2299285242Sachim { 2300285242Sachim /* memory allocation failure */ 2301285242Sachim satFreeIntIoResource( tiRoot, 2302285242Sachim satDevData, 2303285242Sachim satNewIntIo); 2304285242Sachim ostiInitiatorIOCompleted( tiRoot, 2305285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2306285242Sachim tiIOFailed, 2307285242Sachim tiDetailOtherError, 2308285242Sachim agNULL, 2309285242Sachim satOrgIOContext->interruptContext ); 2310285242Sachim 2311285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: momory allocation fails\n")); 2312285242Sachim return; 2313285242Sachim } /* end of memory allocation failure */ 2314285242Sachim 2315285242Sachim /* 2316285242Sachim * Need to initialize all the fields within satIOContext 2317285242Sachim */ 2318285242Sachim 2319285242Sachim satNewIOContext = satPrepareNewIO( 2320285242Sachim satNewIntIo, 2321285242Sachim tiOrgIORequest, 2322285242Sachim satDevData, 2323285242Sachim scsiCmnd, 2324285242Sachim satOrgIOContext 2325285242Sachim ); 2326285242Sachim status = satChainedWriteNVerify_Verify(tiRoot, 2327285242Sachim &satNewIntIo->satIntTiIORequest, 2328285242Sachim satNewIOContext->ptiDeviceHandle, 2329285242Sachim &satNewIntIo->satIntTiScsiXchg, 2330285242Sachim satNewIOContext); 2331285242Sachim 2332285242Sachim if (status != tiSuccess) 2333285242Sachim { 2334285242Sachim satFreeIntIoResource( tiRoot, 2335285242Sachim satDevData, 2336285242Sachim satNewIntIo); 2337285242Sachim ostiInitiatorIOCompleted( tiRoot, 2338285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2339285242Sachim tiIOFailed, 2340285242Sachim tiDetailOtherError, 2341285242Sachim agNULL, 2342285242Sachim satOrgIOContext->interruptContext ); 2343285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: calling satChainedWriteNVerify_Verify fails\n")); 2344285242Sachim return; 2345285242Sachim } 2346285242Sachim 2347285242Sachim break; 2348285242Sachim 2349285242Sachim default: 2350285242Sachim TI_DBG1(("satChainedWriteNVerifyCB: success but default case command 0x%x\n",hostToDevFis->h.command)); 2351285242Sachim ostiInitiatorIOCompleted( tiRoot, 2352285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 2353285242Sachim tiIOFailed, 2354285242Sachim tiDetailOtherError, 2355285242Sachim agNULL, 2356285242Sachim satOrgIOContext->interruptContext ); 2357285242Sachim 2358285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 2359285242Sachim 2360285242Sachim satFreeIntIoResource( tiRoot, 2361285242Sachim satDevData, 2362285242Sachim satIntIo); 2363285242Sachim 2364285242Sachim break; 2365285242Sachim } 2366285242Sachim 2367285242Sachim 2368285242Sachim return; 2369285242Sachim} 2370285242Sachim/***************************************************************************** 2371285242Sachim*! \brief itdsatProcessAbnormalCompletion 2372285242Sachim* 2373285242Sachim* This routine is called to complete error case for SATA request previously 2374285242Sachim* issued to the LL Layer in saSATAStart() 2375285242Sachim* 2376285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 2377285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 2378285242Sachim* \param agIOStatus: Status of completed I/O. 2379285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 2380285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 2381285242Sachim* length. 2382285242Sachim* \param agParam: Additional info based on status. 2383285242Sachim* \param ioContext: Pointer to satIOContext_t. 2384285242Sachim* 2385285242Sachim* \return: none 2386285242Sachim* 2387285242Sachim*****************************************************************************/ 2388285242Sachimvoid itdsatProcessAbnormalCompletion( 2389285242Sachim agsaRoot_t *agRoot, 2390285242Sachim agsaIORequest_t *agIORequest, 2391285242Sachim bit32 agIOStatus, 2392285242Sachim agsaFisHeader_t *agFirstDword, 2393285242Sachim bit32 agIOInfoLen, 2394285242Sachim void *agParam, 2395285242Sachim satIOContext_t *satIOContext 2396285242Sachim ) 2397285242Sachim{ 2398285242Sachim 2399285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2400285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2401285242Sachim bit32 interruptContext = osData->IntContext; 2402285242Sachim tdIORequestBody_t *tdIORequestBody; 2403285242Sachim satDeviceData_t *pSatDevData; 2404285242Sachim tiDeviceHandle_t *tiDeviceHandle; 2405285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 2406285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 2407285242Sachim 2408285242Sachim TI_DBG5(("itdsatProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n", 2409285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 2410285242Sachim 2411285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2412285242Sachim pSatDevData = satIOContext->pSatDevData; 2413285242Sachim tiDeviceHandle = satIOContext->ptiDeviceHandle; 2414285242Sachim 2415285242Sachim /* Get into the detail */ 2416285242Sachim switch(agIOStatus) 2417285242Sachim { 2418285242Sachim case OSSA_IO_SUCCESS: 2419285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS agIOInfoLen %d calling osSatIOCompleted\n", agIOInfoLen)); 2420285242Sachim /* 2421285242Sachim * At this point agIOInfoLen should be non-zero and there is valid FIS 2422285242Sachim * to read. Pass this info to the SAT layer in order to do the ATA status 2423285242Sachim * to SCSI status translation. 2424285242Sachim */ 2425285242Sachim osSatIOCompleted( tiRoot, 2426285242Sachim tdIORequestBody->tiIORequest, 2427285242Sachim agFirstDword, 2428285242Sachim agIOInfoLen, 2429285242Sachim agParam, 2430285242Sachim satIOContext, 2431285242Sachim interruptContext); 2432285242Sachim break; 2433285242Sachim 2434285242Sachim 2435285242Sachim case OSSA_IO_ABORTED: 2436285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n")); 2437285242Sachim 2438285242Sachim ostiInitiatorIOCompleted( tiRoot, 2439285242Sachim tdIORequestBody->tiIORequest, 2440285242Sachim tiIOFailed, 2441285242Sachim tiDetailAborted, 2442285242Sachim agNULL, 2443285242Sachim interruptContext); 2444285242Sachim 2445285242Sachim if ( pSatDevData->satTmTaskTag != agNULL ) 2446285242Sachim { 2447285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: TM callback\n")); 2448285242Sachim if (tiDeviceHandle == agNULL) 2449285242Sachim { 2450285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2451285242Sachim } 2452285242Sachim /* TM completed */ 2453285242Sachim ostiInitiatorEvent( tiRoot, 2454285242Sachim agNULL, /* portalContext not used */ 2455285242Sachim tiDeviceHandle, 2456285242Sachim tiIntrEventTypeTaskManagement, 2457285242Sachim tiTMOK, 2458285242Sachim pSatDevData->satTmTaskTag); 2459285242Sachim /* 2460285242Sachim * Reset flag 2461285242Sachim */ 2462285242Sachim pSatDevData->satTmTaskTag = agNULL; 2463285242Sachim } 2464285242Sachim 2465285242Sachim /* 2466285242Sachim * Check if we are in recovery mode and need to update the recovery flag 2467285242Sachim */ 2468285242Sachim if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2469285242Sachim (pSatDevData->satPendingIO == 0 )) 2470285242Sachim { 2471285242Sachim pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2472285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n")); 2473285242Sachim } 2474285242Sachim 2475285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2476285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2477285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2478285242Sachim 2479285242Sachim break; 2480285242Sachim case OSSA_IO_UNDERFLOW: 2481285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n")); 2482285242Sachim ostiInitiatorIOCompleted( tiRoot, 2483285242Sachim tdIORequestBody->tiIORequest, 2484285242Sachim tiIOUnderRun, 2485285242Sachim agIOInfoLen, 2486285242Sachim agNULL, 2487285242Sachim interruptContext); 2488285242Sachim break; 2489285242Sachim 2490285242Sachim 2491285242Sachim case OSSA_IO_FAILED: 2492285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n")); 2493285242Sachim ostiInitiatorIOCompleted( tiRoot, 2494285242Sachim tdIORequestBody->tiIORequest, 2495285242Sachim tiIOFailed, 2496285242Sachim tiDetailOtherError, 2497285242Sachim agNULL, 2498285242Sachim interruptContext); 2499285242Sachim break; 2500285242Sachim 2501285242Sachim case OSSA_IO_ABORT_RESET: 2502285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n")); 2503285242Sachim ostiInitiatorIOCompleted( tiRoot, 2504285242Sachim tdIORequestBody->tiIORequest, 2505285242Sachim tiIOFailed, 2506285242Sachim tiDetailAbortReset, 2507285242Sachim agNULL, 2508285242Sachim interruptContext); 2509285242Sachim /* 2510285242Sachim * Check if we are in recovery mode and need to update the recovery flag 2511285242Sachim */ 2512285242Sachim if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2513285242Sachim (pSatDevData->satPendingIO == 0 )) 2514285242Sachim { 2515285242Sachim pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2516285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: STATE NORMAL.\n")); 2517285242Sachim } 2518285242Sachim 2519285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2520285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2521285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2522285242Sachim 2523285242Sachim break; 2524285242Sachim 2525285242Sachim 2526285242Sachim case OSSA_IO_NO_DEVICE: 2527285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n")); 2528285242Sachim ostiInitiatorIOCompleted( tiRoot, 2529285242Sachim tdIORequestBody->tiIORequest, 2530285242Sachim tiIOFailed, 2531285242Sachim tiDetailNoLogin, 2532285242Sachim agNULL, 2533285242Sachim interruptContext); 2534285242Sachim break; 2535285242Sachim 2536285242Sachim case OSSA_IO_PROG_ERROR: 2537285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n")); 2538285242Sachim ostiInitiatorIOCompleted( tiRoot, 2539285242Sachim tdIORequestBody->tiIORequest, 2540285242Sachim tiIOFailed, 2541285242Sachim tiDetailOtherError, 2542285242Sachim agNULL, 2543285242Sachim interruptContext); 2544285242Sachim break; 2545285242Sachim case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */ 2546285242Sachim case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */ 2547285242Sachim case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */ 2548285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */ 2549285242Sachim case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */ 2550285242Sachim case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */ 2551285242Sachim case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */ 2552285242Sachim case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */ 2553285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus)); 2554285242Sachim if (tiDeviceHandle == agNULL) 2555285242Sachim { 2556285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2557285242Sachim ostiInitiatorIOCompleted( tiRoot, 2558285242Sachim tdIORequestBody->tiIORequest, 2559285242Sachim tiIOFailed, 2560285242Sachim tiDetailOtherError, 2561285242Sachim agNULL, 2562285242Sachim interruptContext); 2563285242Sachim return; 2564285242Sachim } 2565285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2566285242Sachim if (oneDeviceData == agNULL) 2567285242Sachim { 2568285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2569285242Sachim } 2570285242Sachim else 2571285242Sachim { 2572285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2573285242Sachim } 2574285242Sachim 2575285242Sachim ostiInitiatorIOCompleted( tiRoot, 2576285242Sachim tdIORequestBody->tiIORequest, 2577285242Sachim tiIOFailed, 2578285242Sachim tiDetailOtherError, 2579285242Sachim agNULL, 2580285242Sachim interruptContext); 2581285242Sachim break; 2582285242Sachim 2583285242Sachim case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY: 2584285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 2585285242Sachim ostiInitiatorIOCompleted( tiRoot, 2586285242Sachim tdIORequestBody->tiIORequest, 2587285242Sachim tiIOFailed, 2588285242Sachim tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted, 2589285242Sachim agNULL, 2590285242Sachim interruptContext); 2591285242Sachim break; 2592285242Sachim 2593285242Sachim case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */ 2594285242Sachim case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */ 2595285242Sachim case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */ 2596285242Sachim case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */ 2597285242Sachim case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */ 2598285242Sachim case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */ 2599285242Sachim case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */ 2600285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus)); 2601285242Sachim ostiInitiatorIOCompleted( tiRoot, 2602285242Sachim tdIORequestBody->tiIORequest, 2603285242Sachim tiIOFailed, 2604285242Sachim tiDetailOtherError, 2605285242Sachim agNULL, 2606285242Sachim interruptContext); 2607285242Sachim break; 2608285242Sachim case OSSA_IO_DS_IN_ERROR: 2609285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n")); 2610285242Sachim if (tiDeviceHandle == agNULL) 2611285242Sachim { 2612285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2613285242Sachim ostiInitiatorIOCompleted( tiRoot, 2614285242Sachim tdIORequestBody->tiIORequest, 2615285242Sachim tiIOFailed, 2616285242Sachim tiDetailOtherError, 2617285242Sachim agNULL, 2618285242Sachim interruptContext); 2619285242Sachim return; 2620285242Sachim } 2621285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2622285242Sachim if (oneDeviceData == agNULL) 2623285242Sachim { 2624285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2625285242Sachim } 2626285242Sachim else 2627285242Sachim { 2628285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2629285242Sachim } 2630285242Sachim ostiInitiatorIOCompleted( tiRoot, 2631285242Sachim tdIORequestBody->tiIORequest, 2632285242Sachim tiIOFailed, 2633285242Sachim tiDetailOtherError, 2634285242Sachim agNULL, 2635285242Sachim interruptContext); 2636285242Sachim break; 2637285242Sachim case OSSA_IO_DS_NON_OPERATIONAL: 2638285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n")); 2639285242Sachim if (tiDeviceHandle == agNULL) 2640285242Sachim { 2641285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2642285242Sachim ostiInitiatorIOCompleted( tiRoot, 2643285242Sachim tdIORequestBody->tiIORequest, 2644285242Sachim tiIOFailed, 2645285242Sachim tiDetailOtherError, 2646285242Sachim agNULL, 2647285242Sachim interruptContext); 2648285242Sachim return; 2649285242Sachim } 2650285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2651285242Sachim if (oneDeviceData == agNULL) 2652285242Sachim { 2653285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2654285242Sachim } 2655285242Sachim else 2656285242Sachim { 2657285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2658285242Sachim agDevHandle = oneDeviceData->agDevHandle; 2659285242Sachim if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && 2660285242Sachim oneDeviceData->tdPortContext != agNULL ) 2661285242Sachim { 2662285242Sachim saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL); 2663285242Sachim } 2664285242Sachim } 2665285242Sachim 2666285242Sachim ostiInitiatorIOCompleted( tiRoot, 2667285242Sachim tdIORequestBody->tiIORequest, 2668285242Sachim tiIOFailed, 2669285242Sachim tiDetailOtherError, 2670285242Sachim agNULL, 2671285242Sachim interruptContext); 2672285242Sachim break; 2673285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */ 2674285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH: 2675285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus)); 2676285242Sachim itdsatEncryptionHandler(agRoot, 2677285242Sachim agIORequest, 2678285242Sachim agIOStatus, 2679285242Sachim agIOInfoLen, 2680285242Sachim agParam, 2681285242Sachim 0); 2682285242Sachim break; 2683285242Sachim case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */ 2684285242Sachim case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */ 2685285242Sachim case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 2686285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus)); 2687285242Sachim itdsatDifHandler(agRoot, 2688285242Sachim agIORequest, 2689285242Sachim agIOStatus, 2690285242Sachim agIOInfoLen, 2691285242Sachim agParam, 2692285242Sachim 0); 2693285242Sachim break; 2694285242Sachim default: 2695285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2696285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: agIOStatus = unknown 0x%x\n", agIOStatus)); 2697285242Sachim if (oneDeviceData != agNULL) 2698285242Sachim { 2699285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2700285242Sachim } 2701285242Sachim else 2702285242Sachim { 2703285242Sachim TI_DBG1(("itdsatProcessAbnormalCompletion: oneDeviceData is NULL\n")); 2704285242Sachim } 2705285242Sachim 2706285242Sachim ostiInitiatorIOCompleted( tiRoot, 2707285242Sachim tdIORequestBody->tiIORequest, 2708285242Sachim tiIOFailed, 2709285242Sachim tiDetailOtherError, 2710285242Sachim agNULL, 2711285242Sachim interruptContext); 2712285242Sachim break; 2713285242Sachim 2714285242Sachim } /* switch */ 2715285242Sachim} 2716285242Sachim 2717285242Sachim 2718285242Sachim/***************************************************************************** 2719285242Sachim*! \brief itdsatDelayedProcessAbnormalCompletion 2720285242Sachim* 2721285242Sachim* This routine is called to complete error case for SATA request previously 2722285242Sachim* issued to the LL Layer in saSATAStart(). 2723285242Sachim* This is used when command is chained. 2724285242Sachim* 2725285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 2726285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 2727285242Sachim* \param agIOStatus: Status of completed I/O. 2728285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 2729285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 2730285242Sachim* length. 2731285242Sachim* \param agParam: Additional info based on status. 2732285242Sachim* \param ioContext: Pointer to satIOContext_t. 2733285242Sachim* 2734285242Sachim* \return: none 2735285242Sachim* 2736285242Sachim*****************************************************************************/ 2737285242Sachimvoid itdsatDelayedProcessAbnormalCompletion( 2738285242Sachim agsaRoot_t *agRoot, 2739285242Sachim agsaIORequest_t *agIORequest, 2740285242Sachim bit32 agIOStatus, 2741285242Sachim agsaFisHeader_t *agFirstDword, 2742285242Sachim bit32 agIOInfoLen, 2743285242Sachim void *agParam, 2744285242Sachim satIOContext_t *satIOContext 2745285242Sachim ) 2746285242Sachim{ 2747285242Sachim 2748285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 2749285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 2750285242Sachim bit32 interruptContext = osData->IntContext; 2751285242Sachim tdIORequestBody_t *tdIORequestBody; 2752285242Sachim satDeviceData_t *pSatDevData; 2753285242Sachim tiDeviceHandle_t *tiDeviceHandle; 2754285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 2755285242Sachim agsaDevHandle_t *agDevHandle = agNULL; 2756285242Sachim 2757285242Sachim TI_DBG5(("itdsatDelayedProcessAbnormalCompletion: agIORequest=%p agIOStatus=0x%x agIOInfoLen=%d\n", 2758285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 2759285242Sachim 2760285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 2761285242Sachim pSatDevData = satIOContext->pSatDevData; 2762285242Sachim tiDeviceHandle = satIOContext->ptiDeviceHandle; 2763285242Sachim 2764285242Sachim /* Get into the detail */ 2765285242Sachim switch(agIOStatus) 2766285242Sachim { 2767285242Sachim case OSSA_IO_SUCCESS: 2768285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_SUCCESS calling osSatIOCompleted\n")); 2769285242Sachim /* do nothing */ 2770285242Sachim break; 2771285242Sachim 2772285242Sachim 2773285242Sachim case OSSA_IO_ABORTED: 2774285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORTED\n")); 2775285242Sachim 2776285242Sachim ostiInitiatorIOCompleted( tiRoot, 2777285242Sachim tdIORequestBody->tiIORequest, 2778285242Sachim tiIOFailed, 2779285242Sachim tiDetailAborted, 2780285242Sachim agNULL, 2781285242Sachim interruptContext); 2782285242Sachim 2783285242Sachim if ( pSatDevData->satTmTaskTag != agNULL ) 2784285242Sachim { 2785285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: TM callback\n")); 2786285242Sachim if (tiDeviceHandle == agNULL) 2787285242Sachim { 2788285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2789285242Sachim } 2790285242Sachim /* TM completed */ 2791285242Sachim ostiInitiatorEvent( tiRoot, 2792285242Sachim agNULL, /* portalContext not used */ 2793285242Sachim tiDeviceHandle, 2794285242Sachim tiIntrEventTypeTaskManagement, 2795285242Sachim tiTMOK, 2796285242Sachim pSatDevData->satTmTaskTag); 2797285242Sachim /* 2798285242Sachim * Reset flag 2799285242Sachim */ 2800285242Sachim pSatDevData->satTmTaskTag = agNULL; 2801285242Sachim } 2802285242Sachim 2803285242Sachim /* 2804285242Sachim * Check if we are in recovery mode and need to update the recovery flag 2805285242Sachim */ 2806285242Sachim if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2807285242Sachim (pSatDevData->satPendingIO == 0 )) 2808285242Sachim { 2809285242Sachim pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2810285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n")); 2811285242Sachim } 2812285242Sachim 2813285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2814285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2815285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2816285242Sachim 2817285242Sachim break; 2818285242Sachim case OSSA_IO_UNDERFLOW: 2819285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_UNDERFLOW\n")); 2820285242Sachim ostiInitiatorIOCompleted( tiRoot, 2821285242Sachim tdIORequestBody->tiIORequest, 2822285242Sachim tiIOUnderRun, 2823285242Sachim agIOInfoLen, 2824285242Sachim agNULL, 2825285242Sachim interruptContext); 2826285242Sachim break; 2827285242Sachim 2828285242Sachim 2829285242Sachim case OSSA_IO_FAILED: 2830285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_FAILED\n")); 2831285242Sachim ostiInitiatorIOCompleted( tiRoot, 2832285242Sachim tdIORequestBody->tiIORequest, 2833285242Sachim tiIOFailed, 2834285242Sachim tiDetailOtherError, 2835285242Sachim agNULL, 2836285242Sachim interruptContext); 2837285242Sachim break; 2838285242Sachim 2839285242Sachim case OSSA_IO_ABORT_RESET: 2840285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_ABORT_RESET\n")); 2841285242Sachim ostiInitiatorIOCompleted( tiRoot, 2842285242Sachim tdIORequestBody->tiIORequest, 2843285242Sachim tiIOFailed, 2844285242Sachim tiDetailAbortReset, 2845285242Sachim agNULL, 2846285242Sachim interruptContext); 2847285242Sachim /* 2848285242Sachim * Check if we are in recovery mode and need to update the recovery flag 2849285242Sachim */ 2850285242Sachim if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 2851285242Sachim (pSatDevData->satPendingIO == 0 )) 2852285242Sachim { 2853285242Sachim pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 2854285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: STATE NORMAL.\n")); 2855285242Sachim } 2856285242Sachim 2857285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satDriveState %d\n", pSatDevData->satDriveState)); 2858285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 2859285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 2860285242Sachim 2861285242Sachim break; 2862285242Sachim 2863285242Sachim 2864285242Sachim case OSSA_IO_NO_DEVICE: 2865285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_NO_DEVICE\n")); 2866285242Sachim ostiInitiatorIOCompleted( tiRoot, 2867285242Sachim tdIORequestBody->tiIORequest, 2868285242Sachim tiIOFailed, 2869285242Sachim tiDetailNoLogin, 2870285242Sachim agNULL, 2871285242Sachim interruptContext); 2872285242Sachim break; 2873285242Sachim 2874285242Sachim case OSSA_IO_PROG_ERROR: 2875285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_PROG_ERROR\n")); 2876285242Sachim ostiInitiatorIOCompleted( tiRoot, 2877285242Sachim tdIORequestBody->tiIORequest, 2878285242Sachim tiIOFailed, 2879285242Sachim tiDetailOtherError, 2880285242Sachim agNULL, 2881285242Sachim interruptContext); 2882285242Sachim break; 2883285242Sachim case OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED: /* fall through */ 2884285242Sachim case OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION: /* fall through */ 2885285242Sachim case OSSA_IO_OPEN_CNX_ERROR_BREAK: /* fall through */ 2886285242Sachim case OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS: /* fall through */ 2887285242Sachim case OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION: /* fall through */ 2888285242Sachim case OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED: /* fall through */ 2889285242Sachim case OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION: /* fall through */ 2890285242Sachim case OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR: /* fall through */ 2891285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_* 0x%x\n", agIOStatus)); 2892285242Sachim if (tiDeviceHandle == agNULL) 2893285242Sachim { 2894285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2895285242Sachim ostiInitiatorIOCompleted( tiRoot, 2896285242Sachim tdIORequestBody->tiIORequest, 2897285242Sachim tiIOFailed, 2898285242Sachim tiDetailOtherError, 2899285242Sachim agNULL, 2900285242Sachim interruptContext); 2901285242Sachim return; 2902285242Sachim } 2903285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2904285242Sachim if (oneDeviceData == agNULL) 2905285242Sachim { 2906285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2907285242Sachim } 2908285242Sachim else 2909285242Sachim { 2910285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2911285242Sachim } 2912285242Sachim ostiInitiatorIOCompleted( tiRoot, 2913285242Sachim tdIORequestBody->tiIORequest, 2914285242Sachim tiIOFailed, 2915285242Sachim tiDetailOtherError, 2916285242Sachim agNULL, 2917285242Sachim interruptContext); 2918285242Sachim break; 2919285242Sachim 2920285242Sachim case OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY: 2921285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 2922285242Sachim ostiInitiatorIOCompleted( tiRoot, 2923285242Sachim tdIORequestBody->tiIORequest, 2924285242Sachim tiIOFailed, 2925285242Sachim tiDetailOtherError, //tiDetailNoDeviceError, //tiDetailAborted, 2926285242Sachim agNULL, 2927285242Sachim interruptContext); 2928285242Sachim break; 2929285242Sachim 2930285242Sachim case OSSA_IO_XFER_ERROR_BREAK: /* fall throuth */ 2931285242Sachim case OSSA_IO_XFER_ERROR_PHY_NOT_READY: /* fall throuth */ 2932285242Sachim case OSSA_IO_XFER_ERROR_PEER_ABORTED: /* fall throuth */ 2933285242Sachim case OSSA_IO_XFER_ERROR_DMA: /* fall throuth */ 2934285242Sachim case OSSA_IO_XFER_ERROR_SATA_LINK_TIMEOUT: /* fall throuth */ 2935285242Sachim case OSSA_IO_XFER_ERROR_ABORTED_DUE_TO_SRST: /* fall throuth */ 2936285242Sachim case OSSA_IO_XFER_ERROR_REJECTED_NCQ_MODE: /* fall throuth */ 2937285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_XFER_ERROR_* 0x%x\n", agIOStatus)); 2938285242Sachim 2939285242Sachim ostiInitiatorIOCompleted( tiRoot, 2940285242Sachim tdIORequestBody->tiIORequest, 2941285242Sachim tiIOFailed, 2942285242Sachim tiDetailOtherError, 2943285242Sachim agNULL, 2944285242Sachim interruptContext); 2945285242Sachim break; 2946285242Sachim case OSSA_IO_DS_IN_ERROR: 2947285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_IN_ERROR\n")); 2948285242Sachim if (tiDeviceHandle == agNULL) 2949285242Sachim { 2950285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2951285242Sachim ostiInitiatorIOCompleted( tiRoot, 2952285242Sachim tdIORequestBody->tiIORequest, 2953285242Sachim tiIOFailed, 2954285242Sachim tiDetailOtherError, 2955285242Sachim agNULL, 2956285242Sachim interruptContext); 2957285242Sachim return; 2958285242Sachim } 2959285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2960285242Sachim if (oneDeviceData == agNULL) 2961285242Sachim { 2962285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2963285242Sachim } 2964285242Sachim else 2965285242Sachim { 2966285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2967285242Sachim } 2968285242Sachim ostiInitiatorIOCompleted( tiRoot, 2969285242Sachim tdIORequestBody->tiIORequest, 2970285242Sachim tiIOFailed, 2971285242Sachim tiDetailOtherError, 2972285242Sachim agNULL, 2973285242Sachim interruptContext); 2974285242Sachim break; 2975285242Sachim case OSSA_IO_DS_NON_OPERATIONAL: 2976285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = OSSA_IO_DS_NON_OPERATIONAL\n")); 2977285242Sachim if (tiDeviceHandle == agNULL) 2978285242Sachim { 2979285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, tiDeviceHandle is NULL\n")); 2980285242Sachim ostiInitiatorIOCompleted( tiRoot, 2981285242Sachim tdIORequestBody->tiIORequest, 2982285242Sachim tiIOFailed, 2983285242Sachim tiDetailOtherError, 2984285242Sachim agNULL, 2985285242Sachim interruptContext); 2986285242Sachim return; 2987285242Sachim } 2988285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 2989285242Sachim if (oneDeviceData == agNULL) 2990285242Sachim { 2991285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: wrong, oneDeviceData is NULL\n")); 2992285242Sachim } 2993285242Sachim else 2994285242Sachim { 2995285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: did %d\n", oneDeviceData->id)); 2996285242Sachim agDevHandle = oneDeviceData->agDevHandle; 2997285242Sachim if (oneDeviceData->valid == agTRUE && oneDeviceData->registered == agTRUE && 2998285242Sachim oneDeviceData->tdPortContext != agNULL ) 2999285242Sachim { 3000285242Sachim saSetDeviceState(agRoot, agNULL, tdsaRotateQnumber(tiRoot, oneDeviceData), agDevHandle, SA_DS_OPERATIONAL); 3001285242Sachim } 3002285242Sachim } 3003285242Sachim ostiInitiatorIOCompleted( tiRoot, 3004285242Sachim tdIORequestBody->tiIORequest, 3005285242Sachim tiIOFailed, 3006285242Sachim tiDetailOtherError, 3007285242Sachim agNULL, 3008285242Sachim interruptContext); 3009285242Sachim break; 3010285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: /* fall through */ 3011285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH: 3012285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = ENCRYPTION ERROR 0x%x\n", agIOStatus)); 3013285242Sachim itdsatEncryptionHandler(agRoot, 3014285242Sachim agIORequest, 3015285242Sachim agIOStatus, 3016285242Sachim agIOInfoLen, 3017285242Sachim agParam, 3018285242Sachim 0); 3019285242Sachim break; 3020285242Sachim case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: /* fall through */ 3021285242Sachim case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: /* fall through */ 3022285242Sachim case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 3023285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = DIF ERROR 0x%x\n", agIOStatus)); 3024285242Sachim itdsatDifHandler(agRoot, 3025285242Sachim agIORequest, 3026285242Sachim agIOStatus, 3027285242Sachim agIOInfoLen, 3028285242Sachim agParam, 3029285242Sachim 0); 3030285242Sachim break; 3031285242Sachim default: 3032285242Sachim TI_DBG1(("itdsatDelayedProcessAbnormalCompletion: agIOStatus = unknown\n")); 3033285242Sachim ostiInitiatorIOCompleted( tiRoot, 3034285242Sachim tdIORequestBody->tiIORequest, 3035285242Sachim tiIOFailed, 3036285242Sachim tiDetailOtherError, 3037285242Sachim agNULL, 3038285242Sachim interruptContext); 3039285242Sachim break; 3040285242Sachim 3041285242Sachim } /* switch */ 3042285242Sachim} 3043285242Sachim 3044285242Sachim/***************************************************************************** 3045285242Sachim*! \brief itdsatEncryptionHandler 3046285242Sachim* 3047285242Sachim* Purpose: This function processes I/Os completed and returned by SATA lower 3048285242Sachim* layer with any encryption specific agIOStatus. 3049285242Sachim* 3050285242Sachim* \param agRoot: pointer to port instance 3051285242Sachim* \param agIORequest: pointer to I/O request 3052285242Sachim* \param agIOStatus: I/O status given by LL layer 3053285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3054285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3055285242Sachim* of abort request 3056285242Sachim* \return: None 3057285242Sachim* 3058285242Sachim* 3059285242Sachim*****************************************************************************/ 3060285242SachimosGLOBAL void 3061285242SachimitdsatEncryptionHandler( 3062285242Sachim agsaRoot_t *agRoot, 3063285242Sachim agsaIORequest_t *agIORequest, 3064285242Sachim bit32 agIOStatus, 3065285242Sachim bit32 agIOInfoLen, 3066285242Sachim void *agParam, 3067285242Sachim bit32 agOtherInfo 3068285242Sachim ) 3069285242Sachim{ 3070285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3071285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3072285242Sachim bit32 intContext = osData->IntContext; 3073285242Sachim bit32 errorDetail = tiDetailOtherError; 3074285242Sachim tdIORequestBody_t *tdIORequestBody; 3075285242Sachim TI_DBG1(("itdsatEncryptionHandler: start\n")); 3076285242Sachim TI_DBG1(("itdsatEncryptionHandler: agIOStatus 0x%x\n", agIOStatus)); 3077285242Sachim 3078285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3079285242Sachim 3080285242Sachim switch (agIOStatus) 3081285242Sachim { 3082285242Sachim case OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS: 3083285242Sachim TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_KEY_CACHE_MISS\n")); 3084285242Sachim errorDetail = tiDetailDekKeyCacheMiss; 3085285242Sachim break; 3086285242Sachim case OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID: 3087285242Sachim TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_CIPHER_MODE_INVALID\n")); 3088285242Sachim errorDetail = tiDetailCipherModeInvalid; 3089285242Sachim break; 3090285242Sachim case OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH: 3091285242Sachim TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_IV_MISMATCH\n")); 3092285242Sachim errorDetail = tiDetailDekIVMismatch; 3093285242Sachim break; 3094285242Sachim case OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR: 3095285242Sachim TI_DBG1(("itdsatEncryptionHandler: OSSA_IO_XFR_ERROR_DEK_RAM_INTERFACE_ERROR\n")); 3096285242Sachim errorDetail = tiDetailDekRamInterfaceError; 3097285242Sachim break; 3098285242Sachim default: 3099285242Sachim TI_DBG1(("itdsatEncryptionHandler: other error!!! 0x%x\n", agIOStatus)); 3100285242Sachim errorDetail = tiDetailOtherError; 3101285242Sachim break; 3102285242Sachim } 3103285242Sachim 3104285242Sachim ostiInitiatorIOCompleted ( 3105285242Sachim tiRoot, 3106285242Sachim tdIORequestBody->tiIORequest, 3107285242Sachim tiIOEncryptError, 3108285242Sachim errorDetail, 3109285242Sachim agNULL, 3110285242Sachim intContext 3111285242Sachim ); 3112285242Sachim return; 3113285242Sachim} 3114285242Sachim 3115285242Sachim/***************************************************************************** 3116285242Sachim*! \brief itdsatDifHandler 3117285242Sachim* 3118285242Sachim* Purpose: This function processes I/Os completed and returned by SATA lower 3119285242Sachim* layer with any DIF specific agIOStatus. 3120285242Sachim* 3121285242Sachim* \param agRoot: pointer to port instance 3122285242Sachim* \param agIORequest: pointer to I/O request 3123285242Sachim* \param agIOStatus: I/O status given by LL layer 3124285242Sachim* \param agIOInfoLen: lenth of complete SAS RESP frame 3125285242Sachim* \param agParam A Handle used to refer to the response frame or handle 3126285242Sachim* of abort request 3127285242Sachim* \return: None 3128285242Sachim* 3129285242Sachim* 3130285242Sachim*****************************************************************************/ 3131285242SachimosGLOBAL void 3132285242SachimitdsatDifHandler( 3133285242Sachim agsaRoot_t *agRoot, 3134285242Sachim agsaIORequest_t *agIORequest, 3135285242Sachim bit32 agIOStatus, 3136285242Sachim bit32 agIOInfoLen, 3137285242Sachim void *agParam, 3138285242Sachim bit32 agOtherInfo 3139285242Sachim ) 3140285242Sachim{ 3141285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3142285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3143285242Sachim bit32 intContext = osData->IntContext; 3144285242Sachim bit32 errorDetail = tiDetailOtherError; 3145285242Sachim tdIORequestBody_t *tdIORequestBody; 3146285242Sachim#ifdef TD_DEBUG_ENABLE 3147285242Sachim agsaDifDetails_t *DifDetail; 3148285242Sachim#endif 3149285242Sachim 3150285242Sachim TI_DBG2(("itdsatDifHandler: start\n")); 3151285242Sachim TI_DBG2(("itdsatDifHandler: agIOStatus 0x%x\n", agIOStatus)); 3152285242Sachim 3153285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3154285242Sachim#ifdef TD_DEBUG_ENABLE 3155285242Sachim DifDetail = (agsaDifDetails_t *)agParam; 3156285242Sachim#endif 3157285242Sachim switch (agIOStatus) 3158285242Sachim { 3159285242Sachim case OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH: 3160285242Sachim TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH\n")); 3161285242Sachim errorDetail = tiDetailDifAppTagMismatch; 3162285242Sachim break; 3163285242Sachim case OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH: 3164285242Sachim TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH\n")); 3165285242Sachim errorDetail = tiDetailDifRefTagMismatch; 3166285242Sachim break; 3167285242Sachim case OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH: 3168285242Sachim TI_DBG1(("itdsatDifHandler: OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH\n")); 3169285242Sachim errorDetail = tiDetailDifCrcMismatch; 3170285242Sachim break; 3171285242Sachim default: 3172285242Sachim TI_DBG1(("itdsatDifHandler: other error!!! 0x%x\n", agIOStatus)); 3173285242Sachim errorDetail = tiDetailOtherError; 3174285242Sachim break; 3175285242Sachim } 3176285242Sachim 3177285242Sachim TI_DBG1(("smsatDifHandler: DIF detail UpperLBA 0x%08x LowerLBA 0x%08x\n", DifDetail->UpperLBA, DifDetail->LowerLBA)); 3178285242Sachim 3179285242Sachim ostiInitiatorIOCompleted ( 3180285242Sachim tiRoot, 3181285242Sachim tdIORequestBody->tiIORequest, 3182285242Sachim tiIODifError, 3183285242Sachim errorDetail, 3184285242Sachim agNULL, 3185285242Sachim intContext 3186285242Sachim ); 3187285242Sachim return; 3188285242Sachim} 3189285242Sachim 3190285242Sachim/*****************************************************************************/ 3191285242Sachim/*! \brief satProcessAbort 3192285242Sachim * 3193285242Sachim * This function processes abort. 3194285242Sachim * 3195285242Sachim * \param tiRoot: Pointer to TISA initiator driver/port instance. 3196285242Sachim * \param tiIORequest: Pointer to TISA I/O request context for this I/O. 3197285242Sachim * \param satIOContext_t: Pointer to the SAT IO Context 3198285242Sachim * 3199285242Sachim * \return 3200285242Sachim * None 3201285242Sachim */ 3202285242Sachim/*****************************************************************************/ 3203285242Sachimvoid satProcessAbort( 3204285242Sachim tiRoot_t *tiRoot, 3205285242Sachim tiIORequest_t *tiIORequest, 3206285242Sachim satIOContext_t *satIOContext 3207285242Sachim ) 3208285242Sachim{ 3209285242Sachim satDeviceData_t *pSatDevData; 3210285242Sachim //tiDeviceHandle_t *tiDeviceHandle; 3211285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 3212285242Sachim 3213285242Sachim TI_DBG5(("satProcessAbort: start\n")); 3214285242Sachim 3215285242Sachim pSatDevData = satIOContext->pSatDevData; 3216285242Sachim //tiDeviceHandle = satIOContext->ptiDeviceHandle; 3217285242Sachim hostToDevFis = satIOContext->pFis; 3218285242Sachim if ( (hostToDevFis->h.command == SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE) && 3219285242Sachim (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02) 3220285242Sachim ) 3221285242Sachim { 3222285242Sachim /* no completion for send diagnotic in background. It is done in satSendDiagnostic() */ 3223285242Sachim ostiInitiatorIOCompleted( tiRoot, 3224285242Sachim tiIORequest, 3225285242Sachim tiIOFailed, 3226285242Sachim tiDetailAborted, 3227285242Sachim agNULL, 3228285242Sachim satIOContext->interruptContext); 3229285242Sachim } 3230285242Sachim 3231285242Sachim if ( pSatDevData->satTmTaskTag != agNULL ) 3232285242Sachim { 3233285242Sachim TI_DBG1(("satProcessAbort: TM callback\n")); 3234285242Sachim /* 3235285242Sachim * Reset flag 3236285242Sachim */ 3237285242Sachim pSatDevData->satTmTaskTag = agNULL; 3238285242Sachim } 3239285242Sachim 3240285242Sachim /* 3241285242Sachim * Check if we are in recovery mode and need to update the recovery flag 3242285242Sachim */ 3243285242Sachim if ((pSatDevData->satDriveState == SAT_DEV_STATE_IN_RECOVERY ) && 3244285242Sachim (pSatDevData->satPendingIO == 0 )) 3245285242Sachim { 3246285242Sachim pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 3247285242Sachim TI_DBG1(("satProcessAbort: STATE NORMAL.\n")); 3248285242Sachim } 3249285242Sachim TI_DBG1(("satProcessAbort: satDriveState %d\n", pSatDevData->satDriveState)); 3250285242Sachim TI_DBG1(("satProcessAbort: satPendingIO %d satNCQMaxIO %d\n", pSatDevData->satPendingIO, pSatDevData->satNCQMaxIO )); 3251285242Sachim TI_DBG1(("satProcessAbort: satPendingNCQIO %d satPendingNONNCQIO %d\n", pSatDevData->satPendingNCQIO, pSatDevData->satPendingNONNCQIO)); 3252285242Sachim 3253285242Sachim 3254285242Sachim 3255285242Sachim return; 3256285242Sachim} 3257285242Sachim 3258285242Sachim/***************************************************************************** 3259285242Sachim*! \brief satNonDataIOCB 3260285242Sachim* 3261285242Sachim* This routine is a callback function called from ossaSATACompleted(). 3262285242Sachim* This CB routine deals with non-data I/O SATA request. 3263285242Sachim* 3264285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 3265285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 3266285242Sachim* \param agIOStatus: Status of completed I/O. 3267285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 3268285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 3269285242Sachim* length. 3270285242Sachim* \param agParam: Additional info based on status. 3271285242Sachim* \param ioContext: Pointer to satIOContext_t. 3272285242Sachim* 3273285242Sachim* \return: none 3274285242Sachim* 3275285242Sachim*****************************************************************************/ 3276285242Sachimvoid satNonDataIOCB( 3277285242Sachim agsaRoot_t *agRoot, 3278285242Sachim agsaIORequest_t *agIORequest, 3279285242Sachim bit32 agIOStatus, 3280285242Sachim agsaFisHeader_t *agFirstDword, 3281285242Sachim bit32 agIOInfoLen, 3282285242Sachim void *agParam, 3283285242Sachim void *ioContext 3284285242Sachim ) 3285285242Sachim{ 3286285242Sachim 3287285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3288285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3289285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3290285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3291285242Sachim tdIORequestBody_t *tdIORequestBody; 3292285242Sachim bit32 interruptContext = osData->IntContext; 3293285242Sachim satIOContext_t *satIOContext; 3294285242Sachim 3295285242Sachim TI_DBG5(("satNonDataIOCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 3296285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 3297285242Sachim 3298285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 3299285242Sachim satIOContext = (satIOContext_t *) ioContext; 3300285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 3301285242Sachim 3302285242Sachim tdIORequestBody->ioCompleted = agTRUE; 3303285242Sachim tdIORequestBody->ioStarted = agFALSE; 3304285242Sachim 3305285242Sachim /* Process completion */ 3306285242Sachim if( (agIOStatus == OSSA_IO_SUCCESS) && (agIOInfoLen==0)) 3307285242Sachim { 3308285242Sachim /* 3309285242Sachim * !!! We expect that agIOInfoLen should be non-zero !!!!. 3310285242Sachim * Now call the OS-App Specific layer about this unexpected completion. 3311285242Sachim */ 3312285242Sachim TI_DBG1(("satNonDataIOCB: *** ERROR*** agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 3313285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 3314285242Sachim 3315285242Sachim ostiInitiatorIOCompleted( tiRoot, 3316285242Sachim tdIORequestBody->tiIORequest, 3317285242Sachim tiIOFailed, 3318285242Sachim tiDetailOtherError, 3319285242Sachim agNULL, 3320285242Sachim interruptContext); 3321285242Sachim } 3322285242Sachim else 3323285242Sachim { 3324285242Sachim /* More checking needed, for non-data IO this should be the normal case */ 3325285242Sachim itdsatProcessAbnormalCompletion( agRoot, 3326285242Sachim agIORequest, 3327285242Sachim agIOStatus, 3328285242Sachim agFirstDword, 3329285242Sachim agIOInfoLen, 3330285242Sachim agParam, 3331285242Sachim satIOContext); 3332285242Sachim } 3333285242Sachim 3334285242Sachim} 3335285242Sachim 3336285242Sachim/***************************************************************************** 3337285242Sachim*! \brief tdssSATADeviceTypeDecode 3338285242Sachim* 3339285242Sachim* This routine decodes ATA signature 3340285242Sachim* 3341285242Sachim* \param pSignature: ATA signature 3342285242Sachim* 3343285242Sachim* 3344285242Sachim* \return: 3345285242Sachim* TRUE if ATA signature 3346285242Sachim* FALSE otherwise 3347285242Sachim* 3348285242Sachim*****************************************************************************/ 3349285242Sachim/* 3350285242Sachim ATA p65 3351285242Sachim PM p65 3352285242Sachim SATAII p79, p80 3353285242Sachim */ 3354285242SachimGLOBAL bit32 3355285242SachimtdssSATADeviceTypeDecode( 3356285242Sachim bit8 *pSignature 3357285242Sachim ) 3358285242Sachim{ 3359285242Sachim bit32 deviceType = UNKNOWN_DEVICE; 3360285242Sachim 3361285242Sachim if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3362285242Sachim && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00 3363285242Sachim && (pSignature)[4] == 0xA0 ) /* this is the signature of a Hitachi SATA HDD*/ 3364285242Sachim { 3365285242Sachim deviceType = SATA_ATA_DEVICE; 3366285242Sachim } 3367285242Sachim else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3368285242Sachim && (pSignature)[2] == 0x00 && (pSignature)[3] == 0x00 3369285242Sachim && (pSignature)[4] == 0x00 ) 3370285242Sachim { 3371285242Sachim deviceType = SATA_ATA_DEVICE; 3372285242Sachim } 3373285242Sachim else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3374285242Sachim && (pSignature)[2] == 0x14 && (pSignature)[3] == 0xEB 3375285242Sachim && ( (pSignature)[4] == 0x00 || (pSignature)[4] == 0x10) ) 3376285242Sachim { 3377285242Sachim deviceType = SATA_ATAPI_DEVICE; 3378285242Sachim } 3379285242Sachim else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3380285242Sachim && (pSignature)[2] == 0x69 && (pSignature)[3] == 0x96 3381285242Sachim && (pSignature)[4] == 0x00 ) 3382285242Sachim { 3383285242Sachim deviceType = SATA_PM_DEVICE; 3384285242Sachim } 3385285242Sachim else if ( (pSignature)[0] == 0x01 && (pSignature)[1] == 0x01 3386285242Sachim && (pSignature)[2] == 0x3C && (pSignature)[3] == 0xC3 3387285242Sachim && (pSignature)[4] == 0x00 ) 3388285242Sachim { 3389285242Sachim deviceType = SATA_SEMB_DEVICE; 3390285242Sachim } 3391285242Sachim else if ( (pSignature)[0] == 0xFF && (pSignature)[1] == 0xFF 3392285242Sachim && (pSignature)[2] == 0xFF && (pSignature)[3] == 0xFF 3393285242Sachim && (pSignature)[4] == 0xFF ) 3394285242Sachim { 3395285242Sachim deviceType = SATA_SEMB_WO_SEP_DEVICE; 3396285242Sachim } 3397285242Sachim 3398285242Sachim return deviceType; 3399285242Sachim} 3400285242Sachim 3401285242Sachim/***************************************************************************** 3402285242Sachim*! \brief ossaDiscoverSataCB 3403285242Sachim* 3404285242Sachim* Purpose: This function is called by lower layer to inform TD layer of 3405285242Sachim* STP/SATA discovery results 3406285242Sachim* 3407285242Sachim* 3408285242Sachim* \param agRoot Pointer to chip/driver Instance. 3409285242Sachim* \param agPortContext Pointer to the port context of TD and Lower layer 3410285242Sachim* \param event event type 3411285242Sachim* \param pParm1 Pointer to data associated with event 3412285242Sachim* \param pParm2 Pointer to data associated with event 3413285242Sachim* 3414285242Sachim* \return: none 3415285242Sachim* 3416285242Sachim* \note - For details, refer to SAS/SATA Low-Level API Specification 3417285242Sachim* 3418285242Sachim*****************************************************************************/ 3419285242Sachim 3420285242SachimosGLOBAL void ossaDiscoverSataCB( agsaRoot_t *agRoot, 3421285242Sachim agsaPortContext_t *agPortContext, 3422285242Sachim bit32 event, 3423285242Sachim void *pParm1, 3424285242Sachim void *pParm2 3425285242Sachim ) 3426285242Sachim{ 3427285242Sachim tdsaRootOsData_t *osData; 3428285242Sachim tiRoot_t *tiRoot; 3429285242Sachim tdsaPortContext_t *onePortContext; 3430285242Sachim tdsaDeviceData_t *oneDeviceData; 3431285242Sachim agsaDevHandle_t *agDevHandle; 3432285242Sachim agsaSATADeviceInfo_t *agSATADeviceInfo; 3433285242Sachim tiPortalContext_t *tiPortalContext; 3434285242Sachim 3435285242Sachim bit32 devicetype = UNKNOWN_DEVICE; 3436285242Sachim 3437285242Sachim osData = (tdsaRootOsData_t *)agRoot->osData; 3438285242Sachim tiRoot = (tiRoot_t *)osData->tiRoot; 3439285242Sachim 3440285242Sachim TI_DBG5(("ossaDiscoverSataCB: start\n")); 3441285242Sachim 3442285242Sachim if (agPortContext == agNULL) 3443285242Sachim { 3444285242Sachim TI_DBG1(("ossaDiscoverSataCB: NULL agsaPortContext; wrong\n")); 3445285242Sachim return; 3446285242Sachim } 3447285242Sachim 3448285242Sachim onePortContext = (tdsaPortContext_t *)agPortContext->osData; 3449285242Sachim tiPortalContext = (tiPortalContext_t *)onePortContext->tiPortalContext; 3450285242Sachim 3451285242Sachim switch ( event ) 3452285242Sachim { 3453285242Sachim case OSSA_DISCOVER_STARTED: 3454285242Sachim { 3455285242Sachim TI_DBG5(("ossaDiscoverSataCB: STARTED\n")); 3456285242Sachim /* Do nothing */ 3457285242Sachim break; 3458285242Sachim } 3459285242Sachim 3460285242Sachim case OSSA_DISCOVER_FOUND_DEVICE: 3461285242Sachim { 3462285242Sachim TI_DBG5(("ossaDiscoverSataCB: ***** FOUND DEVICE\n")); 3463285242Sachim agDevHandle = (agsaDevHandle_t *) pParm1; 3464285242Sachim agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2; 3465285242Sachim 3466285242Sachim /* parse the device type */ 3467285242Sachim devicetype = tdssSATADeviceTypeDecode(agSATADeviceInfo->signature); 3468285242Sachim 3469285242Sachim 3470285242Sachim /* for now, TD handles only ATA Device or ATAPI Device */ 3471285242Sachim if (devicetype == SATA_ATA_DEVICE || devicetype == SATA_ATAPI_DEVICE) 3472285242Sachim { 3473285242Sachim TI_DBG5(("ossaDiscoverSataCB: ***** adding ....\n")); 3474285242Sachim /* Add SATA device */ 3475285242Sachim tdssAddSATAToSharedcontext( onePortContext, 3476285242Sachim agRoot, 3477285242Sachim agDevHandle, 3478285242Sachim agSATADeviceInfo, 3479285242Sachim agTRUE, 3480285242Sachim agSATADeviceInfo->stpPhyIdentifier 3481285242Sachim ); 3482285242Sachim#ifdef INITIATOR_DRIVER 3483285242Sachim ostiInitiatorEvent( 3484285242Sachim tiRoot, 3485285242Sachim tiPortalContext, 3486285242Sachim agNULL, 3487285242Sachim tiIntrEventTypeDeviceChange, 3488285242Sachim tiDeviceArrival, 3489285242Sachim agNULL 3490285242Sachim ); 3491285242Sachim#endif 3492285242Sachim } /* end of ATA_ATA_DEVICE or ATA_ATAPI_DEVICE */ 3493285242Sachim else 3494285242Sachim { 3495285242Sachim TI_DBG5(("ossaDiscoverSataCB: ***** not adding ..... devicetype 0x%x\n", devicetype)); 3496285242Sachim } 3497285242Sachim break; 3498285242Sachim } 3499285242Sachim 3500285242Sachim case OSSA_DISCOVER_REMOVED_DEVICE: 3501285242Sachim { 3502285242Sachim TI_DBG1(("ossaDiscoverSataCB: REMOVED_DEVICE\n")); 3503285242Sachim agDevHandle = (agsaDevHandle_t *) pParm1; 3504285242Sachim agSATADeviceInfo = (agsaSATADeviceInfo_t *) pParm2; 3505285242Sachim 3506285242Sachim oneDeviceData = (tdsaDeviceData_t *) agDevHandle->osData; 3507285242Sachim 3508285242Sachim TI_DBG1(("ossaDiscoverSataCB: signature: 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x\n", 3509285242Sachim agSATADeviceInfo->signature[0], agSATADeviceInfo->signature[1], 3510285242Sachim agSATADeviceInfo->signature[2], agSATADeviceInfo->signature[3], 3511285242Sachim agSATADeviceInfo->signature[4], agSATADeviceInfo->signature[5], 3512285242Sachim agSATADeviceInfo->signature[6], agSATADeviceInfo->signature[7] )); 3513285242Sachim 3514285242Sachim if (oneDeviceData == agNULL) 3515285242Sachim { 3516285242Sachim TI_DBG1(("ossaDiscoverSataCB: Wrong. DevHandle->osData is NULL but is being removed\n")); 3517285242Sachim } 3518285242Sachim tdssRemoveSATAFromSharedcontext( onePortContext, 3519285242Sachim oneDeviceData, 3520285242Sachim agRoot 3521285242Sachim ); 3522285242Sachim agDevHandle->osData = agNULL; 3523285242Sachim#ifdef INITIATOR_DRIVER 3524285242Sachim ostiInitiatorEvent( 3525285242Sachim tiRoot, 3526285242Sachim tiPortalContext, 3527285242Sachim agNULL, 3528285242Sachim tiIntrEventTypeDeviceChange, 3529285242Sachim tiDeviceRemoval, 3530285242Sachim agNULL 3531285242Sachim ); 3532285242Sachim#endif 3533285242Sachim break; 3534285242Sachim } 3535285242Sachim 3536285242Sachim case OSSA_DISCOVER_COMPLETE: 3537285242Sachim { 3538285242Sachim TI_DBG1(("ossaDiscoverSataCB: COMPLETE\n")); 3539285242Sachim onePortContext->DiscoveryState = ITD_DSTATE_COMPLETED; 3540285242Sachim TI_DBG6(("ossaDiscoverSataCB: COMPLETE pid %d\n", onePortContext->id)); 3541285242Sachim 3542285242Sachim /* Let OS-Apps specific layer know discovery has been successfully complete */ 3543285242Sachim ostiInitiatorEvent( tiRoot, 3544285242Sachim tiPortalContext, 3545285242Sachim agNULL, 3546285242Sachim tiIntrEventTypeDiscovery, 3547285242Sachim tiDiscOK, 3548285242Sachim agNULL ); 3549285242Sachim break; 3550285242Sachim } 3551285242Sachim 3552285242Sachim case OSSA_DISCOVER_ABORT: 3553285242Sachim { 3554285242Sachim TI_DBG1(("ossaDiscoverSataCB: OSSA_DISCOVER_ABORT\n")); 3555285242Sachim /* Let OS-Apps specific layer know discovery has failed */ 3556285242Sachim ostiInitiatorEvent( tiRoot, 3557285242Sachim tiPortalContext, 3558285242Sachim agNULL, 3559285242Sachim tiIntrEventTypeDiscovery, 3560285242Sachim tiDiscFailed, 3561285242Sachim agNULL ); 3562285242Sachim 3563285242Sachim break; 3564285242Sachim } 3565285242Sachim 3566285242Sachim default: 3567285242Sachim { 3568285242Sachim TI_DBG1(("ossaDiscoverSataCB: error default event 0x%x\n", event)); 3569285242Sachim /* Let OS-Apps specific layer know discovery has failed */ 3570285242Sachim ostiInitiatorEvent( tiRoot, 3571285242Sachim tiPortalContext, 3572285242Sachim agNULL, 3573285242Sachim tiIntrEventTypeDiscovery, 3574285242Sachim tiDiscFailed, 3575285242Sachim agNULL ); 3576285242Sachim break; 3577285242Sachim } 3578285242Sachim 3579285242Sachim } /* end of switch */ 3580285242Sachim 3581285242Sachim return; 3582285242Sachim} 3583285242Sachim 3584285242Sachim/***************************************************************************** 3585285242Sachim*! \brief tdssAddSataToSharedcontext 3586285242Sachim* 3587285242Sachim* Purpose: This function adds a discovered SATA device to a device list of 3588285242Sachim* a port context 3589285242Sachim* 3590285242Sachim* \param tsddPortContext_Instance Pointer to the target port context 3591285242Sachim* \param agRoot Pointer to the root data structure of 3592285242Sachim* TD and Lower layer 3593285242Sachim* \param agDevHandle Pointer to a device handle 3594285242Sachim* \param agSATADeviceInfo Pointer to SATA device info structure 3595285242Sachim* \param registered indication flag for registration to LL 3596285242Sachim* 3597285242Sachim* \Return: none 3598285242Sachim* 3599285242Sachim*****************************************************************************/ 3600285242Sachim/* split into devicedata allocation/registration and sending identify device data */ 3601285242SachimosGLOBAL void 3602285242SachimtdssAddSATAToSharedcontext( tdsaPortContext_t *tdsaPortContext_Instance, 3603285242Sachim agsaRoot_t *agRoot, 3604285242Sachim agsaDevHandle_t *agDevHandle, 3605285242Sachim agsaSATADeviceInfo_t *agSATADeviceInfo, 3606285242Sachim bit32 registered, 3607285242Sachim bit8 phyID 3608285242Sachim ) 3609285242Sachim{ 3610285242Sachim tdsaPortContext_t *onePortContext = agNULL; 3611285242Sachim tdList_t *PortContextList; 3612285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 3613285242Sachim tdList_t *DeviceListList = agNULL; 3614285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 3615285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 3616285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3617285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3618285242Sachim satDeviceData_t *pSatDevData; 3619285242Sachim bit32 Indenom = tdsaAllShared->QueueConfig.numInboundQueues; 3620285242Sachim bit32 Outdenom = tdsaAllShared->QueueConfig.numOutboundQueues; 3621285242Sachim bit8 dev_s_rate = 0; 3622285242Sachim bit8 sasorsata = 1; 3623285242Sachim bit8 connectionRate; 3624285242Sachim bit8 flag = 0; 3625285242Sachim bit8 TLR = 0; 3626285242Sachim bit32 found = agFALSE; 3627285242Sachim TI_DBG5(("tdssAddSataToSharedcontext: start\n")); 3628285242Sachim 3629285242Sachim /* 3630285242Sachim * Find a right portcontext, then get devicedata from FreeLink in DeviceList. 3631285242Sachim * Then, add the devicedata to the portcontext. 3632285242Sachim */ 3633285242Sachim 3634285242Sachim /* Find a right portcontext */ 3635285242Sachim PortContextList = tdsaAllShared->MainPortContextList.flink; 3636285242Sachim while (PortContextList != &(tdsaAllShared->MainPortContextList)) 3637285242Sachim { 3638285242Sachim onePortContext = TDLIST_OBJECT_BASE(tdsaPortContext_t, MainLink, PortContextList); 3639285242Sachim if (onePortContext == tdsaPortContext_Instance) 3640285242Sachim { 3641285242Sachim TI_DBG5(("tdssAddSataToSharedcontext: found; oneportContext ID %d\n", 3642285242Sachim onePortContext->id)); 3643285242Sachim found = agTRUE; 3644285242Sachim break; 3645285242Sachim } 3646285242Sachim PortContextList = PortContextList->flink; 3647285242Sachim } 3648285242Sachim 3649285242Sachim if (found == agFALSE) 3650285242Sachim { 3651285242Sachim TI_DBG1(("tdssAddSataToSharedcontext: No corressponding tdsaPortContext\n")); 3652285242Sachim return; 3653285242Sachim } 3654285242Sachim 3655285242Sachim /* 3656285242Sachim 1. add the devicedata 3657285242Sachim 2. Send Identify Device Data 3658285242Sachim 3. In CB of Identify Device Data (satAddSATAIDDevCB), finds out the devicedata is new or old 3659285242Sachim */ 3660285242Sachim 3661285242Sachim 3662285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 3663285242Sachim if (!TDLIST_NOT_EMPTY(&(tdsaAllShared->FreeDeviceList))) 3664285242Sachim { 3665285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 3666285242Sachim TI_DBG1(("tdssAddSataToSharedcontext: ERROR empty DeviceData FreeLink\n")); 3667285242Sachim /* notifying link up */ 3668285242Sachim ostiPortEvent ( 3669285242Sachim tiRoot, 3670285242Sachim tiPortLinkUp, 3671285242Sachim tiSuccess, 3672285242Sachim (void *)tdsaAllShared->Ports[phyID].tiPortalContext 3673285242Sachim ); 3674285242Sachim#ifdef INITIATOR_DRIVER 3675285242Sachim /* triggers discovery */ 3676285242Sachim ostiPortEvent( 3677285242Sachim tiRoot, 3678285242Sachim tiPortDiscoveryReady, 3679285242Sachim tiSuccess, 3680285242Sachim (void *) tdsaAllShared->Ports[phyID].tiPortalContext 3681285242Sachim ); 3682285242Sachim#endif 3683285242Sachim return; 3684285242Sachim } 3685285242Sachim 3686285242Sachim TDLIST_DEQUEUE_FROM_HEAD(&DeviceListList, &(tdsaAllShared->FreeDeviceList)); 3687285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 3688285242Sachim oneDeviceData = TDLIST_OBJECT_BASE(tdsaDeviceData_t, FreeLink, DeviceListList); 3689285242Sachim TDLIST_DEQUEUE_THIS(&(oneDeviceData->FreeLink)); 3690285242Sachim 3691285242Sachim TI_DBG1(("tdssAddSataToSharedcontext: oneDeviceData %p did %d\n", oneDeviceData, oneDeviceData->id)); 3692285242Sachim oneDeviceData->InQID = oneDeviceData->id % Indenom; 3693285242Sachim oneDeviceData->OutQID = oneDeviceData->id % Outdenom; 3694285242Sachim 3695285242Sachim pSatDevData = (satDeviceData_t *)&(oneDeviceData->satDevData); 3696285242Sachim pSatDevData->satDriveState = SAT_DEV_STATE_NORMAL; 3697285242Sachim pSatDevData->satPendingIO = 0; 3698285242Sachim pSatDevData->satNCQMaxIO = 0; 3699285242Sachim pSatDevData->satPendingNCQIO = 0; 3700285242Sachim pSatDevData->satPendingNONNCQIO = 0; 3701285242Sachim pSatDevData->IDDeviceValid = agFALSE; 3702285242Sachim pSatDevData->satDeviceType = tdssSATADeviceTypeDecode(onePortContext->remoteSignature); 3703285242Sachim 3704285242Sachim osti_memset(&(oneDeviceData->satDevData.satIdentifyData), 0xFF, sizeof(agsaSATAIdentifyData_t)); 3705285242Sachim 3706285242Sachim onePortContext->Count++; 3707285242Sachim oneDeviceData->DeviceType = TD_SATA_DEVICE; // either TD_SAS_DEVICE or TD_SATA_DEVICE 3708285242Sachim oneDeviceData->agRoot = agRoot; 3709285242Sachim// oneDeviceData->agDevHandle = agDevHandle; 3710285242Sachim 3711285242Sachim// agDevHandle->osData = oneDeviceData; /* TD layer */ 3712285242Sachim oneDeviceData->tdPortContext = onePortContext; 3713285242Sachim oneDeviceData->valid = agTRUE; 3714285242Sachim 3715285242Sachim oneDeviceData->directlyAttached = agTRUE; 3716285242Sachim oneDeviceData->initiator_ssp_stp_smp = 0; 3717285242Sachim oneDeviceData->target_ssp_stp_smp = 0x1; /* setting SATA device bit */ 3718285242Sachim oneDeviceData->phyID = phyID; 3719285242Sachim 3720285242Sachim /* parse sasIDframe to fill in agDeviceInfo */ 3721285242Sachim flag = (bit8)((phyID << 4) | TLR); 3722285242Sachim DEVINFO_PUT_SMPTO(&oneDeviceData->agDeviceInfo, DEFAULT_SMP_TIMEOUT); 3723285242Sachim DEVINFO_PUT_ITNEXUSTO(&oneDeviceData->agDeviceInfo, (bit16)tdsaAllShared->itNexusTimeout); 3724285242Sachim DEVINFO_PUT_FBS(&oneDeviceData->agDeviceInfo, 0); 3725285242Sachim //temp 3726285242Sachim //DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, 0); 3727285242Sachim DEVINFO_PUT_FLAG(&oneDeviceData->agDeviceInfo, flag); 3728285242Sachim 3729285242Sachim sasorsata = SATA_DEVICE_TYPE; /* SATA disk */ 3730285242Sachim connectionRate = onePortContext->LinkRate; 3731285242Sachim dev_s_rate = (bit8)(dev_s_rate | (sasorsata << 4)); 3732285242Sachim dev_s_rate = (bit8)(dev_s_rate | connectionRate); 3733285242Sachim DEVINFO_PUT_DEV_S_RATE(&oneDeviceData->agDeviceInfo, dev_s_rate); 3734285242Sachim 3735285242Sachim DEVINFO_PUT_SAS_ADDRESSLO( 3736285242Sachim &oneDeviceData->agDeviceInfo, 3737285242Sachim 0 3738285242Sachim ); 3739285242Sachim DEVINFO_PUT_SAS_ADDRESSHI( 3740285242Sachim &oneDeviceData->agDeviceInfo, 3741285242Sachim 0 3742285242Sachim ); 3743285242Sachim 3744285242Sachim if (pSatDevData->satDeviceType == SATA_ATAPI_DEVICE ) 3745285242Sachim { 3746285242Sachim oneDeviceData->agDeviceInfo.flag |= ATAPI_DEVICE_FLAG; /* ATAPI device flag*/ 3747285242Sachim } 3748285242Sachim 3749285242Sachim oneDeviceData->agContext.osData = oneDeviceData; 3750285242Sachim oneDeviceData->agContext.sdkData = agNULL; 3751285242Sachim 3752285242Sachim if (oneDeviceData->registered == agFALSE) 3753285242Sachim { 3754285242Sachim saRegisterNewDevice( /* tdssAddSATAToSharedcontext */ 3755285242Sachim agRoot, 3756285242Sachim &oneDeviceData->agContext, 3757285242Sachim 0,/*tdsaRotateQnumber(tiRoot, oneDeviceData),*/ 3758285242Sachim &oneDeviceData->agDeviceInfo, 3759285242Sachim onePortContext->agPortContext, 3760285242Sachim 0 3761285242Sachim ); 3762285242Sachim } 3763285242Sachim return; 3764285242Sachim} 3765285242Sachim/***************************************************************************** 3766285242Sachim*! \brief tdssRetrySATAID 3767285242Sachim* 3768285242Sachim* Purpose: This function retries identify device data to directly attached SATA 3769285242Sachim* device after device registration 3770285242Sachim* 3771285242Sachim* \param tiRoot: Pointer to TISA initiator driver/port instance. 3772285242Sachim* \param oneDeviceData Pointer to a device data 3773285242Sachim* \Return: none 3774285242Sachim* 3775285242Sachim*****************************************************************************/ 3776285242SachimosGLOBAL void 3777285242SachimtdssRetrySATAID( tiRoot_t *tiRoot, 3778285242Sachim tdsaDeviceData_t *oneDeviceData 3779285242Sachim ) 3780285242Sachim{ 3781285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3782285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3783285242Sachim void *osMemHandle; 3784285242Sachim tdIORequestBody_t *tdIORequestBody; 3785285242Sachim bit32 PhysUpper32; 3786285242Sachim bit32 PhysLower32; 3787285242Sachim bit32 memAllocStatus; 3788285242Sachim agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */ 3789285242Sachim satIOContext_t *satIOContext = agNULL; 3790285242Sachim bit32 status; 3791285242Sachim 3792285242Sachim TI_DBG5(("tdssRetrySATAID: start\n")); 3793285242Sachim /* allocate identify device data and sends it */ 3794285242Sachim /* allocation tdIORequestBody and pass it to satTM() */ 3795285242Sachim memAllocStatus = ostiAllocMemory( 3796285242Sachim tiRoot, 3797285242Sachim &osMemHandle, 3798285242Sachim (void **)&tdIORequestBody, 3799285242Sachim &PhysUpper32, 3800285242Sachim &PhysLower32, 3801285242Sachim 8, 3802285242Sachim sizeof(tdIORequestBody_t), 3803285242Sachim agTRUE 3804285242Sachim ); 3805285242Sachim 3806285242Sachim if (memAllocStatus != tiSuccess) 3807285242Sachim { 3808285242Sachim TI_DBG1(("tdssRetrySATAID: ostiAllocMemory failed... loc 2\n")); 3809285242Sachim /* notifying link up */ 3810285242Sachim ostiPortEvent ( 3811285242Sachim tiRoot, 3812285242Sachim tiPortLinkUp, 3813285242Sachim tiSuccess, 3814285242Sachim (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3815285242Sachim ); 3816285242Sachim#ifdef INITIATOR_DRIVER 3817285242Sachim /* triggers discovery */ 3818285242Sachim ostiPortEvent( 3819285242Sachim tiRoot, 3820285242Sachim tiPortDiscoveryReady, 3821285242Sachim tiSuccess, 3822285242Sachim (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3823285242Sachim ); 3824285242Sachim#endif 3825285242Sachim 3826285242Sachim return; 3827285242Sachim } 3828285242Sachim 3829285242Sachim if (tdIORequestBody == agNULL) 3830285242Sachim { 3831285242Sachim TI_DBG1(("tdssRetrySATAID: ostiAllocMemory returned NULL tdIORequestBody loc 2\n")); 3832285242Sachim /* notifying link up */ 3833285242Sachim ostiPortEvent ( 3834285242Sachim tiRoot, 3835285242Sachim tiPortLinkUp, 3836285242Sachim tiSuccess, 3837285242Sachim (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3838285242Sachim ); 3839285242Sachim#ifdef INITIATOR_DRIVER 3840285242Sachim /* triggers discovery */ 3841285242Sachim ostiPortEvent( 3842285242Sachim tiRoot, 3843285242Sachim tiPortDiscoveryReady, 3844285242Sachim tiSuccess, 3845285242Sachim (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3846285242Sachim ); 3847285242Sachim#endif 3848285242Sachim 3849285242Sachim return; 3850285242Sachim } 3851285242Sachim 3852285242Sachim /* setup identify device data IO structure */ 3853285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 3854285242Sachim tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL; 3855285242Sachim tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL; 3856285242Sachim 3857285242Sachim /* initialize tiDevhandle */ 3858285242Sachim tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle); 3859285242Sachim tdIORequestBody->tiDevHandle->tdData = oneDeviceData; 3860285242Sachim 3861285242Sachim /* initialize tiIORequest */ 3862285242Sachim tdIORequestBody->tiIORequest = agNULL; 3863285242Sachim 3864285242Sachim /* initialize agIORequest */ 3865285242Sachim agIORequest = &(tdIORequestBody->agIORequest); 3866285242Sachim agIORequest->osData = (void *) tdIORequestBody; 3867285242Sachim agIORequest->sdkData = agNULL; /* SA takes care of this */ 3868285242Sachim 3869285242Sachim /* set up satIOContext */ 3870285242Sachim satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 3871285242Sachim satIOContext->pSatDevData = &(oneDeviceData->satDevData); 3872285242Sachim satIOContext->pFis = 3873285242Sachim &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev); 3874285242Sachim 3875285242Sachim 3876285242Sachim satIOContext->tiRequestBody = tdIORequestBody; 3877285242Sachim satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle); 3878285242Sachim satIOContext->tiScsiXchg = agNULL; 3879285242Sachim satIOContext->satIntIoContext = agNULL; 3880285242Sachim satIOContext->satOrgIOContext = agNULL; 3881285242Sachim 3882285242Sachim /* followings are used only for internal IO */ 3883285242Sachim satIOContext->currentLBA = 0; 3884285242Sachim satIOContext->OrgTL = 0; 3885285242Sachim 3886285242Sachim 3887285242Sachim satIOContext->satToBeAbortedIOContext = agNULL; 3888285242Sachim 3889285242Sachim satIOContext->NotifyOS = agFALSE; 3890285242Sachim 3891285242Sachim satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id; 3892285242Sachim 3893285242Sachim status = satAddSATAStartIDDev(tiRoot, 3894285242Sachim agNULL, 3895285242Sachim &(oneDeviceData->tiDeviceHandle), 3896285242Sachim agNULL, 3897285242Sachim satIOContext 3898285242Sachim ); 3899285242Sachim 3900285242Sachim /* assumption; always new device data */ 3901285242Sachim 3902285242Sachim 3903285242Sachim if (status == tiSuccess) 3904285242Sachim { 3905285242Sachim TI_DBG6(("tdssRetrySATAID: successfully sent identify device data\n")); 3906285242Sachim TI_DBG6(("tdssRetrySATAID: one case did %d \n", oneDeviceData->id)); 3907285242Sachim } 3908285242Sachim else 3909285242Sachim { 3910285242Sachim TI_DBG1(("tdssRetrySATAID: failed in sending identify device data\n")); 3911285242Sachim /* put onedevicedata back to free list */ 3912285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 3913285242Sachim TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList)); 3914285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 3915285242Sachim /* notifying link up */ 3916285242Sachim ostiPortEvent ( 3917285242Sachim tiRoot, 3918285242Sachim tiPortLinkUp, 3919285242Sachim tiSuccess, 3920285242Sachim (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3921285242Sachim ); 3922285242Sachim#ifdef INITIATOR_DRIVER 3923285242Sachim /* triggers discovery */ 3924285242Sachim ostiPortEvent( 3925285242Sachim tiRoot, 3926285242Sachim tiPortDiscoveryReady, 3927285242Sachim tiSuccess, 3928285242Sachim (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3929285242Sachim ); 3930285242Sachim#endif 3931285242Sachim 3932285242Sachim } 3933285242Sachim 3934285242Sachim return; 3935285242Sachim} 3936285242Sachim 3937285242Sachim/***************************************************************************** 3938285242Sachim*! \brief tdssSubAddSATAToSharedcontext 3939285242Sachim* 3940285242Sachim* Purpose: This function sends identify device data to directly attached SATA 3941285242Sachim* device after device registration 3942285242Sachim* 3943285242Sachim* \param tiRoot: Pointer to TISA initiator driver/port instance. 3944285242Sachim* \param oneDeviceData Pointer to a device data 3945285242Sachim* \Return: none 3946285242Sachim* 3947285242Sachim*****************************************************************************/ 3948285242SachimosGLOBAL void 3949285242SachimtdssSubAddSATAToSharedcontext( tiRoot_t *tiRoot, 3950285242Sachim tdsaDeviceData_t *oneDeviceData 3951285242Sachim ) 3952285242Sachim{ 3953285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 3954285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 3955285242Sachim void *osMemHandle; 3956285242Sachim tdIORequestBody_t *tdIORequestBody; 3957285242Sachim bit32 PhysUpper32; 3958285242Sachim bit32 PhysLower32; 3959285242Sachim bit32 memAllocStatus; 3960285242Sachim agsaIORequest_t *agIORequest = agNULL; /* identify device data itself */ 3961285242Sachim satIOContext_t *satIOContext = agNULL; 3962285242Sachim bit32 status; 3963285242Sachim 3964285242Sachim TI_DBG1(("tdssSubAddSATAToSharedcontext: start\n")); 3965285242Sachim /* allocate identify device data and sends it */ 3966285242Sachim /* allocation tdIORequestBody and pass it to satTM() */ 3967285242Sachim memAllocStatus = ostiAllocMemory( 3968285242Sachim tiRoot, 3969285242Sachim &osMemHandle, 3970285242Sachim (void **)&tdIORequestBody, 3971285242Sachim &PhysUpper32, 3972285242Sachim &PhysLower32, 3973285242Sachim 8, 3974285242Sachim sizeof(tdIORequestBody_t), 3975285242Sachim agTRUE 3976285242Sachim ); 3977285242Sachim 3978285242Sachim if (memAllocStatus != tiSuccess) 3979285242Sachim { 3980285242Sachim TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory failed... loc 2\n")); 3981285242Sachim /* notifying link up */ 3982285242Sachim ostiPortEvent ( 3983285242Sachim tiRoot, 3984285242Sachim tiPortLinkUp, 3985285242Sachim tiSuccess, 3986285242Sachim (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3987285242Sachim ); 3988285242Sachim#ifdef INITIATOR_DRIVER 3989285242Sachim /* triggers discovery */ 3990285242Sachim ostiPortEvent( 3991285242Sachim tiRoot, 3992285242Sachim tiPortDiscoveryReady, 3993285242Sachim tiSuccess, 3994285242Sachim (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 3995285242Sachim ); 3996285242Sachim#endif 3997285242Sachim 3998285242Sachim return; 3999285242Sachim } 4000285242Sachim 4001285242Sachim if (tdIORequestBody == agNULL) 4002285242Sachim { 4003285242Sachim TI_DBG1(("tdssSubAddSATAToSharedcontext: ostiAllocMemory returned NULL tdIORequestBody loc 2\n")); 4004285242Sachim /* notifying link up */ 4005285242Sachim ostiPortEvent ( 4006285242Sachim tiRoot, 4007285242Sachim tiPortLinkUp, 4008285242Sachim tiSuccess, 4009285242Sachim (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4010285242Sachim ); 4011285242Sachim#ifdef INITIATOR_DRIVER 4012285242Sachim /* triggers discovery */ 4013285242Sachim ostiPortEvent( 4014285242Sachim tiRoot, 4015285242Sachim tiPortDiscoveryReady, 4016285242Sachim tiSuccess, 4017285242Sachim (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4018285242Sachim ); 4019285242Sachim#endif 4020285242Sachim 4021285242Sachim return; 4022285242Sachim } 4023285242Sachim 4024285242Sachim /* setup identify device data IO structure */ 4025285242Sachim tdIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 4026285242Sachim tdIORequestBody->IOType.InitiatorTMIO.CurrentTaskTag = agNULL; 4027285242Sachim tdIORequestBody->IOType.InitiatorTMIO.TaskTag = agNULL; 4028285242Sachim 4029285242Sachim /* initialize tiDevhandle */ 4030285242Sachim tdIORequestBody->tiDevHandle = &(oneDeviceData->tiDeviceHandle); 4031285242Sachim tdIORequestBody->tiDevHandle->tdData = oneDeviceData; 4032285242Sachim 4033285242Sachim /* initialize tiIORequest */ 4034285242Sachim tdIORequestBody->tiIORequest = agNULL; 4035285242Sachim 4036285242Sachim /* initialize agIORequest */ 4037285242Sachim agIORequest = &(tdIORequestBody->agIORequest); 4038285242Sachim agIORequest->osData = (void *) tdIORequestBody; 4039285242Sachim agIORequest->sdkData = agNULL; /* SA takes care of this */ 4040285242Sachim 4041285242Sachim /* set up satIOContext */ 4042285242Sachim satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 4043285242Sachim satIOContext->pSatDevData = &(oneDeviceData->satDevData); 4044285242Sachim satIOContext->pFis = 4045285242Sachim &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev); 4046285242Sachim 4047285242Sachim 4048285242Sachim satIOContext->tiRequestBody = tdIORequestBody; 4049285242Sachim satIOContext->ptiDeviceHandle = &(oneDeviceData->tiDeviceHandle); 4050285242Sachim satIOContext->tiScsiXchg = agNULL; 4051285242Sachim satIOContext->satIntIoContext = agNULL; 4052285242Sachim satIOContext->satOrgIOContext = agNULL; 4053285242Sachim 4054285242Sachim /* followings are used only for internal IO */ 4055285242Sachim satIOContext->currentLBA = 0; 4056285242Sachim satIOContext->OrgTL = 0; 4057285242Sachim 4058285242Sachim 4059285242Sachim satIOContext->satToBeAbortedIOContext = agNULL; 4060285242Sachim 4061285242Sachim satIOContext->NotifyOS = agFALSE; 4062285242Sachim 4063285242Sachim satIOContext->pid = tdsaAllShared->Ports[oneDeviceData->phyID].portContext->id; 4064285242Sachim 4065285242Sachim status = satAddSATAStartIDDev(tiRoot, 4066285242Sachim agNULL, 4067285242Sachim &(oneDeviceData->tiDeviceHandle), 4068285242Sachim agNULL, 4069285242Sachim satIOContext 4070285242Sachim ); 4071285242Sachim 4072285242Sachim /* assumption; always new device data */ 4073285242Sachim 4074285242Sachim 4075285242Sachim if (status == tiSuccess) 4076285242Sachim { 4077285242Sachim TI_DBG6(("tdssSubAddSATAToSharedcontext: successfully sent identify device data\n")); 4078285242Sachim 4079285242Sachim /* Add the devicedata to the mainlink */ 4080285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 4081285242Sachim TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->MainLink), &(tdsaAllShared->MainDeviceList)); 4082285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 4083285242Sachim TI_DBG6(("tdssSubAddSATAToSharedcontext: one case did %d \n", oneDeviceData->id)); 4084285242Sachim } 4085285242Sachim else 4086285242Sachim { 4087285242Sachim TI_DBG1(("tdssSubAddSATAToSharedcontext: failed in sending identify device data\n")); 4088285242Sachim /* put onedevicedata back to free list */ 4089285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_DEVICE_LOCK); 4090285242Sachim TDLIST_ENQUEUE_AT_TAIL(&(oneDeviceData->FreeLink), &(tdsaAllShared->FreeDeviceList)); 4091285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_DEVICE_LOCK); 4092285242Sachim /* notifying link up */ 4093285242Sachim ostiPortEvent ( 4094285242Sachim tiRoot, 4095285242Sachim tiPortLinkUp, 4096285242Sachim tiSuccess, 4097285242Sachim (void *)tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4098285242Sachim ); 4099285242Sachim#ifdef INITIATOR_DRIVER 4100285242Sachim /* triggers discovery */ 4101285242Sachim ostiPortEvent( 4102285242Sachim tiRoot, 4103285242Sachim tiPortDiscoveryReady, 4104285242Sachim tiSuccess, 4105285242Sachim (void *) tdsaAllShared->Ports[oneDeviceData->phyID].tiPortalContext 4106285242Sachim ); 4107285242Sachim#endif 4108285242Sachim 4109285242Sachim } 4110285242Sachim 4111285242Sachim return; 4112285242Sachim} 4113285242Sachim 4114285242Sachim 4115285242Sachim/***************************************************************************** 4116285242Sachim*! \brief tdssRemoveSATAFromSharedcontext 4117285242Sachim* 4118285242Sachim* Purpose: This function removes a discovered device from a device list of 4119285242Sachim* a port context 4120285242Sachim* 4121285242Sachim* \param tsddPortContext_Ins Pointer to the target port context 4122285242Sachim* \param tdsaDeviceData_Ins Pointer to the target device 4123285242Sachim* \param agRoot Pointer to the root data structure of 4124285242Sachim* TD and Lower layer 4125285242Sachim 4126285242Sachim* 4127285242Sachim* \Return: none 4128285242Sachim* 4129285242Sachim*****************************************************************************/ 4130285242SachimosGLOBAL void 4131285242SachimtdssRemoveSATAFromSharedcontext( 4132285242Sachim tdsaPortContext_t *tdsaPortContext_Ins, 4133285242Sachim tdsaDeviceData_t *tdsaDeviceData_ins, 4134285242Sachim agsaRoot_t *agRoot 4135285242Sachim ) 4136285242Sachim{ 4137285242Sachim TI_DBG1(("tdssRemoveSATAFromSharedcontex: start\n")); 4138285242Sachim return; 4139285242Sachim} 4140285242Sachim 4141285242Sachim 4142285242Sachim/***************************************************************************** 4143285242Sachim*! \brief satSetDevInfo 4144285242Sachim* 4145285242Sachim* Purpose: Based on ATA identify device data, this functions sets fields of 4146285242Sachim* device data maintained in TD layer 4147285242Sachim* 4148285242Sachim* \param satDevData Pointer to a device data 4149285242Sachim* \param SATAIdData Pointer to ATA identify device data 4150285242Sachim* 4151285242Sachim* 4152285242Sachim* \Return: none 4153285242Sachim* 4154285242Sachim*****************************************************************************/ 4155285242Sachimvoid satSetDevInfo( 4156285242Sachim satDeviceData_t *satDevData, 4157285242Sachim agsaSATAIdentifyData_t *SATAIdData 4158285242Sachim ) 4159285242Sachim{ 4160285242Sachim TI_DBG3(("satSetDevInfo: start\n")); 4161285242Sachim 4162285242Sachim satDevData->satDriveState = SAT_DEV_STATE_NORMAL; 4163285242Sachim satDevData->satFormatState = agFALSE; 4164285242Sachim satDevData->satDeviceFaultState = agFALSE; 4165285242Sachim satDevData->satTmTaskTag = agNULL; 4166285242Sachim satDevData->satAbortAfterReset = agFALSE; 4167285242Sachim satDevData->satAbortCalled = agFALSE; 4168285242Sachim satDevData->satSectorDone = 0; 4169285242Sachim 4170285242Sachim /* Qeueu depth, Word 75 */ 4171285242Sachim satDevData->satNCQMaxIO = SATAIdData->queueDepth + 1; 4172285242Sachim TI_DBG3(("satSetDevInfo: max queue depth %d\n",satDevData->satNCQMaxIO)); 4173285242Sachim 4174285242Sachim /* Support NCQ, if Word 76 bit 8 is set */ 4175285242Sachim if (SATAIdData->sataCapabilities & 0x100) 4176285242Sachim { 4177285242Sachim TI_DBG3(("satSetDevInfo: device supports NCQ\n")); 4178285242Sachim satDevData->satNCQ = agTRUE; 4179285242Sachim } 4180285242Sachim else 4181285242Sachim { 4182285242Sachim TI_DBG3(("satSetDevInfo: no NCQ\n")); 4183285242Sachim satDevData->satNCQ = agFALSE; 4184285242Sachim } 4185285242Sachim 4186285242Sachim /* Support 48 bit addressing, if Word 83 bit 10 and Word 86 bit 10 are set */ 4187285242Sachim if ((SATAIdData->commandSetSupported1 & 0x400) && 4188285242Sachim (SATAIdData->commandSetFeatureEnabled1 & 0x400) ) 4189285242Sachim { 4190285242Sachim TI_DBG3(("satSetDevInfo: support 48 bit addressing\n")); 4191285242Sachim satDevData->sat48BitSupport = agTRUE; 4192285242Sachim } 4193285242Sachim else 4194285242Sachim { 4195285242Sachim TI_DBG3(("satSetDevInfo: NO 48 bit addressing\n")); 4196285242Sachim satDevData->sat48BitSupport = agFALSE; 4197285242Sachim } 4198285242Sachim 4199285242Sachim /* Support SMART Self Test, word84 bit 1 */ 4200285242Sachim if (SATAIdData->commandSetFeatureSupportedExt & 0x02) 4201285242Sachim { 4202285242Sachim TI_DBG3(("satSetDevInfo: SMART self-test supported \n")); 4203285242Sachim satDevData->satSMARTSelfTest = agTRUE; 4204285242Sachim } 4205285242Sachim else 4206285242Sachim { 4207285242Sachim TI_DBG3(("satSetDevInfo: no SMART self-test suppored\n")); 4208285242Sachim satDevData->satSMARTSelfTest = agFALSE; 4209285242Sachim } 4210285242Sachim 4211285242Sachim 4212285242Sachim 4213285242Sachim /* Support SMART feature set, word82 bit 0 */ 4214285242Sachim if (SATAIdData->commandSetSupported & 0x01) 4215285242Sachim { 4216285242Sachim TI_DBG3(("satSetDevInfo: SMART feature set supported \n")); 4217285242Sachim satDevData->satSMARTFeatureSet = agTRUE; 4218285242Sachim } 4219285242Sachim else 4220285242Sachim { 4221285242Sachim TI_DBG3(("satSetDevInfo: no SMART feature set suppored\n")); 4222285242Sachim satDevData->satSMARTFeatureSet = agFALSE; 4223285242Sachim } 4224285242Sachim 4225285242Sachim 4226285242Sachim 4227285242Sachim /* Support SMART enabled, word85 bit 0 */ 4228285242Sachim if (SATAIdData->commandSetFeatureEnabled & 0x01) 4229285242Sachim { 4230285242Sachim TI_DBG3(("satSetDevInfo: SMART enabled \n")); 4231285242Sachim satDevData->satSMARTEnabled = agTRUE; 4232285242Sachim } 4233285242Sachim else 4234285242Sachim { 4235285242Sachim TI_DBG3(("satSetDevInfo: no SMART enabled\n")); 4236285242Sachim satDevData->satSMARTEnabled = agFALSE; 4237285242Sachim } 4238285242Sachim 4239285242Sachim satDevData->satVerifyState = 0; 4240285242Sachim 4241285242Sachim /* Removable Media feature set support, word82 bit 2 */ 4242285242Sachim if (SATAIdData->commandSetSupported & 0x4) 4243285242Sachim { 4244285242Sachim TI_DBG3(("satSetDevInfo: Removable Media supported \n")); 4245285242Sachim satDevData->satRemovableMedia = agTRUE; 4246285242Sachim } 4247285242Sachim else 4248285242Sachim { 4249285242Sachim TI_DBG3(("satSetDevInfo: no Removable Media suppored\n")); 4250285242Sachim satDevData->satRemovableMedia = agFALSE; 4251285242Sachim } 4252285242Sachim 4253285242Sachim /* Removable Media feature set enabled, word 85, bit 2 */ 4254285242Sachim if (SATAIdData->commandSetFeatureEnabled & 0x4) 4255285242Sachim { 4256285242Sachim TI_DBG3(("satSetDevInfo: Removable Media enabled\n")); 4257285242Sachim satDevData->satRemovableMediaEnabled = agTRUE; 4258285242Sachim } 4259285242Sachim else 4260285242Sachim { 4261285242Sachim TI_DBG3(("satSetDevInfo: no Removable Media enabled\n")); 4262285242Sachim satDevData->satRemovableMediaEnabled = agFALSE; 4263285242Sachim } 4264285242Sachim 4265285242Sachim /* DMA Support, word49 bit8 */ 4266285242Sachim if (SATAIdData->dma_lba_iod_ios_stimer & 0x100) 4267285242Sachim { 4268285242Sachim TI_DBG3(("satSetDevInfo: DMA supported \n")); 4269285242Sachim satDevData->satDMASupport = agTRUE; 4270285242Sachim } 4271285242Sachim else 4272285242Sachim { 4273285242Sachim TI_DBG3(("satSetDevInfo: no DMA suppored\n")); 4274285242Sachim satDevData->satDMASupport = agFALSE; 4275285242Sachim } 4276285242Sachim 4277285242Sachim /* DMA Enabled, word88 bit0-6, bit8-14*/ 4278285242Sachim /* 0x7F7F = 0111 1111 0111 1111*/ 4279285242Sachim if (SATAIdData->ultraDMAModes & 0x7F7F) 4280285242Sachim { 4281285242Sachim TI_DBG3(("satSetDevInfo: DMA enabled \n")); 4282285242Sachim satDevData->satDMAEnabled = agTRUE; 4283285242Sachim } 4284285242Sachim else 4285285242Sachim { 4286285242Sachim TI_DBG3(("satSetDevInfo: no DMA enabled\n")); 4287285242Sachim satDevData->satDMAEnabled = agFALSE; 4288285242Sachim } 4289285242Sachim 4290285242Sachim /* 4291285242Sachim setting MaxUserAddrSectors: max user addressable setctors 4292285242Sachim word60 - 61, should be 0x 0F FF FF FF 4293285242Sachim */ 4294285242Sachim satDevData->satMaxUserAddrSectors 4295285242Sachim = (SATAIdData->numOfUserAddressableSectorsHi << (8*2) ) 4296285242Sachim + SATAIdData->numOfUserAddressableSectorsLo; 4297285242Sachim TI_DBG3(("satSetDevInfo: MaxUserAddrSectors 0x%x decimal %d\n", satDevData->satMaxUserAddrSectors, satDevData->satMaxUserAddrSectors)); 4298285242Sachim /* Support DMADIR, if Word 62 bit 8 is set */ 4299285242Sachim if (SATAIdData->word62_74[0] & 0x8000) 4300285242Sachim { 4301285242Sachim TI_DBG3(("satSetDevInfo: DMADIR enabled\n")); 4302285242Sachim satDevData->satDMADIRSupport = agTRUE; 4303285242Sachim } 4304285242Sachim else 4305285242Sachim { 4306285242Sachim TI_DBG3(("satSetDevInfo: DMADIR disabled\n")); 4307285242Sachim satDevData->satDMADIRSupport = agFALSE; 4308285242Sachim } 4309285242Sachim 4310285242Sachim 4311285242Sachim /* write cache enabled for caching mode page SAT Table 67 p69, word85 bit5 */ 4312285242Sachim if (SATAIdData->commandSetFeatureEnabled & 0x20) 4313285242Sachim { 4314285242Sachim TI_DBG3(("satSetDevInfo: write cache enabled\n")); 4315285242Sachim satDevData->satWriteCacheEnabled = agTRUE; 4316285242Sachim } 4317285242Sachim else 4318285242Sachim { 4319285242Sachim TI_DBG3(("satSetDevInfo: no write cache enabled\n")); 4320285242Sachim satDevData->satWriteCacheEnabled = agFALSE; 4321285242Sachim } 4322285242Sachim 4323285242Sachim /* look ahead enabled for caching mode page SAT Table 67 p69, word85 bit6 */ 4324285242Sachim if (SATAIdData->commandSetFeatureEnabled & 0x40) 4325285242Sachim { 4326285242Sachim TI_DBG3(("satSetDevInfo: look ahead enabled\n")); 4327285242Sachim satDevData->satLookAheadEnabled = agTRUE; 4328285242Sachim } 4329285242Sachim else 4330285242Sachim { 4331285242Sachim TI_DBG3(("satSetDevInfo: no look ahead enabled\n")); 4332285242Sachim satDevData->satLookAheadEnabled = agFALSE; 4333285242Sachim } 4334285242Sachim 4335285242Sachim /* Support WWN, if Word 87 bit 8 is set */ 4336285242Sachim if (SATAIdData->commandSetFeatureDefault & 0x100) 4337285242Sachim { 4338285242Sachim TI_DBG3(("satSetDevInfo: device supports WWN\n")); 4339285242Sachim satDevData->satWWNSupport = agTRUE; 4340285242Sachim } 4341285242Sachim else 4342285242Sachim { 4343285242Sachim TI_DBG3(("satSetDevInfo: no WWN\n")); 4344285242Sachim satDevData->satWWNSupport = agFALSE; 4345285242Sachim } 4346285242Sachim 4347285242Sachim 4348285242Sachim return; 4349285242Sachim} 4350285242Sachim 4351285242Sachim/***************************************************************************** 4352285242Sachim*! \brief satInquiryCB 4353285242Sachim* 4354285242Sachim* This routine is a callback function for satInquiry() 4355285242Sachim* 4356285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 4357285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 4358285242Sachim* \param agIOStatus: Status of completed I/O. 4359285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 4360285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 4361285242Sachim* length. 4362285242Sachim* \param agParam: Additional info based on status. 4363285242Sachim* \param ioContext: Pointer to satIOContext_t. 4364285242Sachim* 4365285242Sachim* \return: none 4366285242Sachim* 4367285242Sachim*****************************************************************************/ 4368285242Sachimvoid satInquiryCB( 4369285242Sachim agsaRoot_t *agRoot, 4370285242Sachim agsaIORequest_t *agIORequest, 4371285242Sachim bit32 agIOStatus, 4372285242Sachim agsaFisHeader_t *agFirstDword, 4373285242Sachim bit32 agIOInfoLen, 4374285242Sachim void *agParam, 4375285242Sachim void *ioContext 4376285242Sachim ) 4377285242Sachim{ 4378285242Sachim /* 4379285242Sachim In the process of Inquiry 4380285242Sachim Process SAT_IDENTIFY_DEVICE 4381285242Sachim */ 4382285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4383285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4384285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 4385285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 4386285242Sachim tdIORequestBody_t *tdIORequestBody; 4387285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 4388285242Sachim satIOContext_t *satIOContext; 4389285242Sachim satIOContext_t *satOrgIOContext; 4390285242Sachim satInternalIo_t *satIntIo; 4391285242Sachim satDeviceData_t *satDevData; 4392285242Sachim#ifdef TD_DEBUG_ENABLE 4393285242Sachim tdsaDeviceData_t *tdsaDeviceData; 4394285242Sachim bit32 ataStatus = 0; 4395285242Sachim bit32 ataError; 4396285242Sachim agsaFisPioSetupHeader_t *satPIOSetupHeader = agNULL; 4397285242Sachim#endif 4398285242Sachim scsiRspSense_t *pSense; 4399285242Sachim tiIniScsiCmnd_t *scsiCmnd; 4400285242Sachim tiIORequest_t *tiOrgIORequest; 4401285242Sachim tiScsiInitiatorRequest_t *tiScsiRequest; /* TD's tiScsiXchg */ 4402285242Sachim tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* OS's tiScsiXchg */ 4403285242Sachim agsaSATAIdentifyData_t *pSATAIdData; 4404285242Sachim bit8 *pInquiry; 4405285242Sachim bit8 page = 0xFF; 4406285242Sachim bit16 *tmpptr,tmpptr_tmp; 4407285242Sachim bit32 x; 4408285242Sachim bit32 lenReceived; 4409285242Sachim bit32 lenNeeded = 0; 4410285242Sachim 4411285242Sachim TI_DBG6(("satInquiryCB: start\n")); 4412285242Sachim TI_DBG6(("satInquiryCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 4413285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4414285242Sachim satIOContext = (satIOContext_t *) ioContext; 4415285242Sachim satIntIo = satIOContext->satIntIoContext; 4416285242Sachim satDevData = satIOContext->pSatDevData; 4417285242Sachim#ifdef TD_DEBUG_ENABLE 4418285242Sachim tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData; 4419285242Sachim#endif 4420285242Sachim tiScsiRequest = satIOContext->tiScsiXchg; 4421285242Sachim if (satIntIo == agNULL) 4422285242Sachim { 4423285242Sachim TI_DBG6(("satInquiryCB: External, OS generated\n")); 4424285242Sachim pSense = satIOContext->pSense; 4425285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 4426285242Sachim satOrgIOContext = satIOContext; 4427285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 4428285242Sachim } 4429285242Sachim else 4430285242Sachim { 4431285242Sachim TI_DBG6(("satInquiryCB: Internal, TD generated\n")); 4432285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 4433285242Sachim if (satOrgIOContext == agNULL) 4434285242Sachim { 4435285242Sachim TI_DBG1(("satInquiryCB: satOrgIOContext is NULL, wrong\n")); 4436285242Sachim return; 4437285242Sachim } 4438285242Sachim else 4439285242Sachim { 4440285242Sachim TI_DBG6(("satInquiryCB: satOrgIOContext is NOT NULL\n")); 4441285242Sachim } 4442285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 4443285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 4444285242Sachim pSense = satOrgIOContext->pSense; 4445285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 4446285242Sachim } 4447285242Sachim 4448285242Sachim tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 4449285242Sachim pInquiry = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 4450285242Sachim 4451285242Sachim tdIORequestBody->ioCompleted = agTRUE; 4452285242Sachim tdIORequestBody->ioStarted = agFALSE; 4453285242Sachim 4454285242Sachim TI_DBG3(("satInquiryCB: did %d\n", tdsaDeviceData->id)); 4455285242Sachim 4456285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 4457285242Sachim { 4458285242Sachim TI_DBG1(("satInquiryCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 4459285242Sachim if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY) 4460285242Sachim { 4461285242Sachim TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 4462285242Sachim /* should NOT be retried */ 4463285242Sachim ostiInitiatorIOCompleted ( 4464285242Sachim tiRoot, 4465285242Sachim tiOrgIORequest, 4466285242Sachim tiIOFailed, 4467285242Sachim tiDetailNoLogin, 4468285242Sachim agNULL, 4469285242Sachim satOrgIOContext->interruptContext 4470285242Sachim ); 4471285242Sachim } 4472285242Sachim else 4473285242Sachim { 4474285242Sachim TI_DBG1(("satInquiryCB: NOT OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY\n")); 4475285242Sachim ostiInitiatorIOCompleted ( 4476285242Sachim tiRoot, 4477285242Sachim tiOrgIORequest, 4478285242Sachim tiIOFailed, 4479285242Sachim tiDetailNoLogin, 4480285242Sachim agNULL, 4481285242Sachim satOrgIOContext->interruptContext 4482285242Sachim ); 4483285242Sachim } 4484285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4485285242Sachim 4486285242Sachim satFreeIntIoResource( tiRoot, 4487285242Sachim satDevData, 4488285242Sachim satIntIo); 4489285242Sachim return; 4490285242Sachim } 4491285242Sachim if (agIOStatus == OSSA_IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED || 4492285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_ZONE_VIOLATION || 4493285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BREAK || 4494285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS || 4495285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_BAD_DESTINATION || 4496285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_CONNECTION_RATE_NOT_SUPPORTED || 4497285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_WRONG_DESTINATION || 4498285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_UNKNOWN_ERROR || 4499285242Sachim agIOStatus == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY 4500285242Sachim ) 4501285242Sachim { 4502285242Sachim TI_DBG1(("satInquiryCB: OSSA_IO_OPEN_CNX_ERROR\n")); 4503285242Sachim 4504285242Sachim ostiInitiatorIOCompleted ( 4505285242Sachim tiRoot, 4506285242Sachim tiOrgIORequest, 4507285242Sachim tiIOFailed, 4508285242Sachim tiDetailNoLogin, 4509285242Sachim agNULL, 4510285242Sachim satOrgIOContext->interruptContext 4511285242Sachim ); 4512285242Sachim 4513285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4514285242Sachim 4515285242Sachim satFreeIntIoResource( tiRoot, 4516285242Sachim satDevData, 4517285242Sachim satIntIo); 4518285242Sachim return; 4519285242Sachim } 4520285242Sachim 4521285242Sachim if ( agIOStatus != OSSA_IO_SUCCESS || 4522285242Sachim (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0) 4523285242Sachim ) 4524285242Sachim { 4525285242Sachim#ifdef TD_DEBUG_ENABLE 4526285242Sachim // only agsaFisPioSetup_t is expected 4527285242Sachim satPIOSetupHeader = (agsaFisPioSetupHeader_t *)&(agFirstDword->PioSetup); 4528285242Sachim ataStatus = satPIOSetupHeader->status; // ATA Status register 4529285242Sachim ataError = satPIOSetupHeader->error; // ATA Eror register 4530285242Sachim#endif 4531285242Sachim TI_DBG1(("satInquiryCB: ataStatus 0x%x ataError 0x%x\n", ataStatus, ataError)); 4532285242Sachim /* Process abort case */ 4533285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 4534285242Sachim { 4535285242Sachim satProcessAbort(tiRoot, 4536285242Sachim tiOrgIORequest, 4537285242Sachim satOrgIOContext 4538285242Sachim ); 4539285242Sachim 4540285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4541285242Sachim 4542285242Sachim satFreeIntIoResource( tiRoot, 4543285242Sachim satDevData, 4544285242Sachim satIntIo); 4545285242Sachim return; 4546285242Sachim } 4547285242Sachim 4548285242Sachim ostiInitiatorIOCompleted ( 4549285242Sachim tiRoot, 4550285242Sachim tiOrgIORequest, 4551285242Sachim tiIOFailed, 4552285242Sachim tiDetailOtherError, 4553285242Sachim agNULL, 4554285242Sachim satOrgIOContext->interruptContext 4555285242Sachim ); 4556285242Sachim 4557285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4558285242Sachim 4559285242Sachim satFreeIntIoResource( tiRoot, 4560285242Sachim satDevData, 4561285242Sachim satIntIo); 4562285242Sachim return; 4563285242Sachim } 4564285242Sachim 4565285242Sachim /* success */ 4566285242Sachim 4567285242Sachim 4568285242Sachim /* Convert to host endian */ 4569285242Sachim tmpptr = (bit16*)(tiScsiRequest->sglVirtualAddr); 4570285242Sachim for (x=0; x < sizeof(agsaSATAIdentifyData_t)/sizeof(bit16); x++) 4571285242Sachim { 4572285242Sachim OSSA_READ_LE_16(AGROOT, &tmpptr_tmp, tmpptr, 0); 4573285242Sachim *tmpptr = tmpptr_tmp; 4574285242Sachim tmpptr++; 4575285242Sachim /*Print tmpptr_tmp here for debugging purpose*/ 4576285242Sachim } 4577285242Sachim 4578285242Sachim pSATAIdData = (agsaSATAIdentifyData_t *)(tiScsiRequest->sglVirtualAddr); 4579285242Sachim 4580285242Sachim TI_DBG5(("satInquiryCB: OS satOrgIOContext %p \n", satOrgIOContext)); 4581285242Sachim TI_DBG5(("satInquiryCB: TD satIOContext %p \n", satIOContext)); 4582285242Sachim TI_DBG5(("satInquiryCB: OS tiScsiXchg %p \n", satOrgIOContext->tiScsiXchg)); 4583285242Sachim TI_DBG5(("satInquiryCB: TD tiScsiXchg %p \n", satIOContext->tiScsiXchg)); 4584285242Sachim 4585285242Sachim /* copy ID Dev data to satDevData */ 4586285242Sachim satDevData->satIdentifyData = *pSATAIdData; 4587285242Sachim satDevData->IDDeviceValid = agTRUE; 4588285242Sachim#ifdef TD_INTERNAL_DEBUG 4589285242Sachim tdhexdump("satInquiryCB ID Dev data",(bit8 *)pSATAIdData, sizeof(agsaSATAIdentifyData_t)); 4590285242Sachim tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t)); 4591285242Sachim#endif 4592285242Sachim// tdhexdump("satInquiryCB Device ID Dev data",(bit8 *)&satDevData->satIdentifyData, sizeof(agsaSATAIdentifyData_t)); 4593285242Sachim 4594285242Sachim /* set satDevData fields from IndentifyData */ 4595285242Sachim satSetDevInfo(satDevData,pSATAIdData); 4596285242Sachim 4597285242Sachim lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4]; 4598285242Sachim 4599285242Sachim /* SPC-4, spec 6.4 p 141 */ 4600285242Sachim /* EVPD bit == 0 */ 4601285242Sachim if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK)) 4602285242Sachim { 4603285242Sachim /* Returns the standard INQUIRY data */ 4604285242Sachim lenNeeded = STANDARD_INQUIRY_SIZE; 4605285242Sachim 4606285242Sachim 4607285242Sachim satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd); 4608285242Sachim //tdhexdump("satInquiryCB ***standard***", (bit8 *)pInquiry, 36); 4609285242Sachim 4610285242Sachim } 4611285242Sachim else 4612285242Sachim { 4613285242Sachim /* EVPD bit != 0 && PAGE CODE != 0 */ 4614285242Sachim /* returns the pages of vital product data information */ 4615285242Sachim 4616285242Sachim /* we must support page 00h, 83h and 89h */ 4617285242Sachim page = scsiCmnd->cdb[2]; 4618285242Sachim if ((page != INQUIRY_SUPPORTED_VPD_PAGE) && 4619285242Sachim (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) && 4620285242Sachim (page != INQUIRY_ATA_INFORMATION_VPD_PAGE)) 4621285242Sachim { 4622285242Sachim satSetSensePayload( pSense, 4623285242Sachim SCSI_SNSKEY_ILLEGAL_REQUEST, 4624285242Sachim 0, 4625285242Sachim SCSI_SNSCODE_INVALID_FIELD_IN_CDB, 4626285242Sachim satOrgIOContext); 4627285242Sachim 4628285242Sachim ostiInitiatorIOCompleted( tiRoot, 4629285242Sachim tiOrgIORequest, 4630285242Sachim tiIOSuccess, 4631285242Sachim SCSI_STAT_CHECK_CONDITION, 4632285242Sachim satOrgIOContext->pTiSenseData, 4633285242Sachim satOrgIOContext->interruptContext ); 4634285242Sachim 4635285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4636285242Sachim 4637285242Sachim satFreeIntIoResource( tiRoot, 4638285242Sachim satDevData, 4639285242Sachim satIntIo); 4640285242Sachim TI_DBG1(("satInquiryCB: invalid PAGE CODE 0x%x\n", page)); 4641285242Sachim return; 4642285242Sachim } 4643285242Sachim 4644285242Sachim /* checking length */ 4645285242Sachim switch (page) 4646285242Sachim { 4647285242Sachim case INQUIRY_SUPPORTED_VPD_PAGE: 4648285242Sachim lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */ 4649285242Sachim break; 4650285242Sachim case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4651285242Sachim if (satDevData->satWWNSupport) 4652285242Sachim { 4653285242Sachim lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */ 4654285242Sachim } 4655285242Sachim else 4656285242Sachim { 4657285242Sachim lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */ 4658285242Sachim } 4659285242Sachim break; 4660285242Sachim case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4661285242Sachim lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */ 4662285242Sachim break; 4663285242Sachim default: 4664285242Sachim TI_DBG1(("satInquiryCB: wrong!!! invalid PAGE CODE 0x%x\n", page)); 4665285242Sachim break; 4666285242Sachim } 4667285242Sachim 4668285242Sachim 4669285242Sachim /* 4670285242Sachim * Fill in the Inquiry data depending on what Inquiry data we are returning. 4671285242Sachim */ 4672285242Sachim switch (page) 4673285242Sachim { 4674285242Sachim case INQUIRY_SUPPORTED_VPD_PAGE: 4675285242Sachim satInquiryPage0(pInquiry, pSATAIdData); 4676285242Sachim break; 4677285242Sachim case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4678285242Sachim satInquiryPage83(pInquiry, pSATAIdData, satDevData); 4679285242Sachim break; 4680285242Sachim case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4681285242Sachim satInquiryPage89(pInquiry, pSATAIdData, satDevData); 4682285242Sachim break; 4683285242Sachim default: 4684285242Sachim TI_DBG1(("satInquiryCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page)); 4685285242Sachim break; 4686285242Sachim } 4687285242Sachim } /* else */ 4688285242Sachim 4689285242Sachim TI_DBG6(("satInquiryCB: calling ostiInitiatorIOCompleted\n")); 4690285242Sachim 4691285242Sachim if (lenReceived > lenNeeded) 4692285242Sachim { 4693285242Sachim TI_DBG6(("satInquiryCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n", 4694285242Sachim lenNeeded, lenReceived, tiOrgIORequest)); 4695285242Sachim 4696285242Sachim ostiInitiatorIOCompleted( tiRoot, 4697285242Sachim tiOrgIORequest, 4698285242Sachim tiIOUnderRun, 4699285242Sachim lenReceived - lenNeeded, 4700285242Sachim agNULL, 4701285242Sachim satOrgIOContext->interruptContext ); 4702285242Sachim } 4703285242Sachim else 4704285242Sachim { 4705285242Sachim ostiInitiatorIOCompleted( tiRoot, 4706285242Sachim tiOrgIORequest, 4707285242Sachim tiIOSuccess, 4708285242Sachim SCSI_STAT_GOOD, 4709285242Sachim agNULL, 4710285242Sachim satOrgIOContext->interruptContext); 4711285242Sachim } 4712285242Sachim 4713285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4714285242Sachim 4715285242Sachim satFreeIntIoResource( tiRoot, 4716285242Sachim satDevData, 4717285242Sachim satIntIo); 4718285242Sachim TI_DBG5(("satInquiryCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO)); 4719285242Sachim TI_DBG6(("satInquiryCB: end\n")); 4720285242Sachim return; 4721285242Sachim} 4722285242Sachim 4723285242Sachim 4724285242Sachim/*****************************************************************************/ 4725285242Sachim/*! \brief satInquiryIntCB. 4726285242Sachim * 4727285242Sachim * This function is part of INQUIRY SAT implementation. This is called when 4728285242Sachim * ATA identify device data is available. 4729285242Sachim * 4730285242Sachim * \param tiRoot: Pointer to TISA initiator driver/port instance. 4731285242Sachim * \param tiIORequest: Pointer to TISA I/O request context for this I/O. 4732285242Sachim * \param tiDeviceHandle: Pointer to TISA device handle for this I/O. 4733285242Sachim * \param tiScsiRequest: Pointer to TISA SCSI I/O request and SGL list. 4734285242Sachim * \param satIOContext_t: Pointer to the SAT IO Context 4735285242Sachim * 4736285242Sachim * \return If command is started successfully 4737285242Sachim * - \e tiSuccess: I/O request successfully initiated. 4738285242Sachim * - \e tiBusy: No resources available, try again later. 4739285242Sachim * - \e tiIONoDevice: Invalid device handle. 4740285242Sachim * - \e tiError: Other errors. 4741285242Sachim */ 4742285242Sachim/*****************************************************************************/ 4743285242Sachimvoid satInquiryIntCB( 4744285242Sachim tiRoot_t *tiRoot, 4745285242Sachim tiIORequest_t *tiIORequest, 4746285242Sachim tiDeviceHandle_t *tiDeviceHandle, 4747285242Sachim tiScsiInitiatorRequest_t *tiScsiRequest, 4748285242Sachim satIOContext_t *satIOContext 4749285242Sachim ) 4750285242Sachim{ 4751285242Sachim scsiRspSense_t *pSense; 4752285242Sachim tiIniScsiCmnd_t *scsiCmnd; 4753285242Sachim satDeviceData_t *satDevData; 4754285242Sachim agsaSATAIdentifyData_t *pSATAIdData; 4755285242Sachim 4756285242Sachim bit8 *pInquiry; 4757285242Sachim bit8 page = 0xFF; 4758285242Sachim bit32 lenReceived; 4759285242Sachim bit32 lenNeeded = 0; 4760285242Sachim 4761285242Sachim TI_DBG6(("satInquiryIntCB: start\n")); 4762285242Sachim 4763285242Sachim pSense = satIOContext->pSense; 4764285242Sachim scsiCmnd = &tiScsiRequest->scsiCmnd; 4765285242Sachim pInquiry = (bit8 *) tiScsiRequest->sglVirtualAddr; 4766285242Sachim satDevData = satIOContext->pSatDevData; 4767285242Sachim pSATAIdData = &satDevData->satIdentifyData; 4768285242Sachim 4769285242Sachim 4770285242Sachim lenReceived = ((scsiCmnd->cdb[3]) << 8) + scsiCmnd->cdb[4]; 4771285242Sachim 4772285242Sachim /* SPC-4, spec 6.4 p 141 */ 4773285242Sachim /* EVPD bit == 0 */ 4774285242Sachim if (!(scsiCmnd->cdb[1] & SCSI_EVPD_MASK)) 4775285242Sachim { 4776285242Sachim /* Returns the standard INQUIRY data */ 4777285242Sachim lenNeeded = STANDARD_INQUIRY_SIZE; 4778285242Sachim 4779285242Sachim satInquiryStandard(pInquiry, pSATAIdData, scsiCmnd); 4780285242Sachim //tdhexdump("satInquiryIntCB ***standard***", (bit8 *)pInquiry, 36); 4781285242Sachim 4782285242Sachim } 4783285242Sachim else 4784285242Sachim { 4785285242Sachim /* EVPD bit != 0 && PAGE CODE != 0 */ 4786285242Sachim /* returns the pages of vital product data information */ 4787285242Sachim 4788285242Sachim /* we must support page 00h, 83h and 89h */ 4789285242Sachim page = scsiCmnd->cdb[2]; 4790285242Sachim if ((page != INQUIRY_SUPPORTED_VPD_PAGE) && 4791285242Sachim (page != INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE) && 4792285242Sachim (page != INQUIRY_ATA_INFORMATION_VPD_PAGE) && 4793285242Sachim (page != INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE)) 4794285242Sachim { 4795285242Sachim satSetSensePayload( pSense, 4796285242Sachim SCSI_SNSKEY_ILLEGAL_REQUEST, 4797285242Sachim 0, 4798285242Sachim SCSI_SNSCODE_INVALID_FIELD_IN_CDB, 4799285242Sachim satIOContext); 4800285242Sachim 4801285242Sachim ostiInitiatorIOCompleted( tiRoot, 4802285242Sachim tiIORequest, 4803285242Sachim tiIOSuccess, 4804285242Sachim SCSI_STAT_CHECK_CONDITION, 4805285242Sachim satIOContext->pTiSenseData, 4806285242Sachim satIOContext->interruptContext ); 4807285242Sachim 4808285242Sachim TI_DBG1(("satInquiryIntCB: invalid PAGE CODE 0x%x\n", page)); 4809285242Sachim return; 4810285242Sachim } 4811285242Sachim 4812285242Sachim /* checking length */ 4813285242Sachim switch (page) 4814285242Sachim { 4815285242Sachim case INQUIRY_SUPPORTED_VPD_PAGE: 4816285242Sachim lenNeeded = SATA_PAGE0_INQUIRY_SIZE; /* 36 */ 4817285242Sachim break; 4818285242Sachim case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4819285242Sachim if (satDevData->satWWNSupport) 4820285242Sachim { 4821285242Sachim lenNeeded = SATA_PAGE83_INQUIRY_WWN_SIZE; /* 16 */ 4822285242Sachim } 4823285242Sachim else 4824285242Sachim { 4825285242Sachim lenNeeded = SATA_PAGE83_INQUIRY_NO_WWN_SIZE; /* 76 */ 4826285242Sachim } 4827285242Sachim break; 4828285242Sachim case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4829285242Sachim lenNeeded = SATA_PAGE89_INQUIRY_SIZE; /* 572 */ 4830285242Sachim break; 4831285242Sachim case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE: 4832285242Sachim lenNeeded = SATA_PAGE80_INQUIRY_SIZE; /* 24 */ 4833285242Sachim break; 4834285242Sachim 4835285242Sachim default: 4836285242Sachim TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page)); 4837285242Sachim break; 4838285242Sachim } 4839285242Sachim 4840285242Sachim 4841285242Sachim /* 4842285242Sachim * Fill in the Inquiry data depending on what Inquiry data we are returning. 4843285242Sachim */ 4844285242Sachim switch (page) 4845285242Sachim { 4846285242Sachim case INQUIRY_SUPPORTED_VPD_PAGE: 4847285242Sachim satInquiryPage0(pInquiry, pSATAIdData); 4848285242Sachim break; 4849285242Sachim case INQUIRY_DEVICE_IDENTIFICATION_VPD_PAGE: 4850285242Sachim satInquiryPage83(pInquiry, pSATAIdData, satDevData); 4851285242Sachim break; 4852285242Sachim case INQUIRY_ATA_INFORMATION_VPD_PAGE: 4853285242Sachim satInquiryPage89(pInquiry, pSATAIdData, satDevData); 4854285242Sachim break; 4855285242Sachim case INQUIRY_UNIT_SERIAL_NUMBER_VPD_PAGE: 4856285242Sachim satInquiryPage80(pInquiry, pSATAIdData); 4857285242Sachim break; 4858285242Sachim default: 4859285242Sachim TI_DBG1(("satInquiryIntCB: wrong!!! invalidinvalid PAGE CODE 0x%x\n", page)); 4860285242Sachim break; 4861285242Sachim } 4862285242Sachim } /* else */ 4863285242Sachim 4864285242Sachim TI_DBG6(("satInquiryIntCB: calling ostiInitiatorIOCompleted\n")); 4865285242Sachim 4866285242Sachim if (lenReceived > lenNeeded) 4867285242Sachim { 4868285242Sachim TI_DBG6(("satInquiryIntCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n", 4869285242Sachim lenNeeded, lenReceived, tiIORequest)); 4870285242Sachim 4871285242Sachim ostiInitiatorIOCompleted( tiRoot, 4872285242Sachim tiIORequest, 4873285242Sachim tiIOUnderRun, 4874285242Sachim lenReceived - lenNeeded, 4875285242Sachim agNULL, 4876285242Sachim satIOContext->interruptContext ); 4877285242Sachim } 4878285242Sachim else 4879285242Sachim { 4880285242Sachim ostiInitiatorIOCompleted( tiRoot, 4881285242Sachim tiIORequest, 4882285242Sachim tiIOSuccess, 4883285242Sachim SCSI_STAT_GOOD, 4884285242Sachim agNULL, 4885285242Sachim satIOContext->interruptContext); 4886285242Sachim } 4887285242Sachim 4888285242Sachim TI_DBG5(("satInquiryIntCB: device %p pending IO %d\n", satDevData, satDevData->satPendingIO)); 4889285242Sachim TI_DBG6(("satInquiryIntCB: end\n")); 4890285242Sachim return; 4891285242Sachim} 4892285242Sachim 4893285242Sachim 4894285242Sachim/***************************************************************************** 4895285242Sachim*! \brief satVerify10CB 4896285242Sachim* 4897285242Sachim* This routine is a callback function called from ossaSATACompleted(). 4898285242Sachim* This CB routine deals with Verify(10) completion. 4899285242Sachim* 4900285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 4901285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 4902285242Sachim* \param agIOStatus: Status of completed I/O. 4903285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 4904285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 4905285242Sachim* length. 4906285242Sachim* \param agParam: Additional info based on status. 4907285242Sachim* \param ioContext: Pointer to satIOContext_t. 4908285242Sachim* 4909285242Sachim* \return: none 4910285242Sachim* 4911285242Sachim*****************************************************************************/ 4912285242Sachimvoid satVerify10CB( 4913285242Sachim agsaRoot_t *agRoot, 4914285242Sachim agsaIORequest_t *agIORequest, 4915285242Sachim bit32 agIOStatus, 4916285242Sachim agsaFisHeader_t *agFirstDword, 4917285242Sachim bit32 agIOInfoLen, 4918285242Sachim void *agParam, 4919285242Sachim void *ioContext 4920285242Sachim ) 4921285242Sachim{ 4922285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 4923285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 4924285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 4925285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 4926285242Sachim tdIORequestBody_t *tdIORequestBody; 4927285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 4928285242Sachim satIOContext_t *satIOContext; 4929285242Sachim satIOContext_t *satOrgIOContext; 4930285242Sachim satInternalIo_t *satIntIo; 4931285242Sachim satDeviceData_t *satDevData; 4932285242Sachim scsiRspSense_t *pSense; 4933285242Sachim tiIORequest_t *tiOrgIORequest; 4934285242Sachim 4935285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 4936285242Sachim bit32 ataStatus = 0; 4937285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 4938285242Sachim 4939285242Sachim TI_DBG5(("satVerify10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 4940285242Sachim 4941285242Sachim /* internally generate tiIOContext */ 4942285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 4943285242Sachim satIOContext = (satIOContext_t *) ioContext; 4944285242Sachim satIntIo = satIOContext->satIntIoContext; 4945285242Sachim satDevData = satIOContext->pSatDevData; 4946285242Sachim hostToDevFis = satIOContext->pFis; 4947285242Sachim 4948285242Sachim if (satIntIo == agNULL) 4949285242Sachim { 4950285242Sachim TI_DBG4(("satVerify10CB: External satInternalIo_t satIntIoContext\n")); 4951285242Sachim satOrgIOContext = satIOContext; 4952285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 4953285242Sachim pSense = satIOContext->pSense; 4954285242Sachim } 4955285242Sachim else 4956285242Sachim { 4957285242Sachim TI_DBG4(("satVerify10CB: Internal satInternalIo_t satIntIoContext\n")); 4958285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 4959285242Sachim if (satOrgIOContext == agNULL) 4960285242Sachim { 4961285242Sachim TI_DBG4(("satVerify10CB: satOrgIOContext is NULL, wrong\n")); 4962285242Sachim return; 4963285242Sachim } 4964285242Sachim else 4965285242Sachim { 4966285242Sachim TI_DBG4(("satVerify10CB: satOrgIOContext is NOT NULL\n")); 4967285242Sachim } 4968285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 4969285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 4970285242Sachim pSense = satOrgIOContext->pSense; 4971285242Sachim } 4972285242Sachim 4973285242Sachim tdIORequestBody->ioCompleted = agTRUE; 4974285242Sachim tdIORequestBody->ioStarted = agFALSE; 4975285242Sachim 4976285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 4977285242Sachim { 4978285242Sachim TI_DBG1(("satVerify10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 4979285242Sachim satSetSensePayload( pSense, 4980285242Sachim SCSI_SNSKEY_NO_SENSE, 4981285242Sachim 0, 4982285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 4983285242Sachim satOrgIOContext); 4984285242Sachim 4985285242Sachim ostiInitiatorIOCompleted( tiRoot, 4986285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 4987285242Sachim tiIOSuccess, 4988285242Sachim SCSI_STAT_CHECK_CONDITION, 4989285242Sachim satOrgIOContext->pTiSenseData, 4990285242Sachim satOrgIOContext->interruptContext ); 4991285242Sachim 4992285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 4993285242Sachim 4994285242Sachim satFreeIntIoResource( tiRoot, 4995285242Sachim satDevData, 4996285242Sachim satIntIo); 4997285242Sachim return; 4998285242Sachim } 4999285242Sachim 5000285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 5001285242Sachim { 5002285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 5003285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5004285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5005285242Sachim } 5006285242Sachim 5007285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 5008285242Sachim { 5009285242Sachim if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 5010285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 5011285242Sachim ) 5012285242Sachim { 5013285242Sachim /* for debugging */ 5014285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 5015285242Sachim { 5016285242Sachim TI_DBG1(("satVerify10CB: FAILED, NOT IO_SUCCESS\n")); 5017285242Sachim } 5018285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5019285242Sachim { 5020285242Sachim TI_DBG1(("satVerify10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5021285242Sachim } 5022285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5023285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 5024285242Sachim ) 5025285242Sachim { 5026285242Sachim TI_DBG1(("satVerify10CB: FAILED, FAILED, error status\n")); 5027285242Sachim } 5028285242Sachim 5029285242Sachim /* Process abort case */ 5030285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 5031285242Sachim { 5032285242Sachim satProcessAbort(tiRoot, 5033285242Sachim tiOrgIORequest, 5034285242Sachim satOrgIOContext 5035285242Sachim ); 5036285242Sachim 5037285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5038285242Sachim 5039285242Sachim satFreeIntIoResource( tiRoot, 5040285242Sachim satDevData, 5041285242Sachim satIntIo); 5042285242Sachim return; 5043285242Sachim } 5044285242Sachim 5045285242Sachim /* for debugging */ 5046285242Sachim switch (hostToDevFis->h.command) 5047285242Sachim { 5048285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 5049285242Sachim TI_DBG1(("satVerify10CB: SAT_READ_VERIFY_SECTORS_EXT\n")); 5050285242Sachim break; 5051285242Sachim default: 5052285242Sachim TI_DBG1(("satVerify10CB: error default case command 0x%x\n", hostToDevFis->h.command)); 5053285242Sachim break; 5054285242Sachim } 5055285242Sachim 5056285242Sachim satSetSensePayload( pSense, 5057285242Sachim SCSI_SNSKEY_NO_SENSE, 5058285242Sachim 0, 5059285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5060285242Sachim satOrgIOContext); 5061285242Sachim 5062285242Sachim ostiInitiatorIOCompleted( tiRoot, 5063285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5064285242Sachim tiIOSuccess, 5065285242Sachim SCSI_STAT_CHECK_CONDITION, 5066285242Sachim satOrgIOContext->pTiSenseData, 5067285242Sachim satOrgIOContext->interruptContext ); 5068285242Sachim 5069285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5070285242Sachim 5071285242Sachim satFreeIntIoResource( tiRoot, 5072285242Sachim satDevData, 5073285242Sachim satIntIo); 5074285242Sachim return; 5075285242Sachim } /* end error checking */ 5076285242Sachim } 5077285242Sachim 5078285242Sachim /* process success from this point on */ 5079285242Sachim switch (hostToDevFis->h.command) 5080285242Sachim { 5081285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 5082285242Sachim TI_DBG5(("satVerify10CB: SAT_WRITE_DMA_EXT success \n")); 5083285242Sachim 5084285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5085285242Sachim 5086285242Sachim satFreeIntIoResource( tiRoot, 5087285242Sachim satDevData, 5088285242Sachim satIntIo); 5089285242Sachim 5090285242Sachim ostiInitiatorIOCompleted( tiRoot, 5091285242Sachim tiOrgIORequest, 5092285242Sachim tiIOSuccess, 5093285242Sachim SCSI_STAT_GOOD, 5094285242Sachim agNULL, 5095285242Sachim satOrgIOContext->interruptContext); 5096285242Sachim break; 5097285242Sachim default: 5098285242Sachim TI_DBG1(("satVerify10CB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 5099285242Sachim 5100285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5101285242Sachim 5102285242Sachim satFreeIntIoResource( tiRoot, 5103285242Sachim satDevData, 5104285242Sachim satIntIo); 5105285242Sachim 5106285242Sachim satSetSensePayload( pSense, 5107285242Sachim SCSI_SNSKEY_NO_SENSE, 5108285242Sachim 0, 5109285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5110285242Sachim satOrgIOContext); 5111285242Sachim 5112285242Sachim ostiInitiatorIOCompleted( tiRoot, 5113285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5114285242Sachim tiIOSuccess, 5115285242Sachim SCSI_STAT_CHECK_CONDITION, 5116285242Sachim satOrgIOContext->pTiSenseData, 5117285242Sachim satOrgIOContext->interruptContext ); 5118285242Sachim 5119285242Sachim break; 5120285242Sachim } 5121285242Sachim 5122285242Sachim return; 5123285242Sachim} 5124285242Sachim 5125285242Sachim/* similar to satVerify10CB */ 5126285242Sachimvoid satNonChainedVerifyCB( 5127285242Sachim agsaRoot_t *agRoot, 5128285242Sachim agsaIORequest_t *agIORequest, 5129285242Sachim bit32 agIOStatus, 5130285242Sachim agsaFisHeader_t *agFirstDword, 5131285242Sachim bit32 agIOInfoLen, 5132285242Sachim agsaFrameHandle_t agFrameHandle, 5133285242Sachim void *ioContext 5134285242Sachim ) 5135285242Sachim{ 5136285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5137285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5138285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 5139285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 5140285242Sachim tdIORequestBody_t *tdIORequestBody; 5141285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 5142285242Sachim satIOContext_t *satIOContext; 5143285242Sachim satIOContext_t *satOrgIOContext; 5144285242Sachim satInternalIo_t *satIntIo; 5145285242Sachim satDeviceData_t *satDevData; 5146285242Sachim scsiRspSense_t *pSense; 5147285242Sachim tiIORequest_t *tiOrgIORequest; 5148285242Sachim 5149285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 5150285242Sachim bit32 ataStatus = 0; 5151285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 5152285242Sachim 5153285242Sachim TI_DBG5(("satNonChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 5154285242Sachim 5155285242Sachim /* internally generate tiIOContext */ 5156285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5157285242Sachim satIOContext = (satIOContext_t *) ioContext; 5158285242Sachim satIntIo = satIOContext->satIntIoContext; 5159285242Sachim satDevData = satIOContext->pSatDevData; 5160285242Sachim hostToDevFis = satIOContext->pFis; 5161285242Sachim 5162285242Sachim if (satIntIo == agNULL) 5163285242Sachim { 5164285242Sachim TI_DBG4(("satNonChainedVerifyCB: External satInternalIo_t satIntIoContext\n")); 5165285242Sachim satOrgIOContext = satIOContext; 5166285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 5167285242Sachim pSense = satIOContext->pSense; 5168285242Sachim } 5169285242Sachim else 5170285242Sachim { 5171285242Sachim TI_DBG4(("satNonChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 5172285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 5173285242Sachim if (satOrgIOContext == agNULL) 5174285242Sachim { 5175285242Sachim TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NULL, wrong\n")); 5176285242Sachim return; 5177285242Sachim } 5178285242Sachim else 5179285242Sachim { 5180285242Sachim TI_DBG4(("satNonChainedVerifyCB: satOrgIOContext is NOT NULL\n")); 5181285242Sachim } 5182285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 5183285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 5184285242Sachim pSense = satOrgIOContext->pSense; 5185285242Sachim } 5186285242Sachim 5187285242Sachim tdIORequestBody->ioCompleted = agTRUE; 5188285242Sachim tdIORequestBody->ioStarted = agFALSE; 5189285242Sachim 5190285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 5191285242Sachim { 5192285242Sachim TI_DBG1(("satNonChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 5193285242Sachim satSetSensePayload( pSense, 5194285242Sachim SCSI_SNSKEY_NO_SENSE, 5195285242Sachim 0, 5196285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5197285242Sachim satOrgIOContext); 5198285242Sachim 5199285242Sachim ostiInitiatorIOCompleted( tiRoot, 5200285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5201285242Sachim tiIOSuccess, 5202285242Sachim SCSI_STAT_CHECK_CONDITION, 5203285242Sachim satOrgIOContext->pTiSenseData, 5204285242Sachim satOrgIOContext->interruptContext ); 5205285242Sachim 5206285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5207285242Sachim 5208285242Sachim satFreeIntIoResource( tiRoot, 5209285242Sachim satDevData, 5210285242Sachim satIntIo); 5211285242Sachim return; 5212285242Sachim } 5213285242Sachim 5214285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 5215285242Sachim { 5216285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 5217285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5218285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5219285242Sachim } 5220285242Sachim 5221285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 5222285242Sachim { 5223285242Sachim if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 5224285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 5225285242Sachim ) 5226285242Sachim { 5227285242Sachim /* for debugging */ 5228285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 5229285242Sachim { 5230285242Sachim TI_DBG1(("satNonChainedVerifyCB: FAILED, NOT IO_SUCCESS\n")); 5231285242Sachim } 5232285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5233285242Sachim { 5234285242Sachim TI_DBG1(("satNonChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5235285242Sachim } 5236285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5237285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 5238285242Sachim ) 5239285242Sachim { 5240285242Sachim TI_DBG1(("satNonChainedVerifyCB: FAILED, FAILED, error status\n")); 5241285242Sachim } 5242285242Sachim 5243285242Sachim /* Process abort case */ 5244285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 5245285242Sachim { 5246285242Sachim satProcessAbort(tiRoot, 5247285242Sachim tiOrgIORequest, 5248285242Sachim satOrgIOContext 5249285242Sachim ); 5250285242Sachim 5251285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5252285242Sachim 5253285242Sachim satFreeIntIoResource( tiRoot, 5254285242Sachim satDevData, 5255285242Sachim satIntIo); 5256285242Sachim return; 5257285242Sachim } 5258285242Sachim 5259285242Sachim /* for debugging */ 5260285242Sachim switch (hostToDevFis->h.command) 5261285242Sachim { 5262285242Sachim case SAT_READ_VERIFY_SECTORS: 5263285242Sachim TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n")); 5264285242Sachim break; 5265285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 5266285242Sachim TI_DBG1(("satNonChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n")); 5267285242Sachim break; 5268285242Sachim default: 5269285242Sachim TI_DBG1(("satNonChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command)); 5270285242Sachim break; 5271285242Sachim } 5272285242Sachim 5273285242Sachim satSetSensePayload( pSense, 5274285242Sachim SCSI_SNSKEY_NO_SENSE, 5275285242Sachim 0, 5276285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5277285242Sachim satOrgIOContext); 5278285242Sachim 5279285242Sachim ostiInitiatorIOCompleted( tiRoot, 5280285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5281285242Sachim tiIOSuccess, 5282285242Sachim SCSI_STAT_CHECK_CONDITION, 5283285242Sachim satOrgIOContext->pTiSenseData, 5284285242Sachim satOrgIOContext->interruptContext ); 5285285242Sachim 5286285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5287285242Sachim 5288285242Sachim satFreeIntIoResource( tiRoot, 5289285242Sachim satDevData, 5290285242Sachim satIntIo); 5291285242Sachim return; 5292285242Sachim } /* end error checking */ 5293285242Sachim } 5294285242Sachim 5295285242Sachim /* process success from this point on */ 5296285242Sachim switch (hostToDevFis->h.command) 5297285242Sachim { 5298285242Sachim case SAT_READ_VERIFY_SECTORS: /* fall through */ 5299285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 5300285242Sachim TI_DBG5(("satNonChainedVerifyCB: SAT_WRITE_DMA_EXT success \n")); 5301285242Sachim 5302285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5303285242Sachim 5304285242Sachim satFreeIntIoResource( tiRoot, 5305285242Sachim satDevData, 5306285242Sachim satIntIo); 5307285242Sachim 5308285242Sachim ostiInitiatorIOCompleted( tiRoot, 5309285242Sachim tiOrgIORequest, 5310285242Sachim tiIOSuccess, 5311285242Sachim SCSI_STAT_GOOD, 5312285242Sachim agNULL, 5313285242Sachim satOrgIOContext->interruptContext); 5314285242Sachim break; 5315285242Sachim default: 5316285242Sachim TI_DBG1(("satNonChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 5317285242Sachim 5318285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5319285242Sachim 5320285242Sachim satFreeIntIoResource( tiRoot, 5321285242Sachim satDevData, 5322285242Sachim satIntIo); 5323285242Sachim 5324285242Sachim satSetSensePayload( pSense, 5325285242Sachim SCSI_SNSKEY_NO_SENSE, 5326285242Sachim 0, 5327285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5328285242Sachim satOrgIOContext); 5329285242Sachim 5330285242Sachim ostiInitiatorIOCompleted( tiRoot, 5331285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5332285242Sachim tiIOSuccess, 5333285242Sachim SCSI_STAT_CHECK_CONDITION, 5334285242Sachim satOrgIOContext->pTiSenseData, 5335285242Sachim satOrgIOContext->interruptContext ); 5336285242Sachim 5337285242Sachim break; 5338285242Sachim } 5339285242Sachim 5340285242Sachim return; 5341285242Sachim} 5342285242Sachim 5343285242Sachimvoid satChainedVerifyCB( 5344285242Sachim agsaRoot_t *agRoot, 5345285242Sachim agsaIORequest_t *agIORequest, 5346285242Sachim bit32 agIOStatus, 5347285242Sachim agsaFisHeader_t *agFirstDword, 5348285242Sachim bit32 agIOInfoLen, 5349285242Sachim agsaFrameHandle_t agFrameHandle, 5350285242Sachim void *ioContext 5351285242Sachim ) 5352285242Sachim{ 5353285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5354285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5355285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 5356285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 5357285242Sachim tdIORequestBody_t *tdIORequestBody; 5358285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 5359285242Sachim satIOContext_t *satIOContext; 5360285242Sachim satIOContext_t *satOrgIOContext; 5361285242Sachim satIOContext_t *satNewIOContext; 5362285242Sachim satInternalIo_t *satIntIo; 5363285242Sachim satInternalIo_t *satNewIntIo = agNULL; 5364285242Sachim satDeviceData_t *satDevData; 5365285242Sachim scsiRspSense_t *pSense; 5366285242Sachim tiIniScsiCmnd_t *scsiCmnd; 5367285242Sachim tiIORequest_t *tiOrgIORequest; 5368285242Sachim 5369285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 5370285242Sachim bit32 ataStatus = 0; 5371285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 5372285242Sachim bit32 status = tiError; 5373285242Sachim bit32 dataLength; 5374285242Sachim 5375285242Sachim TI_DBG5(("satChainedVerifyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 5376285242Sachim 5377285242Sachim /* internally generate tiIOContext */ 5378285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5379285242Sachim satIOContext = (satIOContext_t *) ioContext; 5380285242Sachim satIntIo = satIOContext->satIntIoContext; 5381285242Sachim satDevData = satIOContext->pSatDevData; 5382285242Sachim hostToDevFis = satIOContext->pFis; 5383285242Sachim 5384285242Sachim if (satIntIo == agNULL) 5385285242Sachim { 5386285242Sachim TI_DBG4(("satChainedVerifyCB: External satInternalIo_t satIntIoContext\n")); 5387285242Sachim satOrgIOContext = satIOContext; 5388285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 5389285242Sachim pSense = satIOContext->pSense; 5390285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 5391285242Sachim } 5392285242Sachim else 5393285242Sachim { 5394285242Sachim TI_DBG4(("satChainedVerifyCB: Internal satInternalIo_t satIntIoContext\n")); 5395285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 5396285242Sachim if (satOrgIOContext == agNULL) 5397285242Sachim { 5398285242Sachim TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NULL, wrong\n")); 5399285242Sachim return; 5400285242Sachim } 5401285242Sachim else 5402285242Sachim { 5403285242Sachim TI_DBG4(("satChainedVerifyCB: satOrgIOContext is NOT NULL\n")); 5404285242Sachim } 5405285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 5406285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 5407285242Sachim pSense = satOrgIOContext->pSense; 5408285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 5409285242Sachim } 5410285242Sachim 5411285242Sachim tdIORequestBody->ioCompleted = agTRUE; 5412285242Sachim tdIORequestBody->ioStarted = agFALSE; 5413285242Sachim 5414285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 5415285242Sachim { 5416285242Sachim TI_DBG1(("satChainedVerifyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 5417285242Sachim satSetSensePayload( pSense, 5418285242Sachim SCSI_SNSKEY_NO_SENSE, 5419285242Sachim 0, 5420285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5421285242Sachim satOrgIOContext); 5422285242Sachim 5423285242Sachim ostiInitiatorIOCompleted( tiRoot, 5424285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5425285242Sachim tiIOSuccess, 5426285242Sachim SCSI_STAT_CHECK_CONDITION, 5427285242Sachim satOrgIOContext->pTiSenseData, 5428285242Sachim satOrgIOContext->interruptContext ); 5429285242Sachim 5430285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5431285242Sachim 5432285242Sachim satFreeIntIoResource( tiRoot, 5433285242Sachim satDevData, 5434285242Sachim satIntIo); 5435285242Sachim return; 5436285242Sachim } 5437285242Sachim 5438285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 5439285242Sachim { 5440285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 5441285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5442285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5443285242Sachim } 5444285242Sachim 5445285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 5446285242Sachim { 5447285242Sachim if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 5448285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 5449285242Sachim ) 5450285242Sachim { 5451285242Sachim /* for debugging */ 5452285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 5453285242Sachim { 5454285242Sachim TI_DBG1(("satChainedVerifyCB: FAILED, NOT IO_SUCCESS\n")); 5455285242Sachim } 5456285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5457285242Sachim { 5458285242Sachim TI_DBG1(("satChainedVerifyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5459285242Sachim } 5460285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5461285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 5462285242Sachim ) 5463285242Sachim { 5464285242Sachim TI_DBG1(("satChainedVerifyCB: FAILED, FAILED, error status\n")); 5465285242Sachim } 5466285242Sachim 5467285242Sachim /* Process abort case */ 5468285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 5469285242Sachim { 5470285242Sachim satProcessAbort(tiRoot, 5471285242Sachim tiOrgIORequest, 5472285242Sachim satOrgIOContext 5473285242Sachim ); 5474285242Sachim 5475285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5476285242Sachim 5477285242Sachim satFreeIntIoResource( tiRoot, 5478285242Sachim satDevData, 5479285242Sachim satIntIo); 5480285242Sachim return; 5481285242Sachim } 5482285242Sachim 5483285242Sachim /* for debugging */ 5484285242Sachim switch (hostToDevFis->h.command) 5485285242Sachim { 5486285242Sachim case SAT_READ_VERIFY_SECTORS: 5487285242Sachim TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS\n")); 5488285242Sachim break; 5489285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 5490285242Sachim TI_DBG1(("satChainedVerifyCB: SAT_READ_VERIFY_SECTORS_EXT\n")); 5491285242Sachim break; 5492285242Sachim default: 5493285242Sachim TI_DBG1(("satChainedVerifyCB: error default case command 0x%x\n", hostToDevFis->h.command)); 5494285242Sachim break; 5495285242Sachim } 5496285242Sachim 5497285242Sachim satSetSensePayload( pSense, 5498285242Sachim SCSI_SNSKEY_NO_SENSE, 5499285242Sachim 0, 5500285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5501285242Sachim satOrgIOContext); 5502285242Sachim 5503285242Sachim ostiInitiatorIOCompleted( tiRoot, 5504285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5505285242Sachim tiIOSuccess, 5506285242Sachim SCSI_STAT_CHECK_CONDITION, 5507285242Sachim satOrgIOContext->pTiSenseData, 5508285242Sachim satOrgIOContext->interruptContext ); 5509285242Sachim 5510285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5511285242Sachim 5512285242Sachim satFreeIntIoResource( tiRoot, 5513285242Sachim satDevData, 5514285242Sachim satIntIo); 5515285242Sachim return; 5516285242Sachim } /* end error checking */ 5517285242Sachim } 5518285242Sachim 5519285242Sachim /* process success from this point on */ 5520285242Sachim switch (hostToDevFis->h.command) 5521285242Sachim { 5522285242Sachim case SAT_READ_VERIFY_SECTORS: /* fall through */ 5523285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 5524285242Sachim TI_DBG5(("satChainedVerifyCB: SAT_WRITE_DMA_EXT success \n")); 5525285242Sachim 5526285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5527285242Sachim 5528285242Sachim satFreeIntIoResource( tiRoot, 5529285242Sachim satDevData, 5530285242Sachim satIntIo); 5531285242Sachim 5532285242Sachim /* let's loop till TL */ 5533285242Sachim 5534285242Sachim /* lba = lba + tl 5535285242Sachim loopnum--; 5536285242Sachim if (loopnum == 0) done 5537285242Sachim */ 5538285242Sachim (satOrgIOContext->LoopNum)--; 5539285242Sachim if (satOrgIOContext->LoopNum == 0) 5540285242Sachim { 5541285242Sachim /* 5542285242Sachim done with write and verify 5543285242Sachim */ 5544285242Sachim ostiInitiatorIOCompleted( tiRoot, 5545285242Sachim 5546285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5547285242Sachim tiIOSuccess, 5548285242Sachim SCSI_STAT_GOOD, 5549285242Sachim agNULL, 5550285242Sachim satOrgIOContext->interruptContext ); 5551285242Sachim return; 5552285242Sachim } 5553285242Sachim 5554285242Sachim if (satOrgIOContext->superIOFlag) 5555285242Sachim { 5556285242Sachim dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 5557285242Sachim } 5558285242Sachim else 5559285242Sachim { 5560285242Sachim dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 5561285242Sachim } 5562285242Sachim 5563285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 5564285242Sachim tiOrgIORequest, 5565285242Sachim satDevData, 5566285242Sachim dataLength, 5567285242Sachim satNewIntIo); 5568285242Sachim if (satNewIntIo == agNULL) 5569285242Sachim { 5570285242Sachim /* memory allocation failure */ 5571285242Sachim satFreeIntIoResource( tiRoot, 5572285242Sachim satDevData, 5573285242Sachim satNewIntIo); 5574285242Sachim ostiInitiatorIOCompleted( tiRoot, 5575285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5576285242Sachim tiIOFailed, 5577285242Sachim tiDetailOtherError, 5578285242Sachim agNULL, 5579285242Sachim satOrgIOContext->interruptContext ); 5580285242Sachim 5581285242Sachim TI_DBG1(("satChainedVerifyCB: momory allocation fails\n")); 5582285242Sachim return; 5583285242Sachim } /* end of memory allocation failure */ 5584285242Sachim 5585285242Sachim /* 5586285242Sachim * Need to initialize all the fields within satIOContext 5587285242Sachim */ 5588285242Sachim 5589285242Sachim satNewIOContext = satPrepareNewIO( 5590285242Sachim satNewIntIo, 5591285242Sachim tiOrgIORequest, 5592285242Sachim satDevData, 5593285242Sachim scsiCmnd, 5594285242Sachim satOrgIOContext 5595285242Sachim ); 5596285242Sachim status = satChainedVerify(tiRoot, 5597285242Sachim &satNewIntIo->satIntTiIORequest, 5598285242Sachim satNewIOContext->ptiDeviceHandle, 5599285242Sachim &satNewIntIo->satIntTiScsiXchg, 5600285242Sachim satNewIOContext); 5601285242Sachim 5602285242Sachim if (status != tiSuccess) 5603285242Sachim { 5604285242Sachim satFreeIntIoResource( tiRoot, 5605285242Sachim satDevData, 5606285242Sachim satNewIntIo); 5607285242Sachim ostiInitiatorIOCompleted( tiRoot, 5608285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5609285242Sachim tiIOFailed, 5610285242Sachim tiDetailOtherError, 5611285242Sachim agNULL, 5612285242Sachim satOrgIOContext->interruptContext ); 5613285242Sachim TI_DBG1(("satChainedVerifyCB: calling satChainedVerify fails\n")); 5614285242Sachim return; 5615285242Sachim } 5616285242Sachim 5617285242Sachim break; 5618285242Sachim default: 5619285242Sachim TI_DBG1(("satChainedVerifyCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 5620285242Sachim 5621285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5622285242Sachim 5623285242Sachim satFreeIntIoResource( tiRoot, 5624285242Sachim satDevData, 5625285242Sachim satIntIo); 5626285242Sachim 5627285242Sachim satSetSensePayload( pSense, 5628285242Sachim SCSI_SNSKEY_NO_SENSE, 5629285242Sachim 0, 5630285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 5631285242Sachim satOrgIOContext); 5632285242Sachim 5633285242Sachim ostiInitiatorIOCompleted( tiRoot, 5634285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5635285242Sachim tiIOSuccess, 5636285242Sachim SCSI_STAT_CHECK_CONDITION, 5637285242Sachim satOrgIOContext->pTiSenseData, 5638285242Sachim satOrgIOContext->interruptContext ); 5639285242Sachim 5640285242Sachim break; 5641285242Sachim } 5642285242Sachim return; 5643285242Sachim} 5644285242Sachim 5645285242Sachim/***************************************************************************** 5646285242Sachim*! \brief satTestUnitReadyCB 5647285242Sachim* 5648285242Sachim* This routine is a callback function for satTestUnitReady() 5649285242Sachim* 5650285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 5651285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 5652285242Sachim* \param agIOStatus: Status of completed I/O. 5653285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 5654285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 5655285242Sachim* length. 5656285242Sachim* \param agParam: Additional info based on status. 5657285242Sachim* \param ioContext: Pointer to satIOContext_t. 5658285242Sachim* 5659285242Sachim* \return: none 5660285242Sachim* 5661285242Sachim*****************************************************************************/ 5662285242Sachimvoid satTestUnitReadyCB( 5663285242Sachim agsaRoot_t *agRoot, 5664285242Sachim agsaIORequest_t *agIORequest, 5665285242Sachim bit32 agIOStatus, 5666285242Sachim agsaFisHeader_t *agFirstDword, 5667285242Sachim bit32 agIOInfoLen, 5668285242Sachim void *agParam, 5669285242Sachim void *ioContext 5670285242Sachim ) 5671285242Sachim{ 5672285242Sachim /* 5673285242Sachim In the process of TestUnitReady 5674285242Sachim Process SAT_GET_MEDIA_STATUS 5675285242Sachim Process SAT_CHECK_POWER_MODE 5676285242Sachim */ 5677285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 5678285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 5679285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 5680285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 5681285242Sachim tdIORequestBody_t *tdIORequestBody; 5682285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 5683285242Sachim satIOContext_t *satIOContext; 5684285242Sachim satIOContext_t *satOrgIOContext; 5685285242Sachim satIOContext_t *satNewIOContext; 5686285242Sachim satInternalIo_t *satIntIo; 5687285242Sachim satInternalIo_t *satNewIntIo = agNULL; 5688285242Sachim satDeviceData_t *satDevData; 5689285242Sachim scsiRspSense_t *pSense; 5690285242Sachim tiIniScsiCmnd_t *scsiCmnd; 5691285242Sachim tiIORequest_t *tiOrgIORequest; 5692285242Sachim 5693285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 5694285242Sachim bit32 ataStatus = 0; 5695285242Sachim bit32 ataError; 5696285242Sachim 5697285242Sachim bit32 status; 5698285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 5699285242Sachim 5700285242Sachim TI_DBG6(("satTestUnitReadyCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 5701285242Sachim 5702285242Sachim /* internally generate tiIOContext */ 5703285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 5704285242Sachim satIOContext = (satIOContext_t *) ioContext; 5705285242Sachim satIntIo = satIOContext->satIntIoContext; 5706285242Sachim satDevData = satIOContext->pSatDevData; 5707285242Sachim hostToDevFis = satIOContext->pFis; 5708285242Sachim 5709285242Sachim if (satIntIo == agNULL) 5710285242Sachim { 5711285242Sachim TI_DBG5(("satTestUnitReadyCB: no internal satInternalIo_t satIntIoContext\n")); 5712285242Sachim pSense = satIOContext->pSense; 5713285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 5714285242Sachim satOrgIOContext = satIOContext; 5715285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 5716285242Sachim } 5717285242Sachim else 5718285242Sachim { 5719285242Sachim TI_DBG5(("satTestUnitReadyCB: yes internal satInternalIo_t satIntIoContext\n")); 5720285242Sachim 5721285242Sachim /* orginal tiIOContext */ 5722285242Sachim tiOrgIORequest = (tiIORequest_t *)satIOContext->satIntIoContext->satOrgTiIORequest; 5723285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)tiOrgIORequest->tdData; 5724285242Sachim satOrgIOContext = &(tdOrgIORequestBody->transport.SATA.satIOContext); 5725285242Sachim 5726285242Sachim pSense = satOrgIOContext->pSense; 5727285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 5728285242Sachim } 5729285242Sachim 5730285242Sachim tdIORequestBody->ioCompleted = agTRUE; 5731285242Sachim tdIORequestBody->ioStarted = agFALSE; 5732285242Sachim 5733285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 5734285242Sachim { 5735285242Sachim TI_DBG1(("satTestUnitReadyCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 5736285242Sachim satSetSensePayload( pSense, 5737285242Sachim SCSI_SNSKEY_NOT_READY, 5738285242Sachim 0, 5739285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5740285242Sachim satOrgIOContext); 5741285242Sachim 5742285242Sachim ostiInitiatorIOCompleted( tiRoot, 5743285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5744285242Sachim tiIOSuccess, 5745285242Sachim SCSI_STAT_CHECK_CONDITION, 5746285242Sachim satOrgIOContext->pTiSenseData, 5747285242Sachim satOrgIOContext->interruptContext ); 5748285242Sachim 5749285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5750285242Sachim 5751285242Sachim satFreeIntIoResource( tiRoot, 5752285242Sachim satDevData, 5753285242Sachim satIntIo); 5754285242Sachim 5755285242Sachim return; 5756285242Sachim } 5757285242Sachim /* 5758285242Sachim HW checks an error for us and the results is agIOStatus 5759285242Sachim */ 5760285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 5761285242Sachim { 5762285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 5763285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 5764285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 5765285242Sachim ataError = statDevToHostFisHeader->error; /* ATA Eror register */ 5766285242Sachim 5767285242Sachim if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 5768285242Sachim { 5769285242Sachim TI_DBG1(("satTestUnitReadyCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 5770285242Sachim } 5771285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 5772285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 5773285242Sachim ) 5774285242Sachim { 5775285242Sachim TI_DBG1(("satTestUnitReadyCB: FAILED, FAILED, error status\n")); 5776285242Sachim } 5777285242Sachim 5778285242Sachim /* Process abort case */ 5779285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 5780285242Sachim { 5781285242Sachim satProcessAbort(tiRoot, 5782285242Sachim tiOrgIORequest, 5783285242Sachim satOrgIOContext 5784285242Sachim ); 5785285242Sachim 5786285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5787285242Sachim 5788285242Sachim satFreeIntIoResource( tiRoot, 5789285242Sachim satDevData, 5790285242Sachim satIntIo); 5791285242Sachim return; 5792285242Sachim } 5793285242Sachim 5794285242Sachim switch (hostToDevFis->h.command) 5795285242Sachim { 5796285242Sachim case SAT_GET_MEDIA_STATUS: 5797285242Sachim TI_DBG1(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS failed \n")); 5798285242Sachim 5799285242Sachim /* checking NM bit */ 5800285242Sachim if (ataError & SCSI_NM_MASK) 5801285242Sachim { 5802285242Sachim satSetSensePayload( pSense, 5803285242Sachim SCSI_SNSKEY_NOT_READY, 5804285242Sachim 0, 5805285242Sachim SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 5806285242Sachim satOrgIOContext); 5807285242Sachim } 5808285242Sachim else 5809285242Sachim { 5810285242Sachim satSetSensePayload( pSense, 5811285242Sachim SCSI_SNSKEY_NOT_READY, 5812285242Sachim 0, 5813285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5814285242Sachim satOrgIOContext); 5815285242Sachim } 5816285242Sachim 5817285242Sachim ostiInitiatorIOCompleted( tiRoot, 5818285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5819285242Sachim tiIOSuccess, 5820285242Sachim SCSI_STAT_CHECK_CONDITION, 5821285242Sachim satOrgIOContext->pTiSenseData, 5822285242Sachim satOrgIOContext->interruptContext ); 5823285242Sachim 5824285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5825285242Sachim 5826285242Sachim satFreeIntIoResource( tiRoot, 5827285242Sachim satDevData, 5828285242Sachim satIntIo); 5829285242Sachim break; 5830285242Sachim case SAT_CHECK_POWER_MODE: 5831285242Sachim TI_DBG1(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE failed \n")); 5832285242Sachim satSetSensePayload( pSense, 5833285242Sachim SCSI_SNSKEY_NOT_READY, 5834285242Sachim 0, 5835285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_DOES_NOT_RESPOND_TO_SELECTION, 5836285242Sachim satOrgIOContext); 5837285242Sachim 5838285242Sachim ostiInitiatorIOCompleted( tiRoot, 5839285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5840285242Sachim tiIOSuccess, 5841285242Sachim SCSI_STAT_CHECK_CONDITION, 5842285242Sachim satOrgIOContext->pTiSenseData, 5843285242Sachim satOrgIOContext->interruptContext ); 5844285242Sachim 5845285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5846285242Sachim 5847285242Sachim satFreeIntIoResource( tiRoot, 5848285242Sachim satDevData, 5849285242Sachim satIntIo); 5850285242Sachim break; 5851285242Sachim default: 5852285242Sachim TI_DBG1(("satTestUnitReadyCB: default failed command %d\n", hostToDevFis->h.command)); 5853285242Sachim 5854285242Sachim satSetSensePayload( pSense, 5855285242Sachim SCSI_SNSKEY_NOT_READY, 5856285242Sachim 0, 5857285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5858285242Sachim satOrgIOContext); 5859285242Sachim 5860285242Sachim ostiInitiatorIOCompleted( tiRoot, 5861285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5862285242Sachim tiIOSuccess, 5863285242Sachim SCSI_STAT_CHECK_CONDITION, 5864285242Sachim satOrgIOContext->pTiSenseData, 5865285242Sachim satOrgIOContext->interruptContext ); 5866285242Sachim 5867285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5868285242Sachim 5869285242Sachim satFreeIntIoResource( tiRoot, 5870285242Sachim satDevData, 5871285242Sachim satIntIo); 5872285242Sachim break; 5873285242Sachim 5874285242Sachim } 5875285242Sachim return; 5876285242Sachim }/* end error */ 5877285242Sachim 5878285242Sachim /* ATA command completes sucessfully */ 5879285242Sachim switch (hostToDevFis->h.command) 5880285242Sachim { 5881285242Sachim case SAT_GET_MEDIA_STATUS: 5882285242Sachim 5883285242Sachim TI_DBG5(("satTestUnitReadyCB: SAT_GET_MEDIA_STATUS success\n")); 5884285242Sachim 5885285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5886285242Sachim 5887285242Sachim satFreeIntIoResource( tiRoot, 5888285242Sachim satDevData, 5889285242Sachim satIntIo); 5890285242Sachim 5891285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 5892285242Sachim tiOrgIORequest, 5893285242Sachim satDevData, 5894285242Sachim 0, 5895285242Sachim satNewIntIo); 5896285242Sachim if (satNewIntIo == agNULL) 5897285242Sachim { 5898285242Sachim /* memory allocation failure */ 5899285242Sachim satFreeIntIoResource( tiRoot, 5900285242Sachim satDevData, 5901285242Sachim satNewIntIo); 5902285242Sachim satSetSensePayload( pSense, 5903285242Sachim SCSI_SNSKEY_NOT_READY, 5904285242Sachim 0, 5905285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5906285242Sachim satOrgIOContext); 5907285242Sachim 5908285242Sachim ostiInitiatorIOCompleted( tiRoot, 5909285242Sachim tiOrgIORequest, 5910285242Sachim tiIOSuccess, 5911285242Sachim SCSI_STAT_CHECK_CONDITION, 5912285242Sachim satOrgIOContext->pTiSenseData, 5913285242Sachim satOrgIOContext->interruptContext ); 5914285242Sachim 5915285242Sachim TI_DBG1(("satTestUnitReadyCB: momory allocation fails\n")); 5916285242Sachim return; 5917285242Sachim } 5918285242Sachim 5919285242Sachim /* 5920285242Sachim * Need to initialize all the fields within satIOContext 5921285242Sachim */ 5922285242Sachim 5923285242Sachim satNewIOContext = satPrepareNewIO( 5924285242Sachim satNewIntIo, 5925285242Sachim tiOrgIORequest, 5926285242Sachim satDevData, 5927285242Sachim scsiCmnd, 5928285242Sachim satOrgIOContext 5929285242Sachim ); 5930285242Sachim 5931285242Sachim /* sends SAT_CHECK_POWER_MODE */ 5932285242Sachim status = satTestUnitReady_1( tiRoot, 5933285242Sachim &satNewIntIo->satIntTiIORequest, 5934285242Sachim satNewIOContext->ptiDeviceHandle, 5935285242Sachim &satNewIntIo->satIntTiScsiXchg, 5936285242Sachim satNewIOContext); 5937285242Sachim 5938285242Sachim if (status != tiSuccess) 5939285242Sachim { 5940285242Sachim /* sending SAT_CHECK_POWER_MODE fails */ 5941285242Sachim satFreeIntIoResource( tiRoot, 5942285242Sachim satDevData, 5943285242Sachim satNewIntIo); 5944285242Sachim satSetSensePayload( pSense, 5945285242Sachim SCSI_SNSKEY_NOT_READY, 5946285242Sachim 0, 5947285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5948285242Sachim satOrgIOContext); 5949285242Sachim 5950285242Sachim ostiInitiatorIOCompleted( tiRoot, 5951285242Sachim tiOrgIORequest, 5952285242Sachim tiIOSuccess, 5953285242Sachim SCSI_STAT_CHECK_CONDITION, 5954285242Sachim satOrgIOContext->pTiSenseData, 5955285242Sachim satOrgIOContext->interruptContext ); 5956285242Sachim 5957285242Sachim TI_DBG1(("satTestUnitReadyCB: calling satTestUnitReady_1 fails\n")); 5958285242Sachim return; 5959285242Sachim } 5960285242Sachim 5961285242Sachim break; 5962285242Sachim case SAT_CHECK_POWER_MODE: 5963285242Sachim TI_DBG5(("satTestUnitReadyCB: SAT_CHECK_POWER_MODE success\n")); 5964285242Sachim 5965285242Sachim 5966285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5967285242Sachim 5968285242Sachim satFreeIntIoResource( tiRoot, 5969285242Sachim satDevData, 5970285242Sachim satIntIo); 5971285242Sachim 5972285242Sachim /* returns good status */ 5973285242Sachim ostiInitiatorIOCompleted( tiRoot, 5974285242Sachim tiOrgIORequest, 5975285242Sachim tiIOSuccess, 5976285242Sachim SCSI_STAT_GOOD, 5977285242Sachim agNULL, 5978285242Sachim satOrgIOContext->interruptContext ); 5979285242Sachim 5980285242Sachim break; 5981285242Sachim default: 5982285242Sachim TI_DBG1(("satTestUnitReadyCB: default success command %d\n", hostToDevFis->h.command)); 5983285242Sachim satSetSensePayload( pSense, 5984285242Sachim SCSI_SNSKEY_NOT_READY, 5985285242Sachim 0, 5986285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_CAUSE_NOT_REPORTABLE, 5987285242Sachim satOrgIOContext); 5988285242Sachim 5989285242Sachim ostiInitiatorIOCompleted( tiRoot, 5990285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 5991285242Sachim tiIOSuccess, 5992285242Sachim SCSI_STAT_CHECK_CONDITION, 5993285242Sachim satOrgIOContext->pTiSenseData, 5994285242Sachim satOrgIOContext->interruptContext ); 5995285242Sachim 5996285242Sachim 5997285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 5998285242Sachim 5999285242Sachim satFreeIntIoResource( tiRoot, 6000285242Sachim satDevData, 6001285242Sachim satIntIo); 6002285242Sachim break; 6003285242Sachim } 6004285242Sachim 6005285242Sachim return; 6006285242Sachim} 6007285242Sachim 6008285242Sachim/***************************************************************************** 6009285242Sachim*! \brief satWriteSame10CB 6010285242Sachim* 6011285242Sachim* This routine is a callback function for satWriteSame10() 6012285242Sachim* 6013285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 6014285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 6015285242Sachim* \param agIOStatus: Status of completed I/O. 6016285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 6017285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 6018285242Sachim* length. 6019285242Sachim* \param agParam: Additional info based on status. 6020285242Sachim* \param ioContext: Pointer to satIOContext_t. 6021285242Sachim* 6022285242Sachim* \return: none 6023285242Sachim* 6024285242Sachim*****************************************************************************/ 6025285242Sachimvoid satWriteSame10CB( 6026285242Sachim agsaRoot_t *agRoot, 6027285242Sachim agsaIORequest_t *agIORequest, 6028285242Sachim bit32 agIOStatus, 6029285242Sachim agsaFisHeader_t *agFirstDword, 6030285242Sachim bit32 agIOInfoLen, 6031285242Sachim void *agParam, 6032285242Sachim void *ioContext 6033285242Sachim ) 6034285242Sachim{ 6035285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 6036285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 6037285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 6038285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 6039285242Sachim tdIORequestBody_t *tdIORequestBody; 6040285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 6041285242Sachim tdIORequestBody_t *tdNewIORequestBody; 6042285242Sachim satIOContext_t *satIOContext; 6043285242Sachim satIOContext_t *satOrgIOContext; 6044285242Sachim satIOContext_t *satNewIOContext; 6045285242Sachim satInternalIo_t *satIntIo; 6046285242Sachim satInternalIo_t *satNewIntIo = agNULL; 6047285242Sachim satDeviceData_t *satDevData; 6048285242Sachim scsiRspSense_t *pSense; 6049285242Sachim tiIniScsiCmnd_t *scsiCmnd; 6050285242Sachim tiIORequest_t *tiOrgIORequest; 6051285242Sachim 6052285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 6053285242Sachim bit32 ataStatus = 0; 6054285242Sachim bit32 status; 6055285242Sachim 6056285242Sachim bit32 sectorcount = 0; 6057285242Sachim bit32 lba = 0, tl = 0; 6058285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 6059285242Sachim agsaFisSetDevBitsHeader_t *statSetDevBitFisHeader = agNULL; 6060285242Sachim 6061285242Sachim TI_DBG5(("satWriteSame10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 6062285242Sachim 6063285242Sachim /* internally generate tiIOContext */ 6064285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 6065285242Sachim satIOContext = (satIOContext_t *) ioContext; 6066285242Sachim satIntIo = satIOContext->satIntIoContext; 6067285242Sachim satDevData = satIOContext->pSatDevData; 6068285242Sachim hostToDevFis = satIOContext->pFis; 6069285242Sachim 6070285242Sachim if (satIntIo == agNULL) 6071285242Sachim { 6072285242Sachim TI_DBG4(("satWriteSame10CB: External satInternalIo_t satIntIoContext\n")); 6073285242Sachim satOrgIOContext = satIOContext; 6074285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 6075285242Sachim pSense = satIOContext->pSense; 6076285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 6077285242Sachim } 6078285242Sachim else 6079285242Sachim { 6080285242Sachim TI_DBG4(("satWriteSame10CB: Internal satInternalIo_t satIntIoContext\n")); 6081285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 6082285242Sachim if (satOrgIOContext == agNULL) 6083285242Sachim { 6084285242Sachim TI_DBG4(("satWriteSame10CB: satOrgIOContext is NULL, wrong\n")); 6085285242Sachim return; 6086285242Sachim } 6087285242Sachim else 6088285242Sachim { 6089285242Sachim TI_DBG4(("satWriteSame10CB: satOrgIOContext is NOT NULL\n")); 6090285242Sachim } 6091285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 6092285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 6093285242Sachim 6094285242Sachim pSense = satOrgIOContext->pSense; 6095285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 6096285242Sachim } 6097285242Sachim 6098285242Sachim 6099285242Sachim tdIORequestBody->ioCompleted = agTRUE; 6100285242Sachim tdIORequestBody->ioStarted = agFALSE; 6101285242Sachim 6102285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 6103285242Sachim { 6104285242Sachim TI_DBG1(("satWriteSame10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 6105285242Sachim satSetSensePayload( pSense, 6106285242Sachim SCSI_SNSKEY_NO_SENSE, 6107285242Sachim 0, 6108285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6109285242Sachim satOrgIOContext); 6110285242Sachim 6111285242Sachim ostiInitiatorIOCompleted( tiRoot, 6112285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6113285242Sachim tiIOSuccess, 6114285242Sachim SCSI_STAT_CHECK_CONDITION, 6115285242Sachim satOrgIOContext->pTiSenseData, 6116285242Sachim satOrgIOContext->interruptContext ); 6117285242Sachim 6118285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6119285242Sachim 6120285242Sachim satFreeIntIoResource( tiRoot, 6121285242Sachim satDevData, 6122285242Sachim satIntIo); 6123285242Sachim return; 6124285242Sachim } 6125285242Sachim 6126285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 6127285242Sachim { 6128285242Sachim /* FP, DMA and PIO write */ 6129285242Sachim /* First, assumed to be Reg Device to Host FIS */ 6130285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 6131285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 6132285242Sachim } 6133285242Sachim 6134285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 6135285242Sachim { 6136285242Sachim if (statDevToHostFisHeader->fisType == SET_DEV_BITS_FIS) 6137285242Sachim { 6138285242Sachim statSetDevBitFisHeader = (agsaFisSetDevBitsHeader_t *)&(agFirstDword->D2H); 6139285242Sachim 6140285242Sachim /* Get ATA Status register */ 6141285242Sachim ataStatus = (statSetDevBitFisHeader->statusHi_Lo & 0x70); /* bits 4,5,6 */ 6142285242Sachim ataStatus = ataStatus | (statSetDevBitFisHeader->statusHi_Lo & 0x07); /* bits 0,1,2 */ 6143285242Sachim 6144285242Sachim /* ATA Eror register */ 6145285242Sachim 6146285242Sachim } 6147285242Sachim } 6148285242Sachim 6149285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 6150285242Sachim { 6151285242Sachim /* 6152285242Sachim checking IO status, FIS type and error status 6153285242Sachim FIS type should be either REG_DEV_TO_HOST_FIS or SET_DEV_BITS_FIS 6154285242Sachim */ 6155285242Sachim if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 6156285242Sachim (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS)) || 6157285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 6158285242Sachim ) 6159285242Sachim { 6160285242Sachim /* for debugging */ 6161285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 6162285242Sachim { 6163285242Sachim TI_DBG1(("satWriteSame10CB: FAILED, NOT IO_SUCCESS\n")); 6164285242Sachim } 6165285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 6166285242Sachim { 6167285242Sachim TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 6168285242Sachim } 6169285242Sachim else if (statDevToHostFisHeader->fisType != SET_DEV_BITS_FIS) 6170285242Sachim { 6171285242Sachim TI_DBG1(("satWriteSame10CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 6172285242Sachim } 6173285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 6174285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 6175285242Sachim ) 6176285242Sachim { 6177285242Sachim TI_DBG1(("satWriteSame10CB: FAILED, FAILED, error status\n")); 6178285242Sachim } 6179285242Sachim 6180285242Sachim /* Process abort case */ 6181285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 6182285242Sachim { 6183285242Sachim satProcessAbort(tiRoot, 6184285242Sachim tiOrgIORequest, 6185285242Sachim satOrgIOContext 6186285242Sachim ); 6187285242Sachim 6188285242Sachim 6189285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6190285242Sachim 6191285242Sachim satFreeIntIoResource( tiRoot, 6192285242Sachim satDevData, 6193285242Sachim satIntIo); 6194285242Sachim return; 6195285242Sachim } 6196285242Sachim 6197285242Sachim /* for debugging */ 6198285242Sachim switch (hostToDevFis->h.command) 6199285242Sachim { 6200285242Sachim case SAT_WRITE_DMA_EXT: 6201285242Sachim TI_DBG1(("satWriteSame10CB: SAT_WRITE_DMA_EXT\n")); 6202285242Sachim break; 6203285242Sachim case SAT_WRITE_SECTORS_EXT: 6204285242Sachim TI_DBG1(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT\n")); 6205285242Sachim break; 6206285242Sachim case SAT_WRITE_FPDMA_QUEUED: 6207285242Sachim TI_DBG1(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED\n")); 6208285242Sachim break; 6209285242Sachim default: 6210285242Sachim TI_DBG1(("satWriteSame10CB: error default case command 0x%x\n", hostToDevFis->h.command)); 6211285242Sachim break; 6212285242Sachim } 6213285242Sachim 6214285242Sachim satSetSensePayload( pSense, 6215285242Sachim SCSI_SNSKEY_NO_SENSE, 6216285242Sachim 0, 6217285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6218285242Sachim satOrgIOContext); 6219285242Sachim 6220285242Sachim ostiInitiatorIOCompleted( tiRoot, 6221285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6222285242Sachim tiIOSuccess, 6223285242Sachim SCSI_STAT_CHECK_CONDITION, 6224285242Sachim satOrgIOContext->pTiSenseData, 6225285242Sachim satOrgIOContext->interruptContext ); 6226285242Sachim 6227285242Sachim 6228285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6229285242Sachim 6230285242Sachim satFreeIntIoResource( tiRoot, 6231285242Sachim satDevData, 6232285242Sachim satIntIo); 6233285242Sachim return; 6234285242Sachim } /* end error */ 6235285242Sachim } 6236285242Sachim 6237285242Sachim /* process success from this point on */ 6238285242Sachim /* 6239285242Sachim note: inefficient implementation until a single block can be manipulated 6240285242Sachim */ 6241285242Sachim 6242285242Sachim if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT) 6243285242Sachim { 6244285242Sachim TI_DBG5(("satWriteSame10CB: SAT_WRITE_DMA_EXT success\n")); 6245285242Sachim } 6246285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT) 6247285242Sachim { 6248285242Sachim TI_DBG5(("satWriteSame10CB: SAT_WRITE_SECTORS_EXT success\n")); 6249285242Sachim } 6250285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED) 6251285242Sachim { 6252285242Sachim TI_DBG5(("satWriteSame10CB: SAT_WRITE_FPDMA_QUEUED success\n")); 6253285242Sachim } 6254285242Sachim else 6255285242Sachim { 6256285242Sachim TI_DBG1(("satWriteSame10CB: error case command 0x%x success\n", hostToDevFis->h.command)); 6257285242Sachim satSetSensePayload( pSense, 6258285242Sachim SCSI_SNSKEY_NO_SENSE, 6259285242Sachim 0, 6260285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6261285242Sachim satOrgIOContext); 6262285242Sachim 6263285242Sachim ostiInitiatorIOCompleted( tiRoot, 6264285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6265285242Sachim tiIOSuccess, 6266285242Sachim SCSI_STAT_CHECK_CONDITION, 6267285242Sachim satOrgIOContext->pTiSenseData, 6268285242Sachim satOrgIOContext->interruptContext ); 6269285242Sachim 6270285242Sachim 6271285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6272285242Sachim 6273285242Sachim satFreeIntIoResource( tiRoot, 6274285242Sachim satDevData, 6275285242Sachim satIntIo); 6276285242Sachim return; 6277285242Sachim } 6278285242Sachim 6279285242Sachim 6280285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6281285242Sachim 6282285242Sachim /* free */ 6283285242Sachim satFreeIntIoResource( tiRoot, 6284285242Sachim satDevData, 6285285242Sachim satIntIo); 6286285242Sachim 6287285242Sachim /* 6288285242Sachim increment LBA by one, keeping the same sector count(1) 6289285242Sachim sends another ATA command with the changed parameters 6290285242Sachim */ 6291285242Sachim 6292285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 6293285242Sachim satDevData->satSectorDone++; 6294285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 6295285242Sachim 6296285242Sachim TI_DBG1(("satWriteSame10CB: sectordone %d\n", satDevData->satSectorDone)); 6297285242Sachim 6298285242Sachim lba = (scsiCmnd->cdb[2] << (8*3)) + (scsiCmnd->cdb[3] << (8*2)) 6299285242Sachim + (scsiCmnd->cdb[4] << 8) + scsiCmnd->cdb[5]; 6300285242Sachim tl = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8]; 6301285242Sachim 6302285242Sachim TI_DBG5(("satWriteSame10CB: lba 0x%x tl 0x%x\n", lba, tl)); 6303285242Sachim 6304285242Sachim if (tl == 0) 6305285242Sachim { 6306285242Sachim /* (satDevData->satMaxUserAddrSectors - 1) - lba*/ 6307285242Sachim sectorcount = (0x0FFFFFFF - 1) - lba; 6308285242Sachim } 6309285242Sachim else 6310285242Sachim { 6311285242Sachim sectorcount = tl; 6312285242Sachim } 6313285242Sachim 6314285242Sachim if (sectorcount <= 0) 6315285242Sachim { 6316285242Sachim satSetSensePayload( pSense, 6317285242Sachim SCSI_SNSKEY_NO_SENSE, 6318285242Sachim 0, 6319285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6320285242Sachim satOrgIOContext); 6321285242Sachim 6322285242Sachim ostiInitiatorIOCompleted( tiRoot, 6323285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6324285242Sachim tiIOSuccess, 6325285242Sachim SCSI_STAT_CHECK_CONDITION, 6326285242Sachim satOrgIOContext->pTiSenseData, 6327285242Sachim satOrgIOContext->interruptContext ); 6328285242Sachim TI_DBG1(("satWriteSame10CB: incorrect sectorcount 0x%x\n", sectorcount)); 6329285242Sachim return; 6330285242Sachim } 6331285242Sachim 6332285242Sachim if (sectorcount == satDevData->satSectorDone) 6333285242Sachim { 6334285242Sachim /* 6335285242Sachim done with writesame 6336285242Sachim */ 6337285242Sachim TI_DBG1(("satWriteSame10CB: return writesame done\n")); 6338285242Sachim satDevData->satSectorDone = 0; 6339285242Sachim 6340285242Sachim ostiInitiatorIOCompleted( tiRoot, 6341285242Sachim tiOrgIORequest, 6342285242Sachim tiIOSuccess, 6343285242Sachim SCSI_STAT_GOOD, 6344285242Sachim agNULL, 6345285242Sachim satOrgIOContext->interruptContext ); 6346285242Sachim } 6347285242Sachim else 6348285242Sachim { 6349285242Sachim /* sends another ATA command */ 6350285242Sachim if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT) 6351285242Sachim { 6352285242Sachim TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_DMA_EXT\n")); 6353285242Sachim } 6354285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT) 6355285242Sachim { 6356285242Sachim TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_SECTORS_EXT\n")); 6357285242Sachim } 6358285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED) 6359285242Sachim { 6360285242Sachim TI_DBG1(("satWriteSame10CB: sends another SAT_WRITE_FPDMA_QUEUED\n")); 6361285242Sachim } 6362285242Sachim 6363285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 6364285242Sachim tiOrgIORequest, 6365285242Sachim satDevData, 6366285242Sachim 0, 6367285242Sachim satNewIntIo); 6368285242Sachim if (satNewIntIo == agNULL) 6369285242Sachim { 6370285242Sachim /* memory allocation failure */ 6371285242Sachim satFreeIntIoResource( tiRoot, 6372285242Sachim satDevData, 6373285242Sachim satNewIntIo); 6374285242Sachim 6375285242Sachim satSetSensePayload( pSense, 6376285242Sachim SCSI_SNSKEY_NO_SENSE, 6377285242Sachim 0, 6378285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6379285242Sachim satOrgIOContext); 6380285242Sachim 6381285242Sachim ostiInitiatorIOCompleted( tiRoot, 6382285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6383285242Sachim tiIOSuccess, 6384285242Sachim SCSI_STAT_CHECK_CONDITION, 6385285242Sachim satOrgIOContext->pTiSenseData, 6386285242Sachim satOrgIOContext->interruptContext ); 6387285242Sachim TI_DBG1(("satWriteSame10CB: momory allocation fails\n")); 6388285242Sachim return; 6389285242Sachim } /* end memory allocation */ 6390285242Sachim 6391285242Sachim /* the one to be used */ 6392285242Sachim tdNewIORequestBody = satNewIntIo->satIntRequestBody; 6393285242Sachim satNewIOContext = &tdNewIORequestBody->transport.SATA.satIOContext; 6394285242Sachim 6395285242Sachim satNewIOContext->pSatDevData = satDevData; 6396285242Sachim satNewIOContext->pFis = &tdNewIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev; 6397285242Sachim satNewIOContext->pScsiCmnd = &satNewIntIo->satIntTiScsiXchg.scsiCmnd; 6398285242Sachim /* saves scsi command for LBA and number of blocks */ 6399285242Sachim osti_memcpy(satNewIOContext->pScsiCmnd, scsiCmnd, sizeof(tiIniScsiCmnd_t)); 6400285242Sachim satNewIOContext->pSense = &tdNewIORequestBody->transport.SATA.sensePayload; 6401285242Sachim satNewIOContext->pTiSenseData = &tdNewIORequestBody->transport.SATA.tiSenseData; 6402285242Sachim satNewIOContext->pTiSenseData->senseData = satNewIOContext->pSense; 6403285242Sachim satNewIOContext->tiRequestBody = satNewIntIo->satIntRequestBody; 6404285242Sachim satNewIOContext->interruptContext = satNewIOContext->interruptContext; 6405285242Sachim satNewIOContext->satIntIoContext = satNewIntIo; 6406285242Sachim satNewIOContext->ptiDeviceHandle = satIOContext->ptiDeviceHandle; 6407285242Sachim /* saves tiScsiXchg; only for writesame10() */ 6408285242Sachim satNewIOContext->tiScsiXchg = satOrgIOContext->tiScsiXchg; 6409285242Sachim 6410285242Sachim if (hostToDevFis->h.command == SAT_WRITE_DMA_EXT) 6411285242Sachim { 6412285242Sachim status = satWriteSame10_1( tiRoot, 6413285242Sachim &satNewIntIo->satIntTiIORequest, 6414285242Sachim satNewIOContext->ptiDeviceHandle, 6415285242Sachim &satNewIntIo->satIntTiScsiXchg, 6416285242Sachim satNewIOContext, 6417285242Sachim lba + satDevData->satSectorDone 6418285242Sachim ); 6419285242Sachim } 6420285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT) 6421285242Sachim { 6422285242Sachim status = satWriteSame10_2( tiRoot, 6423285242Sachim &satNewIntIo->satIntTiIORequest, 6424285242Sachim satNewIOContext->ptiDeviceHandle, 6425285242Sachim &satNewIntIo->satIntTiScsiXchg, 6426285242Sachim satNewIOContext, 6427285242Sachim lba + satDevData->satSectorDone 6428285242Sachim ); 6429285242Sachim } 6430285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED) 6431285242Sachim { 6432285242Sachim status = satWriteSame10_3( tiRoot, 6433285242Sachim &satNewIntIo->satIntTiIORequest, 6434285242Sachim satNewIOContext->ptiDeviceHandle, 6435285242Sachim &satNewIntIo->satIntTiScsiXchg, 6436285242Sachim satNewIOContext, 6437285242Sachim lba + satDevData->satSectorDone 6438285242Sachim ); 6439285242Sachim } 6440285242Sachim else 6441285242Sachim { 6442285242Sachim status = tiError; 6443285242Sachim TI_DBG1(("satWriteSame10CB: sucess but error in command 0x%x\n", hostToDevFis->h.command)); 6444285242Sachim } 6445285242Sachim 6446285242Sachim if (status != tiSuccess) 6447285242Sachim { 6448285242Sachim /* sending ATA command fails */ 6449285242Sachim satFreeIntIoResource( tiRoot, 6450285242Sachim satDevData, 6451285242Sachim satNewIntIo); 6452285242Sachim satSetSensePayload( pSense, 6453285242Sachim SCSI_SNSKEY_NO_SENSE, 6454285242Sachim 0, 6455285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6456285242Sachim satOrgIOContext); 6457285242Sachim 6458285242Sachim ostiInitiatorIOCompleted( tiRoot, 6459285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6460285242Sachim tiIOSuccess, 6461285242Sachim SCSI_STAT_CHECK_CONDITION, 6462285242Sachim satOrgIOContext->pTiSenseData, 6463285242Sachim satOrgIOContext->interruptContext ); 6464285242Sachim TI_DBG1(("satWriteSame10CB:calling satWriteSame10_1 fails\n")); 6465285242Sachim return; 6466285242Sachim } /* end send fails */ 6467285242Sachim 6468285242Sachim } /* end sends another ATA command */ 6469285242Sachim 6470285242Sachim return; 6471285242Sachim} 6472285242Sachim/***************************************************************************** 6473285242Sachim*! \brief satStartStopUnitCB 6474285242Sachim* 6475285242Sachim* This routine is a callback function called from ossaSATACompleted(). 6476285242Sachim* This CB routine deals with Send Diagnostic completion. 6477285242Sachim* 6478285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 6479285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 6480285242Sachim* \param agIOStatus: Status of completed I/O. 6481285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 6482285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 6483285242Sachim* length. 6484285242Sachim* \param agParam: Additional info based on status. 6485285242Sachim* \param ioContext: Pointer to satIOContext_t. 6486285242Sachim* 6487285242Sachim* \return: none 6488285242Sachim* 6489285242Sachim*****************************************************************************/ 6490285242Sachimvoid satStartStopUnitCB( 6491285242Sachim agsaRoot_t *agRoot, 6492285242Sachim agsaIORequest_t *agIORequest, 6493285242Sachim bit32 agIOStatus, 6494285242Sachim agsaFisHeader_t *agFirstDword, 6495285242Sachim bit32 agIOInfoLen, 6496285242Sachim void *agParam, 6497285242Sachim void *ioContext 6498285242Sachim ) 6499285242Sachim{ 6500285242Sachim /* 6501285242Sachim In the process of StartStopUnit 6502285242Sachim Process FLUSH CACHE (EXT) 6503285242Sachim Process STANDBY 6504285242Sachim Process READ VERIFY SECTOR(S) EXT 6505285242Sachim Process MEDIA EJECT 6506285242Sachim */ 6507285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 6508285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 6509285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 6510285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 6511285242Sachim tdIORequestBody_t *tdIORequestBody; 6512285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 6513285242Sachim satIOContext_t *satIOContext; 6514285242Sachim satIOContext_t *satOrgIOContext; 6515285242Sachim satIOContext_t *satNewIOContext; 6516285242Sachim satInternalIo_t *satIntIo; 6517285242Sachim satInternalIo_t *satNewIntIo = agNULL; 6518285242Sachim satDeviceData_t *satDevData; 6519285242Sachim scsiRspSense_t *pSense; 6520285242Sachim tiIniScsiCmnd_t *scsiCmnd; 6521285242Sachim tiIORequest_t *tiOrgIORequest; 6522285242Sachim 6523285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 6524285242Sachim bit32 ataStatus = 0; 6525285242Sachim bit32 status; 6526285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 6527285242Sachim 6528285242Sachim TI_DBG5(("satStartStopUnitCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 6529285242Sachim 6530285242Sachim /* internally generate tiIOContext */ 6531285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 6532285242Sachim satIOContext = (satIOContext_t *) ioContext; 6533285242Sachim satIntIo = satIOContext->satIntIoContext; 6534285242Sachim satDevData = satIOContext->pSatDevData; 6535285242Sachim hostToDevFis = satIOContext->pFis; 6536285242Sachim 6537285242Sachim if (satIntIo == agNULL) 6538285242Sachim { 6539285242Sachim TI_DBG4(("satStartStopUnitCB: External satInternalIo_t satIntIoContext\n")); 6540285242Sachim satOrgIOContext = satIOContext; 6541285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 6542285242Sachim pSense = satIOContext->pSense; 6543285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 6544285242Sachim } 6545285242Sachim else 6546285242Sachim { 6547285242Sachim TI_DBG4(("satStartStopUnitCB: Internal satInternalIo_t satIntIoContext\n")); 6548285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 6549285242Sachim if (satOrgIOContext == agNULL) 6550285242Sachim { 6551285242Sachim TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NULL, wrong\n")); 6552285242Sachim return; 6553285242Sachim } 6554285242Sachim else 6555285242Sachim { 6556285242Sachim TI_DBG4(("satStartStopUnitCB: satOrgIOContext is NOT NULL\n")); 6557285242Sachim } 6558285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 6559285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 6560285242Sachim 6561285242Sachim pSense = satOrgIOContext->pSense; 6562285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 6563285242Sachim } 6564285242Sachim 6565285242Sachim tdIORequestBody->ioCompleted = agTRUE; 6566285242Sachim tdIORequestBody->ioStarted = agFALSE; 6567285242Sachim 6568285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 6569285242Sachim { 6570285242Sachim TI_DBG1(("satStartStopUnitCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 6571285242Sachim 6572285242Sachim /* IMMED == 0 */ 6573285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6574285242Sachim { 6575285242Sachim TI_DBG1(("satStartStopUnitCB: immed bit 0\n")); 6576285242Sachim satSetSensePayload( pSense, 6577285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6578285242Sachim 0, 6579285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6580285242Sachim satOrgIOContext); 6581285242Sachim 6582285242Sachim ostiInitiatorIOCompleted( tiRoot, 6583285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6584285242Sachim tiIOSuccess, 6585285242Sachim SCSI_STAT_CHECK_CONDITION, 6586285242Sachim satOrgIOContext->pTiSenseData, 6587285242Sachim satOrgIOContext->interruptContext ); 6588285242Sachim 6589285242Sachim 6590285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6591285242Sachim satFreeIntIoResource( tiRoot, 6592285242Sachim satDevData, 6593285242Sachim satIntIo); 6594285242Sachim } 6595285242Sachim /* IMMED == 1 */ 6596285242Sachim if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6597285242Sachim { 6598285242Sachim TI_DBG1(("satStartStopUnitCB: immed bit 1\n")); 6599285242Sachim satSetDeferredSensePayload( pSense, 6600285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6601285242Sachim 0, 6602285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6603285242Sachim satOrgIOContext); 6604285242Sachim 6605285242Sachim ostiInitiatorIOCompleted( tiRoot, 6606285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6607285242Sachim tiIOSuccess, 6608285242Sachim SCSI_STAT_CHECK_CONDITION, 6609285242Sachim satOrgIOContext->pTiSenseData, 6610285242Sachim satOrgIOContext->interruptContext ); 6611285242Sachim 6612285242Sachim 6613285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6614285242Sachim satFreeIntIoResource( tiRoot, 6615285242Sachim satDevData, 6616285242Sachim satIntIo); 6617285242Sachim } 6618285242Sachim 6619285242Sachim 6620285242Sachim 6621285242Sachim return; 6622285242Sachim } 6623285242Sachim 6624285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 6625285242Sachim { 6626285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 6627285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 6628285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 6629285242Sachim } 6630285242Sachim /* 6631285242Sachim checking IO status, FIS type and error status 6632285242Sachim */ 6633285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 6634285242Sachim { 6635285242Sachim if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 6636285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 6637285242Sachim ) 6638285242Sachim { 6639285242Sachim /* for debugging */ 6640285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 6641285242Sachim { 6642285242Sachim TI_DBG1(("satStartStopUnitCB: FAILED, NOT IO_SUCCESS\n")); 6643285242Sachim } 6644285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 6645285242Sachim { 6646285242Sachim TI_DBG1(("satStartStopUnitCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 6647285242Sachim } 6648285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 6649285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 6650285242Sachim ) 6651285242Sachim { 6652285242Sachim TI_DBG1(("satStartStopUnitCB: FAILED, FAILED, error status\n")); 6653285242Sachim } 6654285242Sachim 6655285242Sachim 6656285242Sachim /* Process abort case */ 6657285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 6658285242Sachim { 6659285242Sachim satProcessAbort(tiRoot, 6660285242Sachim tiOrgIORequest, 6661285242Sachim satOrgIOContext 6662285242Sachim ); 6663285242Sachim 6664285242Sachim 6665285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6666285242Sachim 6667285242Sachim satFreeIntIoResource( tiRoot, 6668285242Sachim satDevData, 6669285242Sachim satIntIo); 6670285242Sachim return; 6671285242Sachim } 6672285242Sachim 6673285242Sachim switch (hostToDevFis->h.command) 6674285242Sachim { 6675285242Sachim case SAT_FLUSH_CACHE: /* fall through */ 6676285242Sachim case SAT_FLUSH_CACHE_EXT: 6677285242Sachim TI_DBG1(("satStartStopUnitCB: SAT_FLUSH_CACHE(_EXT)\n")); 6678285242Sachim /* check immed bit in scsi command */ 6679285242Sachim /* IMMED == 0 */ 6680285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6681285242Sachim { 6682285242Sachim satSetSensePayload( pSense, 6683285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6684285242Sachim 0, 6685285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6686285242Sachim satOrgIOContext); 6687285242Sachim 6688285242Sachim ostiInitiatorIOCompleted( tiRoot, 6689285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6690285242Sachim tiIOSuccess, 6691285242Sachim SCSI_STAT_CHECK_CONDITION, 6692285242Sachim satOrgIOContext->pTiSenseData, 6693285242Sachim satOrgIOContext->interruptContext ); 6694285242Sachim 6695285242Sachim 6696285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6697285242Sachim 6698285242Sachim satFreeIntIoResource( tiRoot, 6699285242Sachim satDevData, 6700285242Sachim satIntIo); 6701285242Sachim } 6702285242Sachim /* IMMED == 1 */ 6703285242Sachim if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6704285242Sachim { 6705285242Sachim satSetDeferredSensePayload( pSense, 6706285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6707285242Sachim 0, 6708285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6709285242Sachim satOrgIOContext); 6710285242Sachim 6711285242Sachim ostiInitiatorIOCompleted( tiRoot, 6712285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6713285242Sachim tiIOSuccess, 6714285242Sachim SCSI_STAT_CHECK_CONDITION, 6715285242Sachim satOrgIOContext->pTiSenseData, 6716285242Sachim satOrgIOContext->interruptContext ); 6717285242Sachim 6718285242Sachim 6719285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6720285242Sachim 6721285242Sachim satFreeIntIoResource( tiRoot, 6722285242Sachim satDevData, 6723285242Sachim satIntIo); 6724285242Sachim } 6725285242Sachim break; 6726285242Sachim case SAT_STANDBY: 6727285242Sachim TI_DBG5(("satStartStopUnitCB: SAT_STANDBY\n")); 6728285242Sachim /* check immed bit in scsi command */ 6729285242Sachim /* IMMED == 0 */ 6730285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6731285242Sachim { 6732285242Sachim satSetSensePayload( pSense, 6733285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6734285242Sachim 0, 6735285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6736285242Sachim satOrgIOContext); 6737285242Sachim 6738285242Sachim ostiInitiatorIOCompleted( tiRoot, 6739285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6740285242Sachim tiIOSuccess, 6741285242Sachim SCSI_STAT_CHECK_CONDITION, 6742285242Sachim satOrgIOContext->pTiSenseData, 6743285242Sachim satOrgIOContext->interruptContext ); 6744285242Sachim 6745285242Sachim 6746285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6747285242Sachim 6748285242Sachim satFreeIntIoResource( tiRoot, 6749285242Sachim satDevData, 6750285242Sachim satIntIo); 6751285242Sachim } 6752285242Sachim /* IMMED == 1 */ 6753285242Sachim if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6754285242Sachim { 6755285242Sachim satSetDeferredSensePayload( pSense, 6756285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6757285242Sachim 0, 6758285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6759285242Sachim satOrgIOContext); 6760285242Sachim 6761285242Sachim ostiInitiatorIOCompleted( tiRoot, 6762285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6763285242Sachim tiIOSuccess, 6764285242Sachim SCSI_STAT_CHECK_CONDITION, 6765285242Sachim satOrgIOContext->pTiSenseData, 6766285242Sachim satOrgIOContext->interruptContext ); 6767285242Sachim 6768285242Sachim 6769285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6770285242Sachim 6771285242Sachim satFreeIntIoResource( tiRoot, 6772285242Sachim satDevData, 6773285242Sachim satIntIo); 6774285242Sachim } 6775285242Sachim break; 6776285242Sachim case SAT_READ_VERIFY_SECTORS: /* fall through */ 6777285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 6778285242Sachim TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT)\n")); 6779285242Sachim /* IMMED == 0 */ 6780285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6781285242Sachim { 6782285242Sachim satSetSensePayload( pSense, 6783285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6784285242Sachim 0, 6785285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6786285242Sachim satOrgIOContext); 6787285242Sachim 6788285242Sachim ostiInitiatorIOCompleted( tiRoot, 6789285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6790285242Sachim tiIOSuccess, 6791285242Sachim SCSI_STAT_CHECK_CONDITION, 6792285242Sachim satOrgIOContext->pTiSenseData, 6793285242Sachim satOrgIOContext->interruptContext ); 6794285242Sachim 6795285242Sachim 6796285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6797285242Sachim 6798285242Sachim satFreeIntIoResource( tiRoot, 6799285242Sachim satDevData, 6800285242Sachim satIntIo); 6801285242Sachim } 6802285242Sachim /* IMMED == 1 */ 6803285242Sachim if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6804285242Sachim { 6805285242Sachim satSetDeferredSensePayload( pSense, 6806285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6807285242Sachim 0, 6808285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6809285242Sachim satOrgIOContext); 6810285242Sachim 6811285242Sachim ostiInitiatorIOCompleted( tiRoot, 6812285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6813285242Sachim tiIOSuccess, 6814285242Sachim SCSI_STAT_CHECK_CONDITION, 6815285242Sachim satOrgIOContext->pTiSenseData, 6816285242Sachim satOrgIOContext->interruptContext ); 6817285242Sachim 6818285242Sachim 6819285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6820285242Sachim 6821285242Sachim satFreeIntIoResource( tiRoot, 6822285242Sachim satDevData, 6823285242Sachim satIntIo); 6824285242Sachim } 6825285242Sachim break; 6826285242Sachim case SAT_MEDIA_EJECT: 6827285242Sachim TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT\n")); 6828285242Sachim /* IMMED == 0 */ 6829285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6830285242Sachim { 6831285242Sachim satSetSensePayload( pSense, 6832285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6833285242Sachim 0, 6834285242Sachim SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED, 6835285242Sachim satOrgIOContext); 6836285242Sachim 6837285242Sachim ostiInitiatorIOCompleted( tiRoot, 6838285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6839285242Sachim tiIOSuccess, 6840285242Sachim SCSI_STAT_CHECK_CONDITION, 6841285242Sachim satOrgIOContext->pTiSenseData, 6842285242Sachim satOrgIOContext->interruptContext ); 6843285242Sachim 6844285242Sachim 6845285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6846285242Sachim 6847285242Sachim satFreeIntIoResource( tiRoot, 6848285242Sachim satDevData, 6849285242Sachim satIntIo); 6850285242Sachim } 6851285242Sachim /* IMMED == 1 */ 6852285242Sachim if ( scsiCmnd->cdb[1] & SCSI_IMMED_MASK) 6853285242Sachim { 6854285242Sachim satSetDeferredSensePayload( pSense, 6855285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6856285242Sachim 0, 6857285242Sachim SCSI_SNSCODE_MEDIA_LOAD_OR_EJECT_FAILED, 6858285242Sachim satOrgIOContext); 6859285242Sachim 6860285242Sachim ostiInitiatorIOCompleted( tiRoot, 6861285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 6862285242Sachim tiIOSuccess, 6863285242Sachim SCSI_STAT_CHECK_CONDITION, 6864285242Sachim satOrgIOContext->pTiSenseData, 6865285242Sachim satOrgIOContext->interruptContext ); 6866285242Sachim 6867285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6868285242Sachim 6869285242Sachim satFreeIntIoResource( tiRoot, 6870285242Sachim satDevData, 6871285242Sachim satIntIo); 6872285242Sachim } 6873285242Sachim break; 6874285242Sachim default: 6875285242Sachim /* unspecified case, return no sense and no addition info */ 6876285242Sachim TI_DBG5(("satStartStopUnitCB: default command %d\n", hostToDevFis->h.command)); 6877285242Sachim satSetSensePayload( pSense, 6878285242Sachim SCSI_SNSKEY_NO_SENSE, 6879285242Sachim 0, 6880285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 6881285242Sachim satOrgIOContext); 6882285242Sachim 6883285242Sachim ostiInitiatorIOCompleted( tiRoot, 6884285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 6885285242Sachim tiIOSuccess, 6886285242Sachim SCSI_STAT_CHECK_CONDITION, 6887285242Sachim satOrgIOContext->pTiSenseData, 6888285242Sachim satOrgIOContext->interruptContext ); 6889285242Sachim 6890285242Sachim 6891285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6892285242Sachim 6893285242Sachim satFreeIntIoResource( tiRoot, 6894285242Sachim satDevData, 6895285242Sachim satIntIo); 6896285242Sachim break; 6897285242Sachim } /* switch */ 6898285242Sachim 6899285242Sachim return; 6900285242Sachim } /* error check */ 6901285242Sachim } 6902285242Sachim 6903285242Sachim /* ATA command completes sucessfully */ 6904285242Sachim switch (hostToDevFis->h.command) 6905285242Sachim { 6906285242Sachim case SAT_FLUSH_CACHE: /* fall through */ 6907285242Sachim case SAT_FLUSH_CACHE_EXT: 6908285242Sachim TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n")); 6909285242Sachim 6910285242Sachim 6911285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 6912285242Sachim 6913285242Sachim /* done with SAT_FLUSH_CACHE(_EXT) */ 6914285242Sachim satFreeIntIoResource( tiRoot, 6915285242Sachim satDevData, 6916285242Sachim satIntIo); 6917285242Sachim 6918285242Sachim /* at this point, successful SAT_READ_VERIFY_SECTORS(_EXT) 6919285242Sachim send SAT_SATNDBY 6920285242Sachim */ 6921285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 6922285242Sachim tiOrgIORequest, 6923285242Sachim satDevData, 6924285242Sachim 0, 6925285242Sachim satNewIntIo); 6926285242Sachim if (satNewIntIo == agNULL) 6927285242Sachim { 6928285242Sachim /* memory allocation failure */ 6929285242Sachim satFreeIntIoResource( tiRoot, 6930285242Sachim satDevData, 6931285242Sachim satNewIntIo); 6932285242Sachim /* IMMED == 0 */ 6933285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6934285242Sachim { 6935285242Sachim satSetSensePayload( pSense, 6936285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6937285242Sachim 0, 6938285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6939285242Sachim satOrgIOContext); 6940285242Sachim } 6941285242Sachim else /* IMMED == 1 */ 6942285242Sachim { 6943285242Sachim satSetDeferredSensePayload( pSense, 6944285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6945285242Sachim 0, 6946285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6947285242Sachim satOrgIOContext); 6948285242Sachim } 6949285242Sachim ostiInitiatorIOCompleted( tiRoot, 6950285242Sachim tiOrgIORequest, 6951285242Sachim tiIOSuccess, 6952285242Sachim SCSI_STAT_CHECK_CONDITION, 6953285242Sachim satOrgIOContext->pTiSenseData, 6954285242Sachim satOrgIOContext->interruptContext ); 6955285242Sachim 6956285242Sachim TI_DBG1(("satStartStopUnitCB: momory allocation fails\n")); 6957285242Sachim return; 6958285242Sachim } /* end of memory allocation failure */ 6959285242Sachim 6960285242Sachim /* 6961285242Sachim * Need to initialize all the fields within satIOContext 6962285242Sachim */ 6963285242Sachim 6964285242Sachim satNewIOContext = satPrepareNewIO( 6965285242Sachim satNewIntIo, 6966285242Sachim tiOrgIORequest, 6967285242Sachim satDevData, 6968285242Sachim scsiCmnd, 6969285242Sachim satOrgIOContext 6970285242Sachim ); 6971285242Sachim 6972285242Sachim /* sending SAT_STANDBY */ 6973285242Sachim status = satStartStopUnit_1( tiRoot, 6974285242Sachim &satNewIntIo->satIntTiIORequest, 6975285242Sachim satNewIOContext->ptiDeviceHandle, 6976285242Sachim &satNewIntIo->satIntTiScsiXchg, 6977285242Sachim satNewIOContext); 6978285242Sachim 6979285242Sachim if (status != tiSuccess) 6980285242Sachim { 6981285242Sachim /* sending SAT_CHECK_POWER_MODE fails */ 6982285242Sachim satFreeIntIoResource( tiRoot, 6983285242Sachim satDevData, 6984285242Sachim satNewIntIo); 6985285242Sachim 6986285242Sachim /* IMMED == 0 */ 6987285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 6988285242Sachim { 6989285242Sachim satSetSensePayload( pSense, 6990285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6991285242Sachim 0, 6992285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 6993285242Sachim satOrgIOContext); 6994285242Sachim } 6995285242Sachim else /* IMMED == 1 */ 6996285242Sachim { 6997285242Sachim satSetDeferredSensePayload( pSense, 6998285242Sachim SCSI_SNSKEY_ABORTED_COMMAND, 6999285242Sachim 0, 7000285242Sachim SCSI_SNSCODE_COMMAND_SEQUENCE_ERROR, 7001285242Sachim satOrgIOContext); 7002285242Sachim } 7003285242Sachim ostiInitiatorIOCompleted( tiRoot, 7004285242Sachim tiOrgIORequest, 7005285242Sachim tiIOSuccess, 7006285242Sachim SCSI_STAT_CHECK_CONDITION, 7007285242Sachim satOrgIOContext->pTiSenseData, 7008285242Sachim satOrgIOContext->interruptContext ); 7009285242Sachim 7010285242Sachim TI_DBG1(("satStartStopUnitCB: calling satStartStopUnit_1 fails\n")); 7011285242Sachim return; 7012285242Sachim } 7013285242Sachim break; 7014285242Sachim case SAT_STANDBY: 7015285242Sachim TI_DBG5(("satStartStopUnitCB: SAT_STANDBY success case\n")); 7016285242Sachim 7017285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7018285242Sachim 7019285242Sachim /* done with SAT_STANDBY */ 7020285242Sachim satFreeIntIoResource( tiRoot, 7021285242Sachim satDevData, 7022285242Sachim satIntIo); 7023285242Sachim /* 7024285242Sachim if immed == 0, return good status 7025285242Sachim */ 7026285242Sachim /* IMMED == 0 */ 7027285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 7028285242Sachim { 7029285242Sachim ostiInitiatorIOCompleted( tiRoot, 7030285242Sachim tiOrgIORequest, 7031285242Sachim tiIOSuccess, 7032285242Sachim SCSI_STAT_GOOD, 7033285242Sachim agNULL, 7034285242Sachim satOrgIOContext->interruptContext ); 7035285242Sachim } 7036285242Sachim satDevData->satStopState = agTRUE; 7037285242Sachim break; 7038285242Sachim case SAT_READ_VERIFY_SECTORS: /* fall through */ 7039285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 7040285242Sachim TI_DBG5(("satStartStopUnitCB: SAT_READ_VERIFY_SECTORS(_EXT) success case\n")); 7041285242Sachim 7042285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7043285242Sachim 7044285242Sachim /* done with SAT_READ_VERIFY_SECTORS(_EXT) */ 7045285242Sachim satFreeIntIoResource( tiRoot, 7046285242Sachim satDevData, 7047285242Sachim satIntIo); 7048285242Sachim /* 7049285242Sachim if immed == 0, return good status 7050285242Sachim */ 7051285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 7052285242Sachim { 7053285242Sachim ostiInitiatorIOCompleted( tiRoot, 7054285242Sachim tiOrgIORequest, 7055285242Sachim tiIOSuccess, 7056285242Sachim SCSI_STAT_GOOD, 7057285242Sachim agNULL, 7058285242Sachim satOrgIOContext->interruptContext ); 7059285242Sachim } 7060285242Sachim /* 7061285242Sachim if immed == 0, return good status 7062285242Sachim */ 7063285242Sachim /* 7064285242Sachim don't forget to check and set driver state; Active power state 7065285242Sachim */ 7066285242Sachim satDevData->satStopState = agFALSE; 7067285242Sachim break; 7068285242Sachim case SAT_MEDIA_EJECT: 7069285242Sachim TI_DBG5(("satStartStopUnitCB: SAT_MEDIA_EJECT success case\n")); 7070285242Sachim 7071285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7072285242Sachim 7073285242Sachim /* done with SAT_READ_VERIFY_SECTORS(_EXT) */ 7074285242Sachim satFreeIntIoResource( tiRoot, 7075285242Sachim satDevData, 7076285242Sachim satIntIo); 7077285242Sachim /* 7078285242Sachim if immed == 0, return good status 7079285242Sachim */ 7080285242Sachim if (!( scsiCmnd->cdb[1] & SCSI_IMMED_MASK)) 7081285242Sachim { 7082285242Sachim ostiInitiatorIOCompleted( tiRoot, 7083285242Sachim tiOrgIORequest, 7084285242Sachim tiIOSuccess, 7085285242Sachim SCSI_STAT_GOOD, 7086285242Sachim agNULL, 7087285242Sachim satOrgIOContext->interruptContext ); 7088285242Sachim } 7089285242Sachim break; 7090285242Sachim default: 7091285242Sachim TI_DBG1(("satStartStopUnitCB:success but error default case command 0x%x\n", hostToDevFis->h.command)); 7092285242Sachim 7093285242Sachim /* unspecified case, return no sense and no addition info */ 7094285242Sachim satSetSensePayload( pSense, 7095285242Sachim SCSI_SNSKEY_NO_SENSE, 7096285242Sachim 0, 7097285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 7098285242Sachim satOrgIOContext); 7099285242Sachim 7100285242Sachim ostiInitiatorIOCompleted( tiRoot, 7101285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7102285242Sachim tiIOSuccess, 7103285242Sachim SCSI_STAT_CHECK_CONDITION, 7104285242Sachim satOrgIOContext->pTiSenseData, 7105285242Sachim satOrgIOContext->interruptContext ); 7106285242Sachim 7107285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7108285242Sachim 7109285242Sachim satFreeIntIoResource( tiRoot, 7110285242Sachim satDevData, 7111285242Sachim satIntIo); 7112285242Sachim break; 7113285242Sachim } 7114285242Sachim return; 7115285242Sachim} 7116285242Sachim 7117285242Sachim/***************************************************************************** 7118285242Sachim*! \brief satSendDiagnosticCB 7119285242Sachim* 7120285242Sachim* This routine is a callback function called from ossaSATACompleted(). 7121285242Sachim* This CB routine deals with Send Diagnostic completion. 7122285242Sachim* 7123285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 7124285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 7125285242Sachim* \param agIOStatus: Status of completed I/O. 7126285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 7127285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 7128285242Sachim* length. 7129285242Sachim* \param agParam: Additional info based on status. 7130285242Sachim* \param ioContext: Pointer to satIOContext_t. 7131285242Sachim* 7132285242Sachim* \return: none 7133285242Sachim* 7134285242Sachim*****************************************************************************/ 7135285242Sachimvoid satSendDiagnosticCB( 7136285242Sachim agsaRoot_t *agRoot, 7137285242Sachim agsaIORequest_t *agIORequest, 7138285242Sachim bit32 agIOStatus, 7139285242Sachim agsaFisHeader_t *agFirstDword, 7140285242Sachim bit32 agIOInfoLen, 7141285242Sachim void *agParam, 7142285242Sachim void *ioContext 7143285242Sachim ) 7144285242Sachim{ 7145285242Sachim /* 7146285242Sachim In the process of SendDiagnotic 7147285242Sachim Process READ VERIFY SECTOR(S) EXT two time 7148285242Sachim Process SMART ECECUTE OFF-LINE IMMEDIATE 7149285242Sachim */ 7150285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 7151285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 7152285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 7153285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 7154285242Sachim tdIORequestBody_t *tdIORequestBody; 7155285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 7156285242Sachim satIOContext_t *satIOContext; 7157285242Sachim satIOContext_t *satOrgIOContext; 7158285242Sachim satIOContext_t *satNewIOContext; 7159285242Sachim satInternalIo_t *satIntIo; 7160285242Sachim satInternalIo_t *satNewIntIo = agNULL; 7161285242Sachim satDeviceData_t *satDevData; 7162285242Sachim scsiRspSense_t *pSense; 7163285242Sachim tiIniScsiCmnd_t *scsiCmnd; 7164285242Sachim tiIORequest_t *tiOrgIORequest; 7165285242Sachim 7166285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 7167285242Sachim bit32 ataStatus = 0; 7168285242Sachim bit32 status; 7169285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 7170285242Sachim 7171285242Sachim 7172285242Sachim TI_DBG5(("satSendDiagnosticCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 7173285242Sachim 7174285242Sachim /* internally generate tiIOContext */ 7175285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 7176285242Sachim satIOContext = (satIOContext_t *) ioContext; 7177285242Sachim satIntIo = satIOContext->satIntIoContext; 7178285242Sachim satDevData = satIOContext->pSatDevData; 7179285242Sachim hostToDevFis = satIOContext->pFis; 7180285242Sachim 7181285242Sachim if (satIntIo == agNULL) 7182285242Sachim { 7183285242Sachim TI_DBG4(("satSendDiagnosticCB: External satInternalIo_t satIntIoContext\n")); 7184285242Sachim satOrgIOContext = satIOContext; 7185285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 7186285242Sachim pSense = satOrgIOContext->pSense; 7187285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 7188285242Sachim } 7189285242Sachim else 7190285242Sachim { 7191285242Sachim TI_DBG4(("satSendDiagnosticCB: Internal satInternalIo_t satIntIoContext\n")); 7192285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 7193285242Sachim if (satOrgIOContext == agNULL) 7194285242Sachim { 7195285242Sachim TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NULL, wrong\n")); 7196285242Sachim return; 7197285242Sachim } 7198285242Sachim else 7199285242Sachim { 7200285242Sachim TI_DBG4(("satSendDiagnosticCB: satOrgIOContext is NOT NULL\n")); 7201285242Sachim } 7202285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 7203285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 7204285242Sachim pSense = satOrgIOContext->pSense; 7205285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 7206285242Sachim } 7207285242Sachim 7208285242Sachim tdIORequestBody->ioCompleted = agTRUE; 7209285242Sachim tdIORequestBody->ioStarted = agFALSE; 7210285242Sachim 7211285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 7212285242Sachim { 7213285242Sachim TI_DBG1(("satSendDiagnosticCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 7214285242Sachim satDevData->satVerifyState = 0; 7215285242Sachim satDevData->satBGPendingDiag = agFALSE; 7216285242Sachim 7217285242Sachim if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02) 7218285242Sachim { 7219285242Sachim /* no completion for background send diagnotic. It is done in satSendDiagnostic() */ 7220285242Sachim ostiInitiatorIOCompleted ( 7221285242Sachim tiRoot, 7222285242Sachim tiOrgIORequest, 7223285242Sachim tiIOFailed, 7224285242Sachim tiDetailOtherError, 7225285242Sachim agNULL, 7226285242Sachim satOrgIOContext->interruptContext 7227285242Sachim ); 7228285242Sachim } 7229285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7230285242Sachim 7231285242Sachim satFreeIntIoResource( tiRoot, 7232285242Sachim satDevData, 7233285242Sachim satIntIo); 7234285242Sachim return; 7235285242Sachim 7236285242Sachim } 7237285242Sachim 7238285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 7239285242Sachim { 7240285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 7241285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 7242285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 7243285242Sachim } 7244285242Sachim 7245285242Sachim TI_DBG5(("satSendDiagnosticCB: fis command 0x%x\n", hostToDevFis->h.command)); 7246285242Sachim 7247285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 7248285242Sachim { 7249285242Sachim /* 7250285242Sachim checking IO status, FIS type and error status 7251285242Sachim */ 7252285242Sachim satDevData->satVerifyState = 0; 7253285242Sachim satDevData->satBGPendingDiag = agFALSE; 7254285242Sachim 7255285242Sachim if( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 7256285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 7257285242Sachim ) 7258285242Sachim { 7259285242Sachim 7260285242Sachim /* for debugging */ 7261285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 7262285242Sachim { 7263285242Sachim if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) || 7264285242Sachim (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7265285242Sachim { 7266285242Sachim TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_READ_VERIFY_SECTORS(_EXT)\n")); 7267285242Sachim } 7268285242Sachim else 7269285242Sachim { 7270285242Sachim TI_DBG1(("satSendDiagnosticCB: FAILED, NOT IO_SUCCESS and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n")); 7271285242Sachim } 7272285242Sachim } 7273285242Sachim 7274285242Sachim /* for debugging */ 7275285242Sachim if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 7276285242Sachim { 7277285242Sachim if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) || 7278285242Sachim (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7279285242Sachim { 7280285242Sachim TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_READ_VERIFY_SECTORS(_EXT)\n", statDevToHostFisHeader->fisType)); 7281285242Sachim } 7282285242Sachim else 7283285242Sachim { 7284285242Sachim TI_DBG1(("satSendDiagnosticCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n",statDevToHostFisHeader->fisType)); 7285285242Sachim } 7286285242Sachim } 7287285242Sachim 7288285242Sachim /* for debugging */ 7289285242Sachim if ( (ataStatus & ERR_ATA_STATUS_MASK) || 7290285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 7291285242Sachim ) 7292285242Sachim { 7293285242Sachim if ( (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) || 7294285242Sachim (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7295285242Sachim { 7296285242Sachim TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_READ_VERIFY_SECTORS(_EXT)\n")); 7297285242Sachim } 7298285242Sachim else 7299285242Sachim { 7300285242Sachim TI_DBG1(("satSendDiagnosticCB: FAILED, error status and SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE\n")); 7301285242Sachim } 7302285242Sachim } 7303285242Sachim 7304285242Sachim /* Process abort case */ 7305285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 7306285242Sachim { 7307285242Sachim satProcessAbort(tiRoot, 7308285242Sachim tiOrgIORequest, 7309285242Sachim satOrgIOContext 7310285242Sachim ); 7311285242Sachim 7312285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7313285242Sachim 7314285242Sachim satFreeIntIoResource( tiRoot, 7315285242Sachim satDevData, 7316285242Sachim satIntIo); 7317285242Sachim return; 7318285242Sachim } 7319285242Sachim 7320285242Sachim if ( (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS) || 7321285242Sachim (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT) ) 7322285242Sachim { 7323285242Sachim /* report using the original tiIOrequst */ 7324285242Sachim /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */ 7325285242Sachim satSetSensePayload( pSense, 7326285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 7327285242Sachim 0, 7328285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7329285242Sachim satOrgIOContext); 7330285242Sachim 7331285242Sachim ostiInitiatorIOCompleted( tiRoot, 7332285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7333285242Sachim tiIOSuccess, 7334285242Sachim SCSI_STAT_CHECK_CONDITION, 7335285242Sachim satOrgIOContext->pTiSenseData, 7336285242Sachim satOrgIOContext->interruptContext ); 7337285242Sachim 7338285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7339285242Sachim 7340285242Sachim satFreeIntIoResource( tiRoot, 7341285242Sachim satDevData, 7342285242Sachim satIntIo); 7343285242Sachim return; 7344285242Sachim } 7345285242Sachim else 7346285242Sachim { 7347285242Sachim /* report using the original tiIOrequst */ 7348285242Sachim /* failed during sending SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */ 7349285242Sachim satSetSensePayload( pSense, 7350285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 7351285242Sachim 0, 7352285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7353285242Sachim satOrgIOContext); 7354285242Sachim 7355285242Sachim if (hostToDevFis->d.lbaLow != 0x01 && hostToDevFis->d.lbaLow != 0x02) 7356285242Sachim { 7357285242Sachim /* no completion for background send diagnotic. It is done in satSendDiagnostic() */ 7358285242Sachim ostiInitiatorIOCompleted( tiRoot, 7359285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7360285242Sachim tiIOSuccess, 7361285242Sachim SCSI_STAT_CHECK_CONDITION, 7362285242Sachim satOrgIOContext->pTiSenseData, 7363285242Sachim satOrgIOContext->interruptContext ); 7364285242Sachim 7365285242Sachim } 7366285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7367285242Sachim 7368285242Sachim satFreeIntIoResource( tiRoot, 7369285242Sachim satDevData, 7370285242Sachim satIntIo); 7371285242Sachim return; 7372285242Sachim } 7373285242Sachim } 7374285242Sachim } 7375285242Sachim 7376285242Sachim /* processing success case */ 7377285242Sachim switch (hostToDevFis->h.command) 7378285242Sachim { 7379285242Sachim case SAT_READ_VERIFY_SECTORS: /* fall through */ 7380285242Sachim case SAT_READ_VERIFY_SECTORS_EXT: 7381285242Sachim TI_DBG5(("satSendDiagnosticCB: SAT_READ_VERIFY_SECTORS(_EXT) case\n")); 7382285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 7383285242Sachim satDevData->satVerifyState++; 7384285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 7385285242Sachim TI_DBG5(("satSendDiagnosticCB: satVerifyState %d\n",satDevData->satVerifyState)); 7386285242Sachim 7387285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7388285242Sachim 7389285242Sachim /* done with internally genereated AT_READ_VERIFY_SECTORS(_EXT) */ 7390285242Sachim satFreeIntIoResource( tiRoot, 7391285242Sachim satDevData, 7392285242Sachim satIntIo); 7393285242Sachim 7394285242Sachim if (satDevData->satVerifyState == 3) 7395285242Sachim { 7396285242Sachim /* reset satVerifyState */ 7397285242Sachim satDevData->satVerifyState = 0; 7398285242Sachim /* return GOOD status */ 7399285242Sachim TI_DBG5(("satSendDiagnosticCB: return GOOD status\n")); 7400285242Sachim ostiInitiatorIOCompleted( tiRoot, 7401285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7402285242Sachim tiIOSuccess, 7403285242Sachim SCSI_STAT_GOOD, 7404285242Sachim agNULL, 7405285242Sachim satOrgIOContext->interruptContext ); 7406285242Sachim return; 7407285242Sachim } 7408285242Sachim else 7409285242Sachim { 7410285242Sachim 7411285242Sachim /* prepare SAT_READ_VERIFY_SECTORS(_EXT) */ 7412285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 7413285242Sachim tiOrgIORequest, 7414285242Sachim satDevData, 7415285242Sachim 0, 7416285242Sachim satNewIntIo); 7417285242Sachim if (satNewIntIo == agNULL) 7418285242Sachim { 7419285242Sachim /* reset satVerifyState */ 7420285242Sachim satDevData->satVerifyState = 0; 7421285242Sachim /* memory allocation failure */ 7422285242Sachim satFreeIntIoResource( tiRoot, 7423285242Sachim satDevData, 7424285242Sachim satNewIntIo); 7425285242Sachim 7426285242Sachim /* failed as a part of sending SAT_READ_VERIFY_SECTORS(_EXT) */ 7427285242Sachim satSetSensePayload( pSense, 7428285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 7429285242Sachim 0, 7430285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7431285242Sachim satOrgIOContext); 7432285242Sachim 7433285242Sachim ostiInitiatorIOCompleted( tiRoot, 7434285242Sachim tiOrgIORequest, 7435285242Sachim tiIOSuccess, 7436285242Sachim SCSI_STAT_CHECK_CONDITION, 7437285242Sachim satOrgIOContext->pTiSenseData, 7438285242Sachim satOrgIOContext->interruptContext ); 7439285242Sachim 7440285242Sachim TI_DBG1(("satSendDiagnosticCB: momory allocation fails\n")); 7441285242Sachim return; 7442285242Sachim } /* end of memory allocation failure */ 7443285242Sachim 7444285242Sachim /* 7445285242Sachim * Need to initialize all the fields within satIOContext 7446285242Sachim */ 7447285242Sachim 7448285242Sachim satNewIOContext = satPrepareNewIO( 7449285242Sachim satNewIntIo, 7450285242Sachim tiOrgIORequest, 7451285242Sachim satDevData, 7452285242Sachim scsiCmnd, 7453285242Sachim satOrgIOContext 7454285242Sachim ); 7455285242Sachim 7456285242Sachim if (satDevData->satVerifyState == 1) 7457285242Sachim { 7458285242Sachim /* sending SAT_CHECK_POWER_MODE */ 7459285242Sachim status = satSendDiagnostic_1( tiRoot, 7460285242Sachim &satNewIntIo->satIntTiIORequest, 7461285242Sachim satNewIOContext->ptiDeviceHandle, 7462285242Sachim &satNewIntIo->satIntTiScsiXchg, 7463285242Sachim satNewIOContext); 7464285242Sachim } 7465285242Sachim else 7466285242Sachim { 7467285242Sachim /* satDevData->satVerifyState == 2 */ 7468285242Sachim status = satSendDiagnostic_2( tiRoot, 7469285242Sachim &satNewIntIo->satIntTiIORequest, 7470285242Sachim satNewIOContext->ptiDeviceHandle, 7471285242Sachim &satNewIntIo->satIntTiScsiXchg, 7472285242Sachim satNewIOContext); 7473285242Sachim } 7474285242Sachim 7475285242Sachim if (status != tiSuccess) 7476285242Sachim { 7477285242Sachim /* sending SAT_READ_VERIFY_SECTORS(_EXT) fails */ 7478285242Sachim satFreeIntIoResource( tiRoot, 7479285242Sachim satDevData, 7480285242Sachim satNewIntIo); 7481285242Sachim 7482285242Sachim /* failed during sending SAT_READ_VERIFY_SECTORS(_EXT) */ 7483285242Sachim satSetSensePayload( pSense, 7484285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 7485285242Sachim 0, 7486285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_FAILED_SELF_TEST, 7487285242Sachim satOrgIOContext); 7488285242Sachim 7489285242Sachim ostiInitiatorIOCompleted( tiRoot, 7490285242Sachim tiOrgIORequest, 7491285242Sachim tiIOSuccess, 7492285242Sachim SCSI_STAT_CHECK_CONDITION, 7493285242Sachim satOrgIOContext->pTiSenseData, 7494285242Sachim satOrgIOContext->interruptContext ); 7495285242Sachim 7496285242Sachim /* reset satVerifyState */ 7497285242Sachim satDevData->satVerifyState = 0; 7498285242Sachim TI_DBG1(("satSendDiagnosticCB: calling satSendDiagnostic_1 or _2 fails\n")); 7499285242Sachim return; 7500285242Sachim } 7501285242Sachim } /* satDevData->satVerifyState == 1 or 2 */ 7502285242Sachim 7503285242Sachim break; 7504285242Sachim case SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE: 7505285242Sachim TI_DBG5(("satSendDiagnosticCB: SAT_SMART_EXEUTE_OFF_LINE_IMMEDIATE case\n")); 7506285242Sachim 7507285242Sachim satDevData->satBGPendingDiag = agFALSE; 7508285242Sachim 7509285242Sachim if (hostToDevFis->d.lbaLow == 0x01 || hostToDevFis->d.lbaLow == 0x02) 7510285242Sachim { 7511285242Sachim /* for background send diagnostic, no completion here. It is done already. */ 7512285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7513285242Sachim 7514285242Sachim /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */ 7515285242Sachim satFreeIntIoResource( tiRoot, 7516285242Sachim satDevData, 7517285242Sachim satIntIo); 7518285242Sachim TI_DBG5(("satSendDiagnosticCB: returning but no IOCompleted\n")); 7519285242Sachim } 7520285242Sachim else 7521285242Sachim { 7522285242Sachim TI_DBG5(("satSendDiagnosticCB: returning good status for senddiagnostic\n")); 7523285242Sachim ostiInitiatorIOCompleted( tiRoot, 7524285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7525285242Sachim tiIOSuccess, 7526285242Sachim SCSI_STAT_GOOD, 7527285242Sachim agNULL, 7528285242Sachim satOrgIOContext->interruptContext ); 7529285242Sachim 7530285242Sachim 7531285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7532285242Sachim 7533285242Sachim /* done with AT_SMART_EXEUTE_OFF_LINE_IMMEDIATE */ 7534285242Sachim satFreeIntIoResource( tiRoot, 7535285242Sachim satDevData, 7536285242Sachim satIntIo); 7537285242Sachim } 7538285242Sachim 7539285242Sachim break; 7540285242Sachim default: 7541285242Sachim TI_DBG1(("satSendDiagnosticCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 7542285242Sachim /* unspecified case, return no sense and no addition info */ 7543285242Sachim satSetSensePayload( pSense, 7544285242Sachim SCSI_SNSKEY_NO_SENSE, 7545285242Sachim 0, 7546285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 7547285242Sachim satOrgIOContext); 7548285242Sachim 7549285242Sachim ostiInitiatorIOCompleted( tiRoot, 7550285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7551285242Sachim tiIOSuccess, 7552285242Sachim SCSI_STAT_CHECK_CONDITION, 7553285242Sachim satOrgIOContext->pTiSenseData, 7554285242Sachim satOrgIOContext->interruptContext ); 7555285242Sachim 7556285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7557285242Sachim 7558285242Sachim satFreeIntIoResource( tiRoot, 7559285242Sachim satDevData, 7560285242Sachim satIntIo); 7561285242Sachim break; 7562285242Sachim } 7563285242Sachim return; 7564285242Sachim} 7565285242Sachim/***************************************************************************** 7566285242Sachim*! \brief satRequestSenseCB 7567285242Sachim* 7568285242Sachim* This routine is a callback function called from ossaSATACompleted(). 7569285242Sachim* This CB routine deals with Request Sense completion. 7570285242Sachim* 7571285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 7572285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 7573285242Sachim* \param agIOStatus: Status of completed I/O. 7574285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 7575285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 7576285242Sachim* length. 7577285242Sachim* \param agParam: Additional info based on status. 7578285242Sachim* \param ioContext: Pointer to satIOContext_t. 7579285242Sachim* 7580285242Sachim* \return: none 7581285242Sachim* 7582285242Sachim*****************************************************************************/ 7583285242Sachim/* 7584285242Sachim CB for internnaly generated SMART_RETURN_STATUS and SAT_CHECK_POWER_MODE 7585285242Sachim in the process of RequestSense 7586285242Sachim 7587285242Sachim*/ 7588285242Sachimvoid satRequestSenseCB( 7589285242Sachim agsaRoot_t *agRoot, 7590285242Sachim agsaIORequest_t *agIORequest, 7591285242Sachim bit32 agIOStatus, 7592285242Sachim agsaFisHeader_t *agFirstDword, 7593285242Sachim bit32 agIOInfoLen, 7594285242Sachim void *agParam, 7595285242Sachim void *ioContext 7596285242Sachim ) 7597285242Sachim{ 7598285242Sachim /* ATA Vol 1, p299 SAT_SMART_RETURN_STATUS */ 7599285242Sachim /* 7600285242Sachim if threshold exceeds, return SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE 7601285242Sachim else call satRequestSense_1 to send CHECK_POWER_MODE 7602285242Sachim */ 7603285242Sachim 7604285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 7605285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 7606285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 7607285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 7608285242Sachim tdIORequestBody_t *tdIORequestBody; 7609285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 7610285242Sachim satIOContext_t *satIOContext; 7611285242Sachim satIOContext_t *satOrgIOContext; 7612285242Sachim satIOContext_t *satNewIOContext; 7613285242Sachim satInternalIo_t *satIntIo; 7614285242Sachim satInternalIo_t *satNewIntIo = agNULL; 7615285242Sachim satDeviceData_t *satDevData; 7616285242Sachim scsiRspSense_t *pSense; 7617285242Sachim tiIORequest_t *tiOrgIORequest; 7618285242Sachim tiIniScsiCmnd_t *scsiCmnd; 7619285242Sachim 7620285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 7621285242Sachim bit32 ataStatus = 0; 7622285242Sachim bit32 status; 7623285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 7624285242Sachim agsaFisRegD2HData_t statDevToHostFisData; 7625285242Sachim bit32 lenReceived = 0; 7626285242Sachim bit32 dataLength; 7627285242Sachim 7628285242Sachim TI_DBG4(("satRequestSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 7629285242Sachim 7630285242Sachim /* internally generate tiIOContext */ 7631285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 7632285242Sachim satIOContext = (satIOContext_t *) ioContext; 7633285242Sachim satIntIo = satIOContext->satIntIoContext; 7634285242Sachim satDevData = satIOContext->pSatDevData; 7635285242Sachim hostToDevFis = satIOContext->pFis; 7636285242Sachim 7637285242Sachim /*ttttttthe one */ 7638285242Sachim if (satIntIo == agNULL) 7639285242Sachim { 7640285242Sachim TI_DBG4(("satRequestSenseCB: External satInternalIo_t satIntIoContext\n")); 7641285242Sachim satOrgIOContext = satIOContext; 7642285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 7643285242Sachim if (satOrgIOContext->superIOFlag) 7644285242Sachim { 7645285242Sachim pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7646285242Sachim } 7647285242Sachim else 7648285242Sachim { 7649285242Sachim pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7650285242Sachim } 7651285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 7652285242Sachim } 7653285242Sachim else 7654285242Sachim { 7655285242Sachim TI_DBG4(("satRequestSenseCB: Internal satInternalIo_t satIntIoContext\n")); 7656285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 7657285242Sachim if (satOrgIOContext == agNULL) 7658285242Sachim { 7659285242Sachim TI_DBG4(("satRequestSenseCB: satOrgIOContext is NULL, wrong\n")); 7660285242Sachim return; 7661285242Sachim } 7662285242Sachim else 7663285242Sachim { 7664285242Sachim TI_DBG4(("satRequestSenseCB: satOrgIOContext is NOT NULL\n")); 7665285242Sachim } 7666285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 7667285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 7668285242Sachim 7669285242Sachim if (satOrgIOContext->superIOFlag) 7670285242Sachim { 7671285242Sachim pSense = (scsiRspSense_t *)(((tiSuperScsiInitiatorRequest_t *)satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7672285242Sachim } 7673285242Sachim else 7674285242Sachim { 7675285242Sachim pSense = (scsiRspSense_t *)(((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->sglVirtualAddr);//satOrgIOContext->pSense; 7676285242Sachim } 7677285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 7678285242Sachim } 7679285242Sachim 7680285242Sachim tdIORequestBody->ioCompleted = agTRUE; 7681285242Sachim tdIORequestBody->ioStarted = agFALSE; 7682285242Sachim 7683285242Sachim TI_DBG4(("satRequestSenseCB: fis command 0x%x\n", hostToDevFis->h.command)); 7684285242Sachim 7685285242Sachim lenReceived = scsiCmnd->cdb[4]; 7686285242Sachim TI_DBG1(("satRequestSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived)); 7687285242Sachim 7688285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 7689285242Sachim { 7690285242Sachim TI_DBG1(("satRequestSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 7691285242Sachim ostiInitiatorIOCompleted ( 7692285242Sachim tiRoot, 7693285242Sachim tiOrgIORequest, 7694285242Sachim tiIOFailed, 7695285242Sachim tiDetailOtherError, 7696285242Sachim agNULL, 7697285242Sachim satOrgIOContext->interruptContext 7698285242Sachim ); 7699285242Sachim 7700285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7701285242Sachim 7702285242Sachim satFreeIntIoResource( tiRoot, 7703285242Sachim satDevData, 7704285242Sachim satIntIo); 7705285242Sachim 7706285242Sachim return; 7707285242Sachim } 7708285242Sachim 7709285242Sachim /* 7710285242Sachim checking IO status, FIS type and error status 7711285242Sachim */ 7712285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 7713285242Sachim { 7714285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 7715285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 7716285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 7717285242Sachim 7718285242Sachim /* for debugging */ 7719285242Sachim if( statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 7720285242Sachim { 7721285242Sachim if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 7722285242Sachim { 7723285242Sachim TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_SMART_RETURN_STATU\n", statDevToHostFisHeader->fisType)); 7724285242Sachim } 7725285242Sachim else 7726285242Sachim { 7727285242Sachim TI_DBG1(("satRequestSenseCB: FAILED, Wrong FIS type 0x%x and SAT_CHECK_POWER_MODE\n",statDevToHostFisHeader->fisType)); 7728285242Sachim } 7729285242Sachim } 7730285242Sachim 7731285242Sachim /* for debugging */ 7732285242Sachim if ( (ataStatus & ERR_ATA_STATUS_MASK) || 7733285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 7734285242Sachim ) 7735285242Sachim { 7736285242Sachim if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 7737285242Sachim { 7738285242Sachim TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_SMART_RETURN_STATU\n")); 7739285242Sachim } 7740285242Sachim else 7741285242Sachim { 7742285242Sachim TI_DBG1(("satRequestSenseCB: FAILED, error status and SAT_CHECK_POWER_MODE\n")); 7743285242Sachim } 7744285242Sachim } 7745285242Sachim 7746285242Sachim /* Process abort case */ 7747285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 7748285242Sachim { 7749285242Sachim satProcessAbort(tiRoot, 7750285242Sachim tiOrgIORequest, 7751285242Sachim satOrgIOContext 7752285242Sachim ); 7753285242Sachim 7754285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7755285242Sachim 7756285242Sachim satFreeIntIoResource( tiRoot, 7757285242Sachim satDevData, 7758285242Sachim satIntIo); 7759285242Sachim return; 7760285242Sachim } 7761285242Sachim 7762285242Sachim if (hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 7763285242Sachim { 7764285242Sachim /* report using the original tiIOrequst */ 7765285242Sachim /* failed during sending SMART RETURN STATUS */ 7766285242Sachim satSetSensePayload( pSense, 7767285242Sachim SCSI_SNSKEY_NO_SENSE, 7768285242Sachim 0, 7769285242Sachim SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE, 7770285242Sachim satOrgIOContext); 7771285242Sachim 7772285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 7773285242Sachim { 7774285242Sachim /* underrun */ 7775285242Sachim ostiInitiatorIOCompleted( tiRoot, 7776285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7777285242Sachim tiIOUnderRun, 7778285242Sachim lenReceived - SENSE_DATA_LENGTH, 7779285242Sachim agNULL, 7780285242Sachim satOrgIOContext->interruptContext ); 7781285242Sachim } 7782285242Sachim else 7783285242Sachim { 7784285242Sachim ostiInitiatorIOCompleted( tiRoot, 7785285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7786285242Sachim tiIOSuccess, 7787285242Sachim SCSI_STAT_GOOD, 7788285242Sachim agNULL, 7789285242Sachim satOrgIOContext->interruptContext ); 7790285242Sachim } 7791285242Sachim } 7792285242Sachim else 7793285242Sachim { 7794285242Sachim /* report using the original tiIOrequst */ 7795285242Sachim /* failed during sending SAT_CHECK_POWER_MODE */ 7796285242Sachim satSetSensePayload( pSense, 7797285242Sachim SCSI_SNSKEY_NO_SENSE, 7798285242Sachim 0, 7799285242Sachim SCSI_SNSCODE_LOW_POWER_CONDITION_ON, 7800285242Sachim satOrgIOContext); 7801285242Sachim 7802285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 7803285242Sachim { 7804285242Sachim /* underrun */ 7805285242Sachim ostiInitiatorIOCompleted( tiRoot, 7806285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7807285242Sachim tiIOUnderRun, 7808285242Sachim lenReceived - SENSE_DATA_LENGTH, 7809285242Sachim agNULL, 7810285242Sachim satOrgIOContext->interruptContext ); 7811285242Sachim } 7812285242Sachim else 7813285242Sachim { 7814285242Sachim ostiInitiatorIOCompleted( tiRoot, 7815285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 7816285242Sachim tiIOSuccess, 7817285242Sachim SCSI_STAT_GOOD, 7818285242Sachim agNULL, 7819285242Sachim satOrgIOContext->interruptContext ); 7820285242Sachim } 7821285242Sachim } 7822285242Sachim 7823285242Sachim 7824285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7825285242Sachim 7826285242Sachim satFreeIntIoResource( tiRoot, 7827285242Sachim satDevData, 7828285242Sachim satIntIo); 7829285242Sachim return; 7830285242Sachim } 7831285242Sachim 7832285242Sachim saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t)); 7833285242Sachim 7834285242Sachim switch (hostToDevFis->h.command) 7835285242Sachim { 7836285242Sachim case SAT_SMART_RETURN_STATUS: 7837285242Sachim TI_DBG4(("satRequestSenseCB: SAT_SMART_RETURN_STATUS case\n")); 7838285242Sachim if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C) 7839285242Sachim { 7840285242Sachim /* threshold exceeds */ 7841285242Sachim TI_DBG1(("satRequestSenseCB: threshold exceeds\n")); 7842285242Sachim 7843285242Sachim 7844285242Sachim /* report using the original tiIOrequst */ 7845285242Sachim /* failed during sending SMART RETURN STATUS */ 7846285242Sachim satSetSensePayload( pSense, 7847285242Sachim SCSI_SNSKEY_NO_SENSE, 7848285242Sachim 0, 7849285242Sachim SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE, 7850285242Sachim satOrgIOContext); 7851285242Sachim 7852285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 7853285242Sachim { 7854285242Sachim /* underrun */ 7855285242Sachim ostiInitiatorIOCompleted( tiRoot, 7856285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7857285242Sachim tiIOUnderRun, 7858285242Sachim lenReceived - SENSE_DATA_LENGTH, 7859285242Sachim agNULL, 7860285242Sachim satOrgIOContext->interruptContext ); } 7861285242Sachim else 7862285242Sachim { 7863285242Sachim ostiInitiatorIOCompleted( tiRoot, 7864285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 7865285242Sachim tiIOSuccess, 7866285242Sachim SCSI_STAT_GOOD, 7867285242Sachim agNULL, 7868285242Sachim satOrgIOContext->interruptContext ); } 7869285242Sachim 7870285242Sachim 7871285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7872285242Sachim 7873285242Sachim satFreeIntIoResource( tiRoot, 7874285242Sachim satDevData, 7875285242Sachim satIntIo); 7876285242Sachim return; 7877285242Sachim } 7878285242Sachim 7879285242Sachim 7880285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 7881285242Sachim 7882285242Sachim /* done with internally genereated SAT_SMART_RETURN_STATUS */ 7883285242Sachim satFreeIntIoResource( tiRoot, 7884285242Sachim satDevData, 7885285242Sachim satIntIo); 7886285242Sachim 7887285242Sachim /* at this point, successful SMART_RETURN_STATUS 7888285242Sachim xmit SAT_CHECK_POWER_MODE 7889285242Sachim */ 7890285242Sachim if (satOrgIOContext->superIOFlag) 7891285242Sachim { 7892285242Sachim dataLength = ((tiSuperScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 7893285242Sachim } 7894285242Sachim else 7895285242Sachim { 7896285242Sachim dataLength = ((tiScsiInitiatorRequest_t *) satOrgIOContext->tiScsiXchg)->scsiCmnd.expDataLength; 7897285242Sachim } 7898285242Sachim 7899285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 7900285242Sachim tiOrgIORequest, 7901285242Sachim satDevData, 7902285242Sachim dataLength, 7903285242Sachim satNewIntIo); 7904285242Sachim if (satNewIntIo == agNULL) 7905285242Sachim { 7906285242Sachim /* memory allocation failure */ 7907285242Sachim satFreeIntIoResource( tiRoot, 7908285242Sachim satDevData, 7909285242Sachim satNewIntIo); 7910285242Sachim 7911285242Sachim /* failed as a part of sending SMART RETURN STATUS */ 7912285242Sachim satSetSensePayload( pSense, 7913285242Sachim SCSI_SNSKEY_NO_SENSE, 7914285242Sachim 0, 7915285242Sachim SCSI_SNSCODE_HARDWARE_IMPENDING_FAILURE, 7916285242Sachim satOrgIOContext); 7917285242Sachim 7918285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 7919285242Sachim { 7920285242Sachim /* underrun */ 7921285242Sachim ostiInitiatorIOCompleted( tiRoot, 7922285242Sachim tiOrgIORequest, 7923285242Sachim tiIOUnderRun, 7924285242Sachim lenReceived - SENSE_DATA_LENGTH, 7925285242Sachim agNULL, 7926285242Sachim satOrgIOContext->interruptContext ); 7927285242Sachim } 7928285242Sachim else 7929285242Sachim { 7930285242Sachim ostiInitiatorIOCompleted( tiRoot, 7931285242Sachim tiOrgIORequest, 7932285242Sachim tiIOSuccess, 7933285242Sachim SCSI_STAT_GOOD, 7934285242Sachim agNULL, 7935285242Sachim satOrgIOContext->interruptContext ); 7936285242Sachim } 7937285242Sachim 7938285242Sachim TI_DBG1(("satRequestSenseCB: momory allocation fails\n")); 7939285242Sachim return; 7940285242Sachim } /* end of memory allocation failure */ 7941285242Sachim 7942285242Sachim 7943285242Sachim /* 7944285242Sachim * Need to initialize all the fields within satIOContext 7945285242Sachim */ 7946285242Sachim 7947285242Sachim satNewIOContext = satPrepareNewIO( 7948285242Sachim satNewIntIo, 7949285242Sachim tiOrgIORequest, 7950285242Sachim satDevData, 7951285242Sachim scsiCmnd, 7952285242Sachim satOrgIOContext 7953285242Sachim ); 7954285242Sachim 7955285242Sachim /* sending SAT_CHECK_POWER_MODE */ 7956285242Sachim status = satRequestSense_1( tiRoot, 7957285242Sachim &satNewIntIo->satIntTiIORequest, 7958285242Sachim satNewIOContext->ptiDeviceHandle, 7959285242Sachim &satNewIntIo->satIntTiScsiXchg, 7960285242Sachim satNewIOContext); 7961285242Sachim 7962285242Sachim if (status != tiSuccess) 7963285242Sachim { 7964285242Sachim /* sending SAT_CHECK_POWER_MODE fails */ 7965285242Sachim satFreeIntIoResource( tiRoot, 7966285242Sachim satDevData, 7967285242Sachim satNewIntIo); 7968285242Sachim 7969285242Sachim /* failed during sending SAT_CHECK_POWER_MODE */ 7970285242Sachim satSetSensePayload( pSense, 7971285242Sachim SCSI_SNSKEY_NO_SENSE, 7972285242Sachim 0, 7973285242Sachim SCSI_SNSCODE_LOW_POWER_CONDITION_ON, 7974285242Sachim satOrgIOContext); 7975285242Sachim 7976285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 7977285242Sachim { 7978285242Sachim /* underrun */ 7979285242Sachim ostiInitiatorIOCompleted( tiRoot, 7980285242Sachim tiOrgIORequest, 7981285242Sachim tiIOUnderRun, 7982285242Sachim lenReceived - SENSE_DATA_LENGTH, 7983285242Sachim agNULL, 7984285242Sachim satOrgIOContext->interruptContext ); 7985285242Sachim } 7986285242Sachim else 7987285242Sachim { 7988285242Sachim ostiInitiatorIOCompleted( tiRoot, 7989285242Sachim tiOrgIORequest, 7990285242Sachim tiIOSuccess, 7991285242Sachim SCSI_STAT_GOOD, 7992285242Sachim agNULL, 7993285242Sachim satOrgIOContext->interruptContext ); 7994285242Sachim } 7995285242Sachim 7996285242Sachim TI_DBG1(("satRequestSenseCB: calling satRequestSense_1 fails\n")); 7997285242Sachim return; 7998285242Sachim } 7999285242Sachim 8000285242Sachim break; 8001285242Sachim case SAT_CHECK_POWER_MODE: 8002285242Sachim TI_DBG4(("satRequestSenseCB: SAT_CHECK_POWER_MODE case\n")); 8003285242Sachim 8004285242Sachim /* check ATA STANDBY state */ 8005285242Sachim if (statDevToHostFisData.sectorCount == 0x00) 8006285242Sachim { 8007285242Sachim /* in STANDBY */ 8008285242Sachim TI_DBG1(("satRequestSenseCB: in standby\n")); 8009285242Sachim 8010285242Sachim 8011285242Sachim /* report using the original tiIOrequst */ 8012285242Sachim /* failed during sending SAT_CHECK_POWER_MODE */ 8013285242Sachim satSetSensePayload( pSense, 8014285242Sachim SCSI_SNSKEY_NO_SENSE, 8015285242Sachim 0, 8016285242Sachim SCSI_SNSCODE_LOW_POWER_CONDITION_ON, 8017285242Sachim satOrgIOContext); 8018285242Sachim 8019285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 8020285242Sachim { 8021285242Sachim /* underrun */ 8022285242Sachim ostiInitiatorIOCompleted( tiRoot, 8023285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8024285242Sachim tiIOUnderRun, 8025285242Sachim lenReceived - SENSE_DATA_LENGTH, 8026285242Sachim agNULL, 8027285242Sachim satOrgIOContext->interruptContext ); 8028285242Sachim } 8029285242Sachim else 8030285242Sachim { 8031285242Sachim ostiInitiatorIOCompleted( tiRoot, 8032285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8033285242Sachim tiIOSuccess, 8034285242Sachim SCSI_STAT_GOOD, 8035285242Sachim agNULL, 8036285242Sachim satOrgIOContext->interruptContext ); 8037285242Sachim } 8038285242Sachim 8039285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8040285242Sachim 8041285242Sachim satFreeIntIoResource( tiRoot, 8042285242Sachim satDevData, 8043285242Sachim satIntIo); 8044285242Sachim return; 8045285242Sachim } 8046285242Sachim 8047285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8048285242Sachim 8049285242Sachim /* done with internnaly generated SAT_CHECK_POWER_MODE */ 8050285242Sachim satFreeIntIoResource( tiRoot, 8051285242Sachim satDevData, 8052285242Sachim satIntIo); 8053285242Sachim 8054285242Sachim if (satDevData->satFormatState == agTRUE) 8055285242Sachim { 8056285242Sachim TI_DBG1(("satRequestSenseCB: in format\n")); 8057285242Sachim 8058285242Sachim 8059285242Sachim /* report using the original tiIOrequst */ 8060285242Sachim satSetSensePayload( pSense, 8061285242Sachim SCSI_SNSKEY_NOT_READY, 8062285242Sachim 0, 8063285242Sachim SCSI_SNSCODE_LOGICAL_UNIT_NOT_READY_FORMAT_IN_PROGRESS, 8064285242Sachim satOrgIOContext); 8065285242Sachim 8066285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 8067285242Sachim { 8068285242Sachim /* underrun */ 8069285242Sachim ostiInitiatorIOCompleted( tiRoot, 8070285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8071285242Sachim tiIOUnderRun, 8072285242Sachim lenReceived - SENSE_DATA_LENGTH, 8073285242Sachim agNULL, 8074285242Sachim satOrgIOContext->interruptContext ); 8075285242Sachim } 8076285242Sachim else 8077285242Sachim { 8078285242Sachim ostiInitiatorIOCompleted( tiRoot, 8079285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8080285242Sachim tiIOSuccess, 8081285242Sachim SCSI_STAT_GOOD, 8082285242Sachim agNULL, 8083285242Sachim satOrgIOContext->interruptContext ); 8084285242Sachim } 8085285242Sachim 8086285242Sachim return; 8087285242Sachim } 8088285242Sachim 8089285242Sachim /* normal: returns good status for requestsense */ 8090285242Sachim /* report using the original tiIOrequst */ 8091285242Sachim satSetSensePayload( pSense, 8092285242Sachim SCSI_SNSKEY_NO_SENSE, 8093285242Sachim 0, 8094285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8095285242Sachim satOrgIOContext); 8096285242Sachim TI_DBG4(("satRequestSenseCB: returning good status for requestsense\n")); 8097285242Sachim if (SENSE_DATA_LENGTH < lenReceived) 8098285242Sachim { 8099285242Sachim /* underrun */ 8100285242Sachim TI_DBG6(("satRequestSenseCB reporting underrun lenNeeded=0x%x lenReceived=0x%x tiIORequest=%p\n", 8101285242Sachim SENSE_DATA_LENGTH, lenReceived, tiOrgIORequest)); 8102285242Sachim ostiInitiatorIOCompleted( tiRoot, 8103285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8104285242Sachim tiIOUnderRun, 8105285242Sachim lenReceived - SENSE_DATA_LENGTH, 8106285242Sachim agNULL, 8107285242Sachim satOrgIOContext->interruptContext ); 8108285242Sachim 8109285242Sachim } 8110285242Sachim else 8111285242Sachim { 8112285242Sachim ostiInitiatorIOCompleted( tiRoot, 8113285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8114285242Sachim tiIOSuccess, 8115285242Sachim SCSI_STAT_GOOD, 8116285242Sachim agNULL, 8117285242Sachim satOrgIOContext->interruptContext ); 8118285242Sachim } 8119285242Sachim 8120285242Sachim break; 8121285242Sachim default: 8122285242Sachim TI_DBG1(("satRequestSenseCB: success but error default case command 0x%x\n", hostToDevFis->h.command)); 8123285242Sachim /* pSense here is a part of satOrgIOContext */ 8124285242Sachim pSense = satOrgIOContext->pTiSenseData->senseData; 8125285242Sachim satOrgIOContext->pTiSenseData->senseLen = SENSE_DATA_LENGTH; 8126285242Sachim /* unspecified case, return no sense and no addition info */ 8127285242Sachim satSetSensePayload( pSense, 8128285242Sachim SCSI_SNSKEY_NO_SENSE, 8129285242Sachim 0, 8130285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8131285242Sachim satOrgIOContext); 8132285242Sachim 8133285242Sachim ostiInitiatorIOCompleted( tiRoot, 8134285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8135285242Sachim tiIOSuccess, 8136285242Sachim SCSI_STAT_CHECK_CONDITION, 8137285242Sachim satOrgIOContext->pTiSenseData, 8138285242Sachim satOrgIOContext->interruptContext ); 8139285242Sachim 8140285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8141285242Sachim 8142285242Sachim satFreeIntIoResource( tiRoot, 8143285242Sachim satDevData, 8144285242Sachim satIntIo); 8145285242Sachim break; 8146285242Sachim } /* switch */ 8147285242Sachim 8148285242Sachim return; 8149285242Sachim} 8150285242Sachim 8151285242Sachim/***************************************************************************** 8152285242Sachim*! \brief satSynchronizeCache10n16CB 8153285242Sachim* 8154285242Sachim* This routine is a callback function for satSynchronizeCache10 and 8155285242Sachim* satSynchronizeCache1016() 8156285242Sachim* 8157285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 8158285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 8159285242Sachim* \param agIOStatus: Status of completed I/O. 8160285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 8161285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 8162285242Sachim* length. 8163285242Sachim* \param agParam: Additional info based on status. 8164285242Sachim* \param ioContext: Pointer to satIOContext_t. 8165285242Sachim* 8166285242Sachim* \return: none 8167285242Sachim* 8168285242Sachim*****************************************************************************/ 8169285242Sachimvoid satSynchronizeCache10n16CB( 8170285242Sachim agsaRoot_t *agRoot, 8171285242Sachim agsaIORequest_t *agIORequest, 8172285242Sachim bit32 agIOStatus, 8173285242Sachim agsaFisHeader_t *agFirstDword, 8174285242Sachim bit32 agIOInfoLen, 8175285242Sachim void *agParam, 8176285242Sachim void *ioContext 8177285242Sachim ) 8178285242Sachim{ 8179285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 8180285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 8181285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 8182285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 8183285242Sachim tdIORequestBody_t *tdIORequestBody; 8184285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 8185285242Sachim satIOContext_t *satIOContext; 8186285242Sachim satIOContext_t *satOrgIOContext; 8187285242Sachim satInternalIo_t *satIntIo; 8188285242Sachim satDeviceData_t *satDevData; 8189285242Sachim 8190285242Sachim scsiRspSense_t *pSense; 8191285242Sachim tiIniScsiCmnd_t *scsiCmnd; 8192285242Sachim tiIORequest_t *tiOrgIORequest; 8193285242Sachim 8194285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 8195285242Sachim bit32 ataStatus = 0; 8196285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 8197285242Sachim 8198285242Sachim TI_DBG5(("satSynchronizeCache10n16CB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 8199285242Sachim 8200285242Sachim /* internally generate tiIOContext */ 8201285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 8202285242Sachim satIOContext = (satIOContext_t *) ioContext; 8203285242Sachim satIntIo = satIOContext->satIntIoContext; 8204285242Sachim satDevData = satIOContext->pSatDevData; 8205285242Sachim hostToDevFis = satIOContext->pFis; 8206285242Sachim 8207285242Sachim /* SPC: Self-Test Result Log page */ 8208285242Sachim 8209285242Sachim if (satIntIo == agNULL) 8210285242Sachim { 8211285242Sachim TI_DBG4(("satSynchronizeCache10n16CB: External satInternalIo_t satIntIoContext\n")); 8212285242Sachim satOrgIOContext = satIOContext; 8213285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 8214285242Sachim pSense = satIOContext->pSense; 8215285242Sachim scsiCmnd = satIOContext->pScsiCmnd; 8216285242Sachim } 8217285242Sachim else 8218285242Sachim { 8219285242Sachim TI_DBG4(("satSynchronizeCache10n16CB: Internal satInternalIo_t satIntIoContext\n")); 8220285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 8221285242Sachim if (satOrgIOContext == agNULL) 8222285242Sachim { 8223285242Sachim TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NULL, wrong\n")); 8224285242Sachim return; 8225285242Sachim } 8226285242Sachim else 8227285242Sachim { 8228285242Sachim TI_DBG4(("satSynchronizeCache10n16CB: satOrgIOContext is NOT NULL\n")); 8229285242Sachim } 8230285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 8231285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 8232285242Sachim 8233285242Sachim pSense = satOrgIOContext->pSense; 8234285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 8235285242Sachim } 8236285242Sachim 8237285242Sachim tdIORequestBody->ioCompleted = agTRUE; 8238285242Sachim tdIORequestBody->ioStarted = agFALSE; 8239285242Sachim 8240285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 8241285242Sachim { 8242285242Sachim TI_DBG1(("satSynchronizeCache10n16CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 8243285242Sachim 8244285242Sachim ostiInitiatorIOCompleted ( 8245285242Sachim tiRoot, 8246285242Sachim tiOrgIORequest, 8247285242Sachim tiIOFailed, 8248285242Sachim tiDetailOtherError, 8249285242Sachim agNULL, 8250285242Sachim satOrgIOContext->interruptContext 8251285242Sachim ); 8252285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8253285242Sachim 8254285242Sachim satFreeIntIoResource( tiRoot, 8255285242Sachim satDevData, 8256285242Sachim satIntIo); 8257285242Sachim return; 8258285242Sachim } 8259285242Sachim 8260285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 8261285242Sachim { 8262285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 8263285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 8264285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 8265285242Sachim } 8266285242Sachim 8267285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 8268285242Sachim { 8269285242Sachim if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 8270285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 8271285242Sachim ) 8272285242Sachim { 8273285242Sachim /* for debugging */ 8274285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 8275285242Sachim { 8276285242Sachim TI_DBG1(("satSynchronizeCache10n16CB: FAILED, NOT IO_SUCCESS\n")); 8277285242Sachim } 8278285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 8279285242Sachim { 8280285242Sachim TI_DBG1(("satSynchronizeCache10n16CB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 8281285242Sachim } 8282285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 8283285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 8284285242Sachim ) 8285285242Sachim { 8286285242Sachim TI_DBG1(("satSynchronizeCache10n16CB: FAILED, FAILED, error status\n")); 8287285242Sachim } 8288285242Sachim 8289285242Sachim 8290285242Sachim /* Process abort case */ 8291285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 8292285242Sachim { 8293285242Sachim satProcessAbort(tiRoot, 8294285242Sachim tiOrgIORequest, 8295285242Sachim satOrgIOContext 8296285242Sachim ); 8297285242Sachim 8298285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8299285242Sachim 8300285242Sachim satFreeIntIoResource( tiRoot, 8301285242Sachim satDevData, 8302285242Sachim satIntIo); 8303285242Sachim return; 8304285242Sachim } 8305285242Sachim 8306285242Sachim switch (hostToDevFis->h.command) 8307285242Sachim { 8308285242Sachim case SAT_FLUSH_CACHE: 8309285242Sachim TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE failed\n")); 8310285242Sachim /* checking IMMED bit */ 8311285242Sachim if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK) 8312285242Sachim { 8313285242Sachim satSetDeferredSensePayload( pSense, 8314285242Sachim SCSI_SNSKEY_NO_SENSE, 8315285242Sachim 0, 8316285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8317285242Sachim satOrgIOContext); 8318285242Sachim } 8319285242Sachim else 8320285242Sachim { 8321285242Sachim satSetDeferredSensePayload( pSense, 8322285242Sachim SCSI_SNSKEY_NO_SENSE, 8323285242Sachim 0, 8324285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8325285242Sachim satOrgIOContext); 8326285242Sachim } 8327285242Sachim 8328285242Sachim 8329285242Sachim ostiInitiatorIOCompleted( tiRoot, 8330285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8331285242Sachim tiIOSuccess, 8332285242Sachim SCSI_STAT_CHECK_CONDITION, 8333285242Sachim satOrgIOContext->pTiSenseData, 8334285242Sachim satOrgIOContext->interruptContext ); 8335285242Sachim 8336285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8337285242Sachim 8338285242Sachim satFreeIntIoResource( tiRoot, 8339285242Sachim satDevData, 8340285242Sachim satIntIo); 8341285242Sachim return; 8342285242Sachim break; 8343285242Sachim case SAT_FLUSH_CACHE_EXT: 8344285242Sachim TI_DBG1(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT failed\n")); 8345285242Sachim /* checking IMMED bit */ 8346285242Sachim if (scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK) 8347285242Sachim { 8348285242Sachim satSetDeferredSensePayload( pSense, 8349285242Sachim SCSI_SNSKEY_NO_SENSE, 8350285242Sachim 0, 8351285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8352285242Sachim satOrgIOContext); 8353285242Sachim } 8354285242Sachim else 8355285242Sachim { 8356285242Sachim satSetDeferredSensePayload( pSense, 8357285242Sachim SCSI_SNSKEY_NO_SENSE, 8358285242Sachim 0, 8359285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8360285242Sachim satOrgIOContext); 8361285242Sachim } 8362285242Sachim 8363285242Sachim 8364285242Sachim ostiInitiatorIOCompleted( tiRoot, 8365285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8366285242Sachim tiIOSuccess, 8367285242Sachim SCSI_STAT_CHECK_CONDITION, 8368285242Sachim satOrgIOContext->pTiSenseData, 8369285242Sachim satOrgIOContext->interruptContext ); 8370285242Sachim 8371285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8372285242Sachim 8373285242Sachim satFreeIntIoResource( tiRoot, 8374285242Sachim satDevData, 8375285242Sachim satIntIo); 8376285242Sachim return; 8377285242Sachim break; 8378285242Sachim default: 8379285242Sachim TI_DBG1(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command)); 8380285242Sachim satSetSensePayload( pSense, 8381285242Sachim SCSI_SNSKEY_NO_SENSE, 8382285242Sachim 0, 8383285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8384285242Sachim satOrgIOContext); 8385285242Sachim 8386285242Sachim 8387285242Sachim ostiInitiatorIOCompleted( tiRoot, 8388285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8389285242Sachim tiIOSuccess, 8390285242Sachim SCSI_STAT_CHECK_CONDITION, 8391285242Sachim satOrgIOContext->pTiSenseData, 8392285242Sachim satOrgIOContext->interruptContext ); 8393285242Sachim 8394285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8395285242Sachim 8396285242Sachim satFreeIntIoResource( tiRoot, 8397285242Sachim satDevData, 8398285242Sachim satIntIo); 8399285242Sachim return; 8400285242Sachim break; 8401285242Sachim } 8402285242Sachim 8403285242Sachim return; 8404285242Sachim } /* end of error checking */ 8405285242Sachim } 8406285242Sachim 8407285242Sachim /* prcessing the success case */ 8408285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8409285242Sachim 8410285242Sachim satFreeIntIoResource( tiRoot, 8411285242Sachim satDevData, 8412285242Sachim satIntIo); 8413285242Sachim 8414285242Sachim 8415285242Sachim switch (hostToDevFis->h.command) 8416285242Sachim { 8417285242Sachim case SAT_FLUSH_CACHE: 8418285242Sachim TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE success\n")); 8419285242Sachim 8420285242Sachim /* checking IMMED bit */ 8421285242Sachim if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)) 8422285242Sachim { 8423285242Sachim ostiInitiatorIOCompleted( tiRoot, 8424285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8425285242Sachim tiIOSuccess, 8426285242Sachim SCSI_STAT_GOOD, 8427285242Sachim agNULL, 8428285242Sachim satOrgIOContext->interruptContext ); 8429285242Sachim return; 8430285242Sachim } 8431285242Sachim 8432285242Sachim 8433285242Sachim break; 8434285242Sachim case SAT_FLUSH_CACHE_EXT: 8435285242Sachim TI_DBG5(("satSynchronizeCache10n16CB: SAT_FLUSH_CACHE_EXT success\n")); 8436285242Sachim 8437285242Sachim /* checking IMMED bit */ 8438285242Sachim if ( !(scsiCmnd->cdb[1] & SCSI_FLUSH_CACHE_IMMED_MASK)) 8439285242Sachim { 8440285242Sachim ostiInitiatorIOCompleted( tiRoot, 8441285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8442285242Sachim tiIOSuccess, 8443285242Sachim SCSI_STAT_GOOD, 8444285242Sachim agNULL, 8445285242Sachim satOrgIOContext->interruptContext ); 8446285242Sachim return; 8447285242Sachim } 8448285242Sachim 8449285242Sachim break; 8450285242Sachim default: 8451285242Sachim TI_DBG5(("satSynchronizeCache10n16CB: error unknown command 0x%x\n", hostToDevFis->h.command)); 8452285242Sachim satSetSensePayload( pSense, 8453285242Sachim SCSI_SNSKEY_NO_SENSE, 8454285242Sachim 0, 8455285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8456285242Sachim satOrgIOContext); 8457285242Sachim 8458285242Sachim 8459285242Sachim ostiInitiatorIOCompleted( tiRoot, 8460285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8461285242Sachim tiIOSuccess, 8462285242Sachim SCSI_STAT_CHECK_CONDITION, 8463285242Sachim satOrgIOContext->pTiSenseData, 8464285242Sachim satOrgIOContext->interruptContext ); 8465285242Sachim 8466285242Sachim return; 8467285242Sachim break; 8468285242Sachim } 8469285242Sachim 8470285242Sachim return; 8471285242Sachim} 8472285242Sachim 8473285242Sachim/***************************************************************************** 8474285242Sachim*! \brief satModeSelect6n10CB 8475285242Sachim* 8476285242Sachim* This routine is a callback function for satModeSelect6() and 8477285242Sachim* satModeSelect10() 8478285242Sachim* 8479285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 8480285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 8481285242Sachim* \param agIOStatus: Status of completed I/O. 8482285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 8483285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 8484285242Sachim* length. 8485285242Sachim* \param agParam: Additional info based on status. 8486285242Sachim* \param ioContext: Pointer to satIOContext_t. 8487285242Sachim* 8488285242Sachim* \return: none 8489285242Sachim* 8490285242Sachim*****************************************************************************/ 8491285242Sachimvoid satModeSelect6n10CB( 8492285242Sachim agsaRoot_t *agRoot, 8493285242Sachim agsaIORequest_t *agIORequest, 8494285242Sachim bit32 agIOStatus, 8495285242Sachim agsaFisHeader_t *agFirstDword, 8496285242Sachim bit32 agIOInfoLen, 8497285242Sachim void *agParam, 8498285242Sachim void *ioContext 8499285242Sachim ) 8500285242Sachim{ 8501285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 8502285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 8503285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 8504285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 8505285242Sachim tdIORequestBody_t *tdIORequestBody; 8506285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 8507285242Sachim satIOContext_t *satIOContext; 8508285242Sachim satIOContext_t *satOrgIOContext; 8509285242Sachim satIOContext_t *satNewIOContext; 8510285242Sachim satInternalIo_t *satIntIo; 8511285242Sachim satInternalIo_t *satNewIntIo = agNULL; 8512285242Sachim satDeviceData_t *satDevData; 8513285242Sachim scsiRspSense_t *pSense; 8514285242Sachim tiIniScsiCmnd_t *scsiCmnd; 8515285242Sachim tiIORequest_t *tiOrgIORequest; 8516285242Sachim 8517285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 8518285242Sachim bit32 ataStatus = 0; 8519285242Sachim bit32 status; 8520285242Sachim tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 8521285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 8522285242Sachim 8523285242Sachim TI_DBG5(("satModeSelect6n10CB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 8524285242Sachim 8525285242Sachim /* internally generate tiIOContext */ 8526285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 8527285242Sachim satIOContext = (satIOContext_t *) ioContext; 8528285242Sachim satIntIo = satIOContext->satIntIoContext; 8529285242Sachim satDevData = satIOContext->pSatDevData; 8530285242Sachim hostToDevFis = satIOContext->pFis; 8531285242Sachim 8532285242Sachim if (satIntIo == agNULL) 8533285242Sachim { 8534285242Sachim TI_DBG4(("satModeSelect6n10CB: External satInternalIo_t satIntIoContext\n")); 8535285242Sachim satOrgIOContext = satIOContext; 8536285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 8537285242Sachim tiScsiRequest = satOrgIOContext->tiScsiXchg; 8538285242Sachim pSense = satOrgIOContext->pSense; 8539285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 8540285242Sachim } 8541285242Sachim else 8542285242Sachim { 8543285242Sachim TI_DBG4(("satModeSelect6n10CB: Internal satInternalIo_t satIntIoContext\n")); 8544285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 8545285242Sachim if (satOrgIOContext == agNULL) 8546285242Sachim { 8547285242Sachim TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NULL, wrong\n")); 8548285242Sachim return; 8549285242Sachim } 8550285242Sachim else 8551285242Sachim { 8552285242Sachim TI_DBG4(("satModeSelect6n10CB: satOrgIOContext is NOT NULL\n")); 8553285242Sachim } 8554285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 8555285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 8556285242Sachim 8557285242Sachim tiScsiRequest = satOrgIOContext->tiScsiXchg; 8558285242Sachim pSense = satOrgIOContext->pSense; 8559285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 8560285242Sachim } 8561285242Sachim 8562285242Sachim tdIORequestBody->ioCompleted = agTRUE; 8563285242Sachim tdIORequestBody->ioStarted = agFALSE; 8564285242Sachim 8565285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 8566285242Sachim { 8567285242Sachim TI_DBG1(("satModeSelect6n10CB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 8568285242Sachim ostiInitiatorIOCompleted ( 8569285242Sachim tiRoot, 8570285242Sachim tiOrgIORequest, 8571285242Sachim tiIOFailed, 8572285242Sachim tiDetailOtherError, 8573285242Sachim agNULL, 8574285242Sachim satOrgIOContext->interruptContext 8575285242Sachim ); 8576285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8577285242Sachim 8578285242Sachim satFreeIntIoResource( tiRoot, 8579285242Sachim satDevData, 8580285242Sachim satIntIo); 8581285242Sachim return; 8582285242Sachim } 8583285242Sachim 8584285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 8585285242Sachim { 8586285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 8587285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 8588285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 8589285242Sachim } 8590285242Sachim 8591285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 8592285242Sachim { 8593285242Sachim if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 8594285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 8595285242Sachim ) 8596285242Sachim { 8597285242Sachim /* for debugging */ 8598285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 8599285242Sachim { 8600285242Sachim TI_DBG1(("satModeSelect6n10CB FAILED, NOT IO_SUCCESS\n")); 8601285242Sachim } 8602285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 8603285242Sachim { 8604285242Sachim TI_DBG1(("satModeSelect6n10CB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 8605285242Sachim } 8606285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 8607285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 8608285242Sachim ) 8609285242Sachim { 8610285242Sachim TI_DBG1(("satModeSelect6n10CB FAILED, FAILED, error status\n")); 8611285242Sachim } 8612285242Sachim 8613285242Sachim /* Process abort case */ 8614285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 8615285242Sachim { 8616285242Sachim satProcessAbort(tiRoot, 8617285242Sachim tiOrgIORequest, 8618285242Sachim satOrgIOContext 8619285242Sachim ); 8620285242Sachim 8621285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8622285242Sachim 8623285242Sachim satFreeIntIoResource( tiRoot, 8624285242Sachim satDevData, 8625285242Sachim satIntIo); 8626285242Sachim return; 8627285242Sachim } 8628285242Sachim 8629285242Sachim /* for debugging */ 8630285242Sachim if (hostToDevFis->h.command == SAT_SET_FEATURES) 8631285242Sachim { 8632285242Sachim if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02)) 8633285242Sachim { 8634285242Sachim TI_DBG1(("satModeSelect6n10CB 1 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features)); 8635285242Sachim } 8636285242Sachim else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55)) 8637285242Sachim { 8638285242Sachim TI_DBG1(("ssatModeSelect6n10CB 2 SAT_SET_FEATURES failed, feature 0x%x\n", hostToDevFis->h.features)); 8639285242Sachim } 8640285242Sachim else 8641285242Sachim { 8642285242Sachim TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8643285242Sachim } 8644285242Sachim } 8645285242Sachim else if (hostToDevFis->h.command == SAT_SMART) 8646285242Sachim { 8647285242Sachim if ((hostToDevFis->h.features == SAT_SMART_ENABLE_OPERATIONS) || (hostToDevFis->h.features == SAT_SMART_DISABLE_OPERATIONS)) 8648285242Sachim { 8649285242Sachim TI_DBG1(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS failed, feature 0x%x\n", hostToDevFis->h.features)); 8650285242Sachim } 8651285242Sachim else 8652285242Sachim { 8653285242Sachim TI_DBG1(("satModeSelect6n10CB error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8654285242Sachim } 8655285242Sachim } 8656285242Sachim else 8657285242Sachim { 8658285242Sachim TI_DBG1(("satModeSelect6n10CB error default case command 0x%x\n", hostToDevFis->h.command)); 8659285242Sachim } 8660285242Sachim 8661285242Sachim 8662285242Sachim satSetSensePayload( pSense, 8663285242Sachim SCSI_SNSKEY_NO_SENSE, 8664285242Sachim 0, 8665285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8666285242Sachim satOrgIOContext); 8667285242Sachim 8668285242Sachim ostiInitiatorIOCompleted( tiRoot, 8669285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8670285242Sachim tiIOSuccess, 8671285242Sachim SCSI_STAT_CHECK_CONDITION, 8672285242Sachim satOrgIOContext->pTiSenseData, 8673285242Sachim satOrgIOContext->interruptContext ); 8674285242Sachim 8675285242Sachim 8676285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8677285242Sachim 8678285242Sachim satFreeIntIoResource( tiRoot, 8679285242Sachim satDevData, 8680285242Sachim satIntIo); 8681285242Sachim return; 8682285242Sachim } /* error checking */ 8683285242Sachim } 8684285242Sachim 8685285242Sachim 8686285242Sachim /* prcessing the success case */ 8687285242Sachim 8688285242Sachim 8689285242Sachim if (hostToDevFis->h.command == SAT_SET_FEATURES) 8690285242Sachim { 8691285242Sachim if ((hostToDevFis->h.features == 0x82) || (hostToDevFis->h.features == 0x02)) 8692285242Sachim { 8693285242Sachim TI_DBG5(("satModeSelect6n10CB 1 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features)); 8694285242Sachim 8695285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8696285242Sachim 8697285242Sachim satFreeIntIoResource( tiRoot, 8698285242Sachim satDevData, 8699285242Sachim satIntIo); 8700285242Sachim 8701285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 8702285242Sachim tiOrgIORequest, 8703285242Sachim satDevData, 8704285242Sachim 0, 8705285242Sachim satNewIntIo); 8706285242Sachim if (satNewIntIo == agNULL) 8707285242Sachim { 8708285242Sachim /* memory allocation failure */ 8709285242Sachim satFreeIntIoResource( tiRoot, 8710285242Sachim satDevData, 8711285242Sachim satNewIntIo); 8712285242Sachim 8713285242Sachim satSetSensePayload( pSense, 8714285242Sachim SCSI_SNSKEY_NO_SENSE, 8715285242Sachim 0, 8716285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8717285242Sachim satOrgIOContext); 8718285242Sachim 8719285242Sachim ostiInitiatorIOCompleted( tiRoot, 8720285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8721285242Sachim tiIOSuccess, 8722285242Sachim SCSI_STAT_CHECK_CONDITION, 8723285242Sachim satOrgIOContext->pTiSenseData, 8724285242Sachim satOrgIOContext->interruptContext ); 8725285242Sachim TI_DBG1(("satModeSelect6n10CB: momory allocation fails\n")); 8726285242Sachim return; 8727285242Sachim } /* end memory allocation */ 8728285242Sachim 8729285242Sachim satNewIOContext = satPrepareNewIO( 8730285242Sachim satNewIntIo, 8731285242Sachim tiOrgIORequest, 8732285242Sachim satDevData, 8733285242Sachim scsiCmnd, 8734285242Sachim satOrgIOContext 8735285242Sachim ); 8736285242Sachim /* sends either ATA SET FEATURES based on DRA bit */ 8737285242Sachim status = satModeSelect6n10_1( tiRoot, 8738285242Sachim &satNewIntIo->satIntTiIORequest, 8739285242Sachim satNewIOContext->ptiDeviceHandle, 8740285242Sachim tiScsiRequest, /* orginal from OS layer */ 8741285242Sachim satNewIOContext 8742285242Sachim ); 8743285242Sachim 8744285242Sachim if (status != tiSuccess) 8745285242Sachim { 8746285242Sachim /* sending ATA command fails */ 8747285242Sachim satFreeIntIoResource( tiRoot, 8748285242Sachim satDevData, 8749285242Sachim satNewIntIo); 8750285242Sachim satSetSensePayload( pSense, 8751285242Sachim SCSI_SNSKEY_NO_SENSE, 8752285242Sachim 0, 8753285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8754285242Sachim satOrgIOContext); 8755285242Sachim 8756285242Sachim ostiInitiatorIOCompleted( tiRoot, 8757285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8758285242Sachim tiIOSuccess, 8759285242Sachim SCSI_STAT_CHECK_CONDITION, 8760285242Sachim satOrgIOContext->pTiSenseData, 8761285242Sachim satOrgIOContext->interruptContext ); 8762285242Sachim TI_DBG1(("satModeSelect6n10CB calling satModeSelect6_1 fails\n")); 8763285242Sachim return; 8764285242Sachim } /* end send fails */ 8765285242Sachim return; 8766285242Sachim } 8767285242Sachim else if ((hostToDevFis->h.features == 0xAA) || (hostToDevFis->h.features == 0x55)) 8768285242Sachim { 8769285242Sachim TI_DBG5(("satModeSelect6n10CB 2 SAT_SET_FEATURES success, feature 0x%x\n", hostToDevFis->h.features)); 8770285242Sachim 8771285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8772285242Sachim 8773285242Sachim satFreeIntIoResource( tiRoot, 8774285242Sachim satDevData, 8775285242Sachim satIntIo); 8776285242Sachim 8777285242Sachim /* return stat_good */ 8778285242Sachim ostiInitiatorIOCompleted( tiRoot, 8779285242Sachim tiOrgIORequest, 8780285242Sachim tiIOSuccess, 8781285242Sachim SCSI_STAT_GOOD, 8782285242Sachim agNULL, 8783285242Sachim satOrgIOContext->interruptContext ); 8784285242Sachim return; 8785285242Sachim } 8786285242Sachim else 8787285242Sachim { 8788285242Sachim TI_DBG1(("satModeSelect6n10CB error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8789285242Sachim 8790285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8791285242Sachim 8792285242Sachim satFreeIntIoResource( tiRoot, 8793285242Sachim satDevData, 8794285242Sachim satIntIo); 8795285242Sachim satSetSensePayload( pSense, 8796285242Sachim SCSI_SNSKEY_NO_SENSE, 8797285242Sachim 0, 8798285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8799285242Sachim satOrgIOContext); 8800285242Sachim 8801285242Sachim ostiInitiatorIOCompleted( tiRoot, 8802285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8803285242Sachim tiIOSuccess, 8804285242Sachim SCSI_STAT_CHECK_CONDITION, 8805285242Sachim satOrgIOContext->pTiSenseData, 8806285242Sachim satOrgIOContext->interruptContext ); 8807285242Sachim return; 8808285242Sachim } 8809285242Sachim } 8810285242Sachim else if (hostToDevFis->h.command == SAT_SMART_ENABLE_OPERATIONS || 8811285242Sachim hostToDevFis->h.command == SAT_SMART_DISABLE_OPERATIONS 8812285242Sachim ) 8813285242Sachim { 8814285242Sachim if ((hostToDevFis->h.features == 0xD8) || (hostToDevFis->h.features == 0xD9)) 8815285242Sachim { 8816285242Sachim TI_DBG5(("satModeSelect6n10CB SAT_SMART_ENABLE/DISABLE_OPERATIONS success, feature 0x%x\n", hostToDevFis->h.features)); 8817285242Sachim 8818285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8819285242Sachim 8820285242Sachim satFreeIntIoResource( tiRoot, 8821285242Sachim satDevData, 8822285242Sachim satIntIo); 8823285242Sachim /* return stat_good */ 8824285242Sachim ostiInitiatorIOCompleted( tiRoot, 8825285242Sachim tiOrgIORequest, 8826285242Sachim tiIOSuccess, 8827285242Sachim SCSI_STAT_GOOD, 8828285242Sachim agNULL, 8829285242Sachim satOrgIOContext->interruptContext ); 8830285242Sachim return; 8831285242Sachim } 8832285242Sachim else 8833285242Sachim { 8834285242Sachim TI_DBG1(("satModeSelect6n10CB error unknown command failed 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 8835285242Sachim 8836285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8837285242Sachim 8838285242Sachim satFreeIntIoResource( tiRoot, 8839285242Sachim satDevData, 8840285242Sachim satIntIo); 8841285242Sachim satSetSensePayload( pSense, 8842285242Sachim SCSI_SNSKEY_NO_SENSE, 8843285242Sachim 0, 8844285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8845285242Sachim satOrgIOContext); 8846285242Sachim 8847285242Sachim ostiInitiatorIOCompleted( tiRoot, 8848285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8849285242Sachim tiIOSuccess, 8850285242Sachim SCSI_STAT_CHECK_CONDITION, 8851285242Sachim satOrgIOContext->pTiSenseData, 8852285242Sachim satOrgIOContext->interruptContext ); 8853285242Sachim return; 8854285242Sachim } 8855285242Sachim } 8856285242Sachim 8857285242Sachim else 8858285242Sachim { 8859285242Sachim TI_DBG1(("satModeSelect6n10CB error default case command success 0x%x\n", hostToDevFis->h.command)); 8860285242Sachim 8861285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8862285242Sachim 8863285242Sachim satFreeIntIoResource( tiRoot, 8864285242Sachim satDevData, 8865285242Sachim satIntIo); 8866285242Sachim 8867285242Sachim satSetSensePayload( pSense, 8868285242Sachim SCSI_SNSKEY_NO_SENSE, 8869285242Sachim 0, 8870285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 8871285242Sachim satOrgIOContext); 8872285242Sachim 8873285242Sachim ostiInitiatorIOCompleted( tiRoot, 8874285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 8875285242Sachim tiIOSuccess, 8876285242Sachim SCSI_STAT_CHECK_CONDITION, 8877285242Sachim satOrgIOContext->pTiSenseData, 8878285242Sachim satOrgIOContext->interruptContext ); 8879285242Sachim return; 8880285242Sachim } 8881285242Sachim 8882285242Sachim return; 8883285242Sachim} 8884285242Sachim 8885285242Sachim/***************************************************************************** 8886285242Sachim*! \brief satSMARTEnableCB 8887285242Sachim* 8888285242Sachim* This routine is a callback function for satSMARTEnable() 8889285242Sachim* 8890285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 8891285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 8892285242Sachim* \param agIOStatus: Status of completed I/O. 8893285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 8894285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 8895285242Sachim* length. 8896285242Sachim* \param agParam: Additional info based on status. 8897285242Sachim* \param ioContext: Pointer to satIOContext_t. 8898285242Sachim* 8899285242Sachim* \return: none 8900285242Sachim* 8901285242Sachim*****************************************************************************/ 8902285242Sachimvoid satSMARTEnableCB( 8903285242Sachim agsaRoot_t *agRoot, 8904285242Sachim agsaIORequest_t *agIORequest, 8905285242Sachim bit32 agIOStatus, 8906285242Sachim agsaFisHeader_t *agFirstDword, 8907285242Sachim bit32 agIOInfoLen, 8908285242Sachim void *agParam, 8909285242Sachim void *ioContext 8910285242Sachim ) 8911285242Sachim{ 8912285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 8913285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 8914285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 8915285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 8916285242Sachim tdIORequestBody_t *tdIORequestBody; 8917285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 8918285242Sachim satIOContext_t *satIOContext; 8919285242Sachim satIOContext_t *satOrgIOContext; 8920285242Sachim satIOContext_t *satNewIOContext; 8921285242Sachim satInternalIo_t *satIntIo; 8922285242Sachim satInternalIo_t *satNewIntIo = agNULL; 8923285242Sachim satDeviceData_t *satDevData; 8924285242Sachim tiIORequest_t *tiOrgIORequest; 8925285242Sachim tiIniScsiCmnd_t *scsiCmnd; 8926285242Sachim bit32 status; 8927285242Sachim 8928285242Sachim TI_DBG4(("satSMARTEnableCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 8929285242Sachim 8930285242Sachim /* internally generate tiIOContext */ 8931285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 8932285242Sachim satIOContext = (satIOContext_t *) ioContext; 8933285242Sachim satIntIo = satIOContext->satIntIoContext; 8934285242Sachim satDevData = satIOContext->pSatDevData; 8935285242Sachim 8936285242Sachim /*ttttttthe one */ 8937285242Sachim if (satIntIo == agNULL) 8938285242Sachim { 8939285242Sachim TI_DBG4(("satSMARTEnableCB: External satInternalIo_t satIntIoContext\n")); 8940285242Sachim satOrgIOContext = satIOContext; 8941285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 8942285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 8943285242Sachim } 8944285242Sachim else 8945285242Sachim { 8946285242Sachim TI_DBG4(("satSMARTEnableCB: Internal satInternalIo_t satIntIoContext\n")); 8947285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 8948285242Sachim if (satOrgIOContext == agNULL) 8949285242Sachim { 8950285242Sachim TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NULL, wrong\n")); 8951285242Sachim return; 8952285242Sachim } 8953285242Sachim else 8954285242Sachim { 8955285242Sachim TI_DBG4(("satSMARTEnableCB: satOrgIOContext is NOT NULL\n")); 8956285242Sachim } 8957285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 8958285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 8959285242Sachim 8960285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 8961285242Sachim } 8962285242Sachim 8963285242Sachim tdIORequestBody->ioCompleted = agTRUE; 8964285242Sachim tdIORequestBody->ioStarted = agFALSE; 8965285242Sachim 8966285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 8967285242Sachim { 8968285242Sachim TI_DBG1(("satSMARTEnableCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 8969285242Sachim ostiInitiatorIOCompleted ( 8970285242Sachim tiRoot, 8971285242Sachim tiOrgIORequest, 8972285242Sachim tiIOFailed, 8973285242Sachim tiDetailOtherError, 8974285242Sachim agNULL, 8975285242Sachim satOrgIOContext->interruptContext 8976285242Sachim ); 8977285242Sachim 8978285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 8979285242Sachim 8980285242Sachim satFreeIntIoResource( tiRoot, 8981285242Sachim satDevData, 8982285242Sachim satIntIo); 8983285242Sachim 8984285242Sachim return; 8985285242Sachim } 8986285242Sachim 8987285242Sachim /* 8988285242Sachim checking IO status, FIS type and error status 8989285242Sachim */ 8990285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 8991285242Sachim { 8992285242Sachim TI_DBG1(("satSMARTEnableCB: not success status, status %d\n", agIOStatus)); 8993285242Sachim ostiInitiatorIOCompleted ( 8994285242Sachim tiRoot, 8995285242Sachim tiOrgIORequest, 8996285242Sachim tiIOFailed, 8997285242Sachim tiDetailOtherError, 8998285242Sachim agNULL, 8999285242Sachim satOrgIOContext->interruptContext 9000285242Sachim ); 9001285242Sachim 9002285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9003285242Sachim 9004285242Sachim satFreeIntIoResource( tiRoot, 9005285242Sachim satDevData, 9006285242Sachim satIntIo); 9007285242Sachim 9008285242Sachim return; 9009285242Sachim } 9010285242Sachim 9011285242Sachim /* process success case */ 9012285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9013285242Sachim 9014285242Sachim satFreeIntIoResource( tiRoot, 9015285242Sachim satDevData, 9016285242Sachim satIntIo); 9017285242Sachim 9018285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 9019285242Sachim tiOrgIORequest, 9020285242Sachim satDevData, 9021285242Sachim 512, 9022285242Sachim satNewIntIo); 9023285242Sachim 9024285242Sachim if (satNewIntIo == agNULL) 9025285242Sachim { 9026285242Sachim /* memory allocation failure */ 9027285242Sachim satFreeIntIoResource( tiRoot, 9028285242Sachim satDevData, 9029285242Sachim satNewIntIo); 9030285242Sachim 9031285242Sachim ostiInitiatorIOCompleted ( 9032285242Sachim tiRoot, 9033285242Sachim tiOrgIORequest, 9034285242Sachim tiIOFailed, 9035285242Sachim tiDetailOtherError, 9036285242Sachim agNULL, 9037285242Sachim satOrgIOContext->interruptContext 9038285242Sachim ); 9039285242Sachim return; 9040285242Sachim } 9041285242Sachim 9042285242Sachim satNewIOContext = satPrepareNewIO( 9043285242Sachim satNewIntIo, 9044285242Sachim tiOrgIORequest, 9045285242Sachim satDevData, 9046285242Sachim scsiCmnd, 9047285242Sachim satOrgIOContext 9048285242Sachim ); 9049285242Sachim 9050285242Sachim status = satLogSense_1(tiRoot, 9051285242Sachim &satNewIntIo->satIntTiIORequest, 9052285242Sachim satNewIOContext->ptiDeviceHandle, 9053285242Sachim &satNewIntIo->satIntTiScsiXchg, 9054285242Sachim satNewIOContext); 9055285242Sachim 9056285242Sachim if (status != tiSuccess) 9057285242Sachim { 9058285242Sachim /* sending SAT_CHECK_POWER_MODE fails */ 9059285242Sachim satFreeIntIoResource( tiRoot, 9060285242Sachim satDevData, 9061285242Sachim satNewIntIo); 9062285242Sachim 9063285242Sachim ostiInitiatorIOCompleted ( 9064285242Sachim tiRoot, 9065285242Sachim tiOrgIORequest, 9066285242Sachim tiIOFailed, 9067285242Sachim tiDetailOtherError, 9068285242Sachim agNULL, 9069285242Sachim satOrgIOContext->interruptContext 9070285242Sachim ); 9071285242Sachim 9072285242Sachim return; 9073285242Sachim } 9074285242Sachim 9075285242Sachim return; 9076285242Sachim} 9077285242Sachim 9078285242Sachim 9079285242Sachim/***************************************************************************** 9080285242Sachim*! \brief satLogSenseCB 9081285242Sachim* 9082285242Sachim* This routine is a callback function for satLogSense() 9083285242Sachim* 9084285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 9085285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 9086285242Sachim* \param agIOStatus: Status of completed I/O. 9087285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 9088285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 9089285242Sachim* length. 9090285242Sachim* \param agParam: Additional info based on status. 9091285242Sachim* \param ioContext: Pointer to satIOContext_t. 9092285242Sachim* 9093285242Sachim* \return: none 9094285242Sachim* 9095285242Sachim*****************************************************************************/ 9096285242Sachimvoid satLogSenseCB( 9097285242Sachim agsaRoot_t *agRoot, 9098285242Sachim agsaIORequest_t *agIORequest, 9099285242Sachim bit32 agIOStatus, 9100285242Sachim agsaFisHeader_t *agFirstDword, 9101285242Sachim bit32 agIOInfoLen, 9102285242Sachim void *agParam, 9103285242Sachim void *ioContext 9104285242Sachim ) 9105285242Sachim{ 9106285242Sachim 9107285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 9108285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 9109285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 9110285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 9111285242Sachim tdIORequestBody_t *tdIORequestBody; 9112285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 9113285242Sachim satIOContext_t *satIOContext; 9114285242Sachim satIOContext_t *satOrgIOContext; 9115285242Sachim satInternalIo_t *satIntIo; 9116285242Sachim satDeviceData_t *satDevData; 9117285242Sachim 9118285242Sachim scsiRspSense_t *pSense; 9119285242Sachim tiIORequest_t *tiOrgIORequest; 9120285242Sachim 9121285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 9122285242Sachim bit32 ataStatus = 0; 9123285242Sachim tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 9124285242Sachim tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */ 9125285242Sachim satReadLogExtSelfTest_t *virtAddr1; 9126285242Sachim satSmartReadLogSelfTest_t *virtAddr2; 9127285242Sachim bit8 *pLogPage; 9128285242Sachim bit8 SelfTestExecutionStatus = 0; 9129285242Sachim bit32 i = 0; 9130285242Sachim 9131285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 9132285242Sachim agsaFisRegD2HData_t statDevToHostFisData; 9133285242Sachim tiIniScsiCmnd_t *scsiCmnd; 9134285242Sachim bit32 lenReceived = 0; 9135285242Sachim 9136285242Sachim TI_DBG5(("satLogSenseCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 9137285242Sachim 9138285242Sachim /* internally generate tiIOContext */ 9139285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 9140285242Sachim satIOContext = (satIOContext_t *) ioContext; 9141285242Sachim if (satIOContext == agNULL) 9142285242Sachim { 9143285242Sachim TI_DBG1(("satLogSenseCB: satIOContext is NULL\n")); 9144285242Sachim return; 9145285242Sachim } 9146285242Sachim satIntIo = satIOContext->satIntIoContext; 9147285242Sachim satDevData = satIOContext->pSatDevData; 9148285242Sachim hostToDevFis = satIOContext->pFis; 9149285242Sachim 9150285242Sachim if (satIntIo == agNULL) 9151285242Sachim { 9152285242Sachim TI_DBG4(("satLogSenseCB: External satInternalIo_t satIntIoContext\n")); 9153285242Sachim satOrgIOContext = satIOContext; 9154285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 9155285242Sachim pSense = satOrgIOContext->pSense; 9156285242Sachim tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9157285242Sachim /* SCSI command response payload to OS layer */ 9158285242Sachim pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9159285242Sachim /* ATA command response payload */ 9160285242Sachim tiScsiRequest = satOrgIOContext->tiScsiXchg; 9161285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 9162285242Sachim } 9163285242Sachim else 9164285242Sachim { 9165285242Sachim TI_DBG4(("satLogSenseCB: Internal satInternalIo_t satIntIoContext\n")); 9166285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 9167285242Sachim if (satOrgIOContext == agNULL) 9168285242Sachim { 9169285242Sachim TI_DBG4(("satLogSenseCB: satOrgIOContext is NULL\n")); 9170285242Sachim } 9171285242Sachim else 9172285242Sachim { 9173285242Sachim TI_DBG4(("satLogSenseCB: satOrgIOContext is NOT NULL\n")); 9174285242Sachim } 9175285242Sachim 9176285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 9177285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 9178285242Sachim 9179285242Sachim pSense = satOrgIOContext->pSense; 9180285242Sachim tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9181285242Sachim /* SCSI command response payload to OS layer */ 9182285242Sachim pLogPage = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9183285242Sachim /* ATA command response payload */ 9184285242Sachim tiScsiRequest = (tiScsiInitiatorRequest_t *)&(satIntIo->satIntTiScsiXchg); 9185285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 9186285242Sachim } 9187285242Sachim 9188285242Sachim tdIORequestBody->ioCompleted = agTRUE; 9189285242Sachim tdIORequestBody->ioStarted = agFALSE; 9190285242Sachim 9191285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 9192285242Sachim { 9193285242Sachim TI_DBG1(("satLogSenseCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 9194285242Sachim ostiInitiatorIOCompleted ( 9195285242Sachim tiRoot, 9196285242Sachim tiOrgIORequest, 9197285242Sachim tiIOFailed, 9198285242Sachim tiDetailOtherError, 9199285242Sachim agNULL, 9200285242Sachim satOrgIOContext->interruptContext 9201285242Sachim ); 9202285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9203285242Sachim 9204285242Sachim satFreeIntIoResource( tiRoot, 9205285242Sachim satDevData, 9206285242Sachim satIntIo); 9207285242Sachim return; 9208285242Sachim } 9209285242Sachim 9210285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 9211285242Sachim { 9212285242Sachim /* non-data and pio read -> device to host and pio setup fis are expected */ 9213285242Sachim /* 9214285242Sachim first, assumed to be Reg Device to Host FIS 9215285242Sachim This is OK to just find fis type 9216285242Sachim */ 9217285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 9218285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 9219285242Sachim } 9220285242Sachim 9221285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 9222285242Sachim { 9223285242Sachim if ( ((statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) && 9224285242Sachim (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS)) || 9225285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 9226285242Sachim ) 9227285242Sachim { 9228285242Sachim /* for debugging */ 9229285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 9230285242Sachim { 9231285242Sachim TI_DBG1(("satLogSenseCB: FAILED, NOT IO_SUCCESS\n")); 9232285242Sachim } 9233285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 9234285242Sachim { 9235285242Sachim TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 9236285242Sachim } 9237285242Sachim else if (statDevToHostFisHeader->fisType != PIO_SETUP_DEV_TO_HOST_FIS) 9238285242Sachim { 9239285242Sachim TI_DBG1(("satLogSenseCB: FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 9240285242Sachim } 9241285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 9242285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 9243285242Sachim ) 9244285242Sachim { 9245285242Sachim TI_DBG1(("satLogSenseCB: FAILED, FAILED, error status\n")); 9246285242Sachim } 9247285242Sachim 9248285242Sachim /* Process abort case */ 9249285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 9250285242Sachim { 9251285242Sachim satProcessAbort(tiRoot, 9252285242Sachim tiOrgIORequest, 9253285242Sachim satOrgIOContext 9254285242Sachim ); 9255285242Sachim 9256285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9257285242Sachim 9258285242Sachim satFreeIntIoResource( tiRoot, 9259285242Sachim satDevData, 9260285242Sachim satIntIo); 9261285242Sachim return; 9262285242Sachim } 9263285242Sachim 9264285242Sachim /* for debugging */ 9265285242Sachim if (hostToDevFis->h.command == SAT_READ_LOG_EXT) 9266285242Sachim { 9267285242Sachim TI_DBG1(("satLogSenseCB: SAT_READ_LOG_EXT failed\n")); 9268285242Sachim } 9269285242Sachim else if (hostToDevFis->h.command == SAT_SMART) 9270285242Sachim { 9271285242Sachim if (hostToDevFis->h.features == SAT_SMART_READ_LOG) 9272285242Sachim { 9273285242Sachim TI_DBG1(("satLogSenseCB: SAT_SMART_READ_LOG failed\n")); 9274285242Sachim } 9275285242Sachim else if (hostToDevFis->h.features == SAT_SMART_RETURN_STATUS) 9276285242Sachim { 9277285242Sachim TI_DBG1(("satLogSenseCB: SAT_SMART_RETURN_STATUS failed\n")); 9278285242Sachim } 9279285242Sachim else 9280285242Sachim { 9281285242Sachim TI_DBG1(("satLogSenseCB: error unknown command 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 9282285242Sachim } 9283285242Sachim } 9284285242Sachim else 9285285242Sachim { 9286285242Sachim TI_DBG1(("satLogSenseCB: error default case command 0x%x\n", hostToDevFis->h.command)); 9287285242Sachim } 9288285242Sachim 9289285242Sachim satSetSensePayload( pSense, 9290285242Sachim SCSI_SNSKEY_NO_SENSE, 9291285242Sachim 0, 9292285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9293285242Sachim satOrgIOContext); 9294285242Sachim 9295285242Sachim ostiInitiatorIOCompleted( tiRoot, 9296285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9297285242Sachim tiIOSuccess, 9298285242Sachim SCSI_STAT_CHECK_CONDITION, 9299285242Sachim satOrgIOContext->pTiSenseData, 9300285242Sachim satOrgIOContext->interruptContext ); 9301285242Sachim 9302285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9303285242Sachim 9304285242Sachim satFreeIntIoResource( tiRoot, 9305285242Sachim satDevData, 9306285242Sachim satIntIo); 9307285242Sachim return; 9308285242Sachim 9309285242Sachim } /* error checking */ 9310285242Sachim } 9311285242Sachim 9312285242Sachim /* prcessing the success case */ 9313285242Sachim saFrameReadBlock(agRoot, agParam, 0, &statDevToHostFisData, sizeof(agsaFisRegD2HData_t)); 9314285242Sachim 9315285242Sachim lenReceived = (scsiCmnd->cdb[7] << 8) + scsiCmnd->cdb[8]; 9316285242Sachim TI_DBG5(("satLogSenseCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived)); 9317285242Sachim 9318285242Sachim 9319285242Sachim if (hostToDevFis->h.command == SAT_READ_LOG_EXT) 9320285242Sachim { 9321285242Sachim TI_DBG5(("satLogSenseCB: SAT_READ_LOG_EXT success\n")); 9322285242Sachim 9323285242Sachim /* process log data and sends it to upper */ 9324285242Sachim 9325285242Sachim /* ATA: Extended Self-Test Log */ 9326285242Sachim virtAddr1 = (satReadLogExtSelfTest_t *)(tiScsiRequest->sglVirtualAddr); 9327285242Sachim /* 9328285242Sachim ATA/ATAPI VOLII, p197, 287 9329285242Sachim self-test execution status (4 bits); ((virtAddr1->byte[5] & 0xF0) >> 4) 9330285242Sachim */ 9331285242Sachim SelfTestExecutionStatus = (bit8)(((virtAddr1->byte[5] & 0xF0) >> 4)); 9332285242Sachim 9333285242Sachim /* fills in the log page from ATA log page */ 9334285242Sachim /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */ 9335285242Sachim pLogPage[0] = 0x10; /* page code */ 9336285242Sachim pLogPage[1] = 0; 9337285242Sachim pLogPage[2] = 0x01; /* 0x190, page length */ 9338285242Sachim pLogPage[3] = 0x90; 9339285242Sachim 9340285242Sachim /* SPC-4, Table 217 */ 9341285242Sachim pLogPage[4] = 0; /* Parameter Code */ 9342285242Sachim pLogPage[5] = 0x01; /* Parameter Code, unspecfied but ... */ 9343285242Sachim pLogPage[6] = 3; /* unspecified but ... */ 9344285242Sachim pLogPage[7] = 0x10; /* Parameter Length */ 9345285242Sachim pLogPage[8] = (bit8)(0 | ((virtAddr1->byte[5] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */ 9346285242Sachim pLogPage[9] = 0; /* self test number */ 9347285242Sachim pLogPage[10] = virtAddr1->byte[7]; /* time stamp, MSB */ 9348285242Sachim pLogPage[11] = virtAddr1->byte[6]; /* time stamp, LSB */ 9349285242Sachim 9350285242Sachim pLogPage[12] = 0; /* address of first failure MSB*/ 9351285242Sachim pLogPage[13] = 0; /* address of first failure */ 9352285242Sachim pLogPage[14] = virtAddr1->byte[14]; /* address of first failure */ 9353285242Sachim pLogPage[15] = virtAddr1->byte[13]; /* address of first failure */ 9354285242Sachim pLogPage[16] = virtAddr1->byte[12]; /* address of first failure */ 9355285242Sachim pLogPage[17] = virtAddr1->byte[11]; /* address of first failure */ 9356285242Sachim pLogPage[18] = virtAddr1->byte[10]; /* address of first failure */ 9357285242Sachim pLogPage[19] = virtAddr1->byte[9]; /* address of first failure LSB */ 9358285242Sachim 9359285242Sachim /* SAT rev8 Table75, p 76 */ 9360285242Sachim switch (SelfTestExecutionStatus) 9361285242Sachim { 9362285242Sachim case 0: 9363285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9364285242Sachim pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9365285242Sachim pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9366285242Sachim break; 9367285242Sachim case 1: 9368285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9369285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9370285242Sachim pLogPage[22] = 0x81; 9371285242Sachim break; 9372285242Sachim case 2: 9373285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9374285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9375285242Sachim pLogPage[22] = 0x82; 9376285242Sachim break; 9377285242Sachim case 3: 9378285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9379285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9380285242Sachim pLogPage[22] = 0x83; 9381285242Sachim break; 9382285242Sachim case 4: 9383285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9384285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9385285242Sachim pLogPage[22] = 0x84; 9386285242Sachim break; 9387285242Sachim case 5: 9388285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9389285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9390285242Sachim pLogPage[22] = 0x85; 9391285242Sachim break; 9392285242Sachim case 6: 9393285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9394285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9395285242Sachim pLogPage[22] = 0x86; 9396285242Sachim break; 9397285242Sachim case 7: 9398285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR; 9399285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9400285242Sachim pLogPage[22] = 0x87; 9401285242Sachim break; 9402285242Sachim case 8: 9403285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9404285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9405285242Sachim pLogPage[22] = 0x88; 9406285242Sachim break; 9407285242Sachim case 9: /* fall through */ 9408285242Sachim case 10:/* fall through */ 9409285242Sachim case 11:/* fall through */ 9410285242Sachim case 12:/* fall through */ 9411285242Sachim case 13:/* fall through */ 9412285242Sachim case 14: 9413285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9414285242Sachim pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9415285242Sachim pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9416285242Sachim break; 9417285242Sachim case 15: 9418285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9419285242Sachim pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9420285242Sachim pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9421285242Sachim break; 9422285242Sachim default: 9423285242Sachim TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus)); 9424285242Sachim 9425285242Sachim satSetSensePayload( pSense, 9426285242Sachim SCSI_SNSKEY_NO_SENSE, 9427285242Sachim 0, 9428285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9429285242Sachim satOrgIOContext); 9430285242Sachim 9431285242Sachim ostiInitiatorIOCompleted( tiRoot, 9432285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9433285242Sachim tiIOSuccess, 9434285242Sachim SCSI_STAT_CHECK_CONDITION, 9435285242Sachim satOrgIOContext->pTiSenseData, 9436285242Sachim satOrgIOContext->interruptContext ); 9437285242Sachim 9438285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9439285242Sachim 9440285242Sachim satFreeIntIoResource( tiRoot, 9441285242Sachim satDevData, 9442285242Sachim satIntIo); 9443285242Sachim 9444285242Sachim return; 9445285242Sachim } 9446285242Sachim 9447285242Sachim pLogPage[23] = 0; /* vendor specific */ 9448285242Sachim 9449285242Sachim /* the rest of Self-test results log */ 9450285242Sachim /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/ 9451285242Sachim for (i=24;i<=403;i++) 9452285242Sachim { 9453285242Sachim pLogPage[i] = 0; /* vendor specific */ 9454285242Sachim } 9455285242Sachim 9456285242Sachim if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived) 9457285242Sachim { 9458285242Sachim TI_DBG6(("satLogSenseCB: 1st underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH)); 9459285242Sachim 9460285242Sachim /* underrun */ 9461285242Sachim ostiInitiatorIOCompleted( tiRoot, 9462285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9463285242Sachim tiIOUnderRun, 9464285242Sachim lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH, 9465285242Sachim agNULL, 9466285242Sachim satOrgIOContext->interruptContext ); 9467285242Sachim 9468285242Sachim } 9469285242Sachim else 9470285242Sachim { 9471285242Sachim ostiInitiatorIOCompleted( tiRoot, 9472285242Sachim tiOrgIORequest, 9473285242Sachim tiIOSuccess, 9474285242Sachim SCSI_STAT_GOOD, 9475285242Sachim agNULL, 9476285242Sachim satOrgIOContext->interruptContext); 9477285242Sachim } 9478285242Sachim 9479285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9480285242Sachim 9481285242Sachim satFreeIntIoResource( tiRoot, 9482285242Sachim satDevData, 9483285242Sachim satIntIo); 9484285242Sachim 9485285242Sachim return; 9486285242Sachim } 9487285242Sachim else if (hostToDevFis->h.command == SAT_SMART_READ_LOG 9488285242Sachim || hostToDevFis->h.command == SAT_SMART_RETURN_STATUS) 9489285242Sachim { 9490285242Sachim if (hostToDevFis->h.features == 0xd5) 9491285242Sachim { 9492285242Sachim TI_DBG5(("satLogSenseCB: SAT_SMART_READ_LOG success\n")); 9493285242Sachim /* process log data and sends it to upper */ 9494285242Sachim 9495285242Sachim /* ATA: Extended Self-Test Log */ 9496285242Sachim virtAddr2 = (satSmartReadLogSelfTest_t *)(tiScsiRequest->sglVirtualAddr); 9497285242Sachim /* 9498285242Sachim SPC-4, p197, 287 9499285242Sachim self-test execution status (4 bits); ((virtAddr2->byte[3] & 0xF0) >> 4) 9500285242Sachim */ 9501285242Sachim SelfTestExecutionStatus = (bit8)(((virtAddr2->byte[3] & 0xF0) >> 4)); 9502285242Sachim 9503285242Sachim /* fills in the log page from ATA log page */ 9504285242Sachim /* SPC-4, 7.2.10, Table 216, 217, p 259 - 260 */ 9505285242Sachim pLogPage[0] = 0x10; /* page code */ 9506285242Sachim pLogPage[1] = 0; 9507285242Sachim pLogPage[2] = 0x01; /* 0x190, page length */ 9508285242Sachim pLogPage[3] = 0x90; /* 0x190, page length */ 9509285242Sachim 9510285242Sachim /* SPC-4, Table 217 */ 9511285242Sachim pLogPage[4] = 0; /* Parameter Code */ 9512285242Sachim pLogPage[5] = 0x01; /* Parameter Code unspecfied but ... */ 9513285242Sachim pLogPage[6] = 3; /* unspecified but ... */ 9514285242Sachim pLogPage[7] = 0x10; /* Parameter Length */ 9515285242Sachim pLogPage[8] = (bit8)(0 | ((virtAddr2->byte[3] & 0xF0) >> 4)); /* Self Test Code and Self-Test Result */ 9516285242Sachim pLogPage[9] = 0; /* self test number */ 9517285242Sachim pLogPage[10] = virtAddr2->byte[5]; /* time stamp, MSB */ 9518285242Sachim pLogPage[11] = virtAddr2->byte[4]; /* time stamp, LSB */ 9519285242Sachim 9520285242Sachim pLogPage[12] = 0; /* address of first failure MSB*/ 9521285242Sachim pLogPage[13] = 0; /* address of first failure */ 9522285242Sachim pLogPage[14] = 0; /* address of first failure */ 9523285242Sachim pLogPage[15] = 0; /* address of first failure */ 9524285242Sachim pLogPage[16] = virtAddr2->byte[10]; /* address of first failure */ 9525285242Sachim pLogPage[17] = virtAddr2->byte[9]; /* address of first failure */ 9526285242Sachim pLogPage[18] = virtAddr2->byte[8]; /* address of first failure */ 9527285242Sachim pLogPage[19] = virtAddr2->byte[7]; /* address of first failure LSB */ 9528285242Sachim 9529285242Sachim /* SAT rev8 Table75, p 76 */ 9530285242Sachim switch (SelfTestExecutionStatus) 9531285242Sachim { 9532285242Sachim case 0: 9533285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9534285242Sachim pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9535285242Sachim pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9536285242Sachim break; 9537285242Sachim case 1: 9538285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9539285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9540285242Sachim pLogPage[22] = 0x81; 9541285242Sachim break; 9542285242Sachim case 2: 9543285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9544285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9545285242Sachim pLogPage[22] = 0x82; 9546285242Sachim break; 9547285242Sachim case 3: 9548285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_ABORTED_COMMAND; 9549285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9550285242Sachim pLogPage[22] = 0x83; 9551285242Sachim break; 9552285242Sachim case 4: 9553285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9554285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9555285242Sachim pLogPage[22] = 0x84; 9556285242Sachim break; 9557285242Sachim case 5: 9558285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9559285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9560285242Sachim pLogPage[22] = 0x85; 9561285242Sachim break; 9562285242Sachim case 6: 9563285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9564285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9565285242Sachim pLogPage[22] = 0x86; 9566285242Sachim break; 9567285242Sachim case 7: 9568285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_MEDIUM_ERROR; 9569285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9570285242Sachim pLogPage[22] = 0x87; 9571285242Sachim break; 9572285242Sachim case 8: 9573285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_HARDWARE_ERROR; 9574285242Sachim pLogPage[21] = (SCSI_SNSCODE_DIAGNOSTIC_FAILURE_ON_COMPONENT_NN >> 8) & 0xFF; 9575285242Sachim pLogPage[22] = 0x88; 9576285242Sachim break; 9577285242Sachim case 9: /* fall through */ 9578285242Sachim case 10:/* fall through */ 9579285242Sachim case 11:/* fall through */ 9580285242Sachim case 12:/* fall through */ 9581285242Sachim case 13:/* fall through */ 9582285242Sachim case 14: 9583285242Sachim /* unspecified */ 9584285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9585285242Sachim pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9586285242Sachim pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9587285242Sachim break; 9588285242Sachim case 15: 9589285242Sachim pLogPage[20] = 0 | SCSI_SNSKEY_NO_SENSE; 9590285242Sachim pLogPage[21] = (SCSI_SNSCODE_NO_ADDITIONAL_INFO >> 8) & 0xFF; 9591285242Sachim pLogPage[22] = SCSI_SNSCODE_NO_ADDITIONAL_INFO & 0xFF; 9592285242Sachim break; 9593285242Sachim default: 9594285242Sachim TI_DBG1(("satLogSenseCB: Error, incorrect SelfTestExecutionStatus 0x%x\n", SelfTestExecutionStatus)); 9595285242Sachim 9596285242Sachim satSetSensePayload( pSense, 9597285242Sachim SCSI_SNSKEY_NO_SENSE, 9598285242Sachim 0, 9599285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9600285242Sachim satOrgIOContext); 9601285242Sachim 9602285242Sachim ostiInitiatorIOCompleted( tiRoot, 9603285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9604285242Sachim tiIOSuccess, 9605285242Sachim SCSI_STAT_CHECK_CONDITION, 9606285242Sachim satOrgIOContext->pTiSenseData, 9607285242Sachim satOrgIOContext->interruptContext ); 9608285242Sachim 9609285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9610285242Sachim 9611285242Sachim satFreeIntIoResource( tiRoot, 9612285242Sachim satDevData, 9613285242Sachim satIntIo); 9614285242Sachim 9615285242Sachim return; 9616285242Sachim } 9617285242Sachim 9618285242Sachim pLogPage[23] = 0; /* vendor specific */ 9619285242Sachim 9620285242Sachim /* the rest of Self-test results log */ 9621285242Sachim /* 403 is from SPC-4, 7.2.10, Table 216, p 259*/ 9622285242Sachim for (i=24;i<=403;i++) 9623285242Sachim { 9624285242Sachim pLogPage[i] = 0; /* vendor specific */ 9625285242Sachim } 9626285242Sachim 9627285242Sachim if (SELFTEST_RESULTS_LOG_PAGE_LENGTH < lenReceived) 9628285242Sachim { 9629285242Sachim TI_DBG6(("satLogSenseCB: 2nd underrun lenReceived %d len %d \n", lenReceived, SELFTEST_RESULTS_LOG_PAGE_LENGTH)); 9630285242Sachim 9631285242Sachim /* underrun */ 9632285242Sachim ostiInitiatorIOCompleted( tiRoot, 9633285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9634285242Sachim tiIOUnderRun, 9635285242Sachim lenReceived - SELFTEST_RESULTS_LOG_PAGE_LENGTH, 9636285242Sachim agNULL, 9637285242Sachim satOrgIOContext->interruptContext ); 9638285242Sachim 9639285242Sachim } 9640285242Sachim else 9641285242Sachim { 9642285242Sachim ostiInitiatorIOCompleted( tiRoot, 9643285242Sachim tiOrgIORequest, 9644285242Sachim tiIOSuccess, 9645285242Sachim SCSI_STAT_GOOD, 9646285242Sachim agNULL, 9647285242Sachim satOrgIOContext->interruptContext); 9648285242Sachim } 9649285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9650285242Sachim 9651285242Sachim satFreeIntIoResource( tiRoot, 9652285242Sachim satDevData, 9653285242Sachim satIntIo); 9654285242Sachim 9655285242Sachim return; 9656285242Sachim } 9657285242Sachim else if (hostToDevFis->h.features == 0xda) 9658285242Sachim { 9659285242Sachim TI_DBG5(("satLogSenseCB: SAT_SMART_RETURN_STATUS success\n")); 9660285242Sachim 9661285242Sachim /* fills in the log page from ATA output */ 9662285242Sachim /* SPC-4, 7.2.5, Table 209, 211, p 255 */ 9663285242Sachim pLogPage[0] = 0x2F; /* page code unspecified */ 9664285242Sachim pLogPage[1] = 0; /* reserved */ 9665285242Sachim pLogPage[2] = 0; /* page length */ 9666285242Sachim pLogPage[3] = 0x07; /* page length */ 9667285242Sachim 9668285242Sachim /* 9669285242Sachim SPC-4, 7.2.5, Table 211, p 255 9670285242Sachim no vendor specific field 9671285242Sachim */ 9672285242Sachim pLogPage[4] = 0; /* Parameter Code */ 9673285242Sachim pLogPage[5] = 0; /* Parameter Code unspecfied but to do: */ 9674285242Sachim pLogPage[6] = 0; /* unspecified */ 9675285242Sachim pLogPage[7] = 0x03; /* Parameter length, unspecified */ 9676285242Sachim 9677285242Sachim /* SAT rev8, 10.2.3.1 Table 72, p 73 */ 9678285242Sachim if (statDevToHostFisData.lbaMid == 0x4F || statDevToHostFisData.lbaHigh == 0xC2) 9679285242Sachim { 9680285242Sachim pLogPage[8] = 0; /* Sense code */ 9681285242Sachim pLogPage[9] = 0; /* Sense code qualifier */ 9682285242Sachim } 9683285242Sachim else if (statDevToHostFisData.lbaMid == 0xF4 || statDevToHostFisData.lbaHigh == 0x2C) 9684285242Sachim { 9685285242Sachim pLogPage[8] = 0x5D; /* Sense code */ 9686285242Sachim pLogPage[9] = 0x10; /* Sense code qualifier */ 9687285242Sachim } 9688285242Sachim 9689285242Sachim /* Assumption: No support for SCT */ 9690285242Sachim pLogPage[10] = 0xFF; /* Most Recent Temperature Reading */ 9691285242Sachim 9692285242Sachim if (INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH < lenReceived) 9693285242Sachim { 9694285242Sachim TI_DBG6(("satLogSenseCB: 3rd underrun lenReceived %d len %d \n", lenReceived, INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH)); 9695285242Sachim 9696285242Sachim /* underrun */ 9697285242Sachim ostiInitiatorIOCompleted( tiRoot, 9698285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9699285242Sachim tiIOUnderRun, 9700285242Sachim lenReceived - INFORMATION_EXCEPTIONS_LOG_PAGE_LENGTH, 9701285242Sachim agNULL, 9702285242Sachim satOrgIOContext->interruptContext ); 9703285242Sachim 9704285242Sachim } 9705285242Sachim else 9706285242Sachim { 9707285242Sachim ostiInitiatorIOCompleted( tiRoot, 9708285242Sachim tiOrgIORequest, 9709285242Sachim tiIOSuccess, 9710285242Sachim SCSI_STAT_GOOD, 9711285242Sachim agNULL, 9712285242Sachim satOrgIOContext->interruptContext); 9713285242Sachim } 9714285242Sachim 9715285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9716285242Sachim 9717285242Sachim satFreeIntIoResource( tiRoot, 9718285242Sachim satDevData, 9719285242Sachim satIntIo); 9720285242Sachim 9721285242Sachim 9722285242Sachim return; 9723285242Sachim } 9724285242Sachim else 9725285242Sachim { 9726285242Sachim TI_DBG1(("satLogSenseCB: error unknown command success 0x%x feature 0x%x\n", hostToDevFis->h.command, hostToDevFis->h.features)); 9727285242Sachim satSetSensePayload( pSense, 9728285242Sachim SCSI_SNSKEY_NO_SENSE, 9729285242Sachim 0, 9730285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9731285242Sachim satOrgIOContext); 9732285242Sachim 9733285242Sachim ostiInitiatorIOCompleted( tiRoot, 9734285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9735285242Sachim tiIOSuccess, 9736285242Sachim SCSI_STAT_CHECK_CONDITION, 9737285242Sachim satOrgIOContext->pTiSenseData, 9738285242Sachim satOrgIOContext->interruptContext ); 9739285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9740285242Sachim 9741285242Sachim satFreeIntIoResource( tiRoot, 9742285242Sachim satDevData, 9743285242Sachim satIntIo); 9744285242Sachim 9745285242Sachim return; 9746285242Sachim } 9747285242Sachim } 9748285242Sachim else 9749285242Sachim { 9750285242Sachim TI_DBG1(("satLogSenseCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 9751285242Sachim satSetSensePayload( pSense, 9752285242Sachim SCSI_SNSKEY_NO_SENSE, 9753285242Sachim 0, 9754285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9755285242Sachim satOrgIOContext); 9756285242Sachim 9757285242Sachim ostiInitiatorIOCompleted( tiRoot, 9758285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9759285242Sachim tiIOSuccess, 9760285242Sachim SCSI_STAT_CHECK_CONDITION, 9761285242Sachim satOrgIOContext->pTiSenseData, 9762285242Sachim satOrgIOContext->interruptContext ); 9763285242Sachim 9764285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9765285242Sachim 9766285242Sachim satFreeIntIoResource( tiRoot, 9767285242Sachim satDevData, 9768285242Sachim satIntIo); 9769285242Sachim 9770285242Sachim return; 9771285242Sachim } 9772285242Sachim 9773285242Sachim return; 9774285242Sachim} 9775285242Sachim 9776285242Sachim/***************************************************************************** 9777285242Sachim*! \brief satReadMediaSerialNumberCB 9778285242Sachim* 9779285242Sachim* This routine is a callback function called from ossaSATACompleted(). 9780285242Sachim* This CB routine deals with Read Media Serial Number completion. 9781285242Sachim* 9782285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 9783285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 9784285242Sachim* \param agIOStatus: Status of completed I/O. 9785285242Sachim* \param agSATAParm1: Additional info based on status. 9786285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 9787285242Sachim* length. 9788285242Sachim* \param ioContext: Pointer to satIOContext_t. 9789285242Sachim* 9790285242Sachim* \return: none 9791285242Sachim* 9792285242Sachim*****************************************************************************/ 9793285242Sachimvoid satReadMediaSerialNumberCB( 9794285242Sachim agsaRoot_t *agRoot, 9795285242Sachim agsaIORequest_t *agIORequest, 9796285242Sachim bit32 agIOStatus, 9797285242Sachim agsaFisHeader_t *agFirstDword, 9798285242Sachim bit32 agIOInfoLen, 9799285242Sachim agsaFrameHandle_t agFrameHandle, 9800285242Sachim void *ioContext 9801285242Sachim ) 9802285242Sachim{ 9803285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 9804285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 9805285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 9806285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 9807285242Sachim tdIORequestBody_t *tdIORequestBody; 9808285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 9809285242Sachim satIOContext_t *satIOContext; 9810285242Sachim satIOContext_t *satOrgIOContext; 9811285242Sachim satInternalIo_t *satIntIo; 9812285242Sachim satDeviceData_t *satDevData; 9813285242Sachim 9814285242Sachim scsiRspSense_t *pSense; 9815285242Sachim tiIORequest_t *tiOrgIORequest; 9816285242Sachim 9817285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 9818285242Sachim tiScsiInitiatorRequest_t *tiOrgScsiRequest; /* tiScsiXchg */ 9819285242Sachim bit8 *pMediaSerialNumber; 9820285242Sachim 9821285242Sachim tiIniScsiCmnd_t *scsiCmnd; 9822285242Sachim bit32 lenReceived = 0; 9823285242Sachim 9824285242Sachim TI_DBG4(("satReadMediaSerialNumberCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 9825285242Sachim 9826285242Sachim /* internally generate tiIOContext */ 9827285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 9828285242Sachim satIOContext = (satIOContext_t *) ioContext; 9829285242Sachim satIntIo = satIOContext->satIntIoContext; 9830285242Sachim satDevData = satIOContext->pSatDevData; 9831285242Sachim hostToDevFis = satIOContext->pFis; 9832285242Sachim 9833285242Sachim if (satIntIo == agNULL) 9834285242Sachim { 9835285242Sachim TI_DBG4(("satReadMediaSerialNumberCB: External satInternalIo_t satIntIoContext\n")); 9836285242Sachim satOrgIOContext = satIOContext; 9837285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 9838285242Sachim pSense = satOrgIOContext->pSense; 9839285242Sachim tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9840285242Sachim /* SCSI command response payload to OS layer */ 9841285242Sachim pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9842285242Sachim /* ATA command response payload */ 9843285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 9844285242Sachim 9845285242Sachim 9846285242Sachim } 9847285242Sachim else 9848285242Sachim { 9849285242Sachim TI_DBG4(("satReadMediaSerialNumberCB: Internal satInternalIo_t satIntIoContext\n")); 9850285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 9851285242Sachim if (satOrgIOContext == agNULL) 9852285242Sachim { 9853285242Sachim TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NULL, wrong\n")); 9854285242Sachim return; 9855285242Sachim } 9856285242Sachim else 9857285242Sachim { 9858285242Sachim TI_DBG4(("satReadMediaSerialNumberCB: satOrgIOContext is NOT NULL\n")); 9859285242Sachim } 9860285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 9861285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 9862285242Sachim 9863285242Sachim pSense = satOrgIOContext->pSense; 9864285242Sachim tiOrgScsiRequest = satOrgIOContext->tiScsiXchg; 9865285242Sachim /* SCSI command response payload to OS layer */ 9866285242Sachim pMediaSerialNumber = (bit8 *) tiOrgScsiRequest->sglVirtualAddr; 9867285242Sachim /* ATA command response payload */ 9868285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 9869285242Sachim } 9870285242Sachim 9871285242Sachim tdIORequestBody->ioCompleted = agTRUE; 9872285242Sachim tdIORequestBody->ioStarted = agFALSE; 9873285242Sachim 9874285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 9875285242Sachim { 9876285242Sachim TI_DBG1(("satReadMediaSerialNumberCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 9877285242Sachim ostiInitiatorIOCompleted ( 9878285242Sachim tiRoot, 9879285242Sachim tiOrgIORequest, 9880285242Sachim tiIOFailed, 9881285242Sachim tiDetailOtherError, 9882285242Sachim agNULL, 9883285242Sachim satOrgIOContext->interruptContext 9884285242Sachim ); 9885285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9886285242Sachim 9887285242Sachim satFreeIntIoResource( tiRoot, 9888285242Sachim satDevData, 9889285242Sachim satIntIo); 9890285242Sachim return; 9891285242Sachim } 9892285242Sachim 9893285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 9894285242Sachim { 9895285242Sachim /* Process abort case */ 9896285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 9897285242Sachim { 9898285242Sachim satProcessAbort(tiRoot, 9899285242Sachim tiOrgIORequest, 9900285242Sachim satOrgIOContext 9901285242Sachim ); 9902285242Sachim 9903285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9904285242Sachim 9905285242Sachim satFreeIntIoResource( tiRoot, 9906285242Sachim satDevData, 9907285242Sachim satIntIo); 9908285242Sachim return; 9909285242Sachim } 9910285242Sachim satSetSensePayload( pSense, 9911285242Sachim SCSI_SNSKEY_NOT_READY, 9912285242Sachim 0, 9913285242Sachim SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 9914285242Sachim satOrgIOContext); 9915285242Sachim 9916285242Sachim ostiInitiatorIOCompleted( tiRoot, 9917285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9918285242Sachim tiIOSuccess, 9919285242Sachim SCSI_STAT_CHECK_CONDITION, 9920285242Sachim satOrgIOContext->pTiSenseData, 9921285242Sachim satOrgIOContext->interruptContext ); 9922285242Sachim 9923285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9924285242Sachim 9925285242Sachim satFreeIntIoResource( tiRoot, 9926285242Sachim satDevData, 9927285242Sachim satIntIo); 9928285242Sachim return; 9929285242Sachim } 9930285242Sachim 9931285242Sachim /* process success case */ 9932285242Sachim lenReceived = (scsiCmnd->cdb[6] << (8*3)) + (scsiCmnd->cdb[7] << (8*2)) 9933285242Sachim + (scsiCmnd->cdb[8] << 8) + scsiCmnd->cdb[9]; 9934285242Sachim TI_DBG5(("satReadMediaSerialNumberCB: lenReceived in CDB %d 0x%x\n", lenReceived,lenReceived)); 9935285242Sachim 9936285242Sachim if (hostToDevFis->h.command == SAT_READ_SECTORS || 9937285242Sachim hostToDevFis->h.command == SAT_READ_SECTORS_EXT 9938285242Sachim ) 9939285242Sachim { 9940285242Sachim pMediaSerialNumber[0] = 0; 9941285242Sachim pMediaSerialNumber[1] = 0; 9942285242Sachim pMediaSerialNumber[2] = 0; 9943285242Sachim pMediaSerialNumber[3] = 4; 9944285242Sachim pMediaSerialNumber[4] = 0; 9945285242Sachim pMediaSerialNumber[5] = 0; 9946285242Sachim pMediaSerialNumber[6] = 0; 9947285242Sachim pMediaSerialNumber[7] = 0; 9948285242Sachim 9949285242Sachim if (ZERO_MEDIA_SERIAL_NUMBER_LENGTH < lenReceived) 9950285242Sachim { 9951285242Sachim TI_DBG1(("satReadMediaSerialNumberCB: 1st underrun lenReceived %d len %d \n", lenReceived, ZERO_MEDIA_SERIAL_NUMBER_LENGTH)); 9952285242Sachim 9953285242Sachim /* underrun */ 9954285242Sachim ostiInitiatorIOCompleted( tiRoot, 9955285242Sachim tiOrgIORequest, /* == satIntIo->satOrgTiIORequest */ 9956285242Sachim tiIOUnderRun, 9957285242Sachim lenReceived - ZERO_MEDIA_SERIAL_NUMBER_LENGTH, 9958285242Sachim agNULL, 9959285242Sachim satOrgIOContext->interruptContext ); 9960285242Sachim 9961285242Sachim } 9962285242Sachim else 9963285242Sachim { 9964285242Sachim ostiInitiatorIOCompleted( tiRoot, 9965285242Sachim tiOrgIORequest, 9966285242Sachim tiIOSuccess, 9967285242Sachim SCSI_STAT_GOOD, 9968285242Sachim agNULL, 9969285242Sachim satOrgIOContext->interruptContext); 9970285242Sachim } 9971285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9972285242Sachim 9973285242Sachim satFreeIntIoResource( tiRoot, 9974285242Sachim satDevData, 9975285242Sachim satIntIo); 9976285242Sachim return; 9977285242Sachim } 9978285242Sachim else 9979285242Sachim { 9980285242Sachim TI_DBG1(("satReadMediaSerialNumberCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 9981285242Sachim satSetSensePayload( pSense, 9982285242Sachim SCSI_SNSKEY_NO_SENSE, 9983285242Sachim 0, 9984285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 9985285242Sachim satOrgIOContext); 9986285242Sachim 9987285242Sachim ostiInitiatorIOCompleted( tiRoot, 9988285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 9989285242Sachim tiIOSuccess, 9990285242Sachim SCSI_STAT_CHECK_CONDITION, 9991285242Sachim satOrgIOContext->pTiSenseData, 9992285242Sachim satOrgIOContext->interruptContext ); 9993285242Sachim 9994285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 9995285242Sachim 9996285242Sachim satFreeIntIoResource( tiRoot, 9997285242Sachim satDevData, 9998285242Sachim satIntIo); 9999285242Sachim 10000285242Sachim return; 10001285242Sachim } 10002285242Sachim return; 10003285242Sachim} 10004285242Sachim 10005285242Sachim/***************************************************************************** 10006285242Sachim*! \brief satReadBufferCB 10007285242Sachim* 10008285242Sachim* This routine is a callback function called from ossaSATACompleted(). 10009285242Sachim* This CB routine deals with Read Buffer. 10010285242Sachim* 10011285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 10012285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 10013285242Sachim* \param agIOStatus: Status of completed I/O. 10014285242Sachim* \param agSATAParm1: Additional info based on status. 10015285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10016285242Sachim* length. 10017285242Sachim* \param ioContext: Pointer to satIOContext_t. 10018285242Sachim* 10019285242Sachim* \return: none 10020285242Sachim* 10021285242Sachim*****************************************************************************/ 10022285242Sachimvoid satReadBufferCB( 10023285242Sachim agsaRoot_t *agRoot, 10024285242Sachim agsaIORequest_t *agIORequest, 10025285242Sachim bit32 agIOStatus, 10026285242Sachim agsaFisHeader_t *agFirstDword, 10027285242Sachim bit32 agIOInfoLen, 10028285242Sachim agsaFrameHandle_t agFrameHandle, 10029285242Sachim void *ioContext 10030285242Sachim ) 10031285242Sachim{ 10032285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10033285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10034285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10035285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10036285242Sachim tdIORequestBody_t *tdIORequestBody; 10037285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 10038285242Sachim satIOContext_t *satIOContext; 10039285242Sachim satIOContext_t *satOrgIOContext; 10040285242Sachim satInternalIo_t *satIntIo; 10041285242Sachim satDeviceData_t *satDevData; 10042285242Sachim scsiRspSense_t *pSense; 10043285242Sachim tiIORequest_t *tiOrgIORequest; 10044285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 10045285242Sachim 10046285242Sachim TI_DBG4(("satReadBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 10047285242Sachim 10048285242Sachim /* internally generate tiIOContext */ 10049285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10050285242Sachim satIOContext = (satIOContext_t *) ioContext; 10051285242Sachim satIntIo = satIOContext->satIntIoContext; 10052285242Sachim satDevData = satIOContext->pSatDevData; 10053285242Sachim hostToDevFis = satIOContext->pFis; 10054285242Sachim 10055285242Sachim 10056285242Sachim if (satIntIo == agNULL) 10057285242Sachim { 10058285242Sachim TI_DBG4(("satReadBufferCB: External satInternalIo_t satIntIoContext\n")); 10059285242Sachim satOrgIOContext = satIOContext; 10060285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 10061285242Sachim pSense = satOrgIOContext->pSense; 10062285242Sachim 10063285242Sachim /* SCSI command response payload to OS layer */ 10064285242Sachim 10065285242Sachim /* ATA command response payload */ 10066285242Sachim 10067285242Sachim } 10068285242Sachim else 10069285242Sachim { 10070285242Sachim TI_DBG4(("satReadBufferCB: Internal satInternalIo_t satIntIoContext\n")); 10071285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 10072285242Sachim if (satOrgIOContext == agNULL) 10073285242Sachim { 10074285242Sachim TI_DBG4(("satReadBufferCB: satOrgIOContext is NULL, wrong\n")); 10075285242Sachim return; 10076285242Sachim } 10077285242Sachim else 10078285242Sachim { 10079285242Sachim TI_DBG4(("satReadBufferCB: satOrgIOContext is NOT NULL\n")); 10080285242Sachim } 10081285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 10082285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 10083285242Sachim 10084285242Sachim pSense = satOrgIOContext->pSense; 10085285242Sachim 10086285242Sachim /* SCSI command response payload to OS layer */ 10087285242Sachim 10088285242Sachim /* ATA command response payload */ 10089285242Sachim 10090285242Sachim } 10091285242Sachim 10092285242Sachim tdIORequestBody->ioCompleted = agTRUE; 10093285242Sachim tdIORequestBody->ioStarted = agFALSE; 10094285242Sachim 10095285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 10096285242Sachim { 10097285242Sachim TI_DBG1(("satReadBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 10098285242Sachim ostiInitiatorIOCompleted ( 10099285242Sachim tiRoot, 10100285242Sachim tiOrgIORequest, 10101285242Sachim tiIOFailed, 10102285242Sachim tiDetailOtherError, 10103285242Sachim agNULL, 10104285242Sachim satOrgIOContext->interruptContext 10105285242Sachim ); 10106285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10107285242Sachim 10108285242Sachim satFreeIntIoResource( tiRoot, 10109285242Sachim satDevData, 10110285242Sachim satIntIo); 10111285242Sachim return; 10112285242Sachim } 10113285242Sachim 10114285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 10115285242Sachim { 10116285242Sachim /* Process abort case */ 10117285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 10118285242Sachim { 10119285242Sachim satProcessAbort(tiRoot, 10120285242Sachim tiOrgIORequest, 10121285242Sachim satOrgIOContext 10122285242Sachim ); 10123285242Sachim 10124285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10125285242Sachim 10126285242Sachim satFreeIntIoResource( tiRoot, 10127285242Sachim satDevData, 10128285242Sachim satIntIo); 10129285242Sachim return; 10130285242Sachim } 10131285242Sachim satSetSensePayload( pSense, 10132285242Sachim SCSI_SNSKEY_NOT_READY, 10133285242Sachim 0, 10134285242Sachim SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 10135285242Sachim satOrgIOContext); 10136285242Sachim 10137285242Sachim ostiInitiatorIOCompleted( tiRoot, 10138285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10139285242Sachim tiIOSuccess, 10140285242Sachim SCSI_STAT_CHECK_CONDITION, 10141285242Sachim satOrgIOContext->pTiSenseData, 10142285242Sachim satOrgIOContext->interruptContext ); 10143285242Sachim 10144285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10145285242Sachim 10146285242Sachim satFreeIntIoResource( tiRoot, 10147285242Sachim satDevData, 10148285242Sachim satIntIo); 10149285242Sachim return; 10150285242Sachim } 10151285242Sachim 10152285242Sachim /* process success case */ 10153285242Sachim if (hostToDevFis->h.command == SAT_READ_BUFFER ) 10154285242Sachim { 10155285242Sachim 10156285242Sachim ostiInitiatorIOCompleted( tiRoot, 10157285242Sachim tiOrgIORequest, 10158285242Sachim tiIOSuccess, 10159285242Sachim SCSI_STAT_GOOD, 10160285242Sachim agNULL, 10161285242Sachim satOrgIOContext->interruptContext); 10162285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10163285242Sachim 10164285242Sachim satFreeIntIoResource( tiRoot, 10165285242Sachim satDevData, 10166285242Sachim satIntIo); 10167285242Sachim return; 10168285242Sachim } 10169285242Sachim else 10170285242Sachim { 10171285242Sachim TI_DBG1(("satReadBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 10172285242Sachim satSetSensePayload( pSense, 10173285242Sachim SCSI_SNSKEY_NO_SENSE, 10174285242Sachim 0, 10175285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 10176285242Sachim satOrgIOContext); 10177285242Sachim 10178285242Sachim ostiInitiatorIOCompleted( tiRoot, 10179285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10180285242Sachim tiIOSuccess, 10181285242Sachim SCSI_STAT_CHECK_CONDITION, 10182285242Sachim satOrgIOContext->pTiSenseData, 10183285242Sachim satOrgIOContext->interruptContext ); 10184285242Sachim 10185285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10186285242Sachim 10187285242Sachim satFreeIntIoResource( tiRoot, 10188285242Sachim satDevData, 10189285242Sachim satIntIo); 10190285242Sachim 10191285242Sachim return; 10192285242Sachim } 10193285242Sachim 10194285242Sachim return; 10195285242Sachim} 10196285242Sachim 10197285242Sachim/***************************************************************************** 10198285242Sachim*! \brief satWriteBufferCB 10199285242Sachim* 10200285242Sachim* This routine is a callback function called from ossaSATACompleted(). 10201285242Sachim* This CB routine deals with Write Buffer. 10202285242Sachim* 10203285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 10204285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 10205285242Sachim* \param agIOStatus: Status of completed I/O. 10206285242Sachim* \param agSATAParm1: Additional info based on status. 10207285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10208285242Sachim* length. 10209285242Sachim* \param ioContext: Pointer to satIOContext_t. 10210285242Sachim* 10211285242Sachim* \return: none 10212285242Sachim* 10213285242Sachim*****************************************************************************/ 10214285242Sachimvoid satWriteBufferCB( 10215285242Sachim agsaRoot_t *agRoot, 10216285242Sachim agsaIORequest_t *agIORequest, 10217285242Sachim bit32 agIOStatus, 10218285242Sachim agsaFisHeader_t *agFirstDword, 10219285242Sachim bit32 agIOInfoLen, 10220285242Sachim agsaFrameHandle_t agFrameHandle, 10221285242Sachim void *ioContext 10222285242Sachim ) 10223285242Sachim{ 10224285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10225285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10226285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10227285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10228285242Sachim tdIORequestBody_t *tdIORequestBody; 10229285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 10230285242Sachim satIOContext_t *satIOContext; 10231285242Sachim satIOContext_t *satOrgIOContext; 10232285242Sachim satInternalIo_t *satIntIo; 10233285242Sachim satDeviceData_t *satDevData; 10234285242Sachim scsiRspSense_t *pSense; 10235285242Sachim tiIORequest_t *tiOrgIORequest; 10236285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 10237285242Sachim 10238285242Sachim TI_DBG4(("satWriteBufferCB:agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 10239285242Sachim 10240285242Sachim /* internally generate tiIOContext */ 10241285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10242285242Sachim satIOContext = (satIOContext_t *) ioContext; 10243285242Sachim satIntIo = satIOContext->satIntIoContext; 10244285242Sachim satDevData = satIOContext->pSatDevData; 10245285242Sachim hostToDevFis = satIOContext->pFis; 10246285242Sachim 10247285242Sachim 10248285242Sachim if (satIntIo == agNULL) 10249285242Sachim { 10250285242Sachim TI_DBG4(("satWriteBufferCB: External satInternalIo_t satIntIoContext\n")); 10251285242Sachim satOrgIOContext = satIOContext; 10252285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 10253285242Sachim pSense = satOrgIOContext->pSense; 10254285242Sachim /* SCSI command response payload to OS layer */ 10255285242Sachim 10256285242Sachim /* ATA command response payload */ 10257285242Sachim 10258285242Sachim } 10259285242Sachim else 10260285242Sachim { 10261285242Sachim TI_DBG4(("satWriteBufferCB: Internal satInternalIo_t satIntIoContext\n")); 10262285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 10263285242Sachim if (satOrgIOContext == agNULL) 10264285242Sachim { 10265285242Sachim TI_DBG4(("satWriteBufferCB: satOrgIOContext is NULL, wrong\n")); 10266285242Sachim return; 10267285242Sachim } 10268285242Sachim else 10269285242Sachim { 10270285242Sachim TI_DBG4(("satWriteBufferCB: satOrgIOContext is NOT NULL\n")); 10271285242Sachim } 10272285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 10273285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 10274285242Sachim 10275285242Sachim pSense = satOrgIOContext->pSense; 10276285242Sachim /* SCSI command response payload to OS layer */ 10277285242Sachim 10278285242Sachim /* ATA command response payload */ 10279285242Sachim 10280285242Sachim } 10281285242Sachim 10282285242Sachim tdIORequestBody->ioCompleted = agTRUE; 10283285242Sachim tdIORequestBody->ioStarted = agFALSE; 10284285242Sachim 10285285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 10286285242Sachim { 10287285242Sachim TI_DBG1(("satWriteBufferCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 10288285242Sachim ostiInitiatorIOCompleted ( 10289285242Sachim tiRoot, 10290285242Sachim tiOrgIORequest, 10291285242Sachim tiIOFailed, 10292285242Sachim tiDetailOtherError, 10293285242Sachim agNULL, 10294285242Sachim satOrgIOContext->interruptContext 10295285242Sachim ); 10296285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10297285242Sachim 10298285242Sachim satFreeIntIoResource( tiRoot, 10299285242Sachim satDevData, 10300285242Sachim satIntIo); 10301285242Sachim return; 10302285242Sachim } 10303285242Sachim 10304285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 10305285242Sachim { 10306285242Sachim /* Process abort case */ 10307285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 10308285242Sachim { 10309285242Sachim satProcessAbort(tiRoot, 10310285242Sachim tiOrgIORequest, 10311285242Sachim satOrgIOContext 10312285242Sachim ); 10313285242Sachim 10314285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10315285242Sachim 10316285242Sachim satFreeIntIoResource( tiRoot, 10317285242Sachim satDevData, 10318285242Sachim satIntIo); 10319285242Sachim return; 10320285242Sachim } 10321285242Sachim satSetSensePayload( pSense, 10322285242Sachim SCSI_SNSKEY_NOT_READY, 10323285242Sachim 0, 10324285242Sachim SCSI_SNSCODE_MEDIUM_NOT_PRESENT, 10325285242Sachim satOrgIOContext); 10326285242Sachim 10327285242Sachim ostiInitiatorIOCompleted( tiRoot, 10328285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10329285242Sachim tiIOSuccess, 10330285242Sachim SCSI_STAT_CHECK_CONDITION, 10331285242Sachim satOrgIOContext->pTiSenseData, 10332285242Sachim satOrgIOContext->interruptContext ); 10333285242Sachim 10334285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10335285242Sachim 10336285242Sachim satFreeIntIoResource( tiRoot, 10337285242Sachim satDevData, 10338285242Sachim satIntIo); 10339285242Sachim return; 10340285242Sachim } 10341285242Sachim /* process success case */ 10342285242Sachim if (hostToDevFis->h.command == SAT_WRITE_BUFFER ) 10343285242Sachim { 10344285242Sachim 10345285242Sachim ostiInitiatorIOCompleted( tiRoot, 10346285242Sachim tiOrgIORequest, 10347285242Sachim tiIOSuccess, 10348285242Sachim SCSI_STAT_GOOD, 10349285242Sachim agNULL, 10350285242Sachim satOrgIOContext->interruptContext); 10351285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10352285242Sachim 10353285242Sachim satFreeIntIoResource( tiRoot, 10354285242Sachim satDevData, 10355285242Sachim satIntIo); 10356285242Sachim return; 10357285242Sachim } 10358285242Sachim else 10359285242Sachim { 10360285242Sachim TI_DBG1(("satWriteBufferCB: error unknown command success 0x%x\n", hostToDevFis->h.command)); 10361285242Sachim satSetSensePayload( pSense, 10362285242Sachim SCSI_SNSKEY_NO_SENSE, 10363285242Sachim 0, 10364285242Sachim SCSI_SNSCODE_NO_ADDITIONAL_INFO, 10365285242Sachim satOrgIOContext); 10366285242Sachim 10367285242Sachim ostiInitiatorIOCompleted( tiRoot, 10368285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10369285242Sachim tiIOSuccess, 10370285242Sachim SCSI_STAT_CHECK_CONDITION, 10371285242Sachim satOrgIOContext->pTiSenseData, 10372285242Sachim satOrgIOContext->interruptContext ); 10373285242Sachim 10374285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10375285242Sachim 10376285242Sachim satFreeIntIoResource( tiRoot, 10377285242Sachim satDevData, 10378285242Sachim satIntIo); 10379285242Sachim 10380285242Sachim return; 10381285242Sachim } 10382285242Sachim 10383285242Sachim return; 10384285242Sachim} 10385285242Sachim 10386285242Sachim/***************************************************************************** 10387285242Sachim*! \brief satReassignBlocksCB 10388285242Sachim* 10389285242Sachim* This routine is a callback function called from ossaSATACompleted(). 10390285242Sachim* This CB routine deals with Reassign Blocks. 10391285242Sachim* 10392285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 10393285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 10394285242Sachim* \param agIOStatus: Status of completed I/O. 10395285242Sachim* \param agSATAParm1: Additional info based on status. 10396285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10397285242Sachim* length. 10398285242Sachim* \param ioContext: Pointer to satIOContext_t. 10399285242Sachim* 10400285242Sachim* \return: none 10401285242Sachim* 10402285242Sachim*****************************************************************************/ 10403285242Sachimvoid satReassignBlocksCB( 10404285242Sachim agsaRoot_t *agRoot, 10405285242Sachim agsaIORequest_t *agIORequest, 10406285242Sachim bit32 agIOStatus, 10407285242Sachim agsaFisHeader_t *agFirstDword, 10408285242Sachim bit32 agIOInfoLen, 10409285242Sachim agsaFrameHandle_t agFrameHandle, 10410285242Sachim void *ioContext 10411285242Sachim ) 10412285242Sachim{ 10413285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10414285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10415285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10416285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10417285242Sachim tdIORequestBody_t *tdIORequestBody; 10418285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 10419285242Sachim satIOContext_t *satIOContext; 10420285242Sachim satIOContext_t *satOrgIOContext; 10421285242Sachim satIOContext_t *satNewIOContext; 10422285242Sachim satInternalIo_t *satIntIo; 10423285242Sachim satInternalIo_t *satNewIntIo = agNULL; 10424285242Sachim satDeviceData_t *satDevData; 10425285242Sachim 10426285242Sachim scsiRspSense_t *pSense; 10427285242Sachim tiIniScsiCmnd_t *scsiCmnd; 10428285242Sachim tiIORequest_t *tiOrgIORequest; 10429285242Sachim 10430285242Sachim agsaFisRegHostToDevice_t *hostToDevFis = agNULL; 10431285242Sachim bit32 ataStatus = 0; 10432285242Sachim bit32 status; 10433285242Sachim tiScsiInitiatorRequest_t *tiScsiRequest; /* tiScsiXchg */ 10434285242Sachim agsaFisRegD2HHeader_t *statDevToHostFisHeader = agNULL; 10435285242Sachim 10436285242Sachim TI_DBG5(("satReassignBlocksCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", agIORequest, agIOStatus, agIOInfoLen)); 10437285242Sachim 10438285242Sachim /* internally generate tiIOContext */ 10439285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10440285242Sachim satIOContext = (satIOContext_t *) ioContext; 10441285242Sachim satIntIo = satIOContext->satIntIoContext; 10442285242Sachim satDevData = satIOContext->pSatDevData; 10443285242Sachim hostToDevFis = satIOContext->pFis; 10444285242Sachim 10445285242Sachim if (satIntIo == agNULL) 10446285242Sachim { 10447285242Sachim TI_DBG4(("satReassignBlocksCB: External satInternalIo_t satIntIoContext\n")); 10448285242Sachim satOrgIOContext = satIOContext; 10449285242Sachim tiOrgIORequest = tdIORequestBody->tiIORequest; 10450285242Sachim tiScsiRequest = satOrgIOContext->tiScsiXchg; 10451285242Sachim pSense = satOrgIOContext->pSense; 10452285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 10453285242Sachim } 10454285242Sachim else 10455285242Sachim { 10456285242Sachim TI_DBG4(("satReassignBlocksCB: Internal satInternalIo_t satIntIoContext\n")); 10457285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 10458285242Sachim if (satOrgIOContext == agNULL) 10459285242Sachim { 10460285242Sachim TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NULL, Wrong\n")); 10461285242Sachim return; 10462285242Sachim } 10463285242Sachim else 10464285242Sachim { 10465285242Sachim TI_DBG4(("satReassignBlocksCB: satOrgIOContext is NOT NULL, Wrong\n")); 10466285242Sachim } 10467285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 10468285242Sachim tiOrgIORequest = (tiIORequest_t *)tdOrgIORequestBody->tiIORequest; 10469285242Sachim 10470285242Sachim tiScsiRequest = satOrgIOContext->tiScsiXchg; 10471285242Sachim pSense = satOrgIOContext->pSense; 10472285242Sachim scsiCmnd = satOrgIOContext->pScsiCmnd; 10473285242Sachim } 10474285242Sachim 10475285242Sachim tdIORequestBody->ioCompleted = agTRUE; 10476285242Sachim tdIORequestBody->ioStarted = agFALSE; 10477285242Sachim 10478285242Sachim if (agFirstDword == agNULL && agIOStatus != OSSA_IO_SUCCESS) 10479285242Sachim { 10480285242Sachim TI_DBG1(("satReassignBlocksCB: wrong. agFirstDword is NULL when error, status %d\n", agIOStatus)); 10481285242Sachim ostiInitiatorIOCompleted ( 10482285242Sachim tiRoot, 10483285242Sachim tiOrgIORequest, 10484285242Sachim tiIOFailed, 10485285242Sachim tiDetailOtherError, 10486285242Sachim agNULL, 10487285242Sachim satOrgIOContext->interruptContext 10488285242Sachim ); 10489285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10490285242Sachim 10491285242Sachim satFreeIntIoResource( tiRoot, 10492285242Sachim satDevData, 10493285242Sachim satIntIo); 10494285242Sachim return; 10495285242Sachim } 10496285242Sachim 10497285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 10498285242Sachim { 10499285242Sachim /* only agsaFisRegDeviceToHost_t is expected */ 10500285242Sachim statDevToHostFisHeader = (agsaFisRegD2HHeader_t *)&(agFirstDword->D2H); 10501285242Sachim ataStatus = statDevToHostFisHeader->status; /* ATA Status register */ 10502285242Sachim } 10503285242Sachim 10504285242Sachim if (agIOStatus != OSSA_IO_SUCCESS) 10505285242Sachim { 10506285242Sachim if ( (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) || 10507285242Sachim ((ataStatus & ERR_ATA_STATUS_MASK) || (ataStatus & DF_ATA_STATUS_MASK)) 10508285242Sachim ) 10509285242Sachim { 10510285242Sachim /* for debugging */ 10511285242Sachim if( agIOStatus != OSSA_IO_SUCCESS) 10512285242Sachim { 10513285242Sachim TI_DBG1(("satReassignBlocksCB FAILED, NOT IO_SUCCESS\n")); 10514285242Sachim } 10515285242Sachim else if (statDevToHostFisHeader->fisType != REG_DEV_TO_HOST_FIS) 10516285242Sachim { 10517285242Sachim TI_DBG1(("satReassignBlocksCB FAILED, Wrong FIS type 0x%x\n",statDevToHostFisHeader->fisType)); 10518285242Sachim } 10519285242Sachim else if ( (ataStatus & ERR_ATA_STATUS_MASK) || 10520285242Sachim (ataStatus & DF_ATA_STATUS_MASK) 10521285242Sachim ) 10522285242Sachim { 10523285242Sachim TI_DBG1(("satReassignBlocksCB FAILED, FAILED, error status\n")); 10524285242Sachim } 10525285242Sachim 10526285242Sachim /* Process abort case */ 10527285242Sachim if (agIOStatus == OSSA_IO_ABORTED) 10528285242Sachim { 10529285242Sachim satProcessAbort(tiRoot, 10530285242Sachim tiOrgIORequest, 10531285242Sachim satOrgIOContext 10532285242Sachim ); 10533285242Sachim 10534285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10535285242Sachim 10536285242Sachim satFreeIntIoResource( tiRoot, 10537285242Sachim satDevData, 10538285242Sachim satIntIo); 10539285242Sachim return; 10540285242Sachim } 10541285242Sachim 10542285242Sachim /* for debugging */ 10543285242Sachim if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS || 10544285242Sachim hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT 10545285242Sachim ) 10546285242Sachim { 10547285242Sachim TI_DBG1(("satReassignBlocksCB SAT_READ_VERIFY_SECTORS(_EXT) failed\n")); 10548285242Sachim /* Verify failed; send Write with same LBA */ 10549285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10550285242Sachim 10551285242Sachim satFreeIntIoResource( tiRoot, 10552285242Sachim satDevData, 10553285242Sachim satIntIo); 10554285242Sachim 10555285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 10556285242Sachim tiOrgIORequest, 10557285242Sachim satDevData, 10558285242Sachim 512, /* writing 1 sector */ 10559285242Sachim satNewIntIo); 10560285242Sachim if (satNewIntIo == agNULL) 10561285242Sachim { 10562285242Sachim /* memory allocation failure */ 10563285242Sachim satFreeIntIoResource( tiRoot, 10564285242Sachim satDevData, 10565285242Sachim satNewIntIo); 10566285242Sachim 10567285242Sachim satSetSensePayload( pSense, 10568285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 10569285242Sachim 0, 10570285242Sachim SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10571285242Sachim satOrgIOContext); 10572285242Sachim 10573285242Sachim ostiInitiatorIOCompleted( tiRoot, 10574285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10575285242Sachim tiIOSuccess, 10576285242Sachim SCSI_STAT_CHECK_CONDITION, 10577285242Sachim satOrgIOContext->pTiSenseData, 10578285242Sachim satOrgIOContext->interruptContext ); 10579285242Sachim TI_DBG1(("satReassignBlocksCB: momory allocation fails\n")); 10580285242Sachim return; 10581285242Sachim } /* end memory allocation */ 10582285242Sachim 10583285242Sachim satNewIOContext = satPrepareNewIO( 10584285242Sachim satNewIntIo, 10585285242Sachim tiOrgIORequest, 10586285242Sachim satDevData, 10587285242Sachim scsiCmnd, 10588285242Sachim satOrgIOContext 10589285242Sachim ); 10590285242Sachim 10591285242Sachim /* send Write with same LBA */ 10592285242Sachim status = satReassignBlocks_2( 10593285242Sachim tiRoot, 10594285242Sachim &satNewIntIo->satIntTiIORequest, 10595285242Sachim satNewIOContext->ptiDeviceHandle, 10596285242Sachim &satNewIntIo->satIntTiScsiXchg, 10597285242Sachim satNewIOContext, 10598285242Sachim satOrgIOContext->LBA 10599285242Sachim ); 10600285242Sachim 10601285242Sachim if (status != tiSuccess) 10602285242Sachim { 10603285242Sachim /* sending ATA command fails */ 10604285242Sachim satFreeIntIoResource( tiRoot, 10605285242Sachim satDevData, 10606285242Sachim satNewIntIo); 10607285242Sachim satSetSensePayload( pSense, 10608285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 10609285242Sachim 0, 10610285242Sachim SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10611285242Sachim satOrgIOContext); 10612285242Sachim 10613285242Sachim ostiInitiatorIOCompleted( tiRoot, 10614285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10615285242Sachim tiIOSuccess, 10616285242Sachim SCSI_STAT_CHECK_CONDITION, 10617285242Sachim satOrgIOContext->pTiSenseData, 10618285242Sachim satOrgIOContext->interruptContext ); 10619285242Sachim TI_DBG1(("satReassignBlocksCB calling fail 1\n")); 10620285242Sachim return; 10621285242Sachim } /* end send fails */ 10622285242Sachim 10623285242Sachim return; 10624285242Sachim } 10625285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_DMA || 10626285242Sachim hostToDevFis->h.command == SAT_WRITE_SECTORS || 10627285242Sachim hostToDevFis->h.command == SAT_WRITE_DMA_EXT || 10628285242Sachim hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT || 10629285242Sachim hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED 10630285242Sachim ) 10631285242Sachim { 10632285242Sachim TI_DBG1(("satReassignBlocksCB SAT_WRITE failed\n")); 10633285242Sachim /* fall through */ 10634285242Sachim } 10635285242Sachim else 10636285242Sachim { 10637285242Sachim TI_DBG1(("satReassignBlocksCB error default case unexpected command 0x%x\n", hostToDevFis->h.command)); 10638285242Sachim } 10639285242Sachim 10640285242Sachim 10641285242Sachim satSetSensePayload( pSense, 10642285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 10643285242Sachim 0, 10644285242Sachim SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10645285242Sachim satOrgIOContext); 10646285242Sachim 10647285242Sachim ostiInitiatorIOCompleted( tiRoot, 10648285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10649285242Sachim tiIOSuccess, 10650285242Sachim SCSI_STAT_CHECK_CONDITION, 10651285242Sachim satOrgIOContext->pTiSenseData, 10652285242Sachim satOrgIOContext->interruptContext ); 10653285242Sachim 10654285242Sachim 10655285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10656285242Sachim 10657285242Sachim satFreeIntIoResource( tiRoot, 10658285242Sachim satDevData, 10659285242Sachim satIntIo); 10660285242Sachim return; 10661285242Sachim } /* error checking */ 10662285242Sachim } 10663285242Sachim 10664285242Sachim 10665285242Sachim /* prcessing the success case */ 10666285242Sachim if (hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS || 10667285242Sachim hostToDevFis->h.command == SAT_READ_VERIFY_SECTORS_EXT || 10668285242Sachim hostToDevFis->h.command == SAT_WRITE_DMA || 10669285242Sachim hostToDevFis->h.command == SAT_WRITE_SECTORS || 10670285242Sachim hostToDevFis->h.command == SAT_WRITE_DMA_EXT || 10671285242Sachim hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT || 10672285242Sachim hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED 10673285242Sachim ) 10674285242Sachim { 10675285242Sachim /* next LBA; verify */ 10676285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10677285242Sachim 10678285242Sachim satFreeIntIoResource( tiRoot, 10679285242Sachim satDevData, 10680285242Sachim satIntIo); 10681285242Sachim 10682285242Sachim if (satOrgIOContext->ParmIndex >= satOrgIOContext->ParmLen) 10683285242Sachim { 10684285242Sachim TI_DBG5(("satReassignBlocksCB: GOOD status\n")); 10685285242Sachim /* return stat_good */ 10686285242Sachim ostiInitiatorIOCompleted( tiRoot, 10687285242Sachim tiOrgIORequest, 10688285242Sachim tiIOSuccess, 10689285242Sachim SCSI_STAT_GOOD, 10690285242Sachim agNULL, 10691285242Sachim satOrgIOContext->interruptContext ); 10692285242Sachim return; 10693285242Sachim } 10694285242Sachim else 10695285242Sachim { 10696285242Sachim TI_DBG5(("satReassignBlocksCB: processing next LBA\n")); 10697285242Sachim satNewIntIo = satAllocIntIoResource( tiRoot, 10698285242Sachim tiOrgIORequest, 10699285242Sachim satDevData, 10700285242Sachim 0, 10701285242Sachim satNewIntIo); 10702285242Sachim if (satNewIntIo == agNULL) 10703285242Sachim { 10704285242Sachim /* memory allocation failure */ 10705285242Sachim satFreeIntIoResource( tiRoot, 10706285242Sachim satDevData, 10707285242Sachim satNewIntIo); 10708285242Sachim 10709285242Sachim satSetSensePayload( pSense, 10710285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 10711285242Sachim 0, 10712285242Sachim SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10713285242Sachim satOrgIOContext); 10714285242Sachim 10715285242Sachim ostiInitiatorIOCompleted( tiRoot, 10716285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10717285242Sachim tiIOSuccess, 10718285242Sachim SCSI_STAT_CHECK_CONDITION, 10719285242Sachim satOrgIOContext->pTiSenseData, 10720285242Sachim satOrgIOContext->interruptContext ); 10721285242Sachim TI_DBG1(("satReassignBlocksCB: momory allocation fails\n")); 10722285242Sachim return; 10723285242Sachim } /* end memory allocation */ 10724285242Sachim 10725285242Sachim satNewIOContext = satPrepareNewIO( 10726285242Sachim satNewIntIo, 10727285242Sachim tiOrgIORequest, 10728285242Sachim satDevData, 10729285242Sachim scsiCmnd, 10730285242Sachim satOrgIOContext 10731285242Sachim ); 10732285242Sachim 10733285242Sachim /* send Verify with the next LBA */ 10734285242Sachim status = satReassignBlocks_1( 10735285242Sachim tiRoot, 10736285242Sachim &satNewIntIo->satIntTiIORequest, 10737285242Sachim satNewIOContext->ptiDeviceHandle, 10738285242Sachim tiScsiRequest, /* orginal from OS layer */ 10739285242Sachim satNewIOContext, 10740285242Sachim satOrgIOContext 10741285242Sachim ); 10742285242Sachim 10743285242Sachim if (status != tiSuccess) 10744285242Sachim { 10745285242Sachim /* sending ATA command fails */ 10746285242Sachim satFreeIntIoResource( tiRoot, 10747285242Sachim satDevData, 10748285242Sachim satNewIntIo); 10749285242Sachim satSetSensePayload( pSense, 10750285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 10751285242Sachim 0, 10752285242Sachim SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10753285242Sachim satOrgIOContext); 10754285242Sachim 10755285242Sachim ostiInitiatorIOCompleted( tiRoot, 10756285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10757285242Sachim tiIOSuccess, 10758285242Sachim SCSI_STAT_CHECK_CONDITION, 10759285242Sachim satOrgIOContext->pTiSenseData, 10760285242Sachim satOrgIOContext->interruptContext ); 10761285242Sachim TI_DBG1(("satReassignBlocksCB calling satModeSelect6_1 fails\n")); 10762285242Sachim return; 10763285242Sachim } /* end send fails */ 10764285242Sachim } /* else */ 10765285242Sachim return; 10766285242Sachim 10767285242Sachim } 10768285242Sachim else if (hostToDevFis->h.command == SAT_WRITE_DMA || 10769285242Sachim hostToDevFis->h.command == SAT_WRITE_SECTORS || 10770285242Sachim hostToDevFis->h.command == SAT_WRITE_DMA_EXT || 10771285242Sachim hostToDevFis->h.command == SAT_WRITE_SECTORS_EXT || 10772285242Sachim hostToDevFis->h.command == SAT_WRITE_FPDMA_QUEUED 10773285242Sachim ) 10774285242Sachim { 10775285242Sachim /* next LBA; verify */ 10776285242Sachim } 10777285242Sachim else 10778285242Sachim { 10779285242Sachim TI_DBG1(("satReassignBlocksCB error unknown command success 0x%x \n", hostToDevFis->h.command)); 10780285242Sachim 10781285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 10782285242Sachim 10783285242Sachim satFreeIntIoResource( tiRoot, 10784285242Sachim satDevData, 10785285242Sachim satIntIo); 10786285242Sachim satSetSensePayload( pSense, 10787285242Sachim SCSI_SNSKEY_HARDWARE_ERROR, 10788285242Sachim 0, 10789285242Sachim SCSI_SNSCODE_WRITE_ERROR_AUTO_REALLOCATION_FAILED, 10790285242Sachim satOrgIOContext); 10791285242Sachim 10792285242Sachim ostiInitiatorIOCompleted( tiRoot, 10793285242Sachim tiOrgIORequest, /* == &satIntIo->satOrgTiIORequest */ 10794285242Sachim tiIOSuccess, 10795285242Sachim SCSI_STAT_CHECK_CONDITION, 10796285242Sachim satOrgIOContext->pTiSenseData, 10797285242Sachim satOrgIOContext->interruptContext ); 10798285242Sachim return; 10799285242Sachim } 10800285242Sachim return; 10801285242Sachim} 10802285242Sachim/***************************************************************************** 10803285242Sachim*! \brief satReadLogExtCB 10804285242Sachim* 10805285242Sachim* This routine is a callback function called from ossaSATACompleted(). 10806285242Sachim* This CB routine deals READ LOG EXT completion. 10807285242Sachim* 10808285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 10809285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 10810285242Sachim* \param agIOStatus: Status of completed I/O. 10811285242Sachim* \param agFirstDword:Pointer to the four bytes of FIS. 10812285242Sachim* \param agIOInfoLen: Length in bytes of overrun/underrun residual or FIS 10813285242Sachim* length. 10814285242Sachim* \param agParam: Additional info based on status. 10815285242Sachim* \param ioContext: Pointer to satIOContext_t. 10816285242Sachim* 10817285242Sachim* \return: none 10818285242Sachim* 10819285242Sachim*****************************************************************************/ 10820285242Sachim/* 10821285242Sachim SATAII spec p42 10822285242Sachim 10823285242Sachim*/ 10824285242Sachimvoid satReadLogExtCB( 10825285242Sachim agsaRoot_t *agRoot, 10826285242Sachim agsaIORequest_t *agIORequest, 10827285242Sachim bit32 agIOStatus, 10828285242Sachim agsaFisHeader_t *agFirstDword, 10829285242Sachim bit32 agIOInfoLen, 10830285242Sachim void *agParam, 10831285242Sachim void *ioContext 10832285242Sachim ) 10833285242Sachim 10834285242Sachim{ 10835285242Sachim 10836285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 10837285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 10838285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 10839285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 10840285242Sachim tdIORequestBody_t *tdIORequestBody; 10841285242Sachim satIOContext_t *satReadLogExtIOContext; 10842285242Sachim satInternalIo_t *satIntIo; 10843285242Sachim satDeviceData_t *satDevData; 10844285242Sachim tdsaDeviceData_t *tdsaDeviceData; 10845285242Sachim agsaIORequest_t *agAbortIORequest; 10846285242Sachim tdIORequestBody_t *tdAbortIORequestBody; 10847285242Sachim bit32 PhysUpper32; 10848285242Sachim bit32 PhysLower32; 10849285242Sachim bit32 memAllocStatus; 10850285242Sachim void *osMemHandle; 10851285242Sachim 10852285242Sachim TI_DBG1(("satReadLogExtCB: agIORequest=%p agIOStatus=0x%x agIOInfoLen %d\n", 10853285242Sachim agIORequest, agIOStatus, agIOInfoLen)); 10854285242Sachim 10855285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 10856285242Sachim satReadLogExtIOContext = (satIOContext_t *) ioContext; 10857285242Sachim satIntIo = satReadLogExtIOContext->satIntIoContext; 10858285242Sachim satDevData = satReadLogExtIOContext->pSatDevData; 10859285242Sachim tdsaDeviceData = (tdsaDeviceData_t *)satDevData->satSaDeviceData; 10860285242Sachim 10861285242Sachim TI_DBG1(("satReadLogExtCB: did %d\n", tdsaDeviceData->id)); 10862285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satReadLogExtIOContext); 10863285242Sachim 10864285242Sachim 10865285242Sachim tdIORequestBody->ioCompleted = agTRUE; 10866285242Sachim tdIORequestBody->ioStarted = agFALSE; 10867285242Sachim 10868285242Sachim /* 10869285242Sachim * If READ LOG EXT failed, we issue device reset. 10870285242Sachim */ 10871285242Sachim if ( agIOStatus != OSSA_IO_SUCCESS || 10872285242Sachim (agIOStatus == OSSA_IO_SUCCESS && agFirstDword != agNULL && agIOInfoLen != 0) 10873285242Sachim ) 10874285242Sachim { 10875285242Sachim TI_DBG1(("satReadLogExtCB: FAILED.\n")); 10876285242Sachim 10877285242Sachim satFreeIntIoResource( tiRoot, 10878285242Sachim satDevData, 10879285242Sachim satIntIo); 10880285242Sachim /* Abort I/O after completion of device reset */ 10881285242Sachim satDevData->satAbortAfterReset = agTRUE; 10882285242Sachim#ifdef NOT_YET 10883285242Sachim /* needs to investigate this case */ 10884285242Sachim /* no report to OS layer */ 10885285242Sachim satSubTM(tiRoot, 10886285242Sachim satReadLogExtIOContext->ptiDeviceHandle, 10887285242Sachim TD_INTERNAL_TM_RESET, 10888285242Sachim agNULL, 10889285242Sachim agNULL, 10890285242Sachim agNULL, 10891285242Sachim agFALSE); 10892285242Sachim#endif 10893285242Sachim return; 10894285242Sachim } 10895285242Sachim 10896285242Sachim 10897285242Sachim /*************************************************************************** 10898285242Sachim * The following steps take place when READ LOG EXT successfully completed. 10899285242Sachim ***************************************************************************/ 10900285242Sachim 10901285242Sachim /************************************************************************ 10902285242Sachim * 10903285242Sachim * 1. Issue abort to LL layer to all other pending I/Os for the same SATA 10904285242Sachim * drive. 10905285242Sachim * 10906285242Sachim * 2. Free resource allocated for the internally generated READ LOG EXT. 10907285242Sachim * 10908285242Sachim * 3. At the completion of abort, in the context of ossaSATACompleted(), 10909285242Sachim * return the I/O with error status to the OS-App Specific layer. 10910285242Sachim * When all I/O aborts are completed, clear SATA device flag to 10911285242Sachim * indicate ready to process new request. 10912285242Sachim * 10913285242Sachim ***********************************************************************/ 10914285242Sachim 10915285242Sachim /* 10916285242Sachim * Issue abort to LL layer to all other pending I/Os for the same SATA drive 10917285242Sachim */ 10918285242Sachim /* 10919285242Sachim replace the single IO abort with device abort 10920285242Sachim */ 10921285242Sachim 10922285242Sachim TI_DBG1(("satReadLogExtCB: issuing saSATAAbort. Device Abort\n")); 10923285242Sachim /* do not deregister this device */ 10924285242Sachim tdsaDeviceData->OSAbortAll = agTRUE; 10925285242Sachim 10926285242Sachim /* allocating agIORequest for abort itself */ 10927285242Sachim memAllocStatus = ostiAllocMemory( 10928285242Sachim tiRoot, 10929285242Sachim &osMemHandle, 10930285242Sachim (void **)&tdAbortIORequestBody, 10931285242Sachim &PhysUpper32, 10932285242Sachim &PhysLower32, 10933285242Sachim 8, 10934285242Sachim sizeof(tdIORequestBody_t), 10935285242Sachim agTRUE 10936285242Sachim ); 10937285242Sachim 10938285242Sachim if (memAllocStatus != tiSuccess) 10939285242Sachim { 10940285242Sachim /* let os process IO */ 10941285242Sachim TI_DBG1(("satReadLogExtCB: ostiAllocMemory failed...\n")); 10942285242Sachim return; 10943285242Sachim } 10944285242Sachim 10945285242Sachim if (tdAbortIORequestBody == agNULL) 10946285242Sachim { 10947285242Sachim /* let os process IO */ 10948285242Sachim TI_DBG1(("satReadLogExtCB: ostiAllocMemory returned NULL tdAbortIORequestBody\n")); 10949285242Sachim return; 10950285242Sachim } 10951285242Sachim 10952285242Sachim /* setup task management structure */ 10953285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle = osMemHandle; 10954285242Sachim tdAbortIORequestBody->tiDevHandle = (tiDeviceHandle_t *)&(tdsaDeviceData->tiDeviceHandle); 10955285242Sachim /* initialize agIORequest */ 10956285242Sachim agAbortIORequest = &(tdAbortIORequestBody->agIORequest); 10957285242Sachim agAbortIORequest->osData = (void *) tdAbortIORequestBody; 10958285242Sachim agAbortIORequest->sdkData = agNULL; /* LL takes care of this */ 10959285242Sachim 10960285242Sachim /* 10961285242Sachim * Issue abort 10962285242Sachim */ 10963285242Sachim saSATAAbort( agRoot, agAbortIORequest, 0, tdsaDeviceData->agDevHandle, 1, agNULL, agNULL); 10964285242Sachim 10965285242Sachim 10966285242Sachim /* 10967285242Sachim * Free resource allocated for the internally generated READ LOG EXT. 10968285242Sachim */ 10969285242Sachim satFreeIntIoResource( tiRoot, 10970285242Sachim satDevData, 10971285242Sachim satIntIo); 10972285242Sachim 10973285242Sachim /* 10974285242Sachim * Sequence of recovery continue at some other context: 10975285242Sachim * At the completion of abort, in the context of ossaSATACompleted(), 10976285242Sachim * return the I/O with error status to the OS-App Specific layer. 10977285242Sachim * When all I/O aborts are completed, clear SATA device flag to 10978285242Sachim * indicate ready to process new request. 10979285242Sachim */ 10980285242Sachim 10981285242Sachim satDevData->satDriveState = SAT_DEV_STATE_NORMAL; 10982285242Sachim 10983285242Sachim TI_DBG1(("satReadLogExtCB: end return\n")); 10984285242Sachim return; 10985285242Sachim} 10986285242Sachim 10987285242Sachim#ifndef FDS_SM 10988285242Sachim/***************************************************************************** 10989285242Sachim*! \brief ossaSATAEvent 10990285242Sachim* 10991285242Sachim* This routine is called to notify the OS Layer of an event associated with 10992285242Sachim* SATA port or SATA device 10993285242Sachim* 10994285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 10995285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 10996285242Sachim* \param agPortContext Pointer to the port context of TD and Lower layer 10997285242Sachim* \param agDevHandle: Pointer to a device handle 10998285242Sachim* \param event: event type 10999285242Sachim* 11000285242Sachim* \return: none 11001285242Sachim* 11002285242Sachim*****************************************************************************/ 11003285242SachimosGLOBAL void ossaSATAEvent( 11004285242Sachim agsaRoot_t *agRoot, 11005285242Sachim agsaIORequest_t *agIORequest, 11006285242Sachim agsaPortContext_t *agPortContext, 11007285242Sachim agsaDevHandle_t *agDevHandle, 11008285242Sachim bit32 event, 11009285242Sachim bit32 agIOInfoLen, 11010285242Sachim void *agParam 11011285242Sachim ) 11012285242Sachim{ 11013285242Sachim 11014285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11015285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11016285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 11017285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 11018285242Sachim bit32 interruptContext = osData->IntContext; 11019285242Sachim tdsaDeviceData_t *pDeviceData; 11020285242Sachim satDeviceData_t *pSatDevData; 11021285242Sachim satInternalIo_t *satIntIo = agNULL; 11022285242Sachim bit32 status; 11023285242Sachim satIOContext_t *satIOContext2; 11024285242Sachim tdIORequestBody_t *tdIORequestBody; 11025285242Sachim tiDeviceHandle_t *tiDeviceHandle; 11026285242Sachim tiIORequest_t tiIORequestTMP; 11027285242Sachim agsaDifDetails_t agDifDetails; 11028285242Sachim bit8 framePayload[256]; 11029285242Sachim bit16 frameOffset = 0; 11030285242Sachim bit16 frameLen = 0; 11031285242Sachim 11032285242Sachim /* new */ 11033285242Sachim tdsaDeviceData_t *tdsaDeviceData = agNULL; 11034285242Sachim satIOContext_t *satIOContext; 11035285242Sachim tdsaPortContext_t *onePortContext; 11036285242Sachim 11037285242Sachim if (event == OSSA_IO_XFER_ERROR_ABORTED_NCQ_MODE) 11038285242Sachim { 11039285242Sachim 11040285242Sachim /************************************************************************** 11041285242Sachim * 11042285242Sachim * !!!! See Section 13.5.2.4 of SATA 2.5 specs. !!!! 11043285242Sachim * !!!! If the NCQ error ends up here, it means that the device sent !!!! 11044285242Sachim * !!!! Register Device To Host FIS (which does not have SActive !!!! 11045285242Sachim * !!!! register) instead of Set Device Bit FIS (which has SActive !!!! 11046285242Sachim * !!!! register). The routine osSatIOCompleted() deals with the case !!!! 11047285242Sachim * !!!! where Set Device Bit FIS was sent by the device. !!!! 11048285242Sachim * 11049285242Sachim * For NCQ we need to issue READ LOG EXT command with log page 10h 11050285242Sachim * to get the error and to allow other I/Os to continue. 11051285242Sachim * 11052285242Sachim * Here is the basic flow or sequence of error recovery, this sequence is 11053285242Sachim * similar to the one described in SATA 2.5: 11054285242Sachim * 11055285242Sachim * 1. Set SATA device flag to indicate error condition and returning busy 11056285242Sachim * for all new request. 11057285242Sachim * 11058285242Sachim * 2. Prepare READ LOG EXT page 10h command. Set flag to indicate that 11059285242Sachim * the failed I/O has NOT been returned to the OS Layer. Send command. 11060285242Sachim * 11061285242Sachim * 3. When the device receives READ LOG EXT page 10h request all other 11062285242Sachim * pending I/O are implicitly aborted. No completion (aborted) status 11063285242Sachim * will be sent to the host for these aborted commands. 11064285242Sachim * 11065285242Sachim * 4. SATL receives the completion for READ LOG EXT command in 11066285242Sachim * satReadLogExtCB(). Steps 5,6,7,8 below are the step 1,2,3,4 in 11067285242Sachim * satReadLogExtCB(). 11068285242Sachim * 11069285242Sachim * 5. Check flag that indicates whether the failed I/O has been returned 11070285242Sachim * to the OS Layer. If not, search the I/O context in device data 11071285242Sachim * looking for a matched tag. Then return the completion of the failed 11072285242Sachim * NCQ command with the appopriate/trasnlated SCSI status. 11073285242Sachim * 11074285242Sachim * 6. Issue abort to LL layer to all other pending I/Os for the same SATA 11075285242Sachim * drive. 11076285242Sachim * 11077285242Sachim * 7. Free resource allocated for the internally generated READ LOG EXT. 11078285242Sachim * 11079285242Sachim * 8. At the completion of abort, in the context of ossaSATACompleted(), 11080285242Sachim * return the I/O with error status to the OS-App Specific layer. 11081285242Sachim * When all I/O aborts are completed, clear SATA device flag to 11082285242Sachim * indicate ready to process new request. 11083285242Sachim * 11084285242Sachim *************************************************************************/ 11085285242Sachim 11086285242Sachim pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData; 11087285242Sachim pSatDevData = &pDeviceData->satDevData; 11088285242Sachim tiDeviceHandle = &((tdsaDeviceData_t *)(pSatDevData->satSaDeviceData))->tiDeviceHandle; 11089285242Sachim 11090285242Sachim TI_DBG1(("ossaSATAEvent: did %d\n", pDeviceData->id)); 11091285242Sachim 11092285242Sachim if (pSatDevData->satDriveState == SAT_DEV_STATE_NORMAL) 11093285242Sachim { 11094285242Sachim TI_DBG1(("ossaSATAEvent: NCQ ERROR agDevHandle=%p.\n", agDevHandle )); 11095285242Sachim 11096285242Sachim /* Set flag to indicate we are in recovery */ 11097285242Sachim pSatDevData->satDriveState = SAT_DEV_STATE_IN_RECOVERY; 11098285242Sachim 11099285242Sachim /* 11100285242Sachim * Allocate resource for READ LOG EXIT page 10h 11101285242Sachim */ 11102285242Sachim satIntIo = satAllocIntIoResource( tiRoot, 11103285242Sachim &(tiIORequestTMP), /* anything but NULL */ 11104285242Sachim pSatDevData, 11105285242Sachim sizeof (satReadLogExtPage10h_t), 11106285242Sachim satIntIo); 11107285242Sachim 11108285242Sachim /* 11109285242Sachim * If we cannot allocate resource to do the normal NCQ recovery, we 11110285242Sachim * will do SATA device reset. 11111285242Sachim */ 11112285242Sachim if (satIntIo == agNULL) 11113285242Sachim { 11114285242Sachim /* Abort I/O after completion of device reset */ 11115285242Sachim pSatDevData->satAbortAfterReset = agTRUE; 11116285242Sachim TI_DBG1(("ossaSATAEvent: can't send RLE due to resource lack\n")); 11117285242Sachim 11118285242Sachim#ifdef NOT_YET 11119285242Sachim /* needs to investigate this case */ 11120285242Sachim /* no report to OS layer */ 11121285242Sachim satSubTM(tiRoot, 11122285242Sachim tiDeviceHandle, 11123285242Sachim TD_INTERNAL_TM_RESET, 11124285242Sachim agNULL, 11125285242Sachim agNULL, 11126285242Sachim agNULL, 11127285242Sachim agFALSE); 11128285242Sachim#endif 11129285242Sachim 11130285242Sachim return; 11131285242Sachim } 11132285242Sachim 11133285242Sachim 11134285242Sachim /* 11135285242Sachim * Clear flag to indicate that the failed I/O has NOT been returned to the 11136285242Sachim * OS-App specific Layer. 11137285242Sachim */ 11138285242Sachim satIntIo->satIntFlag = 0; 11139285242Sachim 11140285242Sachim /* compare to satPrepareNewIO() */ 11141285242Sachim /* Send READ LOG EXIT page 10h command */ 11142285242Sachim 11143285242Sachim /* 11144285242Sachim * Need to initialize all the fields within satIOContext except 11145285242Sachim * reqType and satCompleteCB which will be set depending on cmd. 11146285242Sachim */ 11147285242Sachim 11148285242Sachim tdIORequestBody = (tdIORequestBody_t *)satIntIo->satIntRequestBody; 11149285242Sachim satIOContext2 = &(tdIORequestBody->transport.SATA.satIOContext); 11150285242Sachim 11151285242Sachim satIOContext2->pSatDevData = pSatDevData; 11152285242Sachim satIOContext2->pFis = &(tdIORequestBody->transport.SATA.agSATARequestBody.fis.fisRegHostToDev); 11153285242Sachim satIOContext2->pScsiCmnd = &(satIntIo->satIntTiScsiXchg.scsiCmnd); 11154285242Sachim satIOContext2->pSense = &(tdIORequestBody->transport.SATA.sensePayload); 11155285242Sachim satIOContext2->pTiSenseData = &(tdIORequestBody->transport.SATA.tiSenseData); 11156285242Sachim satIOContext2->pTiSenseData->senseData = satIOContext2->pSense; 11157285242Sachim 11158285242Sachim satIOContext2->tiRequestBody = satIntIo->satIntRequestBody; 11159285242Sachim satIOContext2->interruptContext = interruptContext; 11160285242Sachim satIOContext2->satIntIoContext = satIntIo; 11161285242Sachim 11162285242Sachim satIOContext2->ptiDeviceHandle = tiDeviceHandle; 11163285242Sachim satIOContext2->satOrgIOContext = agNULL; 11164285242Sachim satIOContext2->tiScsiXchg = agNULL; 11165285242Sachim 11166285242Sachim status = satSendReadLogExt( tiRoot, 11167285242Sachim &satIntIo->satIntTiIORequest, 11168285242Sachim tiDeviceHandle, 11169285242Sachim &satIntIo->satIntTiScsiXchg, 11170285242Sachim satIOContext2); 11171285242Sachim 11172285242Sachim if (status !=tiSuccess) 11173285242Sachim { 11174285242Sachim TI_DBG1(("ossaSATAEvent: can't send RLE due to LL api failure\n")); 11175285242Sachim satFreeIntIoResource( tiRoot, 11176285242Sachim pSatDevData, 11177285242Sachim satIntIo); 11178285242Sachim /* Abort I/O after completion of device reset */ 11179285242Sachim pSatDevData->satAbortAfterReset = agTRUE; 11180285242Sachim#ifdef NOT_YET 11181285242Sachim /* needs to investigate this case */ 11182285242Sachim /* no report to OS layer */ 11183285242Sachim satSubTM(tiRoot, 11184285242Sachim tiDeviceHandle, 11185285242Sachim TD_INTERNAL_TM_RESET, 11186285242Sachim agNULL, 11187285242Sachim agNULL, 11188285242Sachim agNULL, 11189285242Sachim agFALSE); 11190285242Sachim#endif 11191285242Sachim 11192285242Sachim return; 11193285242Sachim } 11194285242Sachim } 11195285242Sachim else 11196285242Sachim { 11197285242Sachim TI_DBG1(("ossaSATAEvent: NCQ ERROR but recovery in progress\n")); 11198285242Sachim } 11199285242Sachim 11200285242Sachim } 11201285242Sachim else if (event == OSSA_IO_XFER_CMD_FRAME_ISSUED) 11202285242Sachim { 11203285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_CMD_FRAME_ISSUED\n")); 11204285242Sachim } 11205285242Sachim else if (event == OSSA_IO_XFER_PIO_SETUP_ERROR) 11206285242Sachim { 11207285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_XFER_PIO_SETUP_ERROR\n")); 11208285242Sachim 11209285242Sachim } 11210285242Sachim else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED) 11211285242Sachim { 11212285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_RETRY_BACKOFF_THRESHOLD_REACHED\n")); 11213285242Sachim } 11214285242Sachim else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO) 11215285242Sachim { 11216285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_TMO\n")); 11217285242Sachim } 11218285242Sachim else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST) 11219285242Sachim { 11220285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_NO_DEST\n")); 11221285242Sachim } 11222285242Sachim else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE) 11223285242Sachim { 11224285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE\n")); 11225285242Sachim } 11226285242Sachim else if (event == OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED) 11227285242Sachim { 11228285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED\n")); 11229285242Sachim } 11230285242Sachim else if (event == OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH) 11231285242Sachim { 11232285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_XFR_ERROR_DEK_KEY_TAG_MISMATCH\n")); 11233285242Sachim } 11234285242Sachim else if (event == OSSA_IO_XFR_ERROR_DIF_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_APPLICATION_TAG_MISMATCH || 11235285242Sachim event == OSSA_IO_XFR_ERROR_DIF_REFERENCE_TAG_MISMATCH || event == OSSA_IO_XFR_ERROR_DIF_CRC_MISMATCH) 11236285242Sachim { 11237285242Sachim TI_DBG1(("ossaSSPEvent: DIF related, event 0x%x\n", event)); 11238285242Sachim /* process DIF detail information */ 11239285242Sachim TI_DBG2(("ossaSSPEvent: agIOInfoLen %d\n", agIOInfoLen)); 11240285242Sachim if (agParam == agNULL) 11241285242Sachim { 11242285242Sachim TI_DBG2(("ossaSSPEvent: agParam is NULL!!!\n")); 11243285242Sachim return; 11244285242Sachim } 11245285242Sachim if (agIOInfoLen < sizeof(agsaDifDetails_t)) 11246285242Sachim { 11247285242Sachim TI_DBG2(("ossaSSPEvent: wrong agIOInfoLen!!! agIOInfoLen %d sizeof(agsaDifDetails_t) %d\n", agIOInfoLen, sizeof(agsaDifDetails_t))); 11248285242Sachim return; 11249285242Sachim } 11250285242Sachim /* reads agsaDifDetails_t */ 11251285242Sachim saFrameReadBlock(agRoot, agParam, 0, &agDifDetails, sizeof(agsaDifDetails_t)); 11252285242Sachim frameOffset = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF); 11253285242Sachim frameLen = (agDifDetails.ErrBoffsetEDataLen & 0xFFFF0000) >> 16; 11254285242Sachim 11255285242Sachim TI_DBG2(("ossaSSPEvent: UpperLBA 0x%08x LowerLBA 0x%08x\n", agDifDetails.UpperLBA, agDifDetails.LowerLBA)); 11256285242Sachim TI_DBG2(("ossaSSPEvent: SASAddrHI 0x%08x SASAddrLO 0x%08x\n", 11257285242Sachim TD_GET_SAS_ADDRESSHI(agDifDetails.sasAddressHi), TD_GET_SAS_ADDRESSLO(agDifDetails.sasAddressLo))); 11258285242Sachim TI_DBG2(("ossaSSPEvent: DIF error mask 0x%x Device ID 0x%x\n", 11259285242Sachim (agDifDetails.DIFErrDevID) & 0xFF, (agDifDetails.DIFErrDevID & 0xFFFF0000) >> 16)); 11260285242Sachim if (frameLen != 0 && frameLen <= 256) 11261285242Sachim { 11262285242Sachim saFrameReadBlock(agRoot, agParam, sizeof(agsaDifDetails_t), framePayload, frameLen); 11263285242Sachim tdhexdump("ossaSSPEvent frame", framePayload, frameLen); 11264285242Sachim } 11265285242Sachim } 11266285242Sachim else 11267285242Sachim { 11268285242Sachim TI_DBG1(("ossaSATAEvent: ERROR event %d agDevHandle=%p.\n", event, agDevHandle )); 11269285242Sachim 11270285242Sachim tdIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 11271285242Sachim satIOContext = &(tdIORequestBody->transport.SATA.satIOContext); 11272285242Sachim pSatDevData = satIOContext->pSatDevData; 11273285242Sachim tdsaDeviceData = (tdsaDeviceData_t *)pSatDevData->satSaDeviceData; 11274285242Sachim onePortContext = tdsaDeviceData->tdPortContext; 11275285242Sachim TI_DBG1(("ossaSATAEvent: did %d\n", tdsaDeviceData->id)); 11276285242Sachim 11277285242Sachim /* send SMP_PHY_CONTROL_HARD_RESET */ 11278285242Sachim if (event == OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY && tdsaAllShared->FCA) 11279285242Sachim { 11280285242Sachim if (pSatDevData->NumOfFCA <= 0) /* does SMP HARD RESET only upto one time */ 11281285242Sachim { 11282285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; sending HARD_RESET\n")); 11283285242Sachim pSatDevData->NumOfFCA++; 11284285242Sachim tdsaPhyControlSend(tiRoot, 11285285242Sachim tdsaDeviceData, 11286285242Sachim SMP_PHY_CONTROL_HARD_RESET, 11287285242Sachim agNULL); 11288285242Sachim } 11289285242Sachim else 11290285242Sachim { 11291285242Sachim /* given up after one time of SMP HARD RESET; */ 11292285242Sachim TI_DBG1(("ossaSATAEvent: OSSA_IO_OPEN_CNX_ERROR_STP_RESOURCES_BUSY; NO!!! sending HARD_RESET\n")); 11293285242Sachim if (tdsaDeviceData->registered == agTRUE && tdsaAllShared->ResetInDiscovery == 0) 11294285242Sachim { 11295285242Sachim /* 11296285242Sachim 1. remove this device 11297285242Sachim 2. device removal event 11298285242Sachim */ 11299285242Sachim tdsaAbortAll(tiRoot, agRoot, tdsaDeviceData); 11300285242Sachim tdsaDeviceData->valid = agFALSE; 11301285242Sachim tdsaDeviceData->valid2 = agFALSE; 11302285242Sachim tdsaDeviceData->registered = agFALSE; 11303285242Sachim ostiInitiatorEvent( 11304285242Sachim tiRoot, 11305285242Sachim onePortContext->tiPortalContext, 11306285242Sachim agNULL, 11307285242Sachim tiIntrEventTypeDeviceChange, 11308285242Sachim tiDeviceRemoval, 11309285242Sachim agNULL 11310285242Sachim ); 11311285242Sachim } 11312285242Sachim } 11313285242Sachim } 11314285242Sachim 11315285242Sachim } 11316285242Sachim} 11317285242Sachim#endif /* FDS_SM */ 11318285242Sachim 11319285242Sachim/***************************************************************************** 11320285242Sachim*! \brief itdsatErrorSATAEventHandle 11321285242Sachim* 11322285242Sachim* This routine is called to handle SATA error event 11323285242Sachim* 11324285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 11325285242Sachim* \param agIORequest: Pointer to the LL I/O request context for this I/O. 11326285242Sachim* \param agPortContext Pointer to the port context of TD and Lower layer 11327285242Sachim* \param agDevHandle: Pointer to a device handle 11328285242Sachim* \param event: event type 11329285242Sachim* \param ioContext: Pointer to satIOContext_t 11330285242Sachim* 11331285242Sachim* \return: none 11332285242Sachim* 11333285242Sachim*****************************************************************************/ 11334285242SachimosGLOBAL void itdsatErrorSATAEventHandle( 11335285242Sachim agsaRoot_t *agRoot, 11336285242Sachim agsaIORequest_t *agIORequest, 11337285242Sachim agsaPortContext_t *agPortContext, 11338285242Sachim agsaDevHandle_t *agDevHandle, 11339285242Sachim bit32 event, 11340285242Sachim satIOContext_t *ioContext 11341285242Sachim ) 11342285242Sachim{ 11343285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11344285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11345285242Sachim tdsaRoot_t *tdsaRoot = (tdsaRoot_t *) tiRoot->tdData; 11346285242Sachim tdsaContext_t *tdsaAllShared = (tdsaContext_t *)&tdsaRoot->tdsaAllShared; 11347285242Sachim tdIORequestBody_t *tdOrgIORequestBody; 11348285242Sachim satIOContext_t *satIOContext; 11349285242Sachim satIOContext_t *satOrgIOContext; 11350285242Sachim satInternalIo_t *satIntIo; 11351285242Sachim satDeviceData_t *satDevData; 11352285242Sachim bit32 interruptContext = osData->IntContext; 11353285242Sachim 11354285242Sachim TI_DBG1(("itdsatErrorSATAEventHandle: start\n")); 11355285242Sachim satIOContext = (satIOContext_t *) ioContext; 11356285242Sachim satIntIo = satIOContext->satIntIoContext; 11357285242Sachim satDevData = satIOContext->pSatDevData; 11358285242Sachim 11359285242Sachim 11360285242Sachim TI_DBG1(("itdsatErrorSATAEventHandle: event 0x%x\n", event)); 11361285242Sachim 11362285242Sachim if (satIntIo == agNULL) 11363285242Sachim { 11364285242Sachim TI_DBG1(("itdsatErrorSATAEventHandle: External, OS generated\n")); 11365285242Sachim satOrgIOContext = satIOContext; 11366285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 11367285242Sachim 11368285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 11369285242Sachim 11370285242Sachim satFreeIntIoResource( tiRoot, 11371285242Sachim satDevData, 11372285242Sachim satIntIo); 11373285242Sachim 11374285242Sachim if (event == OSSA_IO_OVERFLOW) 11375285242Sachim { 11376285242Sachim TI_DBG1(("itdsatErrorSATAEventHandle: tiIOOverRun\n")); 11377285242Sachim ostiInitiatorIOCompleted( tiRoot, 11378285242Sachim tdOrgIORequestBody->tiIORequest, 11379285242Sachim tiIOOverRun, 11380285242Sachim 0, 11381285242Sachim agNULL, 11382285242Sachim interruptContext); 11383285242Sachim } 11384285242Sachim else 11385285242Sachim { 11386285242Sachim TI_DBG1(("itdsatErrorSATAEventHandle: else\n")); 11387285242Sachim ostiInitiatorIOCompleted( tiRoot, 11388285242Sachim tdOrgIORequestBody->tiIORequest, 11389285242Sachim tiIOFailed, 11390285242Sachim tiDetailOtherError, 11391285242Sachim agNULL, 11392285242Sachim interruptContext); 11393285242Sachim } 11394285242Sachim } 11395285242Sachim else 11396285242Sachim { 11397285242Sachim TI_DBG1(("itdsatErrorSATAEventHandle: Internal, TD generated\n")); 11398285242Sachim satOrgIOContext = satIOContext->satOrgIOContext; 11399285242Sachim if (satOrgIOContext == agNULL) 11400285242Sachim { 11401285242Sachim TI_DBG1(("itdsatErrorSATAEventHandle: satOrgIOContext is NULL, wrong\n")); 11402285242Sachim return; 11403285242Sachim } 11404285242Sachim else 11405285242Sachim { 11406285242Sachim TI_DBG6(("itdsatErrorSATAEventHandle: satOrgIOContext is NOT NULL\n")); 11407285242Sachim } 11408285242Sachim tdOrgIORequestBody = (tdIORequestBody_t *)satOrgIOContext->tiRequestBody; 11409285242Sachim satDecrementPendingIO(tiRoot, tdsaAllShared, satIOContext); 11410285242Sachim 11411285242Sachim satFreeIntIoResource( tiRoot, 11412285242Sachim satDevData, 11413285242Sachim satIntIo); 11414285242Sachim 11415285242Sachim /* clean up TD layer's IORequestBody */ 11416285242Sachim ostiFreeMemory( 11417285242Sachim tiRoot, 11418285242Sachim tdOrgIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11419285242Sachim sizeof(tdIORequestBody_t) 11420285242Sachim ); 11421285242Sachim 11422285242Sachim } 11423285242Sachim return; 11424285242Sachim} 11425285242Sachim 11426285242SachimosGLOBAL void ossaSATAAbortCB( 11427285242Sachim agsaRoot_t *agRoot, 11428285242Sachim agsaIORequest_t *agIORequest, 11429285242Sachim bit32 flag, 11430285242Sachim bit32 status) 11431285242Sachim{ 11432285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11433285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11434285242Sachim tdIORequestBody_t *tdAbortIORequestBody = agNULL; 11435285242Sachim tdsaDeviceData_t *oneDeviceData = agNULL; 11436285242Sachim tiDeviceHandle_t *tiDeviceHandle = agNULL; 11437285242Sachim tiIORequest_t *taskTag = agNULL; 11438285242Sachim 11439285242Sachim TI_DBG1(("ossaSATAAbortCB: start\n")); 11440285242Sachim 11441285242Sachim tdAbortIORequestBody = (tdIORequestBody_t *)agIORequest->osData; 11442285242Sachim if (tdAbortIORequestBody == agNULL) 11443285242Sachim { 11444285242Sachim TI_DBG1(("ossaSATAAbortCB: tdAbortIORequestBody is NULL warning!!!!\n")); 11445285242Sachim return; 11446285242Sachim } 11447285242Sachim 11448285242Sachim if (flag == 2) 11449285242Sachim { 11450285242Sachim /* abort per port */ 11451285242Sachim TI_DBG1(("ossaSATAAbortCB: abort per port\n")); 11452285242Sachim } 11453285242Sachim else if (flag == 1) 11454285242Sachim { 11455285242Sachim TI_DBG1(("ossaSATAAbortCB: abort all\n")); 11456285242Sachim tiDeviceHandle = (tiDeviceHandle_t *)tdAbortIORequestBody->tiDevHandle; 11457285242Sachim if (tiDeviceHandle == agNULL) 11458285242Sachim { 11459285242Sachim TI_DBG1(("ossaSATAAbortCB: tiDeviceHandle is NULL warning!!!!\n")); 11460285242Sachim ostiFreeMemory( 11461285242Sachim tiRoot, 11462285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11463285242Sachim sizeof(tdIORequestBody_t) 11464285242Sachim ); 11465285242Sachim return; 11466285242Sachim } 11467285242Sachim 11468285242Sachim oneDeviceData = (tdsaDeviceData_t *)tiDeviceHandle->tdData; 11469285242Sachim if (oneDeviceData == agNULL) 11470285242Sachim { 11471285242Sachim TI_DBG1(("ossaSATAAbortCB: oneDeviceData is NULL warning!!!!\n")); 11472285242Sachim ostiFreeMemory( 11473285242Sachim tiRoot, 11474285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11475285242Sachim sizeof(tdIORequestBody_t) 11476285242Sachim ); 11477285242Sachim return; 11478285242Sachim } 11479285242Sachim 11480285242Sachim if (status == OSSA_IO_SUCCESS) 11481285242Sachim { 11482285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n")); 11483285242Sachim /* clean up TD layer's IORequestBody */ 11484285242Sachim if (oneDeviceData->OSAbortAll == agTRUE) 11485285242Sachim { 11486285242Sachim oneDeviceData->OSAbortAll = agFALSE; 11487285242Sachim ostiInitiatorEvent( tiRoot, 11488285242Sachim agNULL, 11489285242Sachim tiDeviceHandle, 11490285242Sachim tiIntrEventTypeLocalAbort, 11491285242Sachim tiAbortOK, 11492285242Sachim agNULL); 11493285242Sachim } 11494285242Sachim else 11495285242Sachim { 11496285242Sachim TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11497285242Sachim saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11498285242Sachim } 11499285242Sachim /* callback to OS layer here ??? */ 11500285242Sachim TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11501285242Sachim ostiFreeMemory( 11502285242Sachim tiRoot, 11503285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11504285242Sachim sizeof(tdIORequestBody_t) 11505285242Sachim ); 11506285242Sachim 11507285242Sachim } 11508285242Sachim else if (status == OSSA_IO_NOT_VALID) 11509285242Sachim { 11510285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n")); 11511285242Sachim /* 11512285242Sachim Nothing is reproted to OS layer 11513285242Sachim */ 11514285242Sachim if (oneDeviceData->OSAbortAll == agTRUE) 11515285242Sachim { 11516285242Sachim oneDeviceData->OSAbortAll = agFALSE; 11517285242Sachim ostiInitiatorEvent( tiRoot, 11518285242Sachim agNULL, 11519285242Sachim tiDeviceHandle, 11520285242Sachim tiIntrEventTypeLocalAbort, 11521285242Sachim tiAbortFailed, 11522285242Sachim agNULL ); 11523285242Sachim } 11524285242Sachim else 11525285242Sachim { 11526285242Sachim TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11527285242Sachim saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11528285242Sachim } 11529285242Sachim TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11530285242Sachim ostiFreeMemory( 11531285242Sachim tiRoot, 11532285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11533285242Sachim sizeof(tdIORequestBody_t) 11534285242Sachim ); 11535285242Sachim } 11536285242Sachim else if (status == OSSA_IO_NO_DEVICE) 11537285242Sachim { 11538285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n")); 11539285242Sachim /* 11540285242Sachim Nothing is reproted to OS layer 11541285242Sachim */ 11542285242Sachim if (oneDeviceData->OSAbortAll == agTRUE) 11543285242Sachim { 11544285242Sachim oneDeviceData->OSAbortAll = agFALSE; 11545285242Sachim ostiInitiatorEvent( tiRoot, 11546285242Sachim agNULL, 11547285242Sachim tiDeviceHandle, 11548285242Sachim tiIntrEventTypeLocalAbort, 11549285242Sachim tiAbortInProgress, 11550285242Sachim agNULL ); 11551285242Sachim } 11552285242Sachim else 11553285242Sachim { 11554285242Sachim TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11555285242Sachim saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11556285242Sachim } 11557285242Sachim TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11558285242Sachim ostiFreeMemory( 11559285242Sachim tiRoot, 11560285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11561285242Sachim sizeof(tdIORequestBody_t) 11562285242Sachim ); 11563285242Sachim } 11564285242Sachim else if (status == OSSA_IO_ABORT_IN_PROGRESS) 11565285242Sachim { 11566285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n")); 11567285242Sachim /* 11568285242Sachim Nothing is reproted to OS layer 11569285242Sachim */ 11570285242Sachim if (oneDeviceData->OSAbortAll == agTRUE) 11571285242Sachim { 11572285242Sachim oneDeviceData->OSAbortAll = agFALSE; 11573285242Sachim ostiInitiatorEvent( tiRoot, 11574285242Sachim agNULL, 11575285242Sachim tiDeviceHandle, 11576285242Sachim tiIntrEventTypeLocalAbort, 11577285242Sachim tiAbortInProgress, 11578285242Sachim agNULL ); 11579285242Sachim } 11580285242Sachim else 11581285242Sachim { 11582285242Sachim TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11583285242Sachim saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11584285242Sachim } 11585285242Sachim TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11586285242Sachim ostiFreeMemory( 11587285242Sachim tiRoot, 11588285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11589285242Sachim sizeof(tdIORequestBody_t) 11590285242Sachim ); 11591285242Sachim } 11592285242Sachim else 11593285242Sachim { 11594285242Sachim TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status )); 11595285242Sachim /* 11596285242Sachim Nothing is reproted to OS layer 11597285242Sachim */ 11598285242Sachim if (oneDeviceData->OSAbortAll == agTRUE) 11599285242Sachim { 11600285242Sachim oneDeviceData->OSAbortAll = agFALSE; 11601285242Sachim ostiInitiatorEvent( tiRoot, 11602285242Sachim agNULL, 11603285242Sachim tiDeviceHandle, 11604285242Sachim tiIntrEventTypeLocalAbort, 11605285242Sachim tiAbortInProgress, 11606285242Sachim agNULL ); 11607285242Sachim } 11608285242Sachim else 11609285242Sachim { 11610285242Sachim TI_DBG1(("ossaSATAAbortCB: calling saDeregisterDeviceHandle did %d\n", oneDeviceData->id)); 11611285242Sachim saDeregisterDeviceHandle(agRoot, agNULL, oneDeviceData->agDevHandle, tdsaRotateQnumber(tiRoot, oneDeviceData)); 11612285242Sachim } 11613285242Sachim TI_DBG1(("ossaSATAAbortCB: did %d\n", oneDeviceData->id)); 11614285242Sachim ostiFreeMemory( 11615285242Sachim tiRoot, 11616285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11617285242Sachim sizeof(tdIORequestBody_t) 11618285242Sachim ); 11619285242Sachim } 11620285242Sachim } 11621285242Sachim else if (flag == 0) 11622285242Sachim { 11623285242Sachim TI_DBG1(("ossaSATAAbortCB: abort one\n")); 11624285242Sachim taskTag = tdAbortIORequestBody->tiIOToBeAbortedRequest; 11625285242Sachim 11626285242Sachim if (status == OSSA_IO_SUCCESS) 11627285242Sachim { 11628285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_SUCCESS\n")); 11629285242Sachim 11630285242Sachim ostiInitiatorEvent( tiRoot, 11631285242Sachim agNULL, 11632285242Sachim agNULL, 11633285242Sachim tiIntrEventTypeLocalAbort, 11634285242Sachim tiAbortOK, 11635285242Sachim taskTag ); 11636285242Sachim ostiFreeMemory( 11637285242Sachim tiRoot, 11638285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11639285242Sachim sizeof(tdIORequestBody_t) 11640285242Sachim ); 11641285242Sachim 11642285242Sachim } 11643285242Sachim else if (status == OSSA_IO_NOT_VALID) 11644285242Sachim { 11645285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NOT_VALID\n")); 11646285242Sachim 11647285242Sachim ostiInitiatorEvent( tiRoot, 11648285242Sachim agNULL, 11649285242Sachim agNULL, 11650285242Sachim tiIntrEventTypeLocalAbort, 11651285242Sachim tiAbortFailed, 11652285242Sachim taskTag ); 11653285242Sachim 11654285242Sachim ostiFreeMemory( 11655285242Sachim tiRoot, 11656285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11657285242Sachim sizeof(tdIORequestBody_t) 11658285242Sachim ); 11659285242Sachim } 11660285242Sachim else if (status == OSSA_IO_NO_DEVICE) 11661285242Sachim { 11662285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_NO_DEVICE\n")); 11663285242Sachim 11664285242Sachim ostiInitiatorEvent( tiRoot, 11665285242Sachim agNULL, 11666285242Sachim agNULL, 11667285242Sachim tiIntrEventTypeLocalAbort, 11668285242Sachim tiAbortInProgress, 11669285242Sachim taskTag ); 11670285242Sachim 11671285242Sachim ostiFreeMemory( 11672285242Sachim tiRoot, 11673285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11674285242Sachim sizeof(tdIORequestBody_t) 11675285242Sachim ); 11676285242Sachim } 11677285242Sachim else if (status == OSSA_IO_ABORT_IN_PROGRESS) 11678285242Sachim { 11679285242Sachim TI_DBG1(("ossaSATAAbortCB: OSSA_IO_ABORT_IN_PROGRESS\n")); 11680285242Sachim 11681285242Sachim ostiInitiatorEvent( tiRoot, 11682285242Sachim agNULL, 11683285242Sachim agNULL, 11684285242Sachim tiIntrEventTypeLocalAbort, 11685285242Sachim tiAbortInProgress, 11686285242Sachim taskTag ); 11687285242Sachim 11688285242Sachim ostiFreeMemory( 11689285242Sachim tiRoot, 11690285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11691285242Sachim sizeof(tdIORequestBody_t) 11692285242Sachim ); 11693285242Sachim } 11694285242Sachim else 11695285242Sachim { 11696285242Sachim TI_DBG1(("ossaSATAAbortCB: unspecified status 0x%x\n", status )); 11697285242Sachim 11698285242Sachim ostiInitiatorEvent( tiRoot, 11699285242Sachim agNULL, 11700285242Sachim agNULL, 11701285242Sachim tiIntrEventTypeLocalAbort, 11702285242Sachim tiAbortFailed, 11703285242Sachim taskTag ); 11704285242Sachim 11705285242Sachim ostiFreeMemory( 11706285242Sachim tiRoot, 11707285242Sachim tdAbortIORequestBody->IOType.InitiatorTMIO.osMemHandle, 11708285242Sachim sizeof(tdIORequestBody_t) 11709285242Sachim ); 11710285242Sachim } 11711285242Sachim } 11712285242Sachim else 11713285242Sachim { 11714285242Sachim TI_DBG1(("ossaSATAAbortCB: wrong flag %d\n", flag)); 11715285242Sachim } 11716285242Sachim return; 11717285242Sachim} 11718285242Sachim 11719285242Sachim/***************************************************************************** 11720285242Sachim*! \brief ossaSATADeviceResetCB 11721285242Sachim* 11722285242Sachim* This routine is called to complete a SATA device reset request previously 11723285242Sachim* issued to the LL Layer in saSATADeviceReset(). 11724285242Sachim* 11725285242Sachim* \param agRoot: Handles for this instance of SAS/SATA hardware 11726285242Sachim* \param agDevHandle: Pointer to a device handle 11727285242Sachim* \param resetStatus: Reset status: 11728285242Sachim* OSSA_SUCCESS: The reset operation completed successfully. 11729285242Sachim* OSSA_FAILURE: The reset operation failed. 11730285242Sachim* \param resetparm: Pointer to the Device-To-Host FIS received from the device. 11731285242Sachim* 11732285242Sachim* \return: none 11733285242Sachim* 11734285242Sachim*****************************************************************************/ 11735285242SachimosGLOBAL void 11736285242SachimossaSATADeviceResetCB( 11737285242Sachim agsaRoot_t *agRoot, 11738285242Sachim agsaDevHandle_t *agDevHandle, 11739285242Sachim bit32 resetStatus, 11740285242Sachim void *resetparm) 11741285242Sachim{ 11742285242Sachim bit32 tiResetStatus; 11743285242Sachim tdsaRootOsData_t *osData = (tdsaRootOsData_t *)agRoot->osData; 11744285242Sachim tiRoot_t *tiRoot = (tiRoot_t *)osData->tiRoot; 11745285242Sachim tdsaDeviceData_t *pDeviceData; 11746285242Sachim tiDeviceHandle_t *tiDeviceHandle; 11747285242Sachim 11748285242Sachim TI_DBG1(("ossaSATADeviceResetCB: agDevHandle=%p resetStatus=0x%x\n", 11749285242Sachim agDevHandle, resetStatus )); 11750285242Sachim 11751285242Sachim pDeviceData = (tdsaDeviceData_t *) agDevHandle->osData; 11752285242Sachim tiDeviceHandle = &(pDeviceData->tiDeviceHandle); 11753285242Sachim 11754285242Sachim if (resetStatus == OSSA_SUCCESS ) 11755285242Sachim tiResetStatus = tiSuccess; 11756285242Sachim else 11757285242Sachim tiResetStatus = tiError; 11758285242Sachim 11759285242Sachim osSatResetCB( tiRoot, 11760285242Sachim tiDeviceHandle, 11761285242Sachim tiResetStatus, 11762285242Sachim resetparm); 11763285242Sachim 11764285242Sachim} 11765285242Sachim 11766285242Sachim 11767285242Sachim/*****************************************************************************/ 11768285242Sachim/*! \brief satDecrementPendingIO 11769285242Sachim * 11770285242Sachim * This function decrements the number of pending IO's 11771285242Sachim * 11772285242Sachim * \param tiRoot: Pointer to TISA initiator driver/port instance. 11773285242Sachim * \param tdsaAllShared: Pointer to TD context. 11774285242Sachim * \param satIOContext_t: Pointer to the SAT IO Context 11775285242Sachim * 11776285242Sachim * \return 11777285242Sachim * None 11778285242Sachim */ 11779285242Sachim/*****************************************************************************/ 11780285242SachimGLOBAL void 11781285242SachimsatDecrementPendingIO( 11782285242Sachim tiRoot_t *tiRoot, 11783285242Sachim tdsaContext_t *tdsaAllShared, 11784285242Sachim satIOContext_t *satIOContext 11785285242Sachim ) 11786285242Sachim{ 11787285242Sachim satDeviceData_t *satDevData; 11788285242Sachim 11789285242Sachim TI_DBG4(("satDecrementPendingIO: start\n")); 11790285242Sachim 11791285242Sachim satDevData = satIOContext->pSatDevData; 11792285242Sachim 11793285242Sachim if ( (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_WRITE) || 11794285242Sachim (satIOContext->reqType == AGSA_SATA_PROTOCOL_FPDMA_READ) ) 11795285242Sachim { 11796285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 11797285242Sachim satDevData->satPendingNCQIO--; 11798285242Sachim satIOContext->pSatDevData->satPendingIO--; 11799285242Sachim TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink); 11800285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 11801285242Sachim } 11802285242Sachim else 11803285242Sachim { 11804285242Sachim tdsaSingleThreadedEnter(tiRoot, TD_SATA_LOCK); 11805285242Sachim satDevData->satPendingNONNCQIO--; 11806285242Sachim satIOContext->pSatDevData->satPendingIO--; 11807285242Sachim TDLIST_DEQUEUE_THIS (&satIOContext->satIoContextLink); 11808285242Sachim tdsaSingleThreadedLeave(tiRoot, TD_SATA_LOCK); 11809285242Sachim } 11810285242Sachim 11811285242Sachim return; 11812285242Sachim} 11813285242Sachim 11814285242SachimGLOBAL void 11815285242SachimsatTranslateATAPIErrorsToSCSIErrors( 11816285242Sachim bit8 bCommand, 11817285242Sachim bit8 bATAStatus, 11818285242Sachim bit8 bATAError, 11819285242Sachim bit8 *pSenseKey, 11820285242Sachim bit16 *pSenseCodeInfo 11821285242Sachim ) 11822285242Sachim{ 11823285242Sachim if (pSenseKey == agNULL || pSenseCodeInfo == agNULL) 11824285242Sachim { 11825285242Sachim TI_DBG0(("TranslateATAErrorsToSCSIErros: pSenseKey == agNULL || pSenseCodeInfo == agNULL\n")); 11826285242Sachim return; 11827285242Sachim } 11828285242Sachim 11829285242Sachim if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & NM_ATA_ERROR_MASK)) 11830285242Sachim { 11831285242Sachim *pSenseKey = SCSI_SNSKEY_NOT_READY; 11832285242Sachim *pSenseCodeInfo = 0x3a00; 11833285242Sachim } 11834285242Sachim else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ABRT_ATA_ERROR_MASK)) 11835285242Sachim { 11836285242Sachim *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND; 11837285242Sachim *pSenseCodeInfo = 0; 11838285242Sachim } 11839285242Sachim else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MCR_ATA_ERROR_MASK)) 11840285242Sachim { 11841285242Sachim *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION; 11842285242Sachim *pSenseCodeInfo = 0x5a01; 11843285242Sachim } 11844285242Sachim else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & IDNF_ATA_ERROR_MASK)) 11845285242Sachim { 11846285242Sachim *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR; 11847285242Sachim *pSenseCodeInfo = 0x1401; 11848285242Sachim } 11849285242Sachim else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & MC_ATA_ERROR_MASK)) 11850285242Sachim { 11851285242Sachim *pSenseKey = SCSI_SNSKEY_UNIT_ATTENTION; 11852285242Sachim *pSenseCodeInfo = 0x2800; 11853285242Sachim } 11854285242Sachim else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & UNC_ATA_ERROR_MASK)) 11855285242Sachim { 11856285242Sachim /*READ*/ 11857285242Sachim *pSenseKey = SCSI_SNSKEY_MEDIUM_ERROR; 11858285242Sachim *pSenseCodeInfo = 0x1100; 11859285242Sachim 11860285242Sachim /*add WRITE here */ 11861285242Sachim } 11862285242Sachim else if((bATAStatus & ERR_ATA_STATUS_MASK) && (bATAError & ICRC_ATA_ERROR_MASK)) 11863285242Sachim { 11864285242Sachim *pSenseKey = SCSI_SNSKEY_ABORTED_COMMAND; 11865285242Sachim *pSenseCodeInfo = 0x4703; 11866285242Sachim } 11867285242Sachim else if((bATAStatus & DF_ATA_STATUS_MASK)) 11868285242Sachim { 11869285242Sachim *pSenseKey = SCSI_SNSKEY_HARDWARE_ERROR; 11870285242Sachim *pSenseCodeInfo = 0x4400; 11871285242Sachim } 11872285242Sachim else 11873285242Sachim { 11874285242Sachim TI_DBG0(("unhandled ata error: bATAStatus = 0x%x, bATAError = 0x%x\n", 11875285242Sachim bATAStatus, bATAError)); 11876285242Sachim } 11877285242Sachim 11878285242Sachim} 11879285242Sachim 11880285242Sachim#endif /* #ifdef SATA_ENABLE */ 11881285242Sachim 11882